phaser.js 5.3 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994153995153996153997153998153999154000154001154002154003154004154005154006154007154008154009154010154011154012154013154014154015154016154017154018154019154020154021154022154023154024154025154026154027154028154029154030154031154032154033154034154035154036154037154038154039154040154041154042154043154044154045154046154047154048154049154050154051154052154053154054154055154056154057154058154059154060154061154062154063154064154065154066154067154068154069154070154071154072154073154074154075154076154077154078154079154080154081154082154083154084154085154086154087154088154089154090154091154092154093154094154095154096154097154098154099154100154101154102154103154104154105154106154107154108154109154110154111154112154113154114154115154116154117154118154119154120154121154122154123154124154125154126154127154128154129154130154131154132154133154134154135154136154137154138154139154140154141154142154143154144154145154146154147154148154149154150154151154152154153154154154155154156154157154158154159154160154161154162154163154164154165154166154167154168154169154170154171154172154173154174154175154176154177154178154179154180154181154182154183154184154185154186154187154188154189154190154191154192154193154194154195154196154197154198154199154200154201154202154203154204154205154206154207154208154209154210154211154212154213154214154215154216154217154218154219154220154221154222154223154224154225154226154227154228154229154230154231154232154233154234154235154236154237154238154239154240154241154242154243154244154245154246154247154248154249154250154251154252154253154254154255154256154257154258154259154260154261154262154263154264154265154266154267154268154269154270154271154272154273154274154275154276154277154278154279154280154281154282154283154284154285154286154287154288154289154290154291154292154293154294154295154296154297154298154299154300154301154302154303154304154305154306154307154308154309154310154311154312154313154314154315154316154317154318154319154320154321154322154323154324154325154326154327154328154329154330154331154332154333154334154335154336154337154338154339154340154341154342154343154344154345154346154347154348154349154350154351154352154353154354154355154356154357154358154359154360154361154362154363154364154365154366154367154368154369154370154371154372154373154374154375154376154377154378154379154380154381154382154383154384154385154386154387154388154389154390154391154392154393154394154395154396154397154398154399154400154401154402154403154404154405154406154407154408154409154410154411154412154413154414154415154416154417154418154419154420154421154422154423154424154425154426154427154428154429154430154431154432154433154434154435154436154437154438154439154440154441154442154443154444154445154446154447154448154449154450154451154452154453154454154455154456154457154458154459154460154461154462154463154464154465154466154467154468154469154470154471154472154473154474154475154476154477154478154479154480154481154482154483154484154485154486154487154488154489154490154491154492154493154494154495154496154497154498154499154500154501154502154503154504154505154506154507154508154509154510154511154512154513154514154515154516154517154518154519154520154521154522154523154524154525154526154527154528154529154530154531154532154533154534154535154536154537154538154539154540154541154542154543154544154545154546154547154548154549154550154551154552154553154554154555154556154557154558154559154560154561154562154563154564154565154566154567154568154569154570154571154572154573154574154575154576154577154578154579154580154581154582154583154584154585154586154587154588154589154590154591154592154593154594154595154596154597154598154599154600154601154602154603154604154605154606154607154608154609154610154611154612154613154614154615154616154617154618154619154620154621154622154623154624154625154626154627154628154629154630154631154632154633154634154635154636154637154638154639154640154641154642154643154644154645154646154647154648154649154650154651154652154653154654154655154656154657154658154659154660154661154662154663154664154665154666154667154668154669154670154671154672154673154674154675154676154677154678154679154680154681154682154683154684154685154686154687154688154689154690154691154692154693154694154695154696154697154698154699154700154701154702154703154704154705154706154707154708154709154710154711154712154713154714154715154716154717154718154719154720154721154722154723154724154725154726154727154728154729154730154731154732154733154734154735154736154737154738154739154740154741154742154743154744154745154746154747154748154749154750154751154752154753154754154755154756154757154758154759154760154761154762154763154764154765154766154767154768154769154770154771154772154773154774154775154776154777154778154779154780154781154782154783154784154785154786154787154788154789154790154791154792154793154794154795154796154797154798154799154800154801154802154803154804154805154806154807154808154809154810154811154812154813154814154815154816154817154818154819154820154821154822154823154824154825154826154827154828154829154830154831154832154833154834154835154836154837154838154839154840154841154842154843154844154845154846154847154848154849154850154851154852154853154854154855154856154857154858154859154860154861154862154863154864154865154866154867154868154869154870154871154872154873154874154875154876154877154878154879154880154881154882154883154884154885154886154887154888154889154890154891154892154893154894154895154896154897154898154899154900154901154902154903154904154905154906154907154908154909154910154911154912154913154914154915154916154917154918154919154920154921154922154923154924154925154926154927154928154929154930154931154932154933154934154935154936154937154938154939154940154941154942154943154944154945154946154947154948154949154950154951154952154953154954154955154956154957154958154959154960154961154962154963154964154965154966154967154968154969154970154971154972154973154974154975154976154977154978154979154980154981154982154983154984154985154986154987154988154989154990154991154992154993154994154995154996154997154998154999155000155001155002155003155004155005155006155007155008155009155010155011155012155013155014155015155016155017155018155019155020155021155022155023155024155025155026155027155028155029155030155031155032155033155034155035155036155037155038155039155040155041155042155043155044155045155046155047155048155049155050155051155052155053155054155055155056155057155058155059155060155061155062155063155064155065155066155067155068155069155070155071155072155073155074155075155076155077155078155079155080155081155082155083155084155085155086155087155088155089155090155091155092155093155094155095155096155097155098155099155100155101155102155103155104155105155106155107155108155109155110155111155112155113155114155115155116155117155118155119155120155121155122155123155124155125155126155127155128155129155130155131155132155133155134155135155136155137155138155139155140155141155142155143155144155145155146155147155148155149155150155151155152155153155154155155155156155157155158155159155160155161155162155163155164155165155166155167155168155169155170155171155172155173155174155175155176155177155178155179155180155181155182155183155184155185155186155187155188155189155190155191155192155193155194155195155196155197155198155199155200155201155202155203155204155205155206155207155208155209155210155211155212155213155214155215155216155217155218155219155220155221155222155223155224155225155226155227155228155229155230155231155232155233155234155235155236155237155238155239155240155241155242155243155244155245155246155247155248155249155250155251155252155253155254155255155256155257155258155259155260155261155262155263155264155265155266155267155268155269155270155271155272155273155274155275155276155277155278155279155280155281155282155283155284155285155286155287155288155289155290155291155292155293155294155295155296155297155298155299155300155301155302155303155304155305155306155307155308155309155310155311155312155313155314155315155316155317155318155319155320155321155322155323155324155325155326155327155328155329155330155331155332155333155334155335155336155337155338155339155340155341155342155343155344155345155346155347155348155349155350155351155352155353155354155355155356155357155358155359155360155361155362155363155364155365155366155367155368155369155370155371155372155373155374155375155376155377155378155379155380155381155382155383155384155385155386155387155388155389155390155391155392155393155394155395155396155397155398155399155400155401155402155403155404155405155406155407155408155409155410155411155412155413155414155415155416155417155418155419155420155421155422155423155424155425155426155427155428155429155430155431155432155433155434155435155436155437155438155439155440155441155442155443155444155445155446155447155448155449155450155451155452155453155454155455155456155457155458155459155460155461155462155463155464155465155466155467155468155469155470155471155472155473155474155475155476155477155478155479155480155481155482155483155484155485155486155487155488155489155490155491155492155493155494155495155496155497155498155499155500155501155502155503155504155505155506155507155508155509155510155511155512155513155514155515155516155517155518155519155520155521155522155523155524155525155526155527155528155529155530155531155532155533155534155535155536155537155538155539155540155541155542155543155544155545155546155547155548155549155550155551155552155553155554155555155556155557155558155559155560155561155562155563155564155565155566155567155568155569155570155571155572155573155574155575155576155577155578155579155580155581155582155583155584155585155586155587155588155589155590155591155592155593155594155595155596155597155598155599155600155601155602155603155604155605155606155607155608155609155610155611155612155613155614155615155616155617155618155619155620155621155622155623155624155625155626155627155628155629155630155631155632155633155634155635155636155637155638155639155640155641155642155643155644155645155646155647155648155649155650155651155652155653155654155655155656155657155658155659155660155661155662155663155664155665155666155667155668155669155670155671155672155673155674155675155676155677155678155679155680155681155682155683155684155685155686155687155688155689155690155691155692155693155694155695155696155697155698155699155700155701155702155703155704155705155706155707155708155709155710155711155712155713155714155715155716155717155718155719155720155721155722155723155724155725155726155727155728155729155730155731155732155733155734155735155736155737155738155739155740155741155742155743155744155745155746155747155748155749155750155751155752155753155754155755155756155757155758155759155760155761155762155763155764155765155766155767155768155769155770155771155772155773155774155775155776155777155778155779155780155781155782155783155784155785155786155787155788155789155790155791155792155793155794155795155796155797155798155799155800155801155802155803155804155805155806155807155808155809155810155811155812155813155814155815155816155817155818155819155820155821155822155823155824155825155826155827155828155829155830155831155832155833155834155835155836155837155838155839155840155841155842155843155844155845155846155847155848155849155850155851155852155853155854155855155856155857155858155859155860155861155862155863155864155865155866155867155868155869155870155871155872155873155874155875155876155877155878155879155880155881155882155883155884155885155886155887155888155889155890155891155892155893155894155895155896155897155898155899155900155901155902155903155904155905155906155907155908155909155910155911155912155913155914155915155916155917155918155919155920155921155922155923155924155925155926155927155928155929155930155931155932155933155934155935155936155937155938155939155940155941155942155943155944155945155946155947155948155949155950155951155952155953155954155955155956155957155958155959155960155961155962155963155964155965155966155967155968155969155970155971155972155973155974155975155976155977155978155979155980155981155982155983155984155985155986155987155988155989155990155991155992155993155994155995155996155997155998155999156000156001156002156003156004156005156006156007156008156009156010156011156012156013156014156015156016156017156018156019156020156021156022156023156024156025156026156027156028156029156030156031156032156033156034156035156036156037156038156039156040156041156042156043156044156045156046156047156048156049156050156051156052156053156054156055156056156057156058156059156060156061156062156063156064156065156066156067156068156069156070156071156072156073156074156075156076156077156078156079156080156081156082156083156084156085156086156087156088156089156090156091156092156093156094156095156096156097156098156099156100156101156102156103156104156105156106156107156108156109156110156111156112156113156114156115156116156117156118156119156120156121156122156123156124156125156126156127156128156129156130156131156132156133156134156135156136156137156138156139156140156141156142156143156144156145156146156147156148156149156150156151156152156153156154156155156156156157156158156159156160156161156162156163156164156165156166156167156168156169156170156171156172156173156174156175156176156177156178156179156180156181156182156183156184156185156186156187156188156189156190156191156192156193156194156195156196156197156198156199156200156201156202156203156204156205156206156207156208156209156210156211156212156213156214156215156216156217156218156219156220156221156222156223156224156225156226156227156228156229156230156231156232156233156234156235156236156237156238156239156240156241156242156243156244156245156246156247156248156249156250156251156252156253156254156255156256156257156258156259156260156261156262156263156264156265156266156267156268156269156270156271156272156273156274156275156276156277156278156279156280156281156282156283156284156285156286156287156288156289156290156291156292156293156294156295156296156297156298156299156300156301156302156303156304156305156306156307156308156309156310156311156312156313156314156315156316156317156318156319156320156321156322156323156324156325156326156327156328156329156330156331156332156333156334156335156336156337156338156339156340156341156342156343156344156345156346156347156348156349156350156351156352156353156354156355156356156357156358156359156360156361156362156363156364156365156366156367156368156369156370156371156372156373156374156375156376156377156378156379156380156381156382156383156384156385156386156387156388156389156390156391156392156393156394156395156396156397156398156399156400156401156402156403156404156405156406156407156408156409156410156411156412156413156414156415156416156417156418156419156420156421156422156423156424156425156426156427156428156429156430156431156432156433156434156435156436156437156438156439156440156441156442156443156444156445156446156447156448156449156450156451156452156453156454156455156456156457156458156459156460156461156462156463156464156465156466156467156468156469156470156471156472156473156474156475156476156477156478156479156480156481156482156483156484156485156486156487156488156489156490156491156492156493156494156495156496156497156498156499156500156501156502156503156504156505156506156507156508156509156510156511156512156513156514156515156516156517156518156519156520156521156522156523156524156525156526156527156528156529156530156531156532156533156534156535156536156537156538156539156540156541156542156543156544156545156546156547156548156549156550156551156552156553156554156555156556156557156558156559156560156561156562156563156564156565156566156567156568156569156570156571156572156573156574156575156576156577156578156579156580156581156582156583156584156585156586156587156588156589156590156591156592156593156594156595156596156597156598156599156600156601156602156603156604156605156606156607156608156609156610156611156612156613156614156615156616156617156618156619156620156621156622156623156624156625156626156627156628156629156630156631156632156633156634156635156636156637156638156639156640156641156642156643156644156645156646156647156648156649156650156651156652156653156654156655156656156657156658156659156660156661156662156663156664156665156666156667156668156669156670156671156672156673156674156675156676156677156678156679156680156681156682156683156684156685156686156687156688156689156690156691156692156693156694156695156696156697156698156699156700156701156702156703156704156705156706156707156708156709156710156711156712156713156714156715156716156717156718156719156720156721156722156723156724156725156726156727156728156729156730156731156732156733156734156735156736156737156738156739156740156741156742156743156744156745156746156747156748156749156750156751156752156753156754156755156756156757156758156759156760156761156762156763156764156765156766156767156768156769156770156771156772156773156774156775156776156777156778156779156780156781156782156783156784156785156786156787156788156789156790156791156792156793156794156795156796156797156798156799156800156801156802156803156804156805156806156807156808156809156810156811156812156813156814156815156816156817156818156819156820156821156822156823156824156825156826156827156828156829156830156831156832156833156834156835156836156837156838156839156840156841156842156843156844156845156846156847156848156849156850156851156852156853156854156855156856156857156858156859156860156861156862156863156864156865156866156867156868156869156870156871156872156873156874156875156876156877156878156879156880156881156882156883156884156885156886156887156888156889156890156891156892156893156894156895156896156897156898156899156900156901156902156903156904156905156906156907156908156909156910156911156912156913156914156915156916156917156918156919156920156921156922156923156924156925156926156927156928156929156930156931156932156933156934156935156936156937156938156939156940156941156942156943156944156945156946156947156948156949156950156951156952156953156954156955156956156957156958156959156960156961156962156963156964156965156966156967156968156969156970156971156972156973156974156975156976156977156978156979156980156981156982156983156984156985156986156987156988156989156990156991156992156993156994156995156996156997156998156999157000157001157002157003157004157005157006157007157008157009157010157011157012157013157014157015157016157017157018157019157020157021157022157023157024157025157026157027157028157029157030157031157032157033157034157035157036157037157038157039157040157041157042157043157044157045157046157047157048157049157050157051157052157053157054157055157056157057157058157059157060157061157062157063157064157065157066157067157068157069157070157071157072157073157074157075157076157077157078157079157080157081157082157083157084157085157086157087157088157089157090157091157092157093157094157095157096157097157098157099157100157101157102157103157104157105157106157107157108157109157110157111157112157113157114157115157116157117157118157119157120157121157122157123157124157125157126157127157128157129157130157131157132157133157134157135157136157137157138157139157140157141157142157143157144157145157146157147157148157149157150157151157152157153157154157155157156157157157158157159157160157161157162157163157164157165157166157167157168157169157170157171157172157173157174157175157176157177157178157179157180157181157182157183157184157185157186157187157188157189157190157191157192157193157194157195157196157197157198157199157200157201157202157203157204157205157206157207157208157209157210157211157212157213157214157215157216157217157218157219157220157221157222157223157224157225157226157227157228157229157230157231157232157233157234157235157236157237157238157239157240157241157242157243157244157245157246157247157248157249157250157251157252157253157254157255157256157257157258157259157260157261157262157263157264157265157266157267157268157269157270157271157272157273157274157275157276157277157278157279157280157281157282157283157284157285157286157287157288157289157290157291157292157293157294157295157296157297157298157299157300157301157302157303157304157305157306157307157308157309157310157311157312157313157314157315157316157317157318157319157320157321157322157323157324157325157326157327157328157329157330157331157332157333157334157335157336157337157338157339157340157341157342157343157344157345157346157347157348157349157350157351157352157353157354157355157356157357157358157359157360157361157362157363157364157365157366157367157368157369157370157371157372157373157374157375157376157377157378157379157380157381157382157383157384157385157386157387157388157389157390157391157392157393157394157395157396157397157398157399157400157401157402157403157404157405157406157407157408157409157410157411157412157413157414157415157416157417157418157419157420157421157422157423157424157425157426157427157428157429157430157431157432157433157434157435157436157437157438157439157440157441157442157443157444157445157446157447157448157449157450157451157452157453157454157455157456157457157458157459157460157461157462157463157464157465157466157467157468157469157470157471157472157473157474157475157476157477157478157479157480157481157482157483157484157485157486157487157488157489157490157491157492157493157494157495157496157497157498157499157500157501157502157503157504157505157506157507157508157509157510157511157512157513157514157515157516157517157518157519157520157521157522157523157524157525157526157527157528157529157530157531157532157533157534157535157536157537157538157539157540157541157542157543157544157545157546157547157548157549157550157551157552157553157554157555157556157557157558157559157560157561157562157563157564157565157566157567157568157569157570157571157572157573157574157575157576157577157578157579157580157581157582157583157584157585157586157587157588157589157590157591157592157593157594157595157596157597157598157599157600157601157602157603157604157605157606157607157608157609157610157611157612157613157614157615157616157617157618157619157620157621157622157623157624157625157626157627157628157629157630157631157632157633157634157635157636157637157638157639157640157641157642157643157644157645157646157647157648157649157650157651157652157653157654157655157656157657157658157659157660157661157662157663157664157665157666157667157668157669157670157671157672157673157674157675157676157677157678157679157680157681157682157683157684157685157686157687157688157689157690157691157692157693157694157695157696157697157698157699157700157701157702157703157704157705157706157707157708157709157710157711157712157713157714157715157716157717157718157719157720157721157722157723157724157725157726157727157728157729157730157731157732157733157734157735157736157737157738157739157740157741157742157743157744157745157746157747157748157749157750157751157752157753157754157755157756157757157758157759157760157761157762157763157764157765157766157767157768157769157770157771157772157773157774157775157776157777157778157779157780157781157782157783157784157785157786157787157788157789157790157791157792157793157794157795157796157797157798157799157800157801157802157803157804157805157806157807157808157809157810157811157812157813157814157815157816157817157818157819157820157821157822157823157824157825157826157827157828157829157830157831157832157833157834157835157836157837157838157839157840157841157842157843157844157845157846157847157848157849157850157851157852157853157854157855157856157857157858157859157860157861157862157863157864157865157866157867157868157869157870157871157872157873157874157875157876157877157878157879157880157881157882157883157884157885157886157887157888157889157890157891157892157893157894157895157896157897157898157899157900157901157902157903157904157905157906157907157908157909157910157911157912157913157914157915157916157917157918157919157920157921157922157923157924157925157926157927157928157929157930157931157932157933157934157935157936157937157938157939157940157941157942157943157944157945157946157947157948157949157950157951157952157953157954157955157956157957157958157959157960157961157962157963157964157965157966157967157968157969157970157971157972157973157974157975157976157977157978157979157980157981157982157983157984157985157986157987157988157989157990157991157992157993157994157995157996157997157998157999158000158001158002158003158004158005158006158007158008158009158010158011158012158013158014158015158016158017158018158019158020158021158022158023158024158025158026158027158028158029158030158031158032158033158034158035158036158037158038158039158040158041158042158043158044158045158046158047158048158049158050158051158052158053158054158055158056158057158058158059158060158061158062158063158064158065158066158067158068158069158070158071158072158073158074158075158076158077158078158079158080158081158082158083158084158085158086158087158088158089158090158091158092158093158094158095158096158097158098158099158100158101158102158103158104158105158106158107158108158109158110158111158112158113158114158115158116158117158118158119158120158121158122158123158124158125158126158127158128158129158130158131158132158133158134158135158136158137158138158139158140158141158142158143158144158145158146158147158148158149158150158151158152158153158154158155158156158157158158158159158160158161158162158163158164158165158166158167158168158169158170158171158172158173158174158175158176158177158178158179158180158181158182158183158184158185158186158187158188158189158190158191158192158193158194158195158196158197158198158199158200158201158202158203158204158205158206158207158208158209158210158211158212158213158214158215158216158217158218158219158220158221158222158223158224158225158226158227158228158229158230158231158232158233158234158235158236158237158238158239158240158241158242158243158244158245158246158247158248158249158250158251158252158253158254158255158256158257158258158259158260158261158262158263158264158265158266158267158268158269158270158271158272158273158274158275158276158277158278158279158280158281158282158283158284158285158286158287158288158289158290158291158292158293158294158295158296158297158298158299158300158301158302158303158304158305158306158307158308158309158310158311158312158313158314158315158316158317158318158319158320158321158322158323158324158325158326158327158328158329158330158331158332158333158334158335158336158337158338158339158340158341158342158343158344158345158346158347158348158349158350158351158352158353158354158355158356158357158358158359158360158361158362158363158364158365158366158367158368158369158370158371158372158373158374158375158376158377158378158379158380158381158382158383158384158385158386158387158388158389158390158391158392158393158394158395158396158397158398158399158400158401158402158403158404158405158406158407158408158409158410158411158412158413158414158415158416158417158418158419158420158421158422158423158424158425158426158427158428158429158430158431158432158433158434158435158436158437158438158439158440158441158442158443158444158445158446158447158448158449158450158451158452158453158454158455158456158457158458158459158460158461158462158463158464158465158466158467158468158469158470158471158472158473158474158475158476158477158478158479158480158481158482158483158484158485158486158487158488158489158490158491158492158493158494158495158496158497158498158499158500158501158502158503158504158505158506158507158508158509158510158511158512158513158514158515158516158517158518158519158520158521158522158523158524158525158526158527158528158529158530158531158532158533158534158535158536158537158538158539158540158541158542158543158544158545158546158547158548158549158550158551158552158553158554158555158556158557158558158559158560158561158562158563158564158565158566158567158568158569158570158571158572158573158574158575158576158577158578158579158580158581158582158583158584158585158586158587158588158589158590158591158592158593158594158595158596158597158598158599158600158601158602158603158604158605158606158607158608158609158610158611158612158613158614158615158616158617158618158619158620158621158622158623158624158625158626158627158628158629158630158631158632158633158634158635158636158637158638158639158640158641158642158643158644158645158646158647158648158649158650158651158652158653158654158655158656158657158658158659158660158661158662158663158664158665158666158667158668158669158670158671158672158673158674158675158676158677158678158679158680158681158682158683158684158685158686158687158688158689158690158691158692158693158694158695158696158697158698158699158700158701158702158703158704158705158706158707158708158709158710158711158712158713158714158715158716158717158718158719158720158721158722158723158724158725158726158727158728158729158730158731158732158733158734158735158736158737158738158739158740158741158742158743158744158745158746158747158748158749158750158751158752158753158754158755158756158757158758158759158760158761158762158763158764158765158766158767158768158769158770158771158772158773158774158775158776158777158778158779158780158781158782158783158784158785158786158787158788158789158790158791158792158793158794158795158796158797158798158799158800158801158802158803158804158805158806158807158808158809158810158811158812158813158814158815158816158817158818158819158820158821158822158823158824158825158826158827158828158829158830158831158832158833158834158835158836158837158838158839158840158841158842158843158844158845158846158847158848158849158850158851158852158853158854158855158856158857158858158859158860158861158862158863158864158865158866158867158868158869158870158871158872158873158874158875158876158877158878158879158880158881158882158883158884158885158886158887158888158889158890158891158892158893158894158895158896158897158898158899158900158901158902158903158904158905158906158907158908158909158910158911158912158913158914158915158916158917158918158919158920158921158922158923158924158925158926158927158928158929158930158931158932158933158934158935158936158937158938158939158940158941158942158943158944158945158946158947158948158949158950158951158952158953158954158955158956158957158958158959158960158961158962158963158964158965158966158967158968158969158970158971158972158973158974158975158976158977158978158979158980158981158982158983158984158985158986158987158988158989158990158991158992158993158994158995158996158997158998158999159000159001159002159003159004159005159006159007159008159009159010159011159012159013159014159015159016159017159018159019159020159021159022159023159024159025159026159027159028159029159030159031159032159033159034159035159036159037159038159039159040159041159042159043159044159045159046159047159048159049159050159051159052159053159054159055159056159057159058159059159060159061159062159063159064159065159066159067159068159069159070159071159072159073159074159075159076159077159078159079159080159081159082159083159084159085159086159087159088159089159090159091159092159093159094159095159096159097159098159099159100159101159102159103159104159105159106159107159108159109159110159111159112159113159114159115159116159117159118159119159120159121159122159123159124159125159126159127159128159129159130159131159132159133159134159135159136159137159138159139159140159141159142159143159144159145159146159147159148159149159150159151159152159153159154159155159156159157159158159159159160159161159162159163159164159165159166159167159168159169159170159171159172159173159174159175159176159177159178159179159180159181159182159183159184159185159186159187159188159189159190159191159192159193159194159195159196159197159198159199159200159201159202159203159204159205159206159207159208159209159210159211159212159213159214159215159216159217159218159219159220159221159222159223159224159225159226159227159228159229159230159231159232159233159234159235159236159237159238159239159240159241159242159243159244159245159246159247159248159249159250159251159252159253159254159255159256159257159258159259159260159261159262159263159264159265159266159267159268159269159270159271159272159273159274159275159276159277159278159279159280159281159282159283159284159285159286159287159288159289159290159291159292159293159294159295159296159297159298159299159300159301159302159303159304159305159306159307159308159309159310159311159312159313159314159315159316159317159318159319159320159321159322159323159324159325159326159327159328159329159330159331159332159333159334159335159336159337159338159339159340159341159342159343159344159345159346159347159348159349159350159351159352159353159354159355159356159357159358159359159360159361159362159363159364159365159366159367159368159369159370159371159372159373159374159375159376159377159378159379159380159381159382159383159384159385159386159387159388159389159390159391159392159393159394159395159396159397159398159399159400159401159402159403159404159405159406159407159408159409159410159411159412159413159414159415159416159417159418159419159420159421159422159423159424159425159426159427159428159429159430159431159432159433159434159435159436159437159438159439159440159441159442159443159444159445159446159447159448159449159450159451159452159453159454159455159456159457159458159459159460159461159462159463159464159465159466159467159468159469159470159471159472159473159474159475159476159477159478159479159480159481159482159483159484159485159486159487159488159489159490159491159492159493159494159495159496159497159498159499159500159501159502159503159504159505159506159507159508159509159510159511159512159513159514159515159516159517159518159519159520159521159522159523159524159525159526159527159528159529159530159531159532159533159534159535159536159537159538159539159540159541159542159543159544159545159546159547159548159549159550159551159552159553159554159555159556159557159558159559159560159561159562159563159564159565159566159567159568159569159570159571159572159573159574159575159576159577159578159579159580159581159582159583159584159585159586159587159588159589159590159591159592159593159594159595159596159597159598159599159600159601159602159603159604159605159606159607159608159609159610159611159612159613159614159615159616159617159618159619159620159621159622159623159624159625159626159627159628159629159630159631159632159633159634159635159636159637159638159639159640159641159642159643159644159645159646159647159648159649159650159651159652159653159654159655159656159657159658159659159660159661159662159663159664159665159666159667159668159669159670159671159672159673159674159675159676159677159678159679159680159681159682159683159684159685159686159687159688159689159690159691159692159693159694159695159696159697159698159699159700159701159702159703159704159705159706159707159708159709159710159711159712159713159714159715159716159717159718159719159720159721159722159723159724159725159726159727159728159729159730159731159732159733159734159735159736159737159738159739159740159741159742159743159744159745159746159747159748159749159750159751159752159753159754159755159756159757159758159759159760159761159762159763159764159765159766159767159768159769159770159771159772159773159774159775159776159777159778159779159780159781159782159783159784159785159786159787159788159789159790159791159792159793159794159795159796159797159798159799159800159801159802159803159804159805159806159807159808159809159810159811159812159813159814159815159816159817159818159819159820159821159822159823159824159825159826159827159828159829159830159831159832159833159834159835159836159837159838159839159840159841159842159843159844159845159846159847159848159849159850159851159852159853159854159855159856159857159858159859159860159861159862159863159864159865159866159867159868159869159870159871159872159873159874159875159876159877159878159879159880159881159882159883159884159885159886159887159888159889159890159891159892159893159894159895159896159897159898159899159900159901159902159903159904159905159906159907159908159909159910159911159912159913159914159915159916159917159918159919159920159921159922159923159924159925159926159927159928159929159930159931159932159933159934159935159936159937159938159939159940159941159942159943159944159945159946159947159948159949159950159951159952159953159954159955159956159957159958159959159960159961159962159963159964159965159966159967159968159969159970159971159972159973159974159975159976159977159978159979159980159981159982159983159984159985159986159987159988159989159990159991159992159993159994159995159996159997159998159999160000160001160002160003160004160005160006160007160008160009160010160011160012160013160014160015160016160017160018160019160020160021160022160023160024160025160026160027160028160029160030160031160032160033160034160035160036160037160038160039160040160041160042160043160044160045160046160047160048160049160050160051160052160053160054160055160056160057160058160059160060160061160062160063160064160065160066160067160068160069160070160071160072160073160074160075160076160077160078160079160080160081160082160083160084160085160086160087160088160089160090160091160092160093160094160095160096160097160098160099160100160101160102160103160104160105160106160107160108160109160110160111160112160113160114160115160116160117160118160119160120160121160122160123160124160125160126160127160128160129160130160131160132160133160134160135160136160137160138160139160140160141160142160143160144160145160146160147160148160149160150160151160152160153160154160155160156160157160158160159160160160161160162160163160164160165160166160167160168160169160170160171160172160173160174160175160176160177160178160179160180160181160182160183160184160185160186160187160188160189160190160191160192160193160194160195160196160197160198160199160200160201160202160203160204160205160206160207160208160209160210160211160212160213160214160215160216160217160218160219160220160221160222160223160224160225160226160227160228160229160230160231160232160233160234160235160236160237160238160239160240160241160242160243160244160245160246160247160248160249160250160251160252160253160254160255160256160257160258160259160260160261160262160263160264160265160266160267160268160269160270160271160272160273160274160275160276160277160278160279160280160281160282160283160284160285160286160287160288160289160290160291160292160293160294160295160296160297160298160299160300160301160302160303160304160305160306160307160308160309160310160311160312160313160314160315160316160317160318160319160320160321160322160323160324160325160326160327160328160329160330160331160332160333160334160335160336160337160338160339160340160341160342160343160344160345160346160347160348160349160350160351160352160353160354160355160356160357160358160359160360160361160362160363160364160365160366160367160368160369160370160371160372160373160374160375160376160377160378160379160380160381160382160383160384160385160386160387160388160389160390160391160392160393160394160395160396160397160398160399160400160401160402160403160404160405160406160407160408160409160410160411160412160413160414160415160416160417160418160419160420160421160422160423160424160425160426160427160428160429160430160431160432160433160434160435160436160437160438160439160440160441160442160443160444160445160446160447160448160449160450160451160452160453160454160455160456160457160458160459160460160461160462160463160464160465160466160467160468160469160470160471160472160473160474160475160476160477160478160479160480160481160482160483160484160485160486160487160488160489160490160491160492160493160494160495160496160497160498160499160500160501160502160503160504160505160506160507160508160509160510160511160512160513160514160515160516160517160518160519160520160521160522160523160524160525160526160527160528160529160530160531160532160533160534160535160536160537160538160539160540160541160542160543160544160545160546160547160548160549160550160551160552160553160554160555160556160557160558160559160560160561160562160563160564160565160566160567160568160569160570160571160572160573160574160575160576160577160578160579160580160581160582160583160584160585160586160587160588160589160590160591160592160593160594160595160596160597160598160599160600160601160602160603160604160605160606160607160608160609160610160611160612160613160614160615160616160617160618160619160620160621160622160623160624160625160626160627160628160629160630160631160632160633160634160635160636160637160638160639160640160641160642160643160644160645160646160647160648160649160650160651160652160653160654160655160656160657160658160659160660160661160662160663160664160665160666160667160668160669160670160671160672160673160674160675160676160677160678160679160680160681160682160683160684160685160686160687160688160689160690160691160692160693160694160695160696160697160698160699160700160701160702160703160704160705160706160707160708160709160710160711160712160713160714160715160716160717160718160719160720160721160722160723160724160725160726160727160728160729160730160731160732160733160734160735160736160737160738160739160740160741160742160743160744160745160746160747160748160749160750160751160752160753160754160755160756160757160758160759160760160761160762160763160764160765160766160767160768160769160770160771160772160773160774160775160776160777160778160779160780160781160782160783160784160785160786160787160788160789160790160791160792160793160794160795160796160797160798160799160800160801160802160803160804160805160806160807160808160809160810160811160812160813160814160815160816160817160818160819160820160821160822160823160824160825160826160827160828160829160830160831160832160833160834160835160836160837160838160839160840160841160842160843160844160845160846160847160848160849160850160851160852160853160854160855160856160857160858160859160860160861160862160863160864160865160866160867160868160869160870160871160872160873160874160875160876160877160878160879160880160881160882160883160884160885160886160887160888160889160890160891160892160893160894160895160896160897160898160899160900160901160902160903160904160905160906160907160908160909160910160911160912160913160914160915160916160917160918160919160920160921160922160923160924160925160926160927160928160929160930160931160932160933160934160935160936160937160938160939160940160941160942160943160944160945160946160947160948160949160950160951160952160953160954160955160956160957160958160959160960160961160962160963160964160965160966160967160968160969160970160971160972160973160974160975160976160977160978160979160980160981160982160983160984160985160986160987160988160989160990160991160992160993160994160995160996160997160998160999161000161001161002161003161004161005161006161007161008161009161010161011161012161013161014161015161016161017161018161019161020161021161022161023161024161025161026161027161028161029161030161031161032161033161034161035161036161037161038161039161040161041161042161043161044161045161046161047161048161049161050161051161052161053161054161055161056161057161058161059161060161061161062161063161064161065161066161067161068161069161070161071161072161073161074161075161076161077161078161079161080161081161082161083161084161085161086161087161088161089161090161091161092161093161094161095161096161097161098161099161100161101161102161103161104161105161106161107161108161109161110161111161112161113161114161115161116161117161118161119161120161121161122161123161124161125161126161127161128161129161130161131161132161133161134161135161136161137161138161139161140161141161142161143161144161145161146161147161148161149161150161151161152161153161154161155161156161157161158161159161160161161161162161163161164161165161166161167161168161169161170161171161172161173161174161175161176161177161178161179161180161181161182161183161184161185161186161187161188161189161190161191161192161193161194161195161196161197161198161199161200161201161202161203161204161205161206161207161208161209161210161211161212161213161214161215161216161217161218161219161220161221161222161223161224161225161226161227161228161229161230161231161232161233161234161235161236161237161238161239161240161241161242161243161244161245161246161247161248161249161250161251161252161253161254161255161256161257161258161259161260161261161262161263161264161265161266161267161268161269161270161271161272161273161274161275161276161277161278161279161280161281161282161283161284161285161286161287161288161289161290161291161292161293161294161295161296161297161298161299161300161301161302161303161304161305161306161307161308161309161310161311161312161313161314161315161316161317161318161319161320161321161322161323161324161325161326161327161328161329161330161331161332161333161334161335161336161337161338161339161340161341161342161343161344161345161346161347161348161349161350161351161352161353161354161355161356161357161358161359161360161361161362161363161364161365161366161367161368161369161370161371161372161373161374161375161376161377161378161379161380161381161382161383161384161385161386161387161388161389161390161391161392161393161394161395161396161397161398161399161400161401161402161403161404161405161406161407161408161409161410161411161412161413161414161415161416161417161418161419161420161421161422161423161424161425161426161427161428161429161430161431161432161433161434161435161436161437161438161439161440161441161442161443161444161445161446161447161448161449161450161451161452161453161454161455161456161457161458161459161460161461161462161463161464161465161466161467161468161469161470161471161472161473161474161475161476161477161478161479161480161481161482161483161484161485161486161487161488161489161490161491161492161493161494161495161496161497161498161499161500161501161502161503161504161505161506161507161508161509161510161511161512161513161514161515161516161517161518161519161520161521161522161523161524161525161526161527161528161529161530161531161532161533161534161535161536161537161538161539161540161541161542161543161544161545161546161547161548161549161550161551161552161553161554161555161556161557161558161559161560161561161562161563161564161565161566161567161568161569161570161571161572161573161574161575161576161577161578161579161580161581161582161583161584161585161586161587161588161589161590161591161592161593161594161595161596161597161598161599161600161601161602161603161604161605161606161607161608161609161610161611161612161613161614161615161616161617161618161619161620161621161622161623161624161625161626161627161628161629161630161631161632161633161634161635161636161637161638161639161640161641161642161643161644161645161646161647161648161649161650161651161652161653161654161655161656161657161658161659161660161661161662161663161664161665161666161667161668161669161670161671161672161673161674161675161676161677161678161679161680161681161682161683161684161685161686161687161688161689161690161691161692161693161694161695161696161697161698161699161700161701161702161703161704161705161706161707161708161709161710161711161712161713161714161715161716161717161718161719161720161721161722161723161724161725161726161727161728161729161730161731161732161733161734161735161736161737161738161739161740161741161742161743161744161745161746161747161748161749161750161751161752161753161754161755161756161757161758161759161760161761161762161763161764161765161766161767161768161769161770161771161772161773161774161775161776161777161778161779161780161781161782161783161784161785161786161787161788161789161790161791161792161793161794161795161796161797161798161799161800161801161802161803161804161805161806161807161808161809161810161811161812161813161814161815161816161817161818161819161820161821161822161823161824161825161826161827161828161829161830161831161832161833161834161835161836161837161838161839161840161841161842161843161844161845161846161847161848161849161850161851161852161853161854161855161856161857161858161859161860161861161862161863161864161865161866161867161868161869161870161871161872161873161874161875161876161877161878161879161880161881161882161883161884161885161886161887161888161889161890161891161892161893161894161895161896161897161898161899161900161901161902161903161904161905161906161907161908161909161910161911161912161913161914161915161916161917161918161919161920161921161922161923161924161925161926161927161928161929161930161931161932161933161934161935161936161937161938161939161940161941161942161943161944161945161946161947161948161949161950161951161952161953161954161955161956161957161958161959161960161961161962161963161964161965161966161967161968161969161970161971161972161973161974161975161976161977161978161979161980161981161982161983161984161985161986161987161988161989161990161991161992161993161994161995161996161997161998161999162000162001162002162003162004162005162006162007162008162009162010162011162012162013162014162015162016162017162018162019162020162021162022162023162024162025162026162027162028162029162030162031162032162033162034162035162036162037162038162039162040162041162042162043162044162045162046162047162048162049162050162051162052162053162054162055162056162057162058162059162060162061162062162063162064162065162066162067162068162069162070162071162072162073162074162075162076162077162078162079162080162081162082162083162084162085162086162087162088162089162090162091162092162093162094162095162096162097162098162099162100162101162102162103162104162105162106162107162108162109162110162111162112162113162114162115162116162117162118162119162120162121162122162123162124162125162126162127162128162129162130162131162132162133162134162135162136162137162138162139162140162141162142162143162144162145162146162147162148162149162150162151162152162153162154162155162156162157162158162159162160162161162162162163162164162165162166162167162168162169162170162171162172162173162174162175162176162177162178162179162180162181162182162183162184162185162186162187162188162189162190162191162192162193162194162195162196162197162198162199162200162201162202162203162204162205162206162207162208162209162210162211162212162213162214162215162216162217162218162219162220162221162222162223162224162225162226162227162228162229162230162231162232162233162234162235162236162237162238162239162240162241162242162243162244162245162246162247162248162249162250162251162252162253162254162255162256162257162258162259162260162261162262162263162264162265162266162267162268162269162270162271162272162273162274162275162276162277162278162279162280162281162282162283162284162285162286162287162288162289162290162291162292162293162294162295162296162297162298162299162300162301162302162303162304162305162306162307162308162309162310162311162312162313162314162315162316162317162318162319162320162321162322162323162324162325162326162327162328162329162330162331162332162333162334162335162336162337162338162339162340162341162342162343162344162345162346162347162348162349162350162351162352162353162354162355162356162357162358162359162360162361162362162363162364162365162366162367162368162369162370162371162372162373162374162375162376162377162378162379162380162381162382162383162384162385162386162387162388162389162390162391162392162393162394162395162396162397162398162399162400162401162402162403162404162405162406162407162408162409162410162411162412162413162414162415162416162417162418162419162420162421162422162423162424162425162426162427162428162429162430162431162432162433162434162435162436162437162438162439162440162441162442162443162444162445162446162447162448162449162450162451162452162453162454162455162456162457162458162459162460162461162462162463162464162465162466162467162468162469162470162471162472162473162474162475162476162477162478162479162480162481162482162483162484162485162486162487162488162489162490162491162492162493162494162495162496162497162498162499162500162501162502162503162504162505162506162507162508162509162510162511162512162513162514162515162516162517162518162519162520162521162522162523162524162525162526162527162528162529162530162531162532162533162534162535162536162537162538162539162540162541162542162543162544162545162546162547162548162549162550162551162552162553162554162555162556162557162558162559162560162561162562162563162564162565162566162567162568162569162570162571162572162573162574162575162576162577162578162579162580162581162582162583162584162585162586162587162588162589162590162591162592162593162594162595162596162597162598162599162600162601162602162603162604162605162606162607162608162609162610162611162612162613162614162615162616162617162618162619162620162621162622162623162624162625162626162627162628162629162630162631162632162633162634162635162636162637162638162639162640162641162642162643162644162645162646162647162648162649162650162651162652162653162654162655162656162657162658162659162660162661162662162663162664162665162666162667162668162669162670162671162672162673162674162675162676162677162678162679162680162681162682162683162684162685162686162687162688162689162690162691162692162693162694162695162696162697162698162699162700162701162702162703162704162705162706162707162708162709162710162711162712162713162714162715162716162717162718162719162720162721162722162723162724162725162726162727162728162729162730162731162732162733162734162735162736162737162738162739162740162741162742162743162744162745162746162747162748162749162750162751162752162753162754162755162756162757162758162759162760162761162762162763162764162765162766162767162768162769162770162771162772162773162774162775162776162777162778162779162780162781162782162783162784162785162786162787162788162789162790162791162792162793162794162795162796162797162798162799162800162801162802162803162804162805162806162807162808162809162810162811162812162813162814162815162816162817162818162819162820162821162822162823162824162825162826162827162828162829162830162831162832162833162834162835162836162837162838162839162840162841162842162843162844162845162846162847162848162849162850162851162852162853162854162855162856162857162858162859162860162861162862162863162864162865162866162867162868162869162870162871162872162873162874162875162876162877162878162879162880162881162882162883162884162885162886162887162888162889162890162891162892162893162894162895162896162897162898162899162900162901162902162903162904162905162906162907162908162909162910162911162912162913162914162915162916162917162918162919162920162921162922162923162924162925162926162927162928162929162930162931162932162933162934162935162936162937162938162939162940162941162942162943162944162945162946162947162948162949162950162951162952162953162954162955162956162957162958162959162960162961162962162963162964162965162966162967162968162969162970162971162972162973162974162975162976162977162978162979162980162981162982162983162984162985162986162987162988162989162990162991162992162993162994162995162996162997162998162999163000163001163002163003163004163005163006163007163008163009163010163011163012163013163014163015163016163017163018163019163020163021163022163023163024163025163026163027163028163029163030163031163032163033163034163035163036163037163038163039163040163041163042163043163044163045163046163047163048163049163050163051163052163053163054163055163056163057163058163059163060163061163062163063163064163065163066163067163068163069163070163071163072163073163074163075163076163077163078163079163080163081163082163083163084163085163086163087163088163089163090163091163092163093163094163095163096163097163098163099163100163101163102163103163104163105163106163107163108163109163110163111163112163113163114163115163116163117163118163119163120163121163122163123163124163125163126163127163128163129163130163131163132163133163134163135163136163137163138163139163140163141163142163143163144163145163146163147163148163149163150163151163152163153163154163155163156163157163158163159163160163161163162163163163164163165163166163167163168163169163170163171163172163173163174163175163176163177163178163179163180163181163182163183163184163185163186163187163188163189163190163191163192163193163194163195163196163197163198163199163200163201163202163203163204163205163206163207163208163209163210163211163212163213163214163215163216163217163218163219163220163221163222163223163224163225163226163227163228163229163230163231163232163233163234163235163236163237163238163239163240163241163242163243163244163245163246163247163248163249163250163251163252163253163254163255163256163257163258163259163260163261163262163263163264163265163266163267163268163269163270163271163272163273163274163275163276163277163278163279163280163281163282163283163284163285163286163287163288163289163290163291163292163293163294163295163296163297163298163299163300163301163302163303163304163305163306163307163308163309163310163311163312163313163314163315163316163317163318163319163320163321163322163323163324163325163326163327163328163329163330163331163332163333163334163335163336163337163338163339163340163341163342163343163344163345163346163347163348163349163350163351163352163353163354163355163356163357163358163359163360163361163362163363163364163365163366163367163368163369163370163371163372163373163374163375163376163377163378163379163380163381163382163383163384163385163386163387163388163389163390163391163392163393163394163395163396163397163398163399163400163401163402163403163404163405163406163407163408163409163410163411163412163413163414163415163416163417163418163419163420163421163422163423163424163425163426163427163428163429163430163431163432163433163434163435163436163437163438163439163440163441163442163443163444163445163446163447163448163449163450163451163452163453163454163455163456163457163458163459163460163461163462163463163464163465163466163467163468163469163470163471163472163473163474163475163476163477163478163479163480163481163482163483163484163485163486163487163488163489163490163491163492163493163494163495163496163497163498163499163500163501163502163503163504163505163506163507163508163509163510163511163512163513163514163515163516163517163518163519163520163521163522163523163524163525163526163527163528163529163530163531163532163533163534163535163536163537163538163539163540163541163542163543163544163545163546163547163548163549163550163551163552163553163554163555163556163557163558163559163560163561163562163563163564163565163566163567163568163569163570163571163572163573163574163575163576163577163578163579163580163581163582163583163584163585163586163587163588163589163590163591163592163593163594163595163596163597163598163599163600163601163602163603163604163605163606163607163608163609163610163611163612163613163614163615163616163617163618163619163620163621163622163623163624163625163626163627163628163629163630163631163632163633163634163635163636163637163638163639163640163641163642163643163644163645163646163647163648163649163650163651163652163653163654163655163656163657163658163659163660163661163662163663163664163665163666163667163668163669163670163671163672163673163674163675163676163677163678163679163680163681163682163683163684163685163686163687163688163689163690163691163692163693163694163695163696163697163698163699163700163701163702163703163704163705163706163707163708163709163710163711163712163713163714163715163716163717163718163719163720163721163722163723163724163725163726163727163728163729163730163731163732163733163734163735163736163737163738163739163740163741163742163743163744163745163746163747163748163749163750163751163752163753163754163755163756163757163758163759163760163761163762163763163764163765163766163767163768163769163770163771163772163773163774163775163776163777163778163779163780163781163782163783163784163785163786163787163788163789163790163791163792163793163794163795163796163797163798163799163800163801163802163803163804163805163806163807163808163809163810163811163812163813163814163815163816163817163818163819163820163821163822163823163824163825163826163827163828163829163830163831163832163833163834163835163836163837163838163839163840163841163842163843163844163845163846163847163848163849163850163851163852163853163854163855163856163857163858163859163860163861163862163863163864163865163866163867163868163869163870163871163872163873163874163875163876163877163878163879163880163881163882163883163884163885163886163887163888163889163890163891163892163893163894163895163896163897163898163899163900163901163902163903163904163905163906163907163908163909163910163911163912163913163914163915163916163917163918163919163920163921163922163923163924163925163926163927163928163929163930163931163932163933163934163935163936163937163938163939163940163941163942163943163944163945163946163947163948163949163950163951163952163953163954163955163956163957163958163959163960163961163962163963163964163965163966163967163968163969163970163971163972163973163974163975163976163977163978163979163980163981163982163983163984163985163986163987163988163989163990163991163992163993163994163995163996163997163998163999164000164001164002164003164004164005164006164007164008164009164010164011164012164013164014164015164016164017164018164019164020164021164022164023164024164025164026164027164028164029164030164031164032164033164034164035164036164037164038164039164040164041164042164043164044164045164046164047164048164049164050164051164052164053164054164055164056164057164058164059164060164061164062164063164064164065164066164067164068164069164070164071164072164073164074164075164076164077164078164079164080164081164082164083164084164085164086164087164088164089164090164091164092164093164094164095164096164097164098164099164100164101164102164103164104164105164106164107164108164109164110164111164112164113164114164115164116164117164118164119164120164121164122164123164124164125164126164127164128164129164130164131164132164133164134164135164136164137164138164139164140164141164142164143164144164145164146164147164148164149164150164151164152164153164154164155164156164157164158164159164160164161164162164163164164164165164166164167164168164169164170164171164172164173164174164175164176164177164178164179164180164181164182164183164184164185164186164187164188164189164190164191164192164193164194164195164196164197164198164199164200164201164202164203164204164205164206164207164208164209164210164211164212164213164214164215164216164217164218164219164220164221164222164223164224164225164226164227164228164229164230164231164232164233164234164235164236164237164238164239164240164241164242164243164244164245164246164247164248164249164250164251164252164253164254164255164256164257164258164259164260164261164262164263164264164265164266164267164268164269164270164271164272164273164274164275164276164277164278164279164280164281164282164283164284164285164286164287164288164289164290164291164292164293164294164295164296164297164298164299164300164301164302164303164304164305164306164307164308164309164310164311164312164313164314164315164316164317164318164319164320164321164322164323164324164325164326164327164328164329164330164331164332164333164334164335164336164337164338164339164340164341164342164343164344164345164346164347164348164349164350164351164352164353164354164355164356164357164358164359164360164361164362164363164364164365164366164367164368164369164370164371164372164373164374164375164376164377164378164379164380164381164382164383164384164385164386164387164388164389164390164391164392164393164394164395164396164397164398164399164400164401164402164403164404164405164406164407164408164409164410164411164412164413164414164415164416164417164418164419164420164421164422164423164424164425164426164427164428164429164430164431164432164433164434164435164436164437164438164439164440164441164442164443164444164445164446164447164448164449164450164451164452164453164454164455164456164457164458164459164460164461164462164463164464164465164466164467164468164469164470164471164472164473164474164475164476164477164478164479164480164481164482164483164484164485164486164487164488164489164490164491164492164493164494164495164496164497164498164499164500164501164502164503164504164505164506164507164508164509164510164511164512164513164514164515164516164517164518164519164520164521164522164523164524164525164526164527164528164529164530164531164532164533164534164535164536164537164538164539164540164541164542164543164544164545164546164547164548164549164550164551164552164553164554164555164556164557164558164559164560164561164562164563164564164565164566164567164568164569164570164571164572164573164574164575164576164577164578164579164580164581164582164583164584164585164586164587164588164589164590164591164592164593164594164595164596164597164598164599164600164601164602164603164604164605164606164607164608164609164610164611164612164613164614164615164616164617164618164619164620164621164622164623164624164625164626164627164628164629164630164631164632164633164634164635164636164637164638164639164640164641164642164643164644164645164646164647164648164649164650164651164652164653164654164655164656164657164658164659164660164661164662164663164664164665164666164667164668164669164670164671164672164673164674164675164676164677164678164679164680164681164682164683164684164685164686164687164688164689164690164691164692164693164694164695164696164697164698164699164700164701164702164703164704164705164706164707164708164709164710164711164712164713164714164715164716164717164718164719164720164721164722164723164724164725164726164727164728164729164730164731164732164733164734164735164736164737164738164739164740164741164742164743164744164745164746164747164748164749164750164751164752164753164754164755164756164757164758164759164760164761164762164763164764164765164766164767164768164769164770164771164772164773164774164775164776164777164778164779164780164781164782164783164784164785164786164787164788164789164790164791164792164793164794164795164796164797164798164799164800164801164802164803164804164805164806164807164808164809164810164811164812164813164814164815164816164817164818164819164820164821164822164823164824164825164826164827164828164829164830164831164832164833164834164835164836164837164838164839164840164841164842164843164844164845164846164847164848164849164850164851164852164853164854164855164856164857164858164859164860164861164862164863164864164865164866164867164868164869164870164871164872164873164874164875164876164877164878164879164880164881164882164883164884164885164886164887164888164889164890164891164892164893164894164895164896164897164898164899164900164901164902164903164904164905164906164907164908164909164910164911164912164913164914164915164916164917164918164919164920164921164922164923164924164925164926164927164928164929164930164931164932164933164934164935164936164937164938164939164940164941164942164943164944164945164946164947164948164949164950164951164952164953164954164955164956164957164958164959164960164961164962164963164964164965164966164967164968164969164970164971164972164973164974164975164976164977164978164979164980164981164982164983164984164985164986164987164988164989164990164991164992164993164994164995164996164997164998164999165000165001165002165003165004165005165006165007165008165009165010165011165012165013165014165015165016165017165018165019165020165021165022165023165024165025165026165027165028165029165030165031165032165033165034165035165036165037165038165039165040165041165042165043165044165045165046165047165048165049165050165051165052165053165054165055165056165057165058165059165060165061165062165063165064165065165066165067165068165069165070165071165072165073165074165075165076165077165078165079165080165081165082165083165084165085165086165087165088165089165090165091165092165093165094165095165096165097165098165099165100165101165102165103165104165105165106165107165108165109165110165111165112165113165114165115165116165117165118165119165120165121165122165123165124165125165126165127165128165129165130165131165132165133165134165135165136165137165138165139165140165141165142165143165144165145165146165147165148165149165150165151165152165153165154165155165156165157165158165159165160165161165162165163165164165165165166165167165168165169165170165171165172165173165174165175165176165177165178165179165180165181165182165183165184165185165186165187165188165189165190165191165192165193165194165195165196165197165198165199165200165201165202165203165204165205165206165207165208165209165210165211165212165213165214165215165216165217165218165219165220165221165222165223165224165225165226165227165228165229165230165231165232165233165234165235165236165237165238165239165240165241165242165243165244165245165246165247165248165249165250165251165252165253165254165255165256165257165258165259165260165261165262165263165264165265165266165267165268165269165270165271165272165273165274165275165276165277165278165279165280165281165282165283165284165285165286165287165288165289165290165291165292165293165294165295165296165297165298165299165300165301165302165303165304165305165306165307165308165309165310165311165312165313165314165315165316165317165318165319165320165321165322165323165324165325165326165327165328165329165330165331165332165333165334165335165336165337165338165339165340165341165342165343165344165345165346165347165348165349165350165351165352165353165354165355165356165357165358165359165360165361165362165363165364165365165366165367165368165369165370165371165372165373165374165375165376165377165378165379165380165381165382165383165384165385165386165387165388165389165390165391165392165393165394165395165396165397165398165399165400165401165402165403165404165405165406165407165408165409165410165411165412165413165414165415165416165417165418165419165420165421165422165423165424165425165426165427165428165429165430165431165432165433165434165435165436165437165438165439165440165441165442165443165444165445165446165447165448165449165450165451165452165453165454165455165456165457165458165459165460165461165462165463165464165465165466165467165468165469165470165471165472165473165474165475165476165477165478165479165480165481165482165483165484165485165486165487165488165489165490165491165492165493165494165495165496165497165498165499165500165501165502165503165504165505165506165507165508165509165510165511165512165513165514165515165516165517165518165519165520165521165522165523165524165525165526165527165528165529165530165531165532165533165534165535165536165537165538165539165540165541165542165543165544165545165546165547165548165549165550165551165552165553165554165555165556165557165558165559165560165561165562165563165564165565165566165567165568165569165570165571165572165573165574165575165576165577165578165579165580165581165582165583165584165585165586165587165588165589165590165591165592165593165594165595165596165597165598165599165600165601165602165603165604165605165606165607165608165609165610165611165612165613165614165615165616165617165618165619165620165621165622165623165624165625165626165627165628165629165630165631165632165633165634165635165636165637165638165639165640165641165642165643165644165645165646165647165648165649165650165651165652165653165654165655165656165657165658165659165660165661165662165663165664165665165666165667165668165669165670165671165672165673165674165675165676165677165678165679165680165681165682165683165684165685165686165687165688165689165690165691165692165693165694165695165696165697165698165699165700165701165702165703165704165705165706165707165708165709165710165711165712165713165714165715165716165717165718165719165720165721165722165723165724165725165726165727165728165729165730165731165732165733165734165735165736165737165738165739165740165741165742165743165744165745165746165747165748165749165750165751165752165753165754165755165756165757165758165759165760165761165762165763165764165765165766165767165768165769165770165771165772165773165774165775165776165777165778165779165780165781165782165783165784165785165786165787165788165789165790165791165792165793165794165795165796165797165798165799165800165801165802165803165804165805165806165807165808165809165810165811165812165813165814165815165816165817165818165819165820165821165822165823165824165825165826165827165828165829165830165831165832165833165834165835165836165837165838165839165840165841165842165843165844165845165846165847165848165849165850165851165852165853165854165855165856165857165858165859165860165861165862165863165864165865165866165867165868165869165870165871165872165873165874165875165876165877165878165879165880165881165882165883165884165885165886165887165888165889165890165891165892165893165894165895165896165897165898165899165900165901165902165903165904165905165906165907165908165909165910165911165912165913165914165915165916165917165918165919165920165921165922165923165924165925165926165927165928165929165930165931165932165933165934165935165936165937165938165939165940165941165942165943165944165945165946165947165948165949165950165951165952165953165954165955165956165957165958165959165960165961165962165963165964165965165966165967165968165969165970165971165972165973165974165975165976165977165978165979165980165981165982165983165984165985165986165987165988165989165990165991165992165993165994165995165996165997165998165999166000166001166002166003166004166005166006166007166008166009166010166011166012166013166014166015166016166017166018166019166020166021166022166023166024166025166026166027166028166029166030166031166032166033166034166035166036166037166038166039166040166041166042166043166044166045166046166047166048166049166050166051166052166053166054166055166056166057166058166059166060166061166062166063166064166065166066166067166068166069166070166071166072166073166074166075166076166077166078166079166080166081166082166083166084166085166086166087166088166089166090166091166092166093166094166095166096166097166098166099166100166101166102166103166104166105166106166107166108166109166110166111166112166113166114166115166116166117166118166119166120166121166122166123166124166125166126166127166128166129166130166131166132166133166134166135166136166137166138166139166140166141166142166143166144166145166146166147166148166149166150166151166152166153166154166155166156166157166158166159166160166161166162166163166164166165166166166167166168166169166170166171166172166173166174166175166176166177166178166179166180166181166182166183166184166185166186166187166188166189166190166191166192166193166194166195166196166197166198166199166200166201166202166203166204166205166206166207166208166209166210166211166212166213166214166215166216166217166218166219166220166221166222166223166224166225166226166227166228166229166230166231166232166233166234166235166236166237166238166239166240166241166242166243166244166245166246166247166248166249166250166251166252166253166254166255166256166257166258166259166260166261166262166263166264166265166266166267166268166269166270166271166272166273166274166275166276166277166278166279166280166281166282166283166284166285166286166287166288166289166290166291166292166293166294166295166296166297166298166299166300166301166302166303166304166305166306166307166308166309166310166311166312166313166314166315166316166317166318166319166320166321166322166323166324166325166326166327166328166329166330166331166332166333166334166335166336166337166338166339166340166341166342166343166344166345166346166347166348166349166350166351166352166353166354166355166356166357166358166359166360166361166362166363166364166365166366166367166368166369166370166371166372166373166374166375166376166377166378166379166380166381166382166383166384166385166386166387166388166389166390166391166392166393166394166395166396166397166398166399166400166401166402166403166404166405166406166407166408166409166410166411166412166413166414166415166416166417166418166419166420166421166422166423166424166425166426166427166428166429166430166431166432166433166434166435166436166437166438166439166440166441166442166443166444166445166446166447166448166449166450166451166452166453166454166455166456166457166458166459166460166461166462166463166464166465166466166467166468166469166470166471166472166473166474166475166476166477166478166479166480166481166482166483166484166485166486166487166488166489166490166491166492166493166494166495166496166497166498166499166500166501166502166503166504166505166506166507166508166509166510166511166512166513166514166515166516166517166518166519166520166521166522166523166524166525166526166527166528166529166530166531166532166533166534166535166536166537166538166539166540166541166542166543166544166545166546166547166548166549166550166551166552166553166554166555166556166557166558166559166560166561166562166563166564166565166566166567166568166569166570166571166572166573166574166575166576166577166578166579166580166581166582166583166584166585166586166587166588166589166590166591166592166593166594166595166596166597166598166599166600166601166602166603166604166605166606166607166608166609166610166611166612166613166614166615166616166617166618166619166620166621166622166623166624166625166626166627166628166629166630166631166632166633166634166635166636166637166638166639166640166641166642166643166644166645166646166647166648166649166650166651166652166653166654166655166656166657166658166659166660166661166662166663166664166665166666166667166668166669166670166671166672166673166674166675166676166677166678166679166680166681166682166683166684166685166686166687166688166689166690166691166692166693166694166695166696166697166698166699166700166701166702166703166704166705166706166707166708166709166710166711166712166713166714166715166716166717166718166719166720166721166722166723166724166725166726166727166728166729166730166731166732166733166734166735166736166737166738166739166740166741166742166743166744166745166746166747166748166749166750166751166752166753166754166755166756166757166758166759166760166761166762166763166764166765166766166767166768166769166770166771166772166773166774166775166776166777166778166779166780166781166782166783166784166785166786166787166788166789166790166791166792166793166794166795166796166797166798166799166800166801166802166803166804166805166806166807166808166809166810166811166812166813166814166815166816166817166818166819166820166821166822166823166824166825166826166827166828166829166830166831166832166833166834166835166836166837166838166839166840166841166842166843166844166845166846166847166848166849166850166851166852166853166854166855166856166857166858166859166860166861166862166863166864166865166866166867166868166869166870166871166872166873166874166875166876166877166878166879166880166881166882166883166884166885166886166887166888166889166890166891166892166893166894166895166896166897166898166899166900166901166902166903166904166905166906166907166908166909166910166911166912166913166914166915166916166917166918166919166920166921166922166923166924166925166926166927166928166929166930166931166932166933166934166935166936166937166938166939166940166941166942166943166944166945166946166947166948166949166950166951166952166953166954166955166956166957166958166959166960166961166962166963166964166965166966166967166968166969166970166971166972166973166974166975166976166977166978166979166980166981166982166983166984166985166986166987166988166989166990166991166992166993166994166995166996166997166998166999167000167001167002167003167004167005167006167007167008167009167010167011167012167013167014167015167016167017167018167019167020167021167022167023167024167025167026167027167028167029167030167031167032167033167034167035167036167037167038167039167040167041167042167043167044167045167046167047167048167049167050167051167052167053167054167055167056167057167058167059167060167061167062167063167064167065167066167067167068167069167070167071167072167073167074167075167076167077167078167079167080167081167082167083167084167085167086167087167088167089167090167091167092167093167094167095167096167097167098167099167100167101167102167103167104167105167106167107167108167109167110167111167112167113167114167115167116167117167118167119167120167121167122167123167124167125167126167127167128167129167130167131167132167133167134167135167136167137167138167139167140167141167142167143167144167145167146167147167148167149167150167151167152167153167154167155167156167157167158167159167160167161167162167163167164167165167166167167167168167169167170167171167172167173167174167175167176167177167178167179167180167181167182167183167184167185167186167187167188167189167190167191167192167193167194167195167196167197167198167199167200167201167202167203167204167205167206167207167208167209167210167211167212167213167214167215167216167217167218167219167220167221167222167223167224167225167226167227167228167229167230167231167232167233167234167235167236167237167238167239167240167241167242167243167244167245167246167247167248167249167250167251167252167253167254167255167256167257167258167259167260167261167262167263167264167265167266167267167268167269167270167271167272167273167274167275167276167277167278167279167280167281167282167283167284167285167286167287167288167289167290167291167292167293167294167295167296167297167298167299167300167301167302167303167304167305167306167307167308167309167310167311167312167313167314167315167316167317167318167319167320167321167322167323167324167325167326167327167328167329167330167331167332167333167334167335167336167337167338167339167340167341167342167343167344167345167346167347167348167349167350167351167352167353167354167355167356167357167358167359167360167361167362167363167364167365167366167367167368167369167370167371167372167373167374167375167376167377167378167379167380167381167382167383167384167385167386167387167388167389167390167391167392167393167394167395167396167397167398167399167400167401167402167403167404167405167406167407167408167409167410167411167412167413167414167415167416167417167418167419167420167421167422167423167424167425167426167427167428167429167430167431167432167433167434167435167436167437167438167439167440167441167442167443167444167445167446167447167448167449167450167451167452167453167454167455167456167457167458167459167460167461167462167463167464167465167466167467167468167469167470167471167472167473167474167475167476167477167478167479167480167481167482167483167484167485167486167487167488167489167490167491167492167493167494167495167496167497167498167499167500167501167502167503167504167505167506167507167508167509167510167511167512167513167514167515167516167517167518167519167520167521167522167523167524167525167526167527167528167529167530167531167532167533167534167535167536167537167538167539167540167541167542167543167544167545167546167547167548167549167550167551167552167553167554167555167556167557167558167559167560167561167562167563167564167565167566167567167568167569167570167571167572167573167574167575167576167577167578167579167580167581167582167583167584167585167586167587167588167589167590167591167592167593167594167595167596167597167598167599167600167601167602167603167604167605167606167607167608167609167610167611167612167613167614167615167616167617167618167619167620167621167622167623167624167625167626167627167628167629167630167631167632167633167634167635167636167637167638167639167640167641167642167643167644167645167646167647167648167649167650167651167652167653167654167655167656167657167658167659167660167661167662167663167664167665167666167667167668167669167670167671167672167673167674167675167676167677167678167679167680167681167682167683167684167685167686167687167688167689167690167691167692167693167694167695167696167697167698167699167700167701167702167703167704167705167706167707167708167709167710167711167712167713167714167715167716167717167718167719167720167721167722167723167724167725167726167727167728167729167730167731167732167733167734167735167736167737167738167739167740167741167742167743167744167745167746167747167748167749167750167751167752167753167754167755167756167757167758167759167760167761167762167763167764167765167766167767167768167769167770167771167772167773167774167775167776167777167778167779167780167781167782167783167784167785167786167787167788167789167790167791167792167793167794167795167796167797167798167799167800167801167802167803167804167805167806167807167808167809167810167811167812167813167814167815167816167817167818167819167820167821167822167823167824167825167826167827167828167829167830167831167832167833167834167835167836167837167838167839167840167841167842167843167844167845167846167847167848167849167850167851167852167853167854167855167856167857167858167859167860167861167862167863167864167865167866167867167868167869167870167871167872167873167874167875167876167877167878167879167880167881167882167883167884167885167886167887167888167889167890167891167892167893167894167895167896167897167898167899167900167901167902167903167904167905167906167907167908167909167910167911167912167913167914167915167916167917167918167919167920167921167922167923167924167925167926167927167928167929167930167931167932167933167934167935167936167937167938167939167940167941167942167943167944167945167946167947167948167949167950167951167952167953167954167955167956167957167958167959167960167961167962167963167964167965167966167967167968167969167970167971167972167973167974167975167976167977167978167979167980167981167982167983167984167985167986167987167988167989167990167991167992167993167994167995167996167997167998167999168000168001168002168003168004168005168006168007168008168009168010168011168012168013168014168015168016168017168018168019168020168021168022168023168024168025168026168027168028168029168030168031168032168033168034168035168036168037168038168039168040168041168042168043168044168045168046168047168048168049168050168051168052168053168054168055168056168057168058168059168060168061168062168063168064168065168066168067168068168069168070168071168072168073168074168075168076168077168078168079168080168081168082168083168084168085168086168087168088168089168090168091168092168093168094168095168096168097168098168099168100168101168102168103168104168105168106168107168108168109168110168111168112168113168114168115168116168117168118168119168120168121168122168123168124168125168126168127168128168129168130168131168132168133168134168135168136168137168138168139168140168141168142168143168144168145168146168147168148168149168150168151168152168153168154168155168156168157168158168159168160168161168162168163168164168165168166168167168168168169168170168171168172168173168174168175168176168177168178168179168180168181168182168183168184168185168186168187168188168189168190168191168192168193168194168195168196168197168198168199168200168201168202168203168204168205168206168207168208168209168210168211168212168213168214168215168216168217168218168219168220168221168222168223168224168225168226168227168228168229168230168231168232168233168234168235168236168237168238168239168240168241168242168243168244168245168246168247168248168249168250168251168252168253168254168255168256168257168258168259168260168261168262168263168264168265168266168267168268168269168270168271168272168273168274168275168276168277168278168279168280168281168282168283168284168285168286168287168288168289168290168291168292168293168294168295168296168297168298168299168300168301168302168303168304168305168306168307168308168309168310168311168312168313168314168315168316168317168318168319168320168321168322168323168324168325168326168327168328168329168330168331168332168333168334168335168336168337168338168339168340168341168342168343168344168345168346168347168348168349168350168351168352168353168354168355168356168357168358168359168360168361168362168363168364168365168366168367168368168369168370168371168372168373168374168375168376168377168378168379168380168381168382168383168384168385168386168387168388168389168390168391168392168393168394168395168396168397168398168399168400168401168402168403168404168405168406168407168408168409168410168411168412168413168414168415168416168417168418168419168420168421168422168423168424168425168426168427168428168429168430168431168432168433168434168435168436168437168438168439168440168441168442168443168444168445168446168447168448168449168450168451168452168453168454168455168456168457168458168459168460168461168462168463168464168465168466168467168468168469168470168471168472168473168474168475168476168477168478168479168480168481168482168483168484168485168486168487168488168489168490168491168492168493168494168495168496168497168498168499168500168501168502168503168504168505168506168507168508168509168510168511168512168513168514168515168516168517168518168519168520168521168522168523168524168525168526168527168528168529168530168531168532168533168534168535168536168537168538168539168540168541168542168543168544168545168546168547168548168549168550168551168552168553168554168555168556168557168558168559168560168561168562168563168564168565168566168567168568168569168570168571168572168573168574168575168576168577168578168579168580168581168582168583168584168585168586168587168588168589168590168591168592168593168594168595168596168597168598168599168600168601168602168603168604168605168606168607168608168609168610168611168612168613168614168615168616168617168618168619168620168621168622168623168624168625168626168627168628168629168630168631168632168633168634168635168636168637168638168639168640168641168642168643168644168645168646168647168648168649168650168651168652168653168654168655168656168657168658168659168660168661168662168663168664168665168666168667168668168669168670168671168672168673168674168675168676168677168678168679168680168681168682168683168684168685168686168687168688168689168690168691168692168693168694168695168696168697168698168699168700168701168702168703168704168705168706168707168708168709168710168711168712168713168714168715168716168717168718168719168720168721168722168723168724168725168726168727168728168729168730168731168732168733168734168735168736168737168738168739168740168741168742168743168744168745168746168747168748168749168750168751168752168753168754168755168756168757168758168759168760168761168762168763168764168765168766168767168768168769168770168771168772168773168774168775168776168777168778168779168780168781168782168783168784168785168786168787168788168789168790168791168792168793168794168795168796168797168798168799168800168801168802168803168804168805168806168807168808168809168810168811168812168813168814168815168816168817168818168819168820168821168822168823168824168825168826168827168828168829168830168831168832168833168834168835168836168837168838168839168840168841168842168843168844168845168846168847168848168849168850168851168852168853168854168855168856168857168858168859168860168861168862168863168864168865168866168867168868168869168870168871168872168873168874168875168876168877168878168879168880168881168882168883168884168885168886168887168888168889168890168891168892168893168894168895168896168897168898168899168900168901168902168903168904168905168906168907168908168909168910168911168912168913168914168915168916168917168918168919168920168921168922168923168924168925168926168927168928168929168930168931168932168933168934168935168936168937168938168939168940168941168942168943168944168945168946168947168948168949168950168951168952168953168954168955168956168957168958168959168960168961168962168963168964168965168966168967168968168969168970168971168972168973168974168975168976168977168978168979168980168981168982168983168984168985168986168987168988168989168990168991168992168993168994168995168996168997168998168999169000169001169002169003169004169005169006169007169008169009169010169011169012169013169014169015169016169017169018169019169020169021169022169023169024169025169026169027169028169029169030169031169032169033169034169035169036169037169038169039169040169041169042169043169044169045169046169047169048169049169050169051169052169053169054169055169056169057169058169059169060169061169062169063169064169065169066169067169068169069169070169071169072169073169074169075169076169077169078169079169080169081169082169083169084169085169086169087169088169089169090169091169092169093169094169095169096169097169098169099169100169101169102169103169104169105169106169107169108169109169110169111169112169113169114169115169116169117169118169119169120169121169122169123169124169125169126169127169128169129169130169131169132169133169134169135169136169137169138169139169140169141169142169143169144169145169146169147169148169149169150169151169152169153169154169155169156169157169158169159169160169161169162169163169164169165169166169167169168169169169170169171169172169173169174169175169176169177169178169179169180169181169182169183169184169185169186169187169188169189169190169191169192169193169194169195169196169197169198169199169200169201169202169203169204169205169206169207169208169209169210169211169212169213169214169215169216169217169218169219169220169221169222169223169224169225169226169227169228169229169230169231169232169233169234169235169236169237169238169239169240169241169242169243169244169245169246169247169248169249169250169251169252169253169254169255169256169257169258169259169260169261169262169263169264169265169266169267169268169269169270169271169272169273169274169275169276169277169278169279169280169281169282169283169284169285169286169287169288169289169290169291169292169293169294169295169296169297169298169299169300169301169302169303169304169305169306169307169308169309169310169311169312169313169314169315169316169317169318169319169320169321169322169323169324169325169326169327169328169329169330169331169332169333169334169335169336169337169338169339169340169341169342169343169344169345169346169347169348169349169350169351169352169353169354169355169356169357169358169359169360169361169362169363169364169365169366169367169368169369169370169371169372169373169374169375169376169377169378169379169380169381169382169383169384169385169386169387169388169389169390169391169392169393169394169395169396169397169398169399169400169401169402169403169404169405169406169407169408169409169410169411169412169413169414169415169416169417169418169419169420169421169422169423169424169425169426169427169428169429169430169431169432169433169434169435169436169437169438169439169440169441169442169443169444169445169446169447169448169449169450169451169452169453169454169455169456169457169458169459169460169461169462169463169464169465169466169467169468169469169470169471169472169473169474169475169476169477169478169479169480169481169482169483169484169485169486169487169488169489169490169491169492169493169494169495169496169497169498169499169500169501169502169503169504169505169506169507169508169509169510169511169512169513169514169515169516169517169518169519169520169521169522169523169524169525169526169527169528169529169530169531169532169533169534169535169536169537169538169539169540169541169542169543169544169545169546169547169548169549169550169551169552169553169554169555169556169557169558169559169560169561169562169563169564169565169566169567169568169569169570169571169572169573169574169575169576169577169578169579169580169581169582169583169584169585169586169587169588169589169590169591169592169593169594169595169596169597169598169599169600169601169602169603169604169605169606169607169608169609169610169611169612169613169614169615169616169617169618169619169620169621169622169623169624169625169626169627169628169629169630169631169632169633169634169635169636169637169638169639169640169641169642169643169644169645169646169647169648169649169650169651169652169653169654169655169656169657169658169659169660169661169662169663169664169665169666169667169668169669169670169671169672169673169674169675169676169677169678169679169680169681169682169683169684169685169686169687169688169689169690169691169692169693169694169695169696169697169698169699169700169701169702169703169704169705169706169707169708169709169710169711169712169713169714169715169716169717169718169719169720169721169722169723169724169725169726169727169728169729169730169731169732169733169734169735169736169737169738169739169740169741169742169743169744169745169746169747169748169749169750169751169752169753169754169755169756169757169758169759169760169761169762169763169764169765169766169767169768169769169770169771169772169773169774169775169776169777169778169779169780169781169782169783169784169785169786169787169788169789169790169791169792169793169794169795169796169797169798169799169800169801169802169803169804169805169806169807169808169809169810169811169812169813169814169815169816169817169818169819169820169821169822169823169824169825169826169827169828169829169830169831169832169833169834169835169836169837169838169839169840169841169842169843169844169845169846169847169848169849169850169851169852169853169854169855169856169857169858169859169860169861169862169863169864169865169866169867169868169869169870169871169872169873169874169875169876169877169878169879169880169881169882169883169884169885169886169887169888169889169890169891169892169893169894169895169896169897169898169899169900169901169902169903169904169905169906169907169908169909169910169911169912169913169914169915169916169917169918169919169920169921169922169923169924169925169926169927169928169929169930169931169932169933169934169935169936169937169938169939169940169941169942169943169944169945169946169947169948169949169950169951169952169953169954169955169956169957169958169959169960169961169962169963169964169965169966169967169968169969169970169971169972169973169974169975169976169977169978169979169980169981169982169983169984169985169986169987169988169989169990169991169992169993169994169995169996169997169998169999170000170001170002170003170004170005170006170007170008170009170010170011170012170013170014170015170016170017170018170019170020170021170022170023170024170025170026170027170028170029170030170031170032170033170034170035170036170037170038170039170040170041170042170043170044170045170046170047170048170049170050170051170052170053170054170055170056170057170058170059170060170061170062170063170064170065170066170067170068170069170070170071170072170073170074170075170076170077170078170079170080170081170082170083170084170085170086170087170088170089170090170091170092170093170094170095170096170097170098170099170100170101170102170103170104170105170106170107170108170109170110170111170112170113170114170115170116170117170118170119170120170121170122170123170124170125170126170127170128170129170130170131170132170133170134170135170136170137170138170139170140170141170142170143170144170145170146170147170148170149170150170151170152170153170154170155170156170157170158170159170160170161170162170163170164170165170166170167170168170169170170170171170172170173170174170175170176170177170178170179170180170181170182170183170184170185170186170187170188170189170190170191170192170193170194170195170196170197170198170199170200170201170202170203170204170205170206170207170208170209170210170211170212170213170214170215170216170217170218170219170220170221170222170223170224170225170226170227170228170229170230170231170232170233170234170235170236170237170238170239170240170241170242170243170244170245170246170247170248170249170250170251170252170253170254170255170256170257170258170259170260170261170262170263170264170265170266170267170268170269170270170271170272170273170274170275170276170277170278170279170280170281170282170283170284170285170286170287170288170289170290170291170292170293170294170295170296170297170298170299170300170301170302170303170304170305170306170307170308170309170310170311170312170313170314170315170316170317170318170319170320170321170322170323170324170325170326170327170328170329170330170331170332170333170334170335170336170337170338170339170340170341170342170343170344170345170346170347170348170349170350170351170352170353170354170355170356170357170358170359170360170361170362170363170364170365170366170367170368170369170370170371170372170373170374170375170376170377170378170379170380170381170382170383170384170385170386170387170388170389170390170391170392170393170394170395170396170397170398170399170400170401170402170403170404170405170406170407170408170409170410170411170412170413170414170415170416170417170418170419170420170421170422170423170424170425170426170427170428170429170430170431170432170433170434170435170436170437170438170439170440170441170442170443170444170445170446170447170448170449170450170451170452170453170454170455170456170457170458170459170460170461170462170463170464170465170466170467170468170469170470170471170472170473170474170475170476170477170478170479170480170481170482170483170484170485170486170487170488170489170490170491170492170493170494170495170496170497170498170499170500170501170502170503170504170505170506170507170508170509170510170511170512170513170514170515170516170517170518170519170520170521170522170523170524170525170526170527170528170529170530170531170532170533170534170535170536170537170538170539170540170541170542170543170544170545170546170547170548170549170550170551170552170553170554170555170556170557170558170559170560170561170562170563170564170565170566170567170568170569170570170571170572170573170574170575170576170577170578170579170580170581170582170583170584170585170586170587170588170589170590170591170592170593170594170595170596170597170598170599170600170601170602170603170604170605170606170607170608170609170610170611170612170613170614170615170616170617170618170619170620170621170622170623170624170625170626170627170628170629170630170631170632170633170634170635170636170637170638170639170640170641170642170643170644170645170646170647170648170649170650170651170652170653170654170655170656170657170658170659170660170661170662170663170664170665170666170667170668170669170670170671170672170673170674170675170676170677170678170679170680170681170682170683170684170685170686170687170688170689170690170691170692170693170694170695170696170697170698170699170700170701170702170703170704170705170706170707170708170709170710170711170712170713170714170715170716170717170718170719170720170721170722170723170724170725170726170727170728170729170730170731170732170733170734170735170736170737170738170739170740170741170742170743170744170745170746170747170748170749170750170751170752170753170754170755170756170757170758170759170760170761170762170763170764170765170766170767170768170769170770170771170772170773170774170775170776170777170778170779170780170781170782170783170784170785170786170787170788170789170790170791170792170793170794170795170796170797170798170799170800170801170802170803170804170805170806170807170808170809170810170811170812170813170814170815170816170817170818170819170820170821170822170823170824170825170826170827170828170829170830170831170832170833170834170835170836170837170838170839170840170841170842170843170844170845170846170847170848170849170850170851170852170853170854170855170856170857170858170859170860170861170862170863170864170865170866170867170868170869170870170871170872170873170874170875170876170877170878170879170880170881170882170883170884170885170886170887170888170889170890170891170892170893170894170895170896170897170898170899170900170901170902170903170904170905170906170907170908170909170910170911170912170913170914170915170916170917170918170919170920170921170922170923170924170925170926170927170928170929170930170931170932170933170934170935170936170937170938170939170940170941170942170943170944170945170946170947170948170949170950170951170952170953170954170955170956170957170958170959170960170961170962170963170964170965170966170967170968170969170970170971170972170973170974170975170976170977170978170979170980170981170982170983170984170985170986170987170988170989170990170991170992170993170994170995170996170997170998170999171000171001171002171003171004171005171006171007171008171009171010171011171012171013171014171015171016171017171018171019171020171021171022171023171024171025171026171027171028171029171030171031171032171033171034171035171036171037171038171039171040171041171042171043171044171045171046171047171048171049171050171051171052171053171054171055171056171057171058171059171060171061171062171063171064171065171066171067171068171069171070171071171072171073171074171075171076171077171078171079171080171081171082171083171084171085171086171087171088171089171090171091171092171093171094171095171096171097171098171099171100171101171102171103171104171105171106171107171108171109171110171111171112171113171114171115171116171117171118171119171120171121171122171123171124171125171126171127171128171129171130171131171132171133171134171135171136171137171138171139171140171141171142171143171144171145171146171147171148171149171150171151171152171153171154171155171156171157171158171159171160171161171162171163171164171165171166171167171168171169171170171171171172171173171174171175171176171177171178171179171180171181171182171183171184171185171186171187171188171189171190171191171192171193171194171195171196171197171198171199171200171201171202171203171204171205171206171207171208171209171210171211171212171213171214171215171216171217171218171219171220171221171222171223171224171225171226171227171228171229171230171231171232171233171234171235171236171237171238171239171240171241171242171243171244171245171246171247171248171249171250171251171252171253171254171255171256171257171258171259171260171261171262171263171264171265171266171267171268171269171270171271171272171273171274171275171276171277171278171279171280171281171282171283171284171285171286171287171288171289171290171291171292171293171294171295171296171297171298171299171300171301171302171303171304171305171306171307171308171309171310171311171312171313171314171315171316171317171318171319171320171321171322171323171324171325171326171327171328171329171330171331171332171333171334171335171336171337171338171339171340171341171342171343171344171345171346171347171348171349171350171351171352171353171354171355171356171357171358171359171360171361171362171363171364171365171366171367171368171369171370171371171372171373171374171375171376171377171378171379171380171381171382171383171384171385171386171387171388171389171390171391171392171393171394171395171396171397171398171399171400171401171402171403171404171405171406171407171408171409171410171411171412171413171414171415171416171417171418171419171420171421171422171423171424171425171426171427171428171429171430171431171432171433171434171435171436171437171438171439171440171441171442171443171444171445171446171447171448171449171450171451171452171453171454171455171456171457171458171459171460171461171462171463171464171465171466171467171468171469171470171471171472171473171474171475171476171477171478171479171480171481171482171483171484171485171486171487171488171489171490171491171492171493171494171495171496171497171498171499171500171501171502171503171504171505171506171507171508171509171510171511171512171513171514171515171516171517171518171519171520171521171522171523171524171525171526171527171528171529171530171531171532171533171534171535171536171537171538171539171540171541171542171543171544171545171546171547171548171549171550171551171552171553171554171555171556171557171558171559171560171561171562171563171564171565171566171567171568171569171570171571171572171573171574171575171576171577171578171579171580171581171582171583171584171585171586171587171588171589171590171591171592171593171594171595171596171597171598171599171600171601171602171603171604171605171606171607171608171609171610171611171612171613171614171615171616171617171618171619171620171621171622171623171624171625171626171627171628171629171630171631171632171633171634171635171636171637171638171639171640171641171642171643171644171645171646171647171648171649171650171651171652171653171654171655171656171657171658171659171660171661171662171663171664171665171666171667171668171669171670171671171672171673171674171675171676171677171678171679171680171681171682171683171684171685171686171687171688171689171690171691171692171693171694171695171696171697171698171699171700171701171702171703171704171705171706171707171708171709171710171711171712171713171714171715171716171717171718171719171720171721171722171723171724171725171726171727171728171729171730171731171732171733171734171735171736171737171738171739171740171741171742171743171744171745171746171747171748171749171750171751171752171753171754171755171756171757171758171759171760171761171762171763171764171765171766171767171768171769171770171771171772171773171774171775171776171777171778171779171780171781171782171783171784171785171786171787171788171789171790171791171792171793171794171795171796171797171798171799171800171801171802171803171804171805171806171807171808171809171810171811171812171813171814171815171816171817171818171819171820171821171822171823171824171825171826171827171828171829171830171831171832171833171834171835171836171837171838171839171840171841171842171843171844171845171846171847171848171849171850171851171852171853171854171855171856171857171858171859171860171861171862171863171864171865171866171867171868171869171870171871171872171873171874171875171876171877171878171879171880171881171882171883171884171885171886171887171888171889171890171891171892171893171894171895171896171897171898171899171900171901171902171903171904171905171906171907171908171909171910171911171912171913171914171915171916171917171918171919171920171921171922171923171924171925171926171927171928171929171930171931171932171933171934171935171936171937171938171939171940171941171942171943171944171945171946171947171948171949171950171951171952171953171954171955171956171957171958171959171960171961171962171963171964171965171966171967171968171969171970171971171972171973171974171975171976171977171978171979171980171981171982171983171984171985171986171987171988171989171990171991171992171993171994171995171996171997171998171999172000172001172002172003172004172005172006172007172008172009172010172011172012172013172014172015172016172017172018172019172020172021172022172023172024172025172026172027172028172029172030172031172032172033172034172035172036172037172038172039172040172041172042172043172044172045172046172047172048172049172050172051172052172053172054172055172056172057172058172059172060172061172062172063172064172065172066172067172068172069172070172071172072172073172074172075172076172077172078172079172080172081172082172083172084172085172086172087172088172089172090172091172092172093172094172095172096172097172098172099172100172101172102172103172104172105172106172107172108172109172110172111172112172113172114172115172116172117172118172119172120172121172122172123172124172125172126172127172128172129172130172131172132172133172134172135172136172137172138172139172140172141172142172143172144172145172146172147172148172149172150172151172152172153172154172155172156172157172158172159172160172161172162172163172164172165172166172167172168172169172170172171172172172173172174172175172176172177172178172179172180172181172182172183172184172185172186172187172188172189172190172191172192172193172194172195172196172197172198172199172200172201172202172203172204172205172206172207172208172209172210172211172212172213172214172215172216172217172218172219172220172221172222172223172224172225172226172227172228172229172230172231172232172233172234172235172236172237172238172239172240172241172242172243172244172245172246172247172248172249172250172251172252172253172254172255172256172257172258172259172260172261172262172263172264172265172266172267172268172269172270172271172272172273172274172275172276172277172278172279172280172281172282172283172284172285172286172287172288172289172290172291172292172293172294172295172296172297172298172299172300172301172302172303172304172305172306172307172308172309172310172311172312172313172314172315172316172317172318172319172320172321172322172323172324172325172326172327172328172329172330172331172332172333172334172335172336172337172338172339172340172341172342172343172344172345172346172347172348172349172350172351172352172353172354172355172356172357172358172359172360172361172362172363172364172365172366172367172368172369172370172371172372172373172374172375172376172377172378172379172380172381172382172383172384172385172386172387172388172389172390172391172392172393172394172395172396172397172398172399172400172401172402172403172404172405172406172407172408172409172410172411172412172413172414172415172416172417172418172419172420172421172422172423172424172425172426172427172428172429172430172431172432172433172434172435172436172437172438172439172440172441172442172443172444172445172446172447172448172449172450172451172452172453172454172455172456172457172458172459172460172461172462172463172464172465172466172467172468172469172470172471172472172473172474172475172476172477172478172479172480172481172482172483172484172485172486172487172488172489172490172491172492172493172494172495172496172497172498172499172500172501172502172503172504172505172506172507172508172509172510172511172512172513172514172515172516172517172518172519172520172521172522172523172524172525172526172527172528172529172530172531172532172533172534172535172536172537172538172539172540172541172542172543172544172545172546172547172548172549172550172551172552172553172554172555172556172557172558172559172560172561172562172563172564172565172566172567172568172569172570172571172572172573172574172575172576172577172578172579172580172581172582172583172584172585172586172587172588172589172590172591172592172593172594172595172596172597172598172599172600172601172602172603172604172605172606172607172608172609172610172611172612172613172614172615172616172617172618172619172620172621172622172623172624172625172626172627172628172629172630172631172632172633172634172635172636172637172638172639172640172641172642172643172644172645172646172647172648172649172650172651172652172653172654172655172656172657172658172659172660172661172662172663172664172665172666172667172668172669172670172671172672172673172674172675172676172677172678172679172680172681172682172683172684172685172686172687172688172689172690172691172692172693172694172695172696172697172698172699172700172701172702172703172704172705172706172707172708172709172710172711172712172713172714172715172716172717172718172719172720172721172722172723172724172725172726172727172728172729172730172731172732172733172734172735172736172737172738172739172740172741172742172743172744172745172746172747172748172749172750172751172752172753172754172755172756172757172758172759172760172761172762172763172764172765172766172767172768172769172770172771172772172773172774172775172776172777172778172779172780172781172782172783172784172785172786172787172788172789172790172791172792172793172794172795172796172797172798172799172800172801172802172803172804172805172806172807172808172809172810172811172812172813172814172815172816172817172818172819172820172821172822172823172824172825172826172827172828172829172830172831172832172833172834172835172836172837172838172839172840172841172842172843172844172845172846172847172848172849172850172851172852172853172854172855172856172857172858172859172860172861172862172863172864172865172866172867172868172869172870172871172872172873172874172875172876172877172878172879172880172881172882172883172884172885172886172887172888172889172890172891172892172893172894172895172896172897172898172899172900172901172902172903172904172905172906172907172908172909172910172911172912172913172914172915172916172917172918172919172920172921172922172923172924172925172926172927172928172929172930172931172932172933172934172935172936172937172938172939172940172941172942172943172944172945172946172947172948172949172950172951172952172953172954172955172956172957172958172959172960172961172962172963172964172965172966172967172968172969172970172971172972172973172974172975172976172977172978172979172980172981172982172983172984172985172986172987172988172989172990172991172992172993172994172995172996172997172998172999173000173001173002173003173004173005173006173007173008173009173010173011173012173013173014173015173016173017173018173019173020173021173022173023173024173025173026173027173028173029173030173031173032173033173034173035173036173037173038173039173040173041173042173043173044173045173046173047173048173049173050173051173052173053173054173055173056173057173058173059173060173061173062173063173064173065173066173067173068173069173070173071173072173073173074173075173076173077173078173079173080173081173082173083173084173085173086173087173088173089173090173091173092173093173094173095173096173097173098173099173100173101173102173103173104173105173106173107173108173109173110173111173112173113173114173115173116173117173118173119173120173121173122173123173124173125173126173127173128173129173130173131173132173133173134173135173136173137173138173139173140173141173142173143173144173145173146173147173148173149173150173151173152173153173154173155173156173157173158173159173160173161173162173163173164173165173166173167173168173169173170173171173172173173173174173175173176173177173178173179173180173181173182173183173184173185173186173187173188173189173190173191173192173193173194173195173196173197173198173199173200173201173202173203173204173205173206173207173208173209173210173211173212173213173214173215173216173217173218173219173220173221173222173223173224173225173226173227173228173229173230173231173232173233173234173235173236173237173238173239173240173241173242173243173244173245173246173247173248173249173250173251173252173253173254173255173256173257173258173259173260173261173262173263173264173265173266173267173268173269173270173271173272173273173274173275173276173277173278173279173280173281173282173283173284173285173286173287173288173289173290173291173292173293173294173295173296173297173298173299173300173301173302173303173304173305173306173307173308173309173310173311173312173313173314173315173316173317173318173319173320173321173322173323173324173325173326173327173328173329173330173331173332173333173334173335173336173337173338173339173340173341173342173343173344173345173346173347173348173349173350173351173352173353173354173355173356173357173358173359173360173361173362173363173364173365173366173367173368173369173370173371173372173373173374173375173376173377173378173379173380173381173382173383173384173385173386173387173388173389173390173391173392173393173394173395173396173397173398173399173400173401173402173403173404173405173406173407173408173409173410173411173412173413173414173415173416173417173418173419173420173421173422173423173424173425173426173427173428173429173430173431173432173433173434173435173436173437173438173439173440173441173442173443173444173445173446173447173448173449173450173451173452173453173454173455173456173457173458173459173460173461173462173463173464173465173466173467173468173469173470173471173472173473173474173475173476173477173478173479173480173481173482173483173484173485173486173487173488173489173490173491173492173493173494173495173496173497173498173499173500173501173502173503173504173505173506173507173508173509173510173511173512173513173514173515173516173517173518173519173520173521173522173523173524173525173526173527173528173529173530173531173532173533173534173535173536173537173538173539173540173541173542173543173544173545173546173547173548173549173550173551173552173553173554173555173556173557173558173559173560173561173562173563173564173565173566173567173568173569173570173571173572173573173574173575173576173577173578173579173580173581173582173583173584173585173586173587173588173589173590173591173592173593173594173595173596173597173598173599173600173601173602173603173604173605173606173607173608173609173610173611173612173613173614173615173616173617173618173619173620173621173622173623173624173625173626173627173628173629173630173631173632173633173634173635173636173637173638173639173640173641173642173643173644173645173646173647173648173649173650173651173652173653173654173655173656173657173658173659173660173661173662173663173664173665173666173667173668173669173670173671173672173673173674173675173676173677173678173679173680173681173682173683173684173685173686173687173688173689173690173691173692173693173694173695173696173697173698173699173700173701173702173703173704173705173706173707173708173709173710173711173712173713173714173715173716173717173718173719173720173721173722173723173724173725173726173727173728173729173730173731173732173733173734173735173736173737173738173739173740173741173742173743173744173745173746173747173748173749173750173751173752173753173754173755173756173757173758173759173760173761173762173763173764173765173766173767173768173769173770173771173772173773173774173775173776173777173778173779173780173781173782173783173784173785173786173787173788173789173790173791173792173793173794173795173796173797173798173799173800173801173802173803173804173805173806173807173808173809173810173811173812173813173814173815173816173817173818173819173820173821173822173823173824173825173826173827173828173829173830173831173832173833173834173835173836173837173838173839173840173841173842173843173844173845173846173847173848173849173850173851173852173853173854173855173856173857173858173859173860173861173862173863173864173865173866173867173868173869173870173871173872173873173874173875173876173877173878173879173880173881173882173883173884173885173886173887173888173889173890173891173892173893173894173895173896173897173898173899173900173901173902173903173904173905173906173907173908173909173910173911173912173913173914173915173916173917173918173919173920173921173922173923173924173925173926173927173928173929173930173931173932173933173934173935173936173937173938173939173940173941173942173943173944173945173946173947173948173949173950173951173952173953173954173955173956173957173958173959173960173961173962173963173964173965173966173967173968173969173970173971173972173973173974173975173976173977173978173979173980173981173982173983173984173985173986173987173988173989173990173991173992173993173994173995173996173997173998173999174000174001174002174003174004174005174006174007174008174009174010174011174012174013174014174015174016174017174018174019174020174021174022174023174024174025174026174027174028174029174030174031174032174033174034174035174036174037174038174039174040174041174042174043174044174045174046174047174048174049174050174051174052174053174054174055174056174057174058174059174060174061174062174063174064174065174066174067174068174069174070174071174072174073174074174075174076174077174078174079174080174081174082174083174084174085174086174087174088174089174090174091174092174093174094174095174096174097174098174099174100174101174102174103174104174105174106174107174108174109174110174111174112174113174114174115174116174117174118174119174120174121174122174123174124174125174126174127174128174129174130174131174132174133174134174135174136174137174138174139174140174141174142174143174144174145174146174147174148174149174150174151174152174153174154174155174156174157174158174159174160174161174162174163174164174165174166174167174168174169174170174171174172174173174174174175174176174177174178174179174180174181174182174183174184174185174186174187174188174189174190174191174192174193174194174195174196174197174198174199174200174201174202174203174204174205174206174207174208174209174210174211174212174213174214174215174216174217174218174219174220174221174222174223174224174225174226174227174228174229174230174231174232174233174234174235174236174237174238174239174240174241174242174243174244174245174246174247174248174249174250174251174252174253174254174255174256174257174258174259174260174261174262174263174264174265174266174267174268174269174270174271174272174273174274174275174276174277174278174279174280174281174282174283174284174285174286174287174288174289174290174291174292174293174294174295174296174297174298174299174300174301174302174303174304174305174306174307174308174309174310174311174312174313174314174315174316174317174318174319174320174321174322174323174324174325174326174327174328174329174330174331174332174333174334174335174336174337174338174339174340174341174342174343174344174345174346174347174348174349174350174351174352174353174354174355174356174357174358174359174360174361174362174363174364174365174366174367174368174369174370174371174372174373174374174375174376174377174378174379174380174381174382174383174384174385174386174387174388174389174390174391174392174393174394174395174396174397174398174399174400174401174402174403174404174405174406174407174408174409174410174411174412174413174414174415174416174417174418174419174420174421174422174423174424174425174426174427174428174429174430174431174432174433174434174435174436174437174438174439174440174441174442174443174444174445174446174447174448174449174450174451174452174453174454174455174456174457174458174459174460174461174462174463174464174465174466174467174468174469174470174471174472174473174474174475174476174477174478174479174480174481174482174483174484174485174486174487174488174489174490174491174492174493174494174495174496174497174498174499174500174501174502174503174504174505174506174507174508174509174510174511174512174513174514174515174516174517174518174519174520174521174522174523174524174525174526174527174528174529174530174531174532174533174534174535174536174537174538174539174540174541174542174543174544174545174546174547174548174549174550174551174552174553174554174555174556174557174558174559174560174561174562174563174564174565174566174567174568174569174570174571174572174573174574174575174576174577174578174579174580174581174582174583174584174585174586174587174588174589174590174591174592174593174594174595174596174597174598174599174600174601174602174603174604174605174606174607174608174609174610174611174612174613174614174615174616174617174618174619174620174621174622174623174624174625174626174627174628174629174630174631174632174633174634174635174636174637174638174639174640174641174642174643174644174645174646174647174648174649174650174651174652174653174654174655174656174657174658174659174660174661174662174663174664174665174666174667174668174669174670174671174672174673174674174675174676174677174678174679174680174681174682174683174684174685174686174687174688174689174690174691174692174693174694174695174696174697174698174699174700174701174702174703174704174705174706174707174708174709174710174711174712174713174714174715174716174717174718174719174720174721174722174723174724174725174726174727174728174729174730174731174732174733174734174735174736174737174738174739174740174741174742174743174744174745174746174747174748174749174750174751174752174753174754174755174756174757174758174759174760174761174762174763174764174765174766174767174768174769174770174771174772174773174774174775174776174777174778174779174780174781174782174783174784174785174786174787174788174789174790174791174792174793174794174795174796174797174798174799174800174801174802174803174804174805174806174807174808174809174810174811174812174813174814174815174816174817174818174819174820174821174822174823174824174825174826174827174828174829174830174831174832174833174834174835174836174837174838174839174840174841174842174843174844174845174846174847174848174849174850174851174852174853174854174855174856174857174858174859174860174861174862174863174864174865174866174867174868174869174870174871174872174873174874174875174876174877174878174879174880174881174882174883174884174885174886174887174888174889174890174891174892174893174894174895174896174897174898174899174900174901174902174903174904174905174906174907174908174909174910174911174912174913174914174915174916174917174918174919174920174921174922174923174924174925174926174927174928174929174930174931174932174933174934174935174936174937174938174939174940174941174942174943174944174945174946174947174948174949174950174951174952174953174954174955174956174957174958174959174960174961174962174963174964174965174966174967174968174969174970174971174972174973174974174975174976174977174978174979174980174981174982174983174984174985174986174987174988174989174990174991174992174993174994174995174996174997174998174999175000175001175002175003175004175005175006175007175008175009175010175011175012175013175014175015175016175017175018175019175020175021175022175023175024175025175026175027175028175029175030175031175032175033175034175035175036175037175038175039175040175041175042175043175044175045175046175047175048175049175050175051175052175053175054175055175056175057175058175059175060175061175062175063175064175065175066175067175068175069175070175071175072175073175074175075175076175077175078175079175080175081175082175083175084175085175086175087175088175089175090175091175092175093175094175095175096175097175098175099175100175101175102175103175104175105175106175107175108175109175110175111175112175113175114175115175116175117175118175119175120175121175122175123175124175125175126175127175128175129175130175131175132175133175134175135175136175137175138175139175140175141175142175143175144175145175146175147175148175149175150175151175152175153175154175155175156175157175158175159175160175161175162175163175164175165175166175167175168175169175170175171175172175173175174175175175176175177175178175179175180175181175182175183175184175185175186175187175188175189175190175191175192175193175194175195175196175197175198175199175200175201175202175203175204175205175206175207175208175209175210175211175212175213175214175215175216175217175218175219175220175221175222175223175224175225175226175227175228175229175230175231175232175233175234175235175236175237175238175239175240175241175242175243175244175245175246175247175248175249175250175251175252175253175254175255175256175257175258175259175260175261175262175263175264175265175266175267175268175269175270175271175272175273175274175275175276175277175278175279175280175281175282175283175284175285175286175287175288175289175290175291175292175293175294175295175296175297175298175299175300175301175302175303175304175305175306175307175308175309175310175311175312175313175314175315175316175317175318175319175320175321175322175323175324175325175326175327175328175329175330175331175332175333175334175335175336175337175338175339175340175341175342175343175344175345175346175347175348175349175350175351175352175353175354175355175356175357175358175359175360175361175362175363175364175365175366175367175368175369175370175371175372175373175374175375175376175377175378175379175380175381175382175383175384175385175386175387175388175389175390175391175392175393175394175395175396175397175398175399175400175401175402175403175404175405175406175407175408175409175410175411175412175413175414175415175416175417175418175419175420175421175422175423175424175425175426175427175428175429175430175431175432175433175434175435175436175437175438175439175440175441175442175443175444175445175446175447175448175449175450175451175452175453175454175455175456175457175458175459175460175461175462175463175464175465175466175467175468175469175470175471175472175473175474175475175476175477175478175479175480175481175482175483175484175485175486175487175488175489175490175491175492175493175494175495175496175497175498175499175500175501175502175503175504175505175506175507175508175509175510175511175512175513175514175515175516175517175518175519175520175521175522175523175524175525175526175527175528175529175530175531175532175533175534175535175536175537175538175539175540175541175542175543175544175545175546175547175548175549175550175551175552175553175554175555175556175557175558175559175560175561175562175563175564175565175566175567175568175569175570175571175572175573175574175575175576175577175578175579175580175581175582175583175584175585175586175587175588175589175590175591175592175593175594175595175596175597175598175599175600175601175602175603175604175605175606175607175608175609175610175611175612175613175614175615175616175617175618175619175620175621175622175623175624175625175626175627175628175629175630175631175632175633175634175635175636175637175638175639175640175641175642175643175644175645175646175647175648175649175650175651175652175653175654175655175656175657175658175659175660175661175662175663175664175665175666175667175668175669175670175671175672175673175674175675175676175677175678175679175680175681175682175683175684175685175686175687175688175689175690175691175692175693175694175695175696175697175698175699175700175701175702175703175704175705175706175707175708175709175710175711175712175713175714175715175716175717175718175719175720175721175722175723175724175725175726175727175728175729175730175731175732175733175734175735175736175737175738175739175740175741175742175743175744175745175746175747175748175749175750175751175752175753175754175755175756175757175758175759175760175761175762175763175764175765175766175767175768175769175770175771175772175773175774175775175776175777175778175779175780175781175782175783175784175785175786175787175788175789175790175791175792175793175794175795175796175797175798175799175800175801175802175803175804175805175806175807175808175809175810175811175812175813175814175815175816175817175818175819175820175821175822175823175824175825175826175827175828175829175830175831175832175833175834175835175836175837175838175839175840175841175842175843175844175845175846175847175848175849175850175851175852175853175854175855175856175857175858175859175860175861175862175863175864175865175866175867175868175869175870175871175872175873175874175875175876175877175878175879175880175881175882175883175884175885175886175887175888175889175890175891175892175893175894175895175896175897175898175899175900175901175902175903175904175905175906175907175908175909175910175911175912175913175914175915175916175917175918175919175920175921175922175923175924175925175926175927175928175929175930175931175932175933175934175935175936175937175938175939175940175941175942175943175944175945175946175947175948175949175950175951175952175953175954175955175956175957175958175959175960175961175962175963175964175965175966175967175968175969175970175971175972175973175974175975175976175977175978175979175980175981175982175983175984175985175986175987175988175989175990175991175992175993175994175995175996175997175998175999176000176001176002176003176004176005176006176007176008176009176010176011176012176013176014176015176016176017176018176019176020176021176022176023176024176025176026176027176028176029176030176031176032176033176034176035176036176037176038176039176040176041176042176043176044176045176046176047176048176049176050176051176052176053176054176055176056176057176058176059176060176061176062176063176064176065176066176067176068176069176070176071176072176073176074176075176076176077176078176079176080176081176082176083176084176085176086176087176088176089176090176091176092176093176094176095176096176097176098176099176100176101176102176103176104176105176106176107176108176109176110176111176112176113176114176115176116176117176118176119176120176121176122176123176124176125176126176127176128176129176130176131176132176133176134176135176136176137176138176139176140176141176142176143176144176145176146176147176148176149176150176151176152176153176154176155176156176157176158176159176160176161176162176163176164176165176166176167176168176169176170176171176172176173176174176175176176176177176178176179176180176181176182176183176184176185176186176187176188176189176190176191176192176193176194176195176196176197176198176199176200176201176202176203176204176205176206176207176208176209176210176211176212176213176214176215176216176217176218176219176220176221176222176223176224176225176226176227176228176229176230176231176232176233176234176235176236176237176238176239176240176241176242176243176244176245176246176247176248176249176250176251176252176253176254176255176256176257176258176259176260176261176262176263176264176265176266176267176268176269176270176271176272176273176274176275176276176277176278176279176280176281176282176283176284176285176286176287176288176289176290176291176292176293176294176295176296176297176298176299176300176301176302176303176304176305176306176307176308176309176310176311176312176313176314176315176316176317176318176319176320176321176322176323176324176325176326176327176328176329176330176331176332176333176334176335176336176337176338176339176340176341176342176343176344176345176346176347176348176349176350176351176352176353176354176355176356176357176358176359176360176361176362176363176364176365176366176367176368176369176370176371176372176373176374176375176376176377176378176379176380176381176382176383176384176385176386176387176388176389176390176391176392176393176394176395176396176397176398176399176400176401176402176403176404176405176406176407176408176409176410176411176412176413176414176415176416176417176418176419176420176421176422176423176424176425176426176427176428176429176430176431176432176433176434176435176436176437176438176439176440176441176442176443176444176445176446176447176448176449176450176451176452176453176454176455176456176457176458176459176460176461176462176463176464176465176466176467176468176469176470176471176472176473176474176475176476176477176478176479176480176481176482176483176484176485176486176487176488176489176490176491176492176493176494176495176496176497176498176499176500176501176502176503176504176505176506176507176508176509176510176511176512176513176514176515176516176517176518176519176520176521176522176523176524176525176526176527176528176529176530176531176532176533176534176535176536176537176538176539176540176541176542176543176544176545176546176547176548176549176550176551176552176553176554176555176556176557176558176559176560176561176562176563176564176565176566176567176568176569176570176571176572176573176574176575176576176577176578176579176580176581176582176583176584176585176586176587176588176589176590176591176592176593176594176595176596176597176598176599176600176601176602176603176604176605176606176607176608176609176610176611176612176613176614176615176616176617176618176619176620176621176622176623176624176625176626176627176628176629176630176631176632176633176634176635176636176637176638176639176640176641176642176643176644176645176646176647176648176649176650176651176652176653176654176655176656176657176658176659176660176661176662176663176664176665176666176667176668176669176670176671176672176673176674176675176676176677176678176679176680176681176682176683176684176685176686176687176688176689176690176691176692176693176694176695176696176697176698176699176700176701176702176703176704176705176706176707176708176709176710176711176712176713176714176715176716176717176718176719176720176721176722176723176724176725176726176727176728176729176730176731176732176733176734176735176736176737176738176739176740176741176742176743176744176745176746176747176748176749176750176751176752176753176754176755176756176757176758176759176760176761176762176763176764176765176766176767176768176769176770176771176772176773176774176775176776176777176778176779176780176781176782176783176784176785176786176787176788176789176790176791176792176793176794176795176796176797176798176799176800176801176802176803176804176805176806176807176808176809176810176811176812176813176814176815176816176817176818176819176820176821176822176823176824176825176826176827176828176829176830176831176832176833176834176835176836176837176838176839176840176841176842176843176844176845176846176847176848176849176850176851176852176853176854176855176856176857176858176859176860176861176862176863176864176865176866176867176868176869176870176871176872176873176874176875176876176877176878176879176880176881176882176883176884176885176886176887176888176889176890176891176892176893176894176895176896176897176898176899176900176901176902176903176904176905176906176907176908176909176910176911176912176913176914176915176916176917176918176919176920176921176922176923176924176925176926176927176928176929176930176931176932176933176934176935176936176937176938176939176940176941176942176943176944176945176946176947176948176949176950176951176952176953176954176955176956176957176958176959176960176961176962176963176964176965176966176967176968176969176970176971176972176973176974176975176976176977176978176979176980176981176982176983176984176985176986176987176988176989176990176991176992176993176994176995176996176997176998176999177000177001177002177003177004177005177006177007177008177009177010177011177012177013177014177015177016177017177018177019177020177021177022177023177024177025177026177027177028177029177030177031177032177033177034177035177036177037177038177039177040177041177042177043177044177045177046177047177048177049177050177051177052177053177054177055177056177057177058177059177060177061177062177063177064177065177066177067177068177069177070177071177072177073177074177075177076177077177078177079177080177081177082177083177084177085177086177087177088177089177090177091177092177093177094177095177096177097177098177099177100177101177102177103177104177105177106177107177108177109177110177111177112177113177114177115177116177117177118177119177120177121177122177123177124177125177126177127177128177129177130177131177132177133177134177135177136177137177138177139177140177141177142177143177144177145177146177147177148177149177150177151177152177153177154177155177156177157177158177159177160177161177162177163177164177165177166177167177168177169177170177171177172177173177174177175177176177177177178177179177180177181177182177183177184177185177186177187177188177189177190177191177192177193177194177195177196177197177198177199177200177201177202177203177204177205177206177207177208177209177210177211177212177213177214177215177216177217177218177219177220177221177222177223177224177225177226177227177228177229177230177231177232177233177234177235177236177237177238177239177240177241177242177243177244177245177246177247177248177249177250177251177252177253177254177255177256177257177258177259177260177261177262177263177264177265177266177267177268177269177270177271177272177273177274177275177276177277177278177279177280177281177282177283177284177285177286177287177288177289177290177291177292177293177294177295177296177297177298177299177300177301177302177303177304177305177306177307177308177309177310177311177312177313177314177315177316177317177318177319177320177321177322177323177324177325177326177327177328177329177330177331177332177333177334177335177336177337177338177339177340177341177342177343177344177345177346177347177348177349177350177351177352177353177354177355177356177357177358177359177360177361177362177363177364177365177366177367177368177369177370177371177372177373177374177375177376177377177378177379177380177381177382177383177384177385177386177387177388177389177390177391177392177393177394177395177396177397177398177399177400177401177402177403177404177405177406177407177408177409177410177411177412177413177414177415177416177417177418177419177420177421177422177423177424177425177426177427177428177429177430177431177432177433177434177435177436177437177438177439177440177441177442177443177444177445177446177447177448177449177450177451177452177453177454177455177456177457177458177459177460177461177462177463177464177465177466177467177468177469177470177471177472177473177474177475177476177477177478177479177480177481177482177483177484177485177486177487177488177489177490177491177492177493177494177495177496177497177498177499177500177501177502177503177504177505177506177507177508177509177510177511177512177513177514177515177516177517177518177519177520177521177522177523177524177525177526177527177528177529177530177531177532177533177534177535177536177537177538177539177540177541177542177543177544177545177546177547177548177549177550177551177552177553177554177555177556177557177558177559177560177561177562177563177564177565177566177567177568177569177570177571177572177573177574177575177576177577177578177579177580177581177582177583177584177585177586177587177588177589177590177591177592177593177594177595177596177597177598177599177600177601177602177603177604177605177606177607177608177609177610177611177612177613177614177615177616177617177618177619177620177621177622177623177624177625177626177627177628177629177630177631177632177633177634177635177636177637177638177639177640177641177642177643177644177645177646177647177648177649177650177651177652177653177654177655177656177657177658177659177660177661177662177663177664177665177666177667177668177669177670177671177672177673177674177675177676177677177678177679177680177681177682177683177684177685177686177687177688177689177690177691177692177693177694177695177696177697177698177699177700177701177702177703177704177705177706177707177708177709177710177711177712177713177714177715177716177717177718177719177720177721177722177723177724177725177726177727177728177729177730177731177732177733177734177735177736177737177738177739177740177741177742177743177744177745177746177747177748177749177750177751177752177753177754177755177756177757177758177759177760177761177762177763177764177765177766177767177768177769177770177771177772177773177774177775177776177777177778177779177780177781177782177783177784177785177786177787177788177789177790177791177792177793177794177795177796177797177798177799177800177801177802177803177804177805177806177807177808177809177810177811177812177813177814177815177816177817177818177819177820177821177822177823177824177825177826177827177828177829177830177831177832177833177834177835177836177837177838177839177840177841177842177843177844177845177846177847177848177849177850177851177852177853177854177855177856177857177858177859177860177861177862177863177864177865177866177867177868177869177870177871177872177873177874177875177876177877177878177879177880177881177882177883177884177885177886177887177888177889177890177891177892177893177894177895177896177897177898177899177900177901177902177903177904177905177906177907177908177909177910177911177912177913177914177915177916177917177918177919177920177921177922177923177924177925177926177927177928177929177930177931177932177933177934177935177936177937177938177939177940177941177942177943177944177945177946177947177948177949177950177951177952177953177954177955177956177957177958177959177960177961177962177963177964177965177966177967177968177969177970177971177972177973177974177975177976177977177978177979177980177981177982177983177984177985177986177987177988177989177990177991177992177993177994177995177996177997177998177999178000178001178002178003178004178005178006178007178008178009178010178011178012178013178014178015178016178017178018178019178020178021178022178023178024178025178026178027178028178029178030178031178032178033178034178035178036178037178038178039178040178041178042178043178044178045178046178047178048178049178050178051178052178053178054178055178056178057178058178059178060178061178062178063178064178065178066178067178068178069178070178071178072178073178074178075178076178077178078178079178080178081178082178083178084178085178086178087178088178089178090178091178092178093178094178095178096178097178098178099178100178101178102178103178104178105178106178107178108178109178110178111178112178113178114178115178116178117178118178119178120178121178122178123178124178125178126178127178128178129178130178131178132178133178134178135178136178137178138178139178140178141178142178143178144178145178146178147178148178149178150178151178152178153178154178155178156178157178158178159178160178161178162178163178164178165178166178167178168178169178170178171178172178173178174178175178176178177178178178179178180178181178182178183178184178185178186178187178188178189178190178191178192178193178194178195178196178197178198178199178200178201178202178203178204178205178206178207178208178209178210178211178212178213178214178215178216178217178218178219178220178221178222178223178224178225178226178227178228178229178230178231178232178233178234178235178236178237178238178239178240178241178242178243178244178245178246178247178248178249178250178251178252178253178254178255178256178257178258178259178260178261178262178263178264178265178266178267178268178269178270178271178272178273178274178275178276178277178278178279178280178281178282178283178284178285178286178287178288178289178290178291178292178293178294178295178296178297178298178299178300178301178302178303178304178305178306178307178308178309178310178311178312178313178314178315178316178317178318178319178320178321178322178323178324178325178326178327178328178329178330178331178332178333178334178335178336178337178338178339178340178341178342178343178344178345178346178347178348178349178350178351178352178353178354178355178356178357178358178359178360178361178362178363178364178365178366178367178368178369178370178371178372178373178374178375178376178377178378178379178380178381178382178383178384178385178386178387178388178389178390178391178392178393178394178395178396178397178398178399178400178401178402178403178404178405178406178407178408178409178410178411178412178413178414178415178416178417178418178419178420178421178422178423178424178425178426178427178428178429178430178431178432178433178434178435178436178437178438178439178440178441178442178443178444178445178446178447178448178449178450178451178452178453178454178455178456178457178458178459178460178461178462178463178464178465178466178467178468178469178470178471178472178473178474178475178476178477178478178479178480178481178482178483178484178485178486178487178488178489178490178491178492178493178494178495178496178497178498178499178500178501178502178503178504178505178506178507178508178509178510178511178512178513178514178515178516178517178518178519178520178521178522178523178524178525178526178527178528178529178530178531178532178533178534178535178536178537178538178539178540178541178542178543178544178545178546178547178548178549178550178551178552178553178554178555178556178557178558178559178560178561178562178563178564178565178566178567178568178569178570178571178572178573178574178575178576178577178578178579178580178581178582178583178584178585178586178587178588178589178590178591178592178593178594178595178596178597178598178599178600178601178602178603178604178605178606178607178608178609178610178611178612178613178614178615178616178617178618178619178620178621178622178623178624178625178626178627178628178629178630178631178632178633178634178635178636178637178638178639178640178641178642178643178644178645178646178647178648178649178650178651178652178653178654178655178656178657178658178659178660178661178662178663178664178665178666178667178668178669178670178671178672178673178674178675178676178677178678178679178680178681178682178683178684178685178686178687178688178689178690178691178692178693178694178695178696178697178698178699178700178701178702178703178704178705178706178707178708178709178710178711178712178713178714178715178716178717178718178719178720178721178722178723178724178725178726178727178728178729178730178731178732178733178734178735178736178737178738178739178740178741178742178743178744178745178746178747178748178749178750178751178752178753178754178755178756178757178758178759178760178761178762178763178764178765178766178767178768178769178770178771178772178773178774178775178776178777178778178779178780178781178782178783178784178785178786178787178788178789178790178791178792178793178794178795178796178797178798178799178800178801178802178803178804178805178806178807178808178809178810178811178812178813178814178815178816178817178818178819178820178821178822178823178824178825178826178827178828178829178830178831178832178833178834178835178836178837178838178839178840178841178842178843178844178845178846178847178848178849178850178851178852178853178854178855178856178857178858178859178860178861178862178863178864178865178866178867178868178869178870178871178872178873178874178875178876178877178878178879178880178881178882178883178884178885178886178887178888178889178890178891178892178893178894178895178896178897178898178899178900178901178902178903178904178905178906178907178908178909178910178911178912178913178914178915178916178917178918178919178920178921178922178923178924178925178926178927178928178929178930178931178932178933178934178935178936178937178938178939178940178941178942178943178944178945178946178947178948178949178950178951178952178953178954178955178956178957178958178959178960178961178962178963178964178965178966178967178968178969178970178971178972178973178974178975178976178977178978178979178980178981178982178983178984178985178986178987178988178989178990178991178992178993178994178995178996178997178998178999179000179001179002179003179004179005179006179007179008179009179010179011179012179013179014179015179016179017179018179019179020179021179022179023179024179025179026179027179028179029179030179031179032179033179034179035179036179037179038179039179040179041179042179043179044179045179046179047179048179049179050179051179052179053179054179055179056179057179058179059179060179061179062179063179064179065179066179067179068179069179070179071179072179073179074179075179076179077179078179079179080179081179082179083179084179085179086179087179088179089179090179091179092179093179094179095179096179097179098179099179100179101179102179103179104179105179106179107179108179109179110179111179112179113179114179115179116179117179118179119179120179121179122179123179124179125179126179127179128179129179130179131179132179133179134179135179136179137179138179139179140179141179142179143179144179145179146179147179148179149179150179151179152179153179154179155179156179157179158179159179160179161179162179163179164179165179166179167179168179169179170179171179172179173179174179175179176179177179178179179179180179181179182179183179184179185179186179187179188179189179190179191179192179193179194179195179196179197179198179199179200179201179202179203179204179205179206179207179208179209179210179211179212179213179214179215179216179217179218179219179220179221179222179223179224179225179226179227179228179229179230179231179232179233179234179235179236179237179238179239179240179241179242179243179244179245179246179247179248179249179250179251179252179253179254179255179256179257179258179259179260179261179262179263179264179265179266179267179268179269179270179271179272179273179274179275179276179277179278179279179280179281179282179283179284179285179286179287179288179289179290179291179292179293179294179295179296179297179298179299179300179301179302179303179304179305179306179307179308179309179310179311179312179313179314179315179316179317179318179319179320179321179322179323179324179325179326179327179328179329179330179331179332179333179334179335179336179337179338179339179340179341179342179343179344179345179346179347179348179349179350179351179352179353179354179355179356179357179358179359179360179361179362179363179364179365179366179367179368179369179370179371179372179373179374179375179376179377179378179379179380179381179382179383179384179385179386179387179388179389179390179391179392179393179394179395179396179397179398179399179400179401179402179403179404179405179406179407179408179409179410179411179412179413179414179415179416179417179418179419179420179421179422179423179424179425179426179427179428179429179430179431179432179433179434179435179436179437179438179439179440179441179442179443179444179445179446179447179448179449179450179451179452179453179454179455179456179457179458179459179460179461179462179463179464179465179466179467179468179469179470179471179472179473179474179475179476179477179478179479179480179481179482179483179484179485179486179487179488179489179490179491179492179493179494179495179496179497179498179499179500179501179502179503179504179505179506179507179508179509179510179511179512179513179514179515179516179517179518179519179520179521179522179523179524179525179526179527179528179529179530179531179532179533179534179535179536179537179538179539179540179541179542179543179544179545179546179547179548179549179550179551179552179553179554179555179556179557179558179559179560179561179562179563179564179565179566179567179568179569179570179571179572179573179574179575179576179577179578179579179580179581179582179583179584179585179586179587179588179589179590179591179592179593179594179595179596179597179598179599179600179601179602179603179604179605179606179607179608179609179610179611179612179613179614179615179616179617179618179619179620179621179622179623179624179625179626179627179628179629179630179631179632179633179634179635179636179637179638179639179640179641179642179643179644179645179646179647179648179649179650179651179652179653179654179655179656179657179658179659179660179661179662179663179664179665179666179667179668179669179670179671179672179673179674179675179676179677179678179679179680179681179682179683179684179685179686179687179688179689179690179691179692179693179694179695179696179697179698179699179700179701179702179703179704179705179706179707179708179709179710179711179712179713179714179715179716179717179718179719179720179721179722179723179724179725179726179727179728179729179730179731179732179733179734179735179736179737179738179739179740179741179742179743179744179745179746179747179748179749179750179751179752179753179754179755179756179757179758179759179760179761179762179763179764179765179766179767179768179769179770179771179772179773179774179775179776179777179778179779179780179781179782179783179784179785179786179787179788179789179790179791179792179793179794179795179796179797179798179799179800179801179802179803179804179805179806179807179808179809179810179811179812179813179814179815179816179817179818179819179820179821179822179823179824179825179826179827179828179829179830179831179832179833179834179835179836179837179838179839179840179841179842179843179844179845179846179847179848179849179850179851179852179853179854179855179856179857179858179859179860179861179862179863179864179865179866179867179868179869179870179871179872179873179874179875179876179877179878179879179880179881179882179883179884179885179886179887179888179889179890179891179892179893179894179895179896179897179898179899179900179901179902179903179904179905179906179907179908179909179910179911179912179913179914179915179916179917179918179919179920179921179922179923179924179925179926179927179928179929179930179931179932179933179934179935179936179937179938179939179940179941179942179943179944179945179946179947179948179949179950179951179952179953179954179955179956179957179958179959179960179961179962179963179964179965179966179967179968179969179970179971179972179973179974179975179976179977179978179979179980179981179982179983179984179985179986179987179988179989179990179991179992179993179994179995179996179997179998179999180000180001180002180003180004180005180006180007180008180009180010180011180012180013180014180015180016180017180018180019180020180021180022180023180024180025180026180027180028180029180030180031180032180033180034180035180036180037180038180039180040180041180042180043180044180045180046180047180048180049180050180051180052180053180054180055180056180057180058180059180060180061180062180063180064180065180066180067180068180069180070180071180072180073180074180075180076180077180078180079180080180081180082180083180084180085180086180087180088180089180090180091180092180093180094180095180096180097180098180099180100180101180102180103180104180105180106180107180108180109180110180111180112180113180114180115180116180117180118180119180120180121180122180123180124180125180126180127180128180129180130180131180132180133180134180135180136180137180138180139180140180141180142180143180144180145180146180147180148180149180150180151180152180153180154180155180156180157180158180159180160180161180162180163180164180165180166180167180168180169180170180171180172180173180174180175180176180177180178180179180180180181180182180183180184180185180186180187180188180189180190180191180192180193180194180195180196180197180198180199180200180201180202180203180204180205180206180207180208180209180210180211180212180213180214180215180216180217180218180219180220180221180222180223180224180225180226180227180228180229180230180231180232180233180234180235180236180237180238180239180240180241180242180243180244180245180246180247180248180249180250180251180252180253180254180255180256180257180258180259180260180261180262180263180264180265180266180267180268180269180270180271180272180273180274180275180276180277180278180279180280180281180282180283180284180285180286180287180288180289180290180291180292180293180294180295180296180297180298180299180300180301180302180303180304180305180306180307180308180309180310180311180312180313180314180315180316180317180318180319180320180321180322180323180324180325180326180327180328180329180330180331180332180333180334180335180336180337180338180339180340180341180342180343180344180345180346180347180348180349180350180351180352180353180354180355180356180357180358180359180360180361180362180363180364180365180366180367180368180369180370180371180372180373180374180375180376180377180378180379180380180381180382180383180384180385180386180387180388180389180390180391180392180393180394180395180396180397180398180399180400180401180402180403180404180405180406180407180408180409180410180411180412180413180414180415180416180417180418180419180420180421180422180423180424180425180426180427180428180429180430180431180432180433180434180435180436180437180438180439180440180441180442180443180444180445180446180447180448180449180450180451180452180453180454180455180456180457180458180459180460180461180462180463180464180465180466180467180468180469180470180471180472180473180474180475180476180477180478180479180480180481180482180483180484180485180486180487180488180489180490180491180492180493180494180495180496180497180498180499180500180501180502180503180504180505180506180507180508180509180510180511180512180513180514180515180516180517180518180519180520180521180522180523180524180525180526180527180528180529180530180531180532180533180534180535180536180537180538180539180540180541180542180543180544180545180546180547180548180549180550180551180552180553180554180555180556180557180558180559180560180561180562180563180564180565180566180567180568180569180570180571180572180573180574180575180576180577180578180579180580180581180582180583180584180585180586180587180588180589180590180591180592180593180594180595180596180597180598180599180600180601180602180603180604180605180606180607180608180609180610180611180612180613180614180615180616180617180618180619180620180621180622180623180624180625180626180627180628180629180630180631180632180633180634180635180636180637180638180639180640180641180642180643180644180645180646180647180648180649180650180651180652180653180654180655180656180657180658180659180660180661180662180663180664180665180666180667180668180669180670180671180672180673180674180675180676180677180678180679180680180681180682180683180684180685180686180687180688180689180690180691180692180693180694180695180696180697180698180699180700180701180702180703180704180705180706180707180708180709180710180711180712180713180714180715180716180717180718180719180720180721180722180723180724180725180726180727180728180729180730180731180732180733180734180735180736180737180738180739180740180741180742180743180744180745180746180747180748180749180750180751180752180753180754180755180756180757180758180759180760180761180762180763180764180765180766180767180768180769180770180771180772180773180774180775180776180777180778180779180780180781180782180783180784180785180786180787180788180789180790180791180792180793180794180795180796180797180798180799180800180801180802180803180804180805180806180807180808180809180810180811180812180813180814180815180816180817180818180819180820180821180822180823180824180825180826180827180828180829180830180831180832180833180834180835180836180837180838180839180840180841180842180843180844180845180846180847180848180849180850180851180852180853180854180855180856180857180858180859180860180861180862180863180864180865180866180867180868180869180870180871180872180873180874180875180876180877180878180879180880180881180882180883180884180885180886180887180888180889180890180891180892180893180894180895180896180897180898180899180900180901180902180903180904180905180906180907180908180909180910180911180912180913180914180915180916180917180918180919180920180921180922180923180924180925180926180927180928180929180930180931180932180933180934180935180936180937180938180939180940180941180942180943180944180945180946180947180948180949180950180951180952180953180954180955180956180957180958180959180960180961180962180963180964180965180966180967180968180969180970180971180972180973180974180975180976180977180978180979180980180981180982180983180984180985180986180987180988180989180990180991180992180993180994180995180996180997180998180999181000181001181002181003181004181005181006181007181008181009181010181011181012181013181014181015181016181017181018181019181020181021181022181023181024181025181026181027181028181029181030181031181032181033181034181035181036181037181038181039181040181041181042181043181044181045181046181047181048181049181050181051181052181053181054181055181056181057181058181059181060181061181062181063181064181065181066181067181068181069181070181071181072181073181074181075181076181077181078181079181080181081181082181083181084181085181086181087181088181089181090181091181092181093181094181095181096181097181098181099181100181101181102181103181104181105181106181107181108181109181110181111181112181113181114181115181116181117181118181119181120181121181122181123181124181125181126181127181128181129181130181131181132181133181134181135181136181137181138181139181140181141181142181143181144181145181146181147181148181149181150181151181152181153181154181155181156181157181158181159181160181161181162181163181164181165181166181167181168181169181170181171181172181173181174181175181176181177181178181179181180181181181182181183181184181185181186181187181188181189181190181191181192181193181194181195181196181197181198181199181200181201181202181203181204181205181206181207181208181209181210181211181212181213181214181215181216181217181218181219181220181221181222181223181224181225181226181227181228181229181230181231181232181233181234181235181236181237181238181239181240181241181242181243181244181245181246181247181248181249181250181251181252181253181254181255181256181257181258181259181260181261181262181263181264181265181266181267181268181269181270181271181272181273181274181275181276181277181278181279181280181281181282181283181284181285181286181287181288181289181290181291181292181293181294181295181296181297181298181299181300181301181302181303181304181305181306181307181308181309181310181311181312181313181314181315181316181317181318181319181320181321181322181323181324181325181326181327181328181329181330181331181332181333181334181335181336181337181338181339181340181341181342181343181344181345181346181347181348181349181350181351181352181353181354181355181356181357181358181359181360181361181362181363181364181365181366181367181368181369181370181371181372181373181374181375181376181377181378181379181380181381181382181383181384181385181386181387181388181389181390181391181392181393181394181395181396181397181398181399181400181401181402181403181404181405181406181407181408181409181410181411181412181413181414181415181416181417181418181419181420181421181422181423181424181425181426181427181428181429181430181431181432181433181434181435181436181437181438181439181440181441181442181443181444181445181446181447181448181449181450181451181452181453181454181455181456181457181458181459181460181461181462181463181464181465181466181467181468181469181470181471181472181473181474181475181476181477181478181479181480181481181482181483181484181485181486181487181488181489181490181491181492181493181494181495181496181497181498181499181500181501181502181503181504181505181506181507181508181509181510181511181512181513181514181515181516181517181518181519181520181521181522181523181524181525181526181527181528181529181530181531181532181533181534181535181536181537181538181539181540181541181542181543181544181545181546181547181548181549181550181551181552181553181554181555181556181557181558181559181560181561181562181563181564181565181566181567181568181569181570181571181572181573181574181575181576181577181578181579181580181581181582181583181584181585181586181587181588181589181590181591181592181593181594181595181596181597181598181599181600181601181602181603181604181605181606181607181608181609181610181611181612181613181614181615181616181617181618181619181620181621181622181623181624181625181626181627181628181629181630181631181632181633181634181635181636181637181638181639181640181641181642181643181644181645181646181647181648181649181650181651181652181653181654181655181656181657181658181659181660181661181662181663181664181665181666181667181668181669181670181671181672181673181674181675181676181677181678181679181680181681181682181683181684181685181686181687181688181689181690181691181692181693181694181695181696181697181698181699181700181701181702181703181704181705181706181707181708181709181710181711181712181713181714181715181716181717181718181719181720181721181722181723181724181725181726181727181728181729181730181731181732181733181734181735181736181737181738181739181740181741181742181743181744181745181746181747181748181749181750181751181752181753181754181755181756181757181758181759181760181761181762181763181764181765181766181767181768181769181770181771181772181773181774181775181776181777181778181779181780181781181782181783181784181785181786181787181788181789181790181791181792181793181794181795181796181797181798181799181800181801181802181803181804181805181806181807181808181809181810181811181812181813181814181815181816181817181818181819181820181821181822181823181824181825181826181827181828181829181830181831181832181833181834181835181836181837181838181839181840181841181842181843181844181845181846181847181848181849181850181851181852181853181854181855181856181857181858181859181860181861181862181863181864181865181866181867181868181869181870181871181872181873181874181875181876181877181878181879181880181881181882181883181884181885181886181887181888181889181890181891181892181893181894181895181896181897181898181899181900181901181902181903181904181905181906181907181908181909181910181911181912181913181914181915181916181917181918181919181920181921181922181923181924181925181926181927181928181929181930181931181932181933181934181935181936181937181938181939181940181941181942181943181944181945181946181947181948181949181950181951181952181953181954181955181956181957181958181959181960181961181962181963181964181965181966181967181968181969181970181971181972181973181974181975181976181977181978181979181980181981181982181983181984181985181986181987181988181989181990181991181992181993181994181995181996181997181998181999182000182001182002182003182004182005182006182007182008182009182010182011182012182013182014182015182016182017182018182019182020182021182022182023182024182025182026182027182028182029182030182031182032182033182034182035182036182037182038182039182040182041182042182043182044182045182046182047182048182049182050182051182052182053182054182055182056182057182058182059182060182061182062182063182064182065182066182067182068182069182070182071182072182073182074182075182076182077182078182079182080182081182082182083182084182085182086182087182088182089182090182091182092182093182094182095182096182097182098182099182100182101182102182103182104182105182106182107182108182109182110182111182112182113182114182115182116182117182118182119182120182121182122182123182124182125182126182127182128182129182130182131182132182133182134182135182136182137182138182139182140182141182142182143182144182145182146182147182148182149182150182151182152182153182154182155182156182157182158182159182160182161182162182163182164182165182166182167182168182169182170182171182172182173182174182175182176182177182178182179182180182181182182182183182184182185182186182187182188182189182190182191182192182193182194182195182196182197182198182199182200182201182202182203182204182205182206182207182208182209182210182211182212182213182214182215182216182217182218182219182220182221182222182223182224182225182226182227182228182229182230182231182232182233182234182235182236182237182238182239182240182241182242182243182244182245182246182247182248182249182250182251182252182253182254182255182256182257182258182259182260182261182262182263182264182265182266182267182268182269182270182271182272182273182274182275182276182277182278182279182280182281182282182283182284182285182286182287182288182289182290182291182292182293182294182295182296182297182298182299182300182301182302182303182304182305182306182307182308182309182310182311182312182313182314182315182316182317182318182319182320182321182322182323182324182325182326182327182328182329182330182331182332182333182334182335182336182337182338182339182340182341182342182343182344182345182346182347182348182349182350182351182352182353182354182355182356182357182358182359182360182361182362182363182364182365182366182367182368182369182370182371182372182373182374182375182376182377182378182379182380182381182382182383182384182385182386182387182388182389182390182391182392182393182394182395182396182397182398182399182400182401182402182403182404182405182406182407182408182409182410182411182412182413182414182415182416182417182418182419182420182421182422182423182424182425182426182427182428182429182430182431182432182433182434182435182436182437182438182439182440182441182442182443182444182445182446182447182448182449182450182451182452182453182454182455182456182457182458182459182460182461182462182463182464182465182466182467182468182469182470182471182472182473182474182475182476182477182478182479182480182481182482182483182484182485182486182487182488182489182490182491182492182493182494182495182496182497182498182499182500182501182502182503182504182505182506182507182508182509182510182511182512182513182514182515182516182517182518182519182520182521182522182523182524182525182526182527182528182529182530182531182532182533182534182535182536182537182538182539182540182541182542182543182544182545182546182547182548182549182550182551182552182553182554182555182556182557182558182559182560182561182562182563182564182565182566182567182568182569182570182571182572182573182574182575182576182577182578182579182580182581182582182583182584182585182586182587182588182589182590182591182592182593182594182595182596182597182598182599182600182601182602182603182604182605182606182607182608182609182610182611182612182613182614182615182616182617182618182619182620182621182622182623182624182625182626182627182628182629182630182631182632182633182634182635182636182637182638182639182640182641182642182643182644182645182646182647182648182649182650182651182652182653182654182655182656182657182658182659182660182661182662182663182664182665182666182667182668182669182670182671182672182673182674182675182676182677182678182679182680182681182682182683182684182685182686182687182688182689182690182691182692182693182694182695182696182697182698182699182700182701182702182703182704182705182706182707182708182709182710182711182712182713182714182715182716182717182718182719182720182721182722182723182724182725182726182727182728182729182730182731182732182733182734182735182736182737182738182739182740182741182742182743182744182745182746182747182748182749182750182751182752182753182754182755182756182757182758182759182760182761182762182763182764182765182766182767182768182769182770182771182772182773182774182775182776182777182778182779182780182781182782182783182784182785182786182787182788182789182790182791182792182793182794182795182796182797182798182799182800182801182802182803182804182805182806182807182808182809182810182811182812182813182814182815182816182817182818182819182820182821182822182823182824182825182826182827182828182829182830182831182832182833182834182835182836182837182838182839182840182841182842182843182844182845182846182847182848182849182850182851182852182853182854182855182856182857182858182859182860182861182862182863182864182865182866182867182868182869182870182871182872182873182874182875182876182877182878182879182880182881182882182883182884182885182886182887182888182889182890182891182892182893182894182895182896182897182898182899182900182901182902182903182904182905182906182907182908182909182910182911182912182913182914182915182916182917182918182919182920182921182922182923182924182925182926182927182928182929182930182931182932182933182934182935182936182937182938182939182940182941182942182943182944182945182946182947182948182949182950182951182952182953182954182955182956182957182958182959182960182961182962182963182964182965182966182967182968182969182970182971182972182973182974182975182976182977182978182979182980182981182982182983182984182985182986182987182988182989182990182991182992182993182994182995182996182997182998182999183000183001183002183003183004183005183006183007183008183009183010183011183012183013183014183015183016183017183018183019183020183021183022183023183024183025183026183027183028183029183030183031183032183033183034183035183036183037183038183039183040183041183042183043183044183045183046183047183048183049183050183051183052183053183054183055183056183057183058183059183060183061183062183063183064183065183066183067183068183069183070183071183072183073183074183075183076183077183078183079183080183081183082183083183084183085183086183087183088183089183090183091183092183093183094183095183096183097183098183099183100183101183102183103183104183105183106183107183108183109183110183111183112183113183114183115183116183117183118183119183120183121183122183123183124183125183126183127183128183129183130183131183132183133183134183135183136183137183138183139183140183141183142183143183144183145183146183147183148183149183150183151183152183153183154183155183156183157183158183159183160183161183162183163183164183165183166183167183168183169183170183171183172183173183174183175183176183177183178183179183180183181183182183183183184183185183186183187183188183189183190183191183192183193183194183195183196183197183198183199183200183201183202183203183204183205183206183207183208183209183210183211183212183213183214183215183216183217183218183219183220183221183222183223183224183225183226183227183228183229183230183231183232183233183234183235183236183237183238183239183240183241183242183243183244183245183246183247183248183249183250183251183252183253183254183255183256183257183258183259183260183261183262183263183264183265183266183267183268183269183270183271183272183273183274183275183276183277183278183279183280183281183282183283183284183285183286183287183288183289183290183291183292183293183294183295183296183297183298183299183300183301183302183303183304183305183306183307183308183309183310183311183312183313183314183315183316183317183318183319183320183321183322183323183324183325183326183327183328183329183330183331183332183333183334183335183336183337183338183339183340183341183342183343183344183345183346183347183348183349183350183351183352183353183354183355183356183357183358183359
  1. (function webpackUniversalModuleDefinition(root, factory) {
  2. if(typeof exports === 'object' && typeof module === 'object')
  3. module.exports = factory();
  4. else if(typeof define === 'function' && define.amd)
  5. define("Phaser", [], factory);
  6. else if(typeof exports === 'object')
  7. exports["Phaser"] = factory();
  8. else
  9. root["Phaser"] = factory();
  10. })(window, function() {
  11. return /******/ (function(modules) { // webpackBootstrap
  12. /******/ // The module cache
  13. /******/ var installedModules = {};
  14. /******/
  15. /******/ // The require function
  16. /******/ function __webpack_require__(moduleId) {
  17. /******/
  18. /******/ // Check if module is in cache
  19. /******/ if(installedModules[moduleId]) {
  20. /******/ return installedModules[moduleId].exports;
  21. /******/ }
  22. /******/ // Create a new module (and put it into the cache)
  23. /******/ var module = installedModules[moduleId] = {
  24. /******/ i: moduleId,
  25. /******/ l: false,
  26. /******/ exports: {}
  27. /******/ };
  28. /******/
  29. /******/ // Execute the module function
  30. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  31. /******/
  32. /******/ // Flag the module as loaded
  33. /******/ module.l = true;
  34. /******/
  35. /******/ // Return the exports of the module
  36. /******/ return module.exports;
  37. /******/ }
  38. /******/
  39. /******/
  40. /******/ // expose the modules object (__webpack_modules__)
  41. /******/ __webpack_require__.m = modules;
  42. /******/
  43. /******/ // expose the module cache
  44. /******/ __webpack_require__.c = installedModules;
  45. /******/
  46. /******/ // define getter function for harmony exports
  47. /******/ __webpack_require__.d = function(exports, name, getter) {
  48. /******/ if(!__webpack_require__.o(exports, name)) {
  49. /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
  50. /******/ }
  51. /******/ };
  52. /******/
  53. /******/ // define __esModule on exports
  54. /******/ __webpack_require__.r = function(exports) {
  55. /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  56. /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  57. /******/ }
  58. /******/ Object.defineProperty(exports, '__esModule', { value: true });
  59. /******/ };
  60. /******/
  61. /******/ // create a fake namespace object
  62. /******/ // mode & 1: value is a module id, require it
  63. /******/ // mode & 2: merge all properties of value into the ns
  64. /******/ // mode & 4: return value when already ns object
  65. /******/ // mode & 8|1: behave like require
  66. /******/ __webpack_require__.t = function(value, mode) {
  67. /******/ if(mode & 1) value = __webpack_require__(value);
  68. /******/ if(mode & 8) return value;
  69. /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
  70. /******/ var ns = Object.create(null);
  71. /******/ __webpack_require__.r(ns);
  72. /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
  73. /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
  74. /******/ return ns;
  75. /******/ };
  76. /******/
  77. /******/ // getDefaultExport function for compatibility with non-harmony modules
  78. /******/ __webpack_require__.n = function(module) {
  79. /******/ var getter = module && module.__esModule ?
  80. /******/ function getDefault() { return module['default']; } :
  81. /******/ function getModuleExports() { return module; };
  82. /******/ __webpack_require__.d(getter, 'a', getter);
  83. /******/ return getter;
  84. /******/ };
  85. /******/
  86. /******/ // Object.prototype.hasOwnProperty.call
  87. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  88. /******/
  89. /******/ // __webpack_public_path__
  90. /******/ __webpack_require__.p = "";
  91. /******/
  92. /******/
  93. /******/ // Load entry module and return exports
  94. /******/ return __webpack_require__(__webpack_require__.s = 1363);
  95. /******/ })
  96. /************************************************************************/
  97. /******/ ([
  98. /* 0 */
  99. /***/ (function(module, exports) {
  100. /**
  101. * @author Richard Davey <rich@photonstorm.com>
  102. * @copyright 2019 Photon Storm Ltd.
  103. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104. */
  105. // Taken from klasse by mattdesl https://github.com/mattdesl/klasse
  106. function hasGetterOrSetter (def)
  107. {
  108. return (!!def.get && typeof def.get === 'function') || (!!def.set && typeof def.set === 'function');
  109. }
  110. function getProperty (definition, k, isClassDescriptor)
  111. {
  112. // This may be a lightweight object, OR it might be a property that was defined previously.
  113. // For simple class descriptors we can just assume its NOT previously defined.
  114. var def = (isClassDescriptor) ? definition[k] : Object.getOwnPropertyDescriptor(definition, k);
  115. if (!isClassDescriptor && def.value && typeof def.value === 'object')
  116. {
  117. def = def.value;
  118. }
  119. // This might be a regular property, or it may be a getter/setter the user defined in a class.
  120. if (def && hasGetterOrSetter(def))
  121. {
  122. if (typeof def.enumerable === 'undefined')
  123. {
  124. def.enumerable = true;
  125. }
  126. if (typeof def.configurable === 'undefined')
  127. {
  128. def.configurable = true;
  129. }
  130. return def;
  131. }
  132. else
  133. {
  134. return false;
  135. }
  136. }
  137. function hasNonConfigurable (obj, k)
  138. {
  139. var prop = Object.getOwnPropertyDescriptor(obj, k);
  140. if (!prop)
  141. {
  142. return false;
  143. }
  144. if (prop.value && typeof prop.value === 'object')
  145. {
  146. prop = prop.value;
  147. }
  148. if (prop.configurable === false)
  149. {
  150. return true;
  151. }
  152. return false;
  153. }
  154. function extend (ctor, definition, isClassDescriptor, extend)
  155. {
  156. for (var k in definition)
  157. {
  158. if (!definition.hasOwnProperty(k))
  159. {
  160. continue;
  161. }
  162. var def = getProperty(definition, k, isClassDescriptor);
  163. if (def !== false)
  164. {
  165. // If Extends is used, we will check its prototype to see if the final variable exists.
  166. var parent = extend || ctor;
  167. if (hasNonConfigurable(parent.prototype, k))
  168. {
  169. // Just skip the final property
  170. if (Class.ignoreFinals)
  171. {
  172. continue;
  173. }
  174. // We cannot re-define a property that is configurable=false.
  175. // So we will consider them final and throw an error. This is by
  176. // default so it is clear to the developer what is happening.
  177. // You can set ignoreFinals to true if you need to extend a class
  178. // which has configurable=false; it will simply not re-define final properties.
  179. throw new Error('cannot override final property \'' + k + '\', set Class.ignoreFinals = true to skip');
  180. }
  181. Object.defineProperty(ctor.prototype, k, def);
  182. }
  183. else
  184. {
  185. ctor.prototype[k] = definition[k];
  186. }
  187. }
  188. }
  189. function mixin (myClass, mixins)
  190. {
  191. if (!mixins)
  192. {
  193. return;
  194. }
  195. if (!Array.isArray(mixins))
  196. {
  197. mixins = [ mixins ];
  198. }
  199. for (var i = 0; i < mixins.length; i++)
  200. {
  201. extend(myClass, mixins[i].prototype || mixins[i]);
  202. }
  203. }
  204. /**
  205. * Creates a new class with the given descriptor.
  206. * The constructor, defined by the name `initialize`,
  207. * is an optional function. If unspecified, an anonymous
  208. * function will be used which calls the parent class (if
  209. * one exists).
  210. *
  211. * You can also use `Extends` and `Mixins` to provide subclassing
  212. * and inheritance.
  213. *
  214. * @class Class
  215. * @constructor
  216. * @param {Object} definition a dictionary of functions for the class
  217. * @example
  218. *
  219. * var MyClass = new Phaser.Class({
  220. *
  221. * initialize: function() {
  222. * this.foo = 2.0;
  223. * },
  224. *
  225. * bar: function() {
  226. * return this.foo + 5;
  227. * }
  228. * });
  229. */
  230. function Class (definition)
  231. {
  232. if (!definition)
  233. {
  234. definition = {};
  235. }
  236. // The variable name here dictates what we see in Chrome debugger
  237. var initialize;
  238. var Extends;
  239. if (definition.initialize)
  240. {
  241. if (typeof definition.initialize !== 'function')
  242. {
  243. throw new Error('initialize must be a function');
  244. }
  245. initialize = definition.initialize;
  246. // Usually we should avoid 'delete' in V8 at all costs.
  247. // However, its unlikely to make any performance difference
  248. // here since we only call this on class creation (i.e. not object creation).
  249. delete definition.initialize;
  250. }
  251. else if (definition.Extends)
  252. {
  253. var base = definition.Extends;
  254. initialize = function ()
  255. {
  256. base.apply(this, arguments);
  257. };
  258. }
  259. else
  260. {
  261. initialize = function () {};
  262. }
  263. if (definition.Extends)
  264. {
  265. initialize.prototype = Object.create(definition.Extends.prototype);
  266. initialize.prototype.constructor = initialize;
  267. // For getOwnPropertyDescriptor to work, we need to act directly on the Extends (or Mixin)
  268. Extends = definition.Extends;
  269. delete definition.Extends;
  270. }
  271. else
  272. {
  273. initialize.prototype.constructor = initialize;
  274. }
  275. // Grab the mixins, if they are specified...
  276. var mixins = null;
  277. if (definition.Mixins)
  278. {
  279. mixins = definition.Mixins;
  280. delete definition.Mixins;
  281. }
  282. // First, mixin if we can.
  283. mixin(initialize, mixins);
  284. // Now we grab the actual definition which defines the overrides.
  285. extend(initialize, definition, true, Extends);
  286. return initialize;
  287. }
  288. Class.extend = extend;
  289. Class.mixin = mixin;
  290. Class.ignoreFinals = false;
  291. module.exports = Class;
  292. /***/ }),
  293. /* 1 */
  294. /***/ (function(module, exports) {
  295. /**
  296. * @author Richard Davey <rich@photonstorm.com>
  297. * @copyright 2019 Photon Storm Ltd.
  298. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  299. */
  300. /**
  301. * A NOOP (No Operation) callback function.
  302. *
  303. * Used internally by Phaser when it's more expensive to determine if a callback exists
  304. * than it is to just invoke an empty function.
  305. *
  306. * @function Phaser.Utils.NOOP
  307. * @since 3.0.0
  308. */
  309. var NOOP = function ()
  310. {
  311. // NOOP
  312. };
  313. module.exports = NOOP;
  314. /***/ }),
  315. /* 2 */
  316. /***/ (function(module, exports) {
  317. /**
  318. * @author Richard Davey <rich@photonstorm.com>
  319. * @copyright 2019 Photon Storm Ltd.
  320. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  321. */
  322. /**
  323. * Finds the key within the top level of the {@link source} object, or returns {@link defaultValue}
  324. *
  325. * @function Phaser.Utils.Objects.GetFastValue
  326. * @since 3.0.0
  327. *
  328. * @param {object} source - The object to search
  329. * @param {string} key - The key for the property on source. Must exist at the top level of the source object (no periods)
  330. * @param {*} [defaultValue] - The default value to use if the key does not exist.
  331. *
  332. * @return {*} The value if found; otherwise, defaultValue (null if none provided)
  333. */
  334. var GetFastValue = function (source, key, defaultValue)
  335. {
  336. var t = typeof(source);
  337. if (!source || t === 'number' || t === 'string')
  338. {
  339. return defaultValue;
  340. }
  341. else if (source.hasOwnProperty(key) && source[key] !== undefined)
  342. {
  343. return source[key];
  344. }
  345. else
  346. {
  347. return defaultValue;
  348. }
  349. };
  350. module.exports = GetFastValue;
  351. /***/ }),
  352. /* 3 */
  353. /***/ (function(module, exports, __webpack_require__) {
  354. /**
  355. * @author Richard Davey <rich@photonstorm.com>
  356. * @copyright 2019 Photon Storm Ltd.
  357. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  358. */
  359. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  360. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  361. var Class = __webpack_require__(0);
  362. /**
  363. * @typedef {object} Vector2Like
  364. *
  365. * @property {number} x - The x component.
  366. * @property {number} y - The y component.
  367. */
  368. /**
  369. * @classdesc
  370. * A representation of a vector in 2D space.
  371. *
  372. * A two-component vector.
  373. *
  374. * @class Vector2
  375. * @memberof Phaser.Math
  376. * @constructor
  377. * @since 3.0.0
  378. *
  379. * @param {number|Vector2Like} [x] - The x component, or an object with `x` and `y` properties.
  380. * @param {number} [y] - The y component.
  381. */
  382. var Vector2 = new Class({
  383. initialize:
  384. function Vector2 (x, y)
  385. {
  386. /**
  387. * The x component of this Vector.
  388. *
  389. * @name Phaser.Math.Vector2#x
  390. * @type {number}
  391. * @default 0
  392. * @since 3.0.0
  393. */
  394. this.x = 0;
  395. /**
  396. * The y component of this Vector.
  397. *
  398. * @name Phaser.Math.Vector2#y
  399. * @type {number}
  400. * @default 0
  401. * @since 3.0.0
  402. */
  403. this.y = 0;
  404. if (typeof x === 'object')
  405. {
  406. this.x = x.x || 0;
  407. this.y = x.y || 0;
  408. }
  409. else
  410. {
  411. if (y === undefined) { y = x; }
  412. this.x = x || 0;
  413. this.y = y || 0;
  414. }
  415. },
  416. /**
  417. * Make a clone of this Vector2.
  418. *
  419. * @method Phaser.Math.Vector2#clone
  420. * @since 3.0.0
  421. *
  422. * @return {Phaser.Math.Vector2} A clone of this Vector2.
  423. */
  424. clone: function ()
  425. {
  426. return new Vector2(this.x, this.y);
  427. },
  428. /**
  429. * Copy the components of a given Vector into this Vector.
  430. *
  431. * @method Phaser.Math.Vector2#copy
  432. * @since 3.0.0
  433. *
  434. * @param {Phaser.Math.Vector2} src - The Vector to copy the components from.
  435. *
  436. * @return {Phaser.Math.Vector2} This Vector2.
  437. */
  438. copy: function (src)
  439. {
  440. this.x = src.x || 0;
  441. this.y = src.y || 0;
  442. return this;
  443. },
  444. /**
  445. * Set the component values of this Vector from a given Vector2Like object.
  446. *
  447. * @method Phaser.Math.Vector2#setFromObject
  448. * @since 3.0.0
  449. *
  450. * @param {Vector2Like} obj - The object containing the component values to set for this Vector.
  451. *
  452. * @return {Phaser.Math.Vector2} This Vector2.
  453. */
  454. setFromObject: function (obj)
  455. {
  456. this.x = obj.x || 0;
  457. this.y = obj.y || 0;
  458. return this;
  459. },
  460. /**
  461. * Set the `x` and `y` components of the this Vector to the given `x` and `y` values.
  462. *
  463. * @method Phaser.Math.Vector2#set
  464. * @since 3.0.0
  465. *
  466. * @param {number} x - The x value to set for this Vector.
  467. * @param {number} [y=x] - The y value to set for this Vector.
  468. *
  469. * @return {Phaser.Math.Vector2} This Vector2.
  470. */
  471. set: function (x, y)
  472. {
  473. if (y === undefined) { y = x; }
  474. this.x = x;
  475. this.y = y;
  476. return this;
  477. },
  478. /**
  479. * This method is an alias for `Vector2.set`.
  480. *
  481. * @method Phaser.Math.Vector2#setTo
  482. * @since 3.4.0
  483. *
  484. * @param {number} x - The x value to set for this Vector.
  485. * @param {number} [y=x] - The y value to set for this Vector.
  486. *
  487. * @return {Phaser.Math.Vector2} This Vector2.
  488. */
  489. setTo: function (x, y)
  490. {
  491. return this.set(x, y);
  492. },
  493. /**
  494. * Sets the `x` and `y` values of this object from a given polar coordinate.
  495. *
  496. * @method Phaser.Math.Vector2#setToPolar
  497. * @since 3.0.0
  498. *
  499. * @param {number} azimuth - The angular coordinate, in radians.
  500. * @param {number} [radius=1] - The radial coordinate (length).
  501. *
  502. * @return {Phaser.Math.Vector2} This Vector2.
  503. */
  504. setToPolar: function (azimuth, radius)
  505. {
  506. if (radius == null) { radius = 1; }
  507. this.x = Math.cos(azimuth) * radius;
  508. this.y = Math.sin(azimuth) * radius;
  509. return this;
  510. },
  511. /**
  512. * Check whether this Vector is equal to a given Vector.
  513. *
  514. * Performs a strict equality check against each Vector's components.
  515. *
  516. * @method Phaser.Math.Vector2#equals
  517. * @since 3.0.0
  518. *
  519. * @param {Phaser.Math.Vector2} v - The vector to compare with this Vector.
  520. *
  521. * @return {boolean} Whether the given Vector is equal to this Vector.
  522. */
  523. equals: function (v)
  524. {
  525. return ((this.x === v.x) && (this.y === v.y));
  526. },
  527. /**
  528. * Calculate the angle between this Vector and the positive x-axis, in radians.
  529. *
  530. * @method Phaser.Math.Vector2#angle
  531. * @since 3.0.0
  532. *
  533. * @return {number} The angle between this Vector, and the positive x-axis, given in radians.
  534. */
  535. angle: function ()
  536. {
  537. // computes the angle in radians with respect to the positive x-axis
  538. var angle = Math.atan2(this.y, this.x);
  539. if (angle < 0)
  540. {
  541. angle += 2 * Math.PI;
  542. }
  543. return angle;
  544. },
  545. /**
  546. * Add a given Vector to this Vector. Addition is component-wise.
  547. *
  548. * @method Phaser.Math.Vector2#add
  549. * @since 3.0.0
  550. *
  551. * @param {Phaser.Math.Vector2} src - The Vector to add to this Vector.
  552. *
  553. * @return {Phaser.Math.Vector2} This Vector2.
  554. */
  555. add: function (src)
  556. {
  557. this.x += src.x;
  558. this.y += src.y;
  559. return this;
  560. },
  561. /**
  562. * Subtract the given Vector from this Vector. Subtraction is component-wise.
  563. *
  564. * @method Phaser.Math.Vector2#subtract
  565. * @since 3.0.0
  566. *
  567. * @param {Phaser.Math.Vector2} src - The Vector to subtract from this Vector.
  568. *
  569. * @return {Phaser.Math.Vector2} This Vector2.
  570. */
  571. subtract: function (src)
  572. {
  573. this.x -= src.x;
  574. this.y -= src.y;
  575. return this;
  576. },
  577. /**
  578. * Perform a component-wise multiplication between this Vector and the given Vector.
  579. *
  580. * Multiplies this Vector by the given Vector.
  581. *
  582. * @method Phaser.Math.Vector2#multiply
  583. * @since 3.0.0
  584. *
  585. * @param {Phaser.Math.Vector2} src - The Vector to multiply this Vector by.
  586. *
  587. * @return {Phaser.Math.Vector2} This Vector2.
  588. */
  589. multiply: function (src)
  590. {
  591. this.x *= src.x;
  592. this.y *= src.y;
  593. return this;
  594. },
  595. /**
  596. * Scale this Vector by the given value.
  597. *
  598. * @method Phaser.Math.Vector2#scale
  599. * @since 3.0.0
  600. *
  601. * @param {number} value - The value to scale this Vector by.
  602. *
  603. * @return {Phaser.Math.Vector2} This Vector2.
  604. */
  605. scale: function (value)
  606. {
  607. if (isFinite(value))
  608. {
  609. this.x *= value;
  610. this.y *= value;
  611. }
  612. else
  613. {
  614. this.x = 0;
  615. this.y = 0;
  616. }
  617. return this;
  618. },
  619. /**
  620. * Perform a component-wise division between this Vector and the given Vector.
  621. *
  622. * Divides this Vector by the given Vector.
  623. *
  624. * @method Phaser.Math.Vector2#divide
  625. * @since 3.0.0
  626. *
  627. * @param {Phaser.Math.Vector2} src - The Vector to divide this Vector by.
  628. *
  629. * @return {Phaser.Math.Vector2} This Vector2.
  630. */
  631. divide: function (src)
  632. {
  633. this.x /= src.x;
  634. this.y /= src.y;
  635. return this;
  636. },
  637. /**
  638. * Negate the `x` and `y` components of this Vector.
  639. *
  640. * @method Phaser.Math.Vector2#negate
  641. * @since 3.0.0
  642. *
  643. * @return {Phaser.Math.Vector2} This Vector2.
  644. */
  645. negate: function ()
  646. {
  647. this.x = -this.x;
  648. this.y = -this.y;
  649. return this;
  650. },
  651. /**
  652. * Calculate the distance between this Vector and the given Vector.
  653. *
  654. * @method Phaser.Math.Vector2#distance
  655. * @since 3.0.0
  656. *
  657. * @param {Phaser.Math.Vector2} src - The Vector to calculate the distance to.
  658. *
  659. * @return {number} The distance from this Vector to the given Vector.
  660. */
  661. distance: function (src)
  662. {
  663. var dx = src.x - this.x;
  664. var dy = src.y - this.y;
  665. return Math.sqrt(dx * dx + dy * dy);
  666. },
  667. /**
  668. * Calculate the distance between this Vector and the given Vector, squared.
  669. *
  670. * @method Phaser.Math.Vector2#distanceSq
  671. * @since 3.0.0
  672. *
  673. * @param {Phaser.Math.Vector2} src - The Vector to calculate the distance to.
  674. *
  675. * @return {number} The distance from this Vector to the given Vector, squared.
  676. */
  677. distanceSq: function (src)
  678. {
  679. var dx = src.x - this.x;
  680. var dy = src.y - this.y;
  681. return dx * dx + dy * dy;
  682. },
  683. /**
  684. * Calculate the length (or magnitude) of this Vector.
  685. *
  686. * @method Phaser.Math.Vector2#length
  687. * @since 3.0.0
  688. *
  689. * @return {number} The length of this Vector.
  690. */
  691. length: function ()
  692. {
  693. var x = this.x;
  694. var y = this.y;
  695. return Math.sqrt(x * x + y * y);
  696. },
  697. /**
  698. * Calculate the length of this Vector squared.
  699. *
  700. * @method Phaser.Math.Vector2#lengthSq
  701. * @since 3.0.0
  702. *
  703. * @return {number} The length of this Vector, squared.
  704. */
  705. lengthSq: function ()
  706. {
  707. var x = this.x;
  708. var y = this.y;
  709. return x * x + y * y;
  710. },
  711. /**
  712. * Normalize this Vector.
  713. *
  714. * Makes the vector a unit length vector (magnitude of 1) in the same direction.
  715. *
  716. * @method Phaser.Math.Vector2#normalize
  717. * @since 3.0.0
  718. *
  719. * @return {Phaser.Math.Vector2} This Vector2.
  720. */
  721. normalize: function ()
  722. {
  723. var x = this.x;
  724. var y = this.y;
  725. var len = x * x + y * y;
  726. if (len > 0)
  727. {
  728. len = 1 / Math.sqrt(len);
  729. this.x = x * len;
  730. this.y = y * len;
  731. }
  732. return this;
  733. },
  734. /**
  735. * Right-hand normalize (make unit length) this Vector.
  736. *
  737. * @method Phaser.Math.Vector2#normalizeRightHand
  738. * @since 3.0.0
  739. *
  740. * @return {Phaser.Math.Vector2} This Vector2.
  741. */
  742. normalizeRightHand: function ()
  743. {
  744. var x = this.x;
  745. this.x = this.y * -1;
  746. this.y = x;
  747. return this;
  748. },
  749. /**
  750. * Calculate the dot product of this Vector and the given Vector.
  751. *
  752. * @method Phaser.Math.Vector2#dot
  753. * @since 3.0.0
  754. *
  755. * @param {Phaser.Math.Vector2} src - The Vector2 to dot product with this Vector2.
  756. *
  757. * @return {number} The dot product of this Vector and the given Vector.
  758. */
  759. dot: function (src)
  760. {
  761. return this.x * src.x + this.y * src.y;
  762. },
  763. /**
  764. * Calculate the cross product of this Vector and the given Vector.
  765. *
  766. * @method Phaser.Math.Vector2#cross
  767. * @since 3.0.0
  768. *
  769. * @param {Phaser.Math.Vector2} src - The Vector2 to cross with this Vector2.
  770. *
  771. * @return {number} The cross product of this Vector and the given Vector.
  772. */
  773. cross: function (src)
  774. {
  775. return this.x * src.y - this.y * src.x;
  776. },
  777. /**
  778. * Linearly interpolate between this Vector and the given Vector.
  779. *
  780. * Interpolates this Vector towards the given Vector.
  781. *
  782. * @method Phaser.Math.Vector2#lerp
  783. * @since 3.0.0
  784. *
  785. * @param {Phaser.Math.Vector2} src - The Vector2 to interpolate towards.
  786. * @param {number} [t=0] - The interpolation percentage, between 0 and 1.
  787. *
  788. * @return {Phaser.Math.Vector2} This Vector2.
  789. */
  790. lerp: function (src, t)
  791. {
  792. if (t === undefined) { t = 0; }
  793. var ax = this.x;
  794. var ay = this.y;
  795. this.x = ax + t * (src.x - ax);
  796. this.y = ay + t * (src.y - ay);
  797. return this;
  798. },
  799. /**
  800. * Transform this Vector with the given Matrix.
  801. *
  802. * @method Phaser.Math.Vector2#transformMat3
  803. * @since 3.0.0
  804. *
  805. * @param {Phaser.Math.Matrix3} mat - The Matrix3 to transform this Vector2 with.
  806. *
  807. * @return {Phaser.Math.Vector2} This Vector2.
  808. */
  809. transformMat3: function (mat)
  810. {
  811. var x = this.x;
  812. var y = this.y;
  813. var m = mat.val;
  814. this.x = m[0] * x + m[3] * y + m[6];
  815. this.y = m[1] * x + m[4] * y + m[7];
  816. return this;
  817. },
  818. /**
  819. * Transform this Vector with the given Matrix.
  820. *
  821. * @method Phaser.Math.Vector2#transformMat4
  822. * @since 3.0.0
  823. *
  824. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to transform this Vector2 with.
  825. *
  826. * @return {Phaser.Math.Vector2} This Vector2.
  827. */
  828. transformMat4: function (mat)
  829. {
  830. var x = this.x;
  831. var y = this.y;
  832. var m = mat.val;
  833. this.x = m[0] * x + m[4] * y + m[12];
  834. this.y = m[1] * x + m[5] * y + m[13];
  835. return this;
  836. },
  837. /**
  838. * Make this Vector the zero vector (0, 0).
  839. *
  840. * @method Phaser.Math.Vector2#reset
  841. * @since 3.0.0
  842. *
  843. * @return {Phaser.Math.Vector2} This Vector2.
  844. */
  845. reset: function ()
  846. {
  847. this.x = 0;
  848. this.y = 0;
  849. return this;
  850. }
  851. });
  852. /**
  853. * A static zero Vector2 for use by reference.
  854. *
  855. * This constant is meant for comparison operations and should not be modified directly.
  856. *
  857. * @constant
  858. * @name Phaser.Math.Vector2.ZERO
  859. * @type {Phaser.Math.Vector2}
  860. * @since 3.1.0
  861. */
  862. Vector2.ZERO = new Vector2();
  863. /**
  864. * A static right Vector2 for use by reference.
  865. *
  866. * This constant is meant for comparison operations and should not be modified directly.
  867. *
  868. * @constant
  869. * @name Phaser.Math.Vector2.RIGHT
  870. * @type {Phaser.Math.Vector2}
  871. * @since 3.16.0
  872. */
  873. Vector2.RIGHT = new Vector2(1, 0);
  874. /**
  875. * A static left Vector2 for use by reference.
  876. *
  877. * This constant is meant for comparison operations and should not be modified directly.
  878. *
  879. * @constant
  880. * @name Phaser.Math.Vector2.LEFT
  881. * @type {Phaser.Math.Vector2}
  882. * @since 3.16.0
  883. */
  884. Vector2.LEFT = new Vector2(-1, 0);
  885. /**
  886. * A static up Vector2 for use by reference.
  887. *
  888. * This constant is meant for comparison operations and should not be modified directly.
  889. *
  890. * @constant
  891. * @name Phaser.Math.Vector2.UP
  892. * @type {Phaser.Math.Vector2}
  893. * @since 3.16.0
  894. */
  895. Vector2.UP = new Vector2(0, -1);
  896. /**
  897. * A static down Vector2 for use by reference.
  898. *
  899. * This constant is meant for comparison operations and should not be modified directly.
  900. *
  901. * @constant
  902. * @name Phaser.Math.Vector2.DOWN
  903. * @type {Phaser.Math.Vector2}
  904. * @since 3.16.0
  905. */
  906. Vector2.DOWN = new Vector2(0, 1);
  907. /**
  908. * A static one Vector2 for use by reference.
  909. *
  910. * This constant is meant for comparison operations and should not be modified directly.
  911. *
  912. * @constant
  913. * @name Phaser.Math.Vector2.ONE
  914. * @type {Phaser.Math.Vector2}
  915. * @since 3.16.0
  916. */
  917. Vector2.ONE = new Vector2(1, 1);
  918. module.exports = Vector2;
  919. /***/ }),
  920. /* 4 */
  921. /***/ (function(module, exports) {
  922. /**
  923. * @author Richard Davey <rich@photonstorm.com>
  924. * @copyright 2019 Photon Storm Ltd.
  925. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  926. */
  927. // Source object
  928. // The key as a string, or an array of keys, i.e. 'banner', or 'banner.hideBanner'
  929. // The default value to use if the key doesn't exist
  930. /**
  931. * Retrieves a value from an object.
  932. *
  933. * @function Phaser.Utils.Objects.GetValue
  934. * @since 3.0.0
  935. *
  936. * @param {object} source - The object to retrieve the value from.
  937. * @param {string} key - The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`) - `banner.hideBanner` would return the value of the `hideBanner` property from the object stored in the `banner` property of the `source` object.
  938. * @param {*} defaultValue - The value to return if the `key` isn't found in the `source` object.
  939. *
  940. * @return {*} The value of the requested key.
  941. */
  942. var GetValue = function (source, key, defaultValue)
  943. {
  944. if (!source || typeof source === 'number')
  945. {
  946. return defaultValue;
  947. }
  948. else if (source.hasOwnProperty(key))
  949. {
  950. return source[key];
  951. }
  952. else if (key.indexOf('.') !== -1)
  953. {
  954. var keys = key.split('.');
  955. var parent = source;
  956. var value = defaultValue;
  957. // Use for loop here so we can break early
  958. for (var i = 0; i < keys.length; i++)
  959. {
  960. if (parent.hasOwnProperty(keys[i]))
  961. {
  962. // Yes it has a key property, let's carry on down
  963. value = parent[keys[i]];
  964. parent = parent[keys[i]];
  965. }
  966. else
  967. {
  968. // Can't go any further, so reset to default
  969. value = defaultValue;
  970. break;
  971. }
  972. }
  973. return value;
  974. }
  975. else
  976. {
  977. return defaultValue;
  978. }
  979. };
  980. module.exports = GetValue;
  981. /***/ }),
  982. /* 5 */
  983. /***/ (function(module, exports, __webpack_require__) {
  984. /**
  985. * @author Richard Davey <rich@photonstorm.com>
  986. * @copyright 2019 Photon Storm Ltd.
  987. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  988. */
  989. var Class = __webpack_require__(0);
  990. var PluginCache = __webpack_require__(17);
  991. var SceneEvents = __webpack_require__(16);
  992. /**
  993. * @classdesc
  994. * The Game Object Factory is a Scene plugin that allows you to quickly create many common
  995. * types of Game Objects and have them automatically registered with the Scene.
  996. *
  997. * Game Objects directly register themselves with the Factory and inject their own creation
  998. * methods into the class.
  999. *
  1000. * @class GameObjectFactory
  1001. * @memberof Phaser.GameObjects
  1002. * @constructor
  1003. * @since 3.0.0
  1004. *
  1005. * @param {Phaser.Scene} scene - The Scene to which this Game Object Factory belongs.
  1006. */
  1007. var GameObjectFactory = new Class({
  1008. initialize:
  1009. function GameObjectFactory (scene)
  1010. {
  1011. /**
  1012. * The Scene to which this Game Object Factory belongs.
  1013. *
  1014. * @name Phaser.GameObjects.GameObjectFactory#scene
  1015. * @type {Phaser.Scene}
  1016. * @protected
  1017. * @since 3.0.0
  1018. */
  1019. this.scene = scene;
  1020. /**
  1021. * A reference to the Scene.Systems.
  1022. *
  1023. * @name Phaser.GameObjects.GameObjectFactory#systems
  1024. * @type {Phaser.Scenes.Systems}
  1025. * @protected
  1026. * @since 3.0.0
  1027. */
  1028. this.systems = scene.sys;
  1029. /**
  1030. * A reference to the Scene Display List.
  1031. *
  1032. * @name Phaser.GameObjects.GameObjectFactory#displayList
  1033. * @type {Phaser.GameObjects.DisplayList}
  1034. * @protected
  1035. * @since 3.0.0
  1036. */
  1037. this.displayList;
  1038. /**
  1039. * A reference to the Scene Update List.
  1040. *
  1041. * @name Phaser.GameObjects.GameObjectFactory#updateList;
  1042. * @type {Phaser.GameObjects.UpdateList}
  1043. * @protected
  1044. * @since 3.0.0
  1045. */
  1046. this.updateList;
  1047. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  1048. scene.sys.events.on(SceneEvents.START, this.start, this);
  1049. },
  1050. /**
  1051. * This method is called automatically, only once, when the Scene is first created.
  1052. * Do not invoke it directly.
  1053. *
  1054. * @method Phaser.GameObjects.GameObjectFactory#boot
  1055. * @private
  1056. * @since 3.5.1
  1057. */
  1058. boot: function ()
  1059. {
  1060. this.displayList = this.systems.displayList;
  1061. this.updateList = this.systems.updateList;
  1062. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  1063. },
  1064. /**
  1065. * This method is called automatically by the Scene when it is starting up.
  1066. * It is responsible for creating local systems, properties and listening for Scene events.
  1067. * Do not invoke it directly.
  1068. *
  1069. * @method Phaser.GameObjects.GameObjectFactory#start
  1070. * @private
  1071. * @since 3.5.0
  1072. */
  1073. start: function ()
  1074. {
  1075. this.systems.events.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  1076. },
  1077. /**
  1078. * Adds an existing Game Object to this Scene.
  1079. *
  1080. * If the Game Object renders, it will be added to the Display List.
  1081. * If it has a `preUpdate` method, it will be added to the Update List.
  1082. *
  1083. * @method Phaser.GameObjects.GameObjectFactory#existing
  1084. * @since 3.0.0
  1085. *
  1086. * @param {Phaser.GameObjects.GameObject} child - The child to be added to this Scene.
  1087. *
  1088. * @return {Phaser.GameObjects.GameObject} The Game Object that was added.
  1089. */
  1090. existing: function (child)
  1091. {
  1092. if (child.renderCanvas || child.renderWebGL)
  1093. {
  1094. this.displayList.add(child);
  1095. }
  1096. if (child.preUpdate)
  1097. {
  1098. this.updateList.add(child);
  1099. }
  1100. return child;
  1101. },
  1102. /**
  1103. * The Scene that owns this plugin is shutting down.
  1104. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  1105. *
  1106. * @method Phaser.GameObjects.GameObjectFactory#shutdown
  1107. * @private
  1108. * @since 3.0.0
  1109. */
  1110. shutdown: function ()
  1111. {
  1112. this.systems.events.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  1113. },
  1114. /**
  1115. * The Scene that owns this plugin is being destroyed.
  1116. * We need to shutdown and then kill off all external references.
  1117. *
  1118. * @method Phaser.GameObjects.GameObjectFactory#destroy
  1119. * @private
  1120. * @since 3.0.0
  1121. */
  1122. destroy: function ()
  1123. {
  1124. this.shutdown();
  1125. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  1126. this.scene = null;
  1127. this.systems = null;
  1128. this.displayList = null;
  1129. this.updateList = null;
  1130. }
  1131. });
  1132. // Static method called directly by the Game Object factory functions
  1133. GameObjectFactory.register = function (factoryType, factoryFunction)
  1134. {
  1135. if (!GameObjectFactory.prototype.hasOwnProperty(factoryType))
  1136. {
  1137. GameObjectFactory.prototype[factoryType] = factoryFunction;
  1138. }
  1139. };
  1140. PluginCache.register('GameObjectFactory', GameObjectFactory, 'add');
  1141. module.exports = GameObjectFactory;
  1142. /***/ }),
  1143. /* 6 */
  1144. /***/ (function(module, exports, __webpack_require__) {
  1145. /**
  1146. * @author Richard Davey <rich@photonstorm.com>
  1147. * @copyright 2019 Photon Storm Ltd.
  1148. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  1149. */
  1150. var Class = __webpack_require__(0);
  1151. /**
  1152. * @classdesc
  1153. * Defines a Point in 2D space, with an x and y component.
  1154. *
  1155. * @class Point
  1156. * @memberof Phaser.Geom
  1157. * @constructor
  1158. * @since 3.0.0
  1159. *
  1160. * @param {number} [x=0] - The x coordinate of this Point.
  1161. * @param {number} [y=x] - The y coordinate of this Point.
  1162. */
  1163. var Point = new Class({
  1164. initialize:
  1165. function Point (x, y)
  1166. {
  1167. if (x === undefined) { x = 0; }
  1168. if (y === undefined) { y = x; }
  1169. /**
  1170. * The x coordinate of this Point.
  1171. *
  1172. * @name Phaser.Geom.Point#x
  1173. * @type {number}
  1174. * @default 0
  1175. * @since 3.0.0
  1176. */
  1177. this.x = x;
  1178. /**
  1179. * The y coordinate of this Point.
  1180. *
  1181. * @name Phaser.Geom.Point#y
  1182. * @type {number}
  1183. * @default 0
  1184. * @since 3.0.0
  1185. */
  1186. this.y = y;
  1187. },
  1188. /**
  1189. * Set the x and y coordinates of the point to the given values.
  1190. *
  1191. * @method Phaser.Geom.Point#setTo
  1192. * @since 3.0.0
  1193. *
  1194. * @param {number} [x=0] - The x coordinate of this Point.
  1195. * @param {number} [y=x] - The y coordinate of this Point.
  1196. *
  1197. * @return {Phaser.Geom.Point} This Point object.
  1198. */
  1199. setTo: function (x, y)
  1200. {
  1201. if (x === undefined) { x = 0; }
  1202. if (y === undefined) { y = x; }
  1203. this.x = x;
  1204. this.y = y;
  1205. return this;
  1206. }
  1207. });
  1208. module.exports = Point;
  1209. /***/ }),
  1210. /* 7 */
  1211. /***/ (function(module, exports) {
  1212. /**
  1213. * @author Richard Davey <rich@photonstorm.com>
  1214. * @copyright 2019 Photon Storm Ltd.
  1215. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  1216. */
  1217. var types = {};
  1218. /**
  1219. * @namespace Phaser.Loader.FileTypesManager
  1220. */
  1221. var FileTypesManager = {
  1222. /**
  1223. * Static method called when a LoaderPlugin is created.
  1224. *
  1225. * Loops through the local types object and injects all of them as
  1226. * properties into the LoaderPlugin instance.
  1227. *
  1228. * @method Phaser.Loader.FileTypesManager.install
  1229. * @since 3.0.0
  1230. *
  1231. * @param {Phaser.Loader.LoaderPlugin} loader - The LoaderPlugin to install the types into.
  1232. */
  1233. install: function (loader)
  1234. {
  1235. for (var key in types)
  1236. {
  1237. loader[key] = types[key];
  1238. }
  1239. },
  1240. /**
  1241. * Static method called directly by the File Types.
  1242. *
  1243. * The key is a reference to the function used to load the files via the Loader, i.e. `image`.
  1244. *
  1245. * @method Phaser.Loader.FileTypesManager.register
  1246. * @since 3.0.0
  1247. *
  1248. * @param {string} key - The key that will be used as the method name in the LoaderPlugin.
  1249. * @param {function} factoryFunction - The function that will be called when LoaderPlugin.key is invoked.
  1250. */
  1251. register: function (key, factoryFunction)
  1252. {
  1253. types[key] = factoryFunction;
  1254. },
  1255. /**
  1256. * Removed all associated file types.
  1257. *
  1258. * @method Phaser.Loader.FileTypesManager.destroy
  1259. * @since 3.0.0
  1260. */
  1261. destroy: function ()
  1262. {
  1263. types = {};
  1264. }
  1265. };
  1266. module.exports = FileTypesManager;
  1267. /***/ }),
  1268. /* 8 */
  1269. /***/ (function(module, exports) {
  1270. /**
  1271. * @author Richard Davey <rich@photonstorm.com>
  1272. * @copyright 2019 Photon Storm Ltd.
  1273. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  1274. */
  1275. /**
  1276. * This is a slightly modified version of jQuery.isPlainObject.
  1277. * A plain object is an object whose internal class property is [object Object].
  1278. *
  1279. * @function Phaser.Utils.Objects.IsPlainObject
  1280. * @since 3.0.0
  1281. *
  1282. * @param {object} obj - The object to inspect.
  1283. *
  1284. * @return {boolean} `true` if the object is plain, otherwise `false`.
  1285. */
  1286. var IsPlainObject = function (obj)
  1287. {
  1288. // Not plain objects:
  1289. // - Any object or value whose internal [[Class]] property is not "[object Object]"
  1290. // - DOM nodes
  1291. // - window
  1292. if (typeof(obj) !== 'object' || obj.nodeType || obj === obj.window)
  1293. {
  1294. return false;
  1295. }
  1296. // Support: Firefox <20
  1297. // The try/catch suppresses exceptions thrown when attempting to access
  1298. // the "constructor" property of certain host objects, ie. |window.location|
  1299. // https://bugzilla.mozilla.org/show_bug.cgi?id=814622
  1300. try
  1301. {
  1302. if (obj.constructor && !({}).hasOwnProperty.call(obj.constructor.prototype, 'isPrototypeOf'))
  1303. {
  1304. return false;
  1305. }
  1306. }
  1307. catch (e)
  1308. {
  1309. return false;
  1310. }
  1311. // If the function hasn't returned already, we're confident that
  1312. // |obj| is a plain object, created by {} or constructed with new Object
  1313. return true;
  1314. };
  1315. module.exports = IsPlainObject;
  1316. /***/ }),
  1317. /* 9 */
  1318. /***/ (function(module, exports) {
  1319. /**
  1320. * @author Richard Davey <rich@photonstorm.com>
  1321. * @author Felipe Alfonso <@bitnenfer>
  1322. * @copyright 2019 Photon Storm Ltd.
  1323. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  1324. */
  1325. /**
  1326. * @namespace Phaser.Renderer.WebGL.Utils
  1327. * @since 3.0.0
  1328. */
  1329. module.exports = {
  1330. /**
  1331. * Packs four floats on a range from 0.0 to 1.0 into a single Uint32
  1332. *
  1333. * @function Phaser.Renderer.WebGL.Utils.getTintFromFloats
  1334. * @since 3.0.0
  1335. *
  1336. * @param {number} r - Red component in a range from 0.0 to 1.0
  1337. * @param {number} g - Green component in a range from 0.0 to 1.0
  1338. * @param {number} b - Blue component in a range from 0.0 to 1.0
  1339. * @param {number} a - Alpha component in a range from 0.0 to 1.0
  1340. *
  1341. * @return {number} [description]
  1342. */
  1343. getTintFromFloats: function (r, g, b, a)
  1344. {
  1345. var ur = ((r * 255.0)|0) & 0xFF;
  1346. var ug = ((g * 255.0)|0) & 0xFF;
  1347. var ub = ((b * 255.0)|0) & 0xFF;
  1348. var ua = ((a * 255.0)|0) & 0xFF;
  1349. return ((ua << 24) | (ur << 16) | (ug << 8) | ub) >>> 0;
  1350. },
  1351. /**
  1352. * Packs a Uint24, representing RGB components, with a Float32, representing
  1353. * the alpha component, with a range between 0.0 and 1.0 and return a Uint32
  1354. *
  1355. * @function Phaser.Renderer.WebGL.Utils.getTintAppendFloatAlpha
  1356. * @since 3.0.0
  1357. *
  1358. * @param {number} rgb - Uint24 representing RGB components
  1359. * @param {number} a - Float32 representing Alpha component
  1360. *
  1361. * @return {number} Packed RGBA as Uint32
  1362. */
  1363. getTintAppendFloatAlpha: function (rgb, a)
  1364. {
  1365. var ua = ((a * 255.0)|0) & 0xFF;
  1366. return ((ua << 24) | rgb) >>> 0;
  1367. },
  1368. /**
  1369. * Packs a Uint24, representing RGB components, with a Float32, representing
  1370. * the alpha component, with a range between 0.0 and 1.0 and return a
  1371. * swizzled Uint32
  1372. *
  1373. * @function Phaser.Renderer.WebGL.Utils.getTintAppendFloatAlphaAndSwap
  1374. * @since 3.0.0
  1375. *
  1376. * @param {number} rgb - Uint24 representing RGB components
  1377. * @param {number} a - Float32 representing Alpha component
  1378. *
  1379. * @return {number} Packed RGBA as Uint32
  1380. */
  1381. getTintAppendFloatAlphaAndSwap: function (rgb, a)
  1382. {
  1383. var ur = ((rgb >> 16)|0) & 0xff;
  1384. var ug = ((rgb >> 8)|0) & 0xff;
  1385. var ub = (rgb|0) & 0xff;
  1386. var ua = ((a * 255.0)|0) & 0xFF;
  1387. return ((ua << 24) | (ub << 16) | (ug << 8) | ur) >>> 0;
  1388. },
  1389. /**
  1390. * Unpacks a Uint24 RGB into an array of floats of ranges of 0.0 and 1.0
  1391. *
  1392. * @function Phaser.Renderer.WebGL.Utils.getFloatsFromUintRGB
  1393. * @since 3.0.0
  1394. *
  1395. * @param {number} rgb - RGB packed as a Uint24
  1396. *
  1397. * @return {array} Array of floats representing each component as a float
  1398. */
  1399. getFloatsFromUintRGB: function (rgb)
  1400. {
  1401. var ur = ((rgb >> 16)|0) & 0xff;
  1402. var ug = ((rgb >> 8)|0) & 0xff;
  1403. var ub = (rgb|0) & 0xff;
  1404. return [ ur / 255.0, ug / 255.0, ub / 255.0 ];
  1405. },
  1406. /**
  1407. * Counts how many attributes of 32 bits a vertex has
  1408. *
  1409. * @function Phaser.Renderer.WebGL.Utils.getComponentCount
  1410. * @since 3.0.0
  1411. *
  1412. * @param {array} attributes - Array of attributes
  1413. * @param {WebGLRenderingContext} glContext - WebGLContext used for check types
  1414. *
  1415. * @return {number} Count of 32 bit attributes in vertex
  1416. */
  1417. getComponentCount: function (attributes, glContext)
  1418. {
  1419. var count = 0;
  1420. for (var index = 0; index < attributes.length; ++index)
  1421. {
  1422. var element = attributes[index];
  1423. if (element.type === glContext.FLOAT)
  1424. {
  1425. count += element.size;
  1426. }
  1427. else
  1428. {
  1429. count += 1; // We'll force any other type to be 32 bit. for now
  1430. }
  1431. }
  1432. return count;
  1433. }
  1434. };
  1435. /***/ }),
  1436. /* 10 */
  1437. /***/ (function(module, exports, __webpack_require__) {
  1438. /**
  1439. * @author Richard Davey <rich@photonstorm.com>
  1440. * @copyright 2019 Photon Storm Ltd.
  1441. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  1442. */
  1443. var Class = __webpack_require__(0);
  1444. var Contains = __webpack_require__(42);
  1445. var GetPoint = __webpack_require__(204);
  1446. var GetPoints = __webpack_require__(430);
  1447. var Line = __webpack_require__(59);
  1448. var Random = __webpack_require__(201);
  1449. /**
  1450. * @classdesc
  1451. * Encapsulates a 2D rectangle defined by its corner point in the top-left and its extends in x (width) and y (height)
  1452. *
  1453. * @class Rectangle
  1454. * @memberof Phaser.Geom
  1455. * @constructor
  1456. * @since 3.0.0
  1457. *
  1458. * @param {number} [x=0] - The X coordinate of the top left corner of the Rectangle.
  1459. * @param {number} [y=0] - The Y coordinate of the top left corner of the Rectangle.
  1460. * @param {number} [width=0] - The width of the Rectangle.
  1461. * @param {number} [height=0] - The height of the Rectangle.
  1462. */
  1463. var Rectangle = new Class({
  1464. initialize:
  1465. function Rectangle (x, y, width, height)
  1466. {
  1467. if (x === undefined) { x = 0; }
  1468. if (y === undefined) { y = 0; }
  1469. if (width === undefined) { width = 0; }
  1470. if (height === undefined) { height = 0; }
  1471. /**
  1472. * The X coordinate of the top left corner of the Rectangle.
  1473. *
  1474. * @name Phaser.Geom.Rectangle#x
  1475. * @type {number}
  1476. * @default 0
  1477. * @since 3.0.0
  1478. */
  1479. this.x = x;
  1480. /**
  1481. * The Y coordinate of the top left corner of the Rectangle.
  1482. *
  1483. * @name Phaser.Geom.Rectangle#y
  1484. * @type {number}
  1485. * @default 0
  1486. * @since 3.0.0
  1487. */
  1488. this.y = y;
  1489. /**
  1490. * The width of the Rectangle, i.e. the distance between its left side (defined by `x`) and its right side.
  1491. *
  1492. * @name Phaser.Geom.Rectangle#width
  1493. * @type {number}
  1494. * @default 0
  1495. * @since 3.0.0
  1496. */
  1497. this.width = width;
  1498. /**
  1499. * The height of the Rectangle, i.e. the distance between its top side (defined by `y`) and its bottom side.
  1500. *
  1501. * @name Phaser.Geom.Rectangle#height
  1502. * @type {number}
  1503. * @default 0
  1504. * @since 3.0.0
  1505. */
  1506. this.height = height;
  1507. },
  1508. /**
  1509. * Checks if the given point is inside the Rectangle's bounds.
  1510. *
  1511. * @method Phaser.Geom.Rectangle#contains
  1512. * @since 3.0.0
  1513. *
  1514. * @param {number} x - The X coordinate of the point to check.
  1515. * @param {number} y - The Y coordinate of the point to check.
  1516. *
  1517. * @return {boolean} `true` if the point is within the Rectangle's bounds, otherwise `false`.
  1518. */
  1519. contains: function (x, y)
  1520. {
  1521. return Contains(this, x, y);
  1522. },
  1523. /**
  1524. * Calculates the coordinates of a point at a certain `position` on the Rectangle's perimeter.
  1525. *
  1526. * The `position` is a fraction between 0 and 1 which defines how far into the perimeter the point is.
  1527. *
  1528. * A value of 0 or 1 returns the point at the top left corner of the rectangle, while a value of 0.5 returns the point at the bottom right corner of the rectangle. Values between 0 and 0.5 are on the top or the right side and values between 0.5 and 1 are on the bottom or the left side.
  1529. *
  1530. * @method Phaser.Geom.Rectangle#getPoint
  1531. * @since 3.0.0
  1532. *
  1533. * @generic {Phaser.Geom.Point} O - [output,$return]
  1534. *
  1535. * @param {number} position - The normalized distance into the Rectangle's perimeter to return.
  1536. * @param {(Phaser.Geom.Point|object)} [output] - An object to update with the `x` and `y` coordinates of the point.
  1537. *
  1538. * @return {(Phaser.Geom.Point|object)} The updated `output` object, or a new Point if no `output` object was given.
  1539. */
  1540. getPoint: function (position, output)
  1541. {
  1542. return GetPoint(this, position, output);
  1543. },
  1544. /**
  1545. * Returns an array of points from the perimeter of the Rectangle, each spaced out based on the quantity or step required.
  1546. *
  1547. * @method Phaser.Geom.Rectangle#getPoints
  1548. * @since 3.0.0
  1549. *
  1550. * @generic {Phaser.Geom.Point[]} O - [output,$return]
  1551. *
  1552. * @param {integer} quantity - The number of points to return. Set to `false` or 0 to return an arbitrary number of points (`perimeter / stepRate`) evenly spaced around the Rectangle based on the `stepRate`.
  1553. * @param {number} [stepRate] - If `quantity` is 0, determines the normalized distance between each returned point.
  1554. * @param {(array|Phaser.Geom.Point[])} [output] - An array to which to append the points.
  1555. *
  1556. * @return {(array|Phaser.Geom.Point[])} The modified `output` array, or a new array if none was provided.
  1557. */
  1558. getPoints: function (quantity, stepRate, output)
  1559. {
  1560. return GetPoints(this, quantity, stepRate, output);
  1561. },
  1562. /**
  1563. * Returns a random point within the Rectangle's bounds.
  1564. *
  1565. * @method Phaser.Geom.Rectangle#getRandomPoint
  1566. * @since 3.0.0
  1567. *
  1568. * @generic {Phaser.Geom.Point} O - [point,$return]
  1569. *
  1570. * @param {Phaser.Geom.Point} [point] - The object in which to store the `x` and `y` coordinates of the point.
  1571. *
  1572. * @return {Phaser.Geom.Point} The updated `point`, or a new Point if none was provided.
  1573. */
  1574. getRandomPoint: function (point)
  1575. {
  1576. return Random(this, point);
  1577. },
  1578. /**
  1579. * Sets the position, width, and height of the Rectangle.
  1580. *
  1581. * @method Phaser.Geom.Rectangle#setTo
  1582. * @since 3.0.0
  1583. *
  1584. * @param {number} x - The X coordinate of the top left corner of the Rectangle.
  1585. * @param {number} y - The Y coordinate of the top left corner of the Rectangle.
  1586. * @param {number} width - The width of the Rectangle.
  1587. * @param {number} height - The height of the Rectangle.
  1588. *
  1589. * @return {Phaser.Geom.Rectangle} This Rectangle object.
  1590. */
  1591. setTo: function (x, y, width, height)
  1592. {
  1593. this.x = x;
  1594. this.y = y;
  1595. this.width = width;
  1596. this.height = height;
  1597. return this;
  1598. },
  1599. /**
  1600. * Resets the position, width, and height of the Rectangle to 0.
  1601. *
  1602. * @method Phaser.Geom.Rectangle#setEmpty
  1603. * @since 3.0.0
  1604. *
  1605. * @return {Phaser.Geom.Rectangle} This Rectangle object.
  1606. */
  1607. setEmpty: function ()
  1608. {
  1609. return this.setTo(0, 0, 0, 0);
  1610. },
  1611. /**
  1612. * Sets the position of the Rectangle.
  1613. *
  1614. * @method Phaser.Geom.Rectangle#setPosition
  1615. * @since 3.0.0
  1616. *
  1617. * @param {number} x - The X coordinate of the top left corner of the Rectangle.
  1618. * @param {number} [y=x] - The Y coordinate of the top left corner of the Rectangle.
  1619. *
  1620. * @return {Phaser.Geom.Rectangle} This Rectangle object.
  1621. */
  1622. setPosition: function (x, y)
  1623. {
  1624. if (y === undefined) { y = x; }
  1625. this.x = x;
  1626. this.y = y;
  1627. return this;
  1628. },
  1629. /**
  1630. * Sets the width and height of the Rectangle.
  1631. *
  1632. * @method Phaser.Geom.Rectangle#setSize
  1633. * @since 3.0.0
  1634. *
  1635. * @param {number} width - The width to set the Rectangle to.
  1636. * @param {number} [height=width] - The height to set the Rectangle to.
  1637. *
  1638. * @return {Phaser.Geom.Rectangle} This Rectangle object.
  1639. */
  1640. setSize: function (width, height)
  1641. {
  1642. if (height === undefined) { height = width; }
  1643. this.width = width;
  1644. this.height = height;
  1645. return this;
  1646. },
  1647. /**
  1648. * Determines if the Rectangle is empty. A Rectangle is empty if its width or height is less than or equal to 0.
  1649. *
  1650. * @method Phaser.Geom.Rectangle#isEmpty
  1651. * @since 3.0.0
  1652. *
  1653. * @return {boolean} `true` if the Rectangle is empty. A Rectangle object is empty if its width or height is less than or equal to 0.
  1654. */
  1655. isEmpty: function ()
  1656. {
  1657. return (this.width <= 0 || this.height <= 0);
  1658. },
  1659. /**
  1660. * Returns a Line object that corresponds to the top of this Rectangle.
  1661. *
  1662. * @method Phaser.Geom.Rectangle#getLineA
  1663. * @since 3.0.0
  1664. *
  1665. * @generic {Phaser.Geom.Line} O - [line,$return]
  1666. *
  1667. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  1668. *
  1669. * @return {Phaser.Geom.Line} A Line object that corresponds to the top of this Rectangle.
  1670. */
  1671. getLineA: function (line)
  1672. {
  1673. if (line === undefined) { line = new Line(); }
  1674. line.setTo(this.x, this.y, this.right, this.y);
  1675. return line;
  1676. },
  1677. /**
  1678. * Returns a Line object that corresponds to the right of this Rectangle.
  1679. *
  1680. * @method Phaser.Geom.Rectangle#getLineB
  1681. * @since 3.0.0
  1682. *
  1683. * @generic {Phaser.Geom.Line} O - [line,$return]
  1684. *
  1685. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  1686. *
  1687. * @return {Phaser.Geom.Line} A Line object that corresponds to the right of this Rectangle.
  1688. */
  1689. getLineB: function (line)
  1690. {
  1691. if (line === undefined) { line = new Line(); }
  1692. line.setTo(this.right, this.y, this.right, this.bottom);
  1693. return line;
  1694. },
  1695. /**
  1696. * Returns a Line object that corresponds to the bottom of this Rectangle.
  1697. *
  1698. * @method Phaser.Geom.Rectangle#getLineC
  1699. * @since 3.0.0
  1700. *
  1701. * @generic {Phaser.Geom.Line} O - [line,$return]
  1702. *
  1703. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  1704. *
  1705. * @return {Phaser.Geom.Line} A Line object that corresponds to the bottom of this Rectangle.
  1706. */
  1707. getLineC: function (line)
  1708. {
  1709. if (line === undefined) { line = new Line(); }
  1710. line.setTo(this.right, this.bottom, this.x, this.bottom);
  1711. return line;
  1712. },
  1713. /**
  1714. * Returns a Line object that corresponds to the left of this Rectangle.
  1715. *
  1716. * @method Phaser.Geom.Rectangle#getLineD
  1717. * @since 3.0.0
  1718. *
  1719. * @generic {Phaser.Geom.Line} O - [line,$return]
  1720. *
  1721. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  1722. *
  1723. * @return {Phaser.Geom.Line} A Line object that corresponds to the left of this Rectangle.
  1724. */
  1725. getLineD: function (line)
  1726. {
  1727. if (line === undefined) { line = new Line(); }
  1728. line.setTo(this.x, this.bottom, this.x, this.y);
  1729. return line;
  1730. },
  1731. /**
  1732. * The x coordinate of the left of the Rectangle.
  1733. * Changing the left property of a Rectangle object has no effect on the y and height properties. However it does affect the width property, whereas changing the x value does not affect the width property.
  1734. *
  1735. * @name Phaser.Geom.Rectangle#left
  1736. * @type {number}
  1737. * @since 3.0.0
  1738. */
  1739. left: {
  1740. get: function ()
  1741. {
  1742. return this.x;
  1743. },
  1744. set: function (value)
  1745. {
  1746. if (value >= this.right)
  1747. {
  1748. this.width = 0;
  1749. }
  1750. else
  1751. {
  1752. this.width = this.right - value;
  1753. }
  1754. this.x = value;
  1755. }
  1756. },
  1757. /**
  1758. * The sum of the x and width properties.
  1759. * Changing the right property of a Rectangle object has no effect on the x, y and height properties, however it does affect the width property.
  1760. *
  1761. * @name Phaser.Geom.Rectangle#right
  1762. * @type {number}
  1763. * @since 3.0.0
  1764. */
  1765. right: {
  1766. get: function ()
  1767. {
  1768. return this.x + this.width;
  1769. },
  1770. set: function (value)
  1771. {
  1772. if (value <= this.x)
  1773. {
  1774. this.width = 0;
  1775. }
  1776. else
  1777. {
  1778. this.width = value - this.x;
  1779. }
  1780. }
  1781. },
  1782. /**
  1783. * The y coordinate of the top of the Rectangle. Changing the top property of a Rectangle object has no effect on the x and width properties.
  1784. * However it does affect the height property, whereas changing the y value does not affect the height property.
  1785. *
  1786. * @name Phaser.Geom.Rectangle#top
  1787. * @type {number}
  1788. * @since 3.0.0
  1789. */
  1790. top: {
  1791. get: function ()
  1792. {
  1793. return this.y;
  1794. },
  1795. set: function (value)
  1796. {
  1797. if (value >= this.bottom)
  1798. {
  1799. this.height = 0;
  1800. }
  1801. else
  1802. {
  1803. this.height = (this.bottom - value);
  1804. }
  1805. this.y = value;
  1806. }
  1807. },
  1808. /**
  1809. * The sum of the y and height properties.
  1810. * Changing the bottom property of a Rectangle object has no effect on the x, y and width properties, but does change the height property.
  1811. *
  1812. * @name Phaser.Geom.Rectangle#bottom
  1813. * @type {number}
  1814. * @since 3.0.0
  1815. */
  1816. bottom: {
  1817. get: function ()
  1818. {
  1819. return this.y + this.height;
  1820. },
  1821. set: function (value)
  1822. {
  1823. if (value <= this.y)
  1824. {
  1825. this.height = 0;
  1826. }
  1827. else
  1828. {
  1829. this.height = value - this.y;
  1830. }
  1831. }
  1832. },
  1833. /**
  1834. * The x coordinate of the center of the Rectangle.
  1835. *
  1836. * @name Phaser.Geom.Rectangle#centerX
  1837. * @type {number}
  1838. * @since 3.0.0
  1839. */
  1840. centerX: {
  1841. get: function ()
  1842. {
  1843. return this.x + (this.width / 2);
  1844. },
  1845. set: function (value)
  1846. {
  1847. this.x = value - (this.width / 2);
  1848. }
  1849. },
  1850. /**
  1851. * The y coordinate of the center of the Rectangle.
  1852. *
  1853. * @name Phaser.Geom.Rectangle#centerY
  1854. * @type {number}
  1855. * @since 3.0.0
  1856. */
  1857. centerY: {
  1858. get: function ()
  1859. {
  1860. return this.y + (this.height / 2);
  1861. },
  1862. set: function (value)
  1863. {
  1864. this.y = value - (this.height / 2);
  1865. }
  1866. }
  1867. });
  1868. module.exports = Rectangle;
  1869. /***/ }),
  1870. /* 11 */
  1871. /***/ (function(module, exports, __webpack_require__) {
  1872. "use strict";
  1873. var has = Object.prototype.hasOwnProperty
  1874. , prefix = '~';
  1875. /**
  1876. * Constructor to create a storage for our `EE` objects.
  1877. * An `Events` instance is a plain object whose properties are event names.
  1878. *
  1879. * @constructor
  1880. * @private
  1881. */
  1882. function Events() {}
  1883. //
  1884. // We try to not inherit from `Object.prototype`. In some engines creating an
  1885. // instance in this way is faster than calling `Object.create(null)` directly.
  1886. // If `Object.create(null)` is not supported we prefix the event names with a
  1887. // character to make sure that the built-in object properties are not
  1888. // overridden or used as an attack vector.
  1889. //
  1890. if (Object.create) {
  1891. Events.prototype = Object.create(null);
  1892. //
  1893. // This hack is needed because the `__proto__` property is still inherited in
  1894. // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
  1895. //
  1896. if (!new Events().__proto__) prefix = false;
  1897. }
  1898. /**
  1899. * Representation of a single event listener.
  1900. *
  1901. * @param {Function} fn The listener function.
  1902. * @param {*} context The context to invoke the listener with.
  1903. * @param {Boolean} [once=false] Specify if the listener is a one-time listener.
  1904. * @constructor
  1905. * @private
  1906. */
  1907. function EE(fn, context, once) {
  1908. this.fn = fn;
  1909. this.context = context;
  1910. this.once = once || false;
  1911. }
  1912. /**
  1913. * Add a listener for a given event.
  1914. *
  1915. * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
  1916. * @param {(String|Symbol)} event The event name.
  1917. * @param {Function} fn The listener function.
  1918. * @param {*} context The context to invoke the listener with.
  1919. * @param {Boolean} once Specify if the listener is a one-time listener.
  1920. * @returns {EventEmitter}
  1921. * @private
  1922. */
  1923. function addListener(emitter, event, fn, context, once) {
  1924. if (typeof fn !== 'function') {
  1925. throw new TypeError('The listener must be a function');
  1926. }
  1927. var listener = new EE(fn, context || emitter, once)
  1928. , evt = prefix ? prefix + event : event;
  1929. if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
  1930. else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
  1931. else emitter._events[evt] = [emitter._events[evt], listener];
  1932. return emitter;
  1933. }
  1934. /**
  1935. * Clear event by name.
  1936. *
  1937. * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
  1938. * @param {(String|Symbol)} evt The Event name.
  1939. * @private
  1940. */
  1941. function clearEvent(emitter, evt) {
  1942. if (--emitter._eventsCount === 0) emitter._events = new Events();
  1943. else delete emitter._events[evt];
  1944. }
  1945. /**
  1946. * Minimal `EventEmitter` interface that is molded against the Node.js
  1947. * `EventEmitter` interface.
  1948. *
  1949. * @constructor
  1950. * @public
  1951. */
  1952. function EventEmitter() {
  1953. this._events = new Events();
  1954. this._eventsCount = 0;
  1955. }
  1956. /**
  1957. * Return an array listing the events for which the emitter has registered
  1958. * listeners.
  1959. *
  1960. * @returns {Array}
  1961. * @public
  1962. */
  1963. EventEmitter.prototype.eventNames = function eventNames() {
  1964. var names = []
  1965. , events
  1966. , name;
  1967. if (this._eventsCount === 0) return names;
  1968. for (name in (events = this._events)) {
  1969. if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
  1970. }
  1971. if (Object.getOwnPropertySymbols) {
  1972. return names.concat(Object.getOwnPropertySymbols(events));
  1973. }
  1974. return names;
  1975. };
  1976. /**
  1977. * Return the listeners registered for a given event.
  1978. *
  1979. * @param {(String|Symbol)} event The event name.
  1980. * @returns {Array} The registered listeners.
  1981. * @public
  1982. */
  1983. EventEmitter.prototype.listeners = function listeners(event) {
  1984. var evt = prefix ? prefix + event : event
  1985. , handlers = this._events[evt];
  1986. if (!handlers) return [];
  1987. if (handlers.fn) return [handlers.fn];
  1988. for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
  1989. ee[i] = handlers[i].fn;
  1990. }
  1991. return ee;
  1992. };
  1993. /**
  1994. * Return the number of listeners listening to a given event.
  1995. *
  1996. * @param {(String|Symbol)} event The event name.
  1997. * @returns {Number} The number of listeners.
  1998. * @public
  1999. */
  2000. EventEmitter.prototype.listenerCount = function listenerCount(event) {
  2001. var evt = prefix ? prefix + event : event
  2002. , listeners = this._events[evt];
  2003. if (!listeners) return 0;
  2004. if (listeners.fn) return 1;
  2005. return listeners.length;
  2006. };
  2007. /**
  2008. * Calls each of the listeners registered for a given event.
  2009. *
  2010. * @param {(String|Symbol)} event The event name.
  2011. * @returns {Boolean} `true` if the event had listeners, else `false`.
  2012. * @public
  2013. */
  2014. EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
  2015. var evt = prefix ? prefix + event : event;
  2016. if (!this._events[evt]) return false;
  2017. var listeners = this._events[evt]
  2018. , len = arguments.length
  2019. , args
  2020. , i;
  2021. if (listeners.fn) {
  2022. if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
  2023. switch (len) {
  2024. case 1: return listeners.fn.call(listeners.context), true;
  2025. case 2: return listeners.fn.call(listeners.context, a1), true;
  2026. case 3: return listeners.fn.call(listeners.context, a1, a2), true;
  2027. case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
  2028. case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
  2029. case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
  2030. }
  2031. for (i = 1, args = new Array(len -1); i < len; i++) {
  2032. args[i - 1] = arguments[i];
  2033. }
  2034. listeners.fn.apply(listeners.context, args);
  2035. } else {
  2036. var length = listeners.length
  2037. , j;
  2038. for (i = 0; i < length; i++) {
  2039. if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
  2040. switch (len) {
  2041. case 1: listeners[i].fn.call(listeners[i].context); break;
  2042. case 2: listeners[i].fn.call(listeners[i].context, a1); break;
  2043. case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
  2044. case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
  2045. default:
  2046. if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
  2047. args[j - 1] = arguments[j];
  2048. }
  2049. listeners[i].fn.apply(listeners[i].context, args);
  2050. }
  2051. }
  2052. }
  2053. return true;
  2054. };
  2055. /**
  2056. * Add a listener for a given event.
  2057. *
  2058. * @param {(String|Symbol)} event The event name.
  2059. * @param {Function} fn The listener function.
  2060. * @param {*} [context=this] The context to invoke the listener with.
  2061. * @returns {EventEmitter} `this`.
  2062. * @public
  2063. */
  2064. EventEmitter.prototype.on = function on(event, fn, context) {
  2065. return addListener(this, event, fn, context, false);
  2066. };
  2067. /**
  2068. * Add a one-time listener for a given event.
  2069. *
  2070. * @param {(String|Symbol)} event The event name.
  2071. * @param {Function} fn The listener function.
  2072. * @param {*} [context=this] The context to invoke the listener with.
  2073. * @returns {EventEmitter} `this`.
  2074. * @public
  2075. */
  2076. EventEmitter.prototype.once = function once(event, fn, context) {
  2077. return addListener(this, event, fn, context, true);
  2078. };
  2079. /**
  2080. * Remove the listeners of a given event.
  2081. *
  2082. * @param {(String|Symbol)} event The event name.
  2083. * @param {Function} fn Only remove the listeners that match this function.
  2084. * @param {*} context Only remove the listeners that have this context.
  2085. * @param {Boolean} once Only remove one-time listeners.
  2086. * @returns {EventEmitter} `this`.
  2087. * @public
  2088. */
  2089. EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
  2090. var evt = prefix ? prefix + event : event;
  2091. if (!this._events[evt]) return this;
  2092. if (!fn) {
  2093. clearEvent(this, evt);
  2094. return this;
  2095. }
  2096. var listeners = this._events[evt];
  2097. if (listeners.fn) {
  2098. if (
  2099. listeners.fn === fn &&
  2100. (!once || listeners.once) &&
  2101. (!context || listeners.context === context)
  2102. ) {
  2103. clearEvent(this, evt);
  2104. }
  2105. } else {
  2106. for (var i = 0, events = [], length = listeners.length; i < length; i++) {
  2107. if (
  2108. listeners[i].fn !== fn ||
  2109. (once && !listeners[i].once) ||
  2110. (context && listeners[i].context !== context)
  2111. ) {
  2112. events.push(listeners[i]);
  2113. }
  2114. }
  2115. //
  2116. // Reset the array, or remove it completely if we have no more listeners.
  2117. //
  2118. if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
  2119. else clearEvent(this, evt);
  2120. }
  2121. return this;
  2122. };
  2123. /**
  2124. * Remove all listeners, or those of the specified event.
  2125. *
  2126. * @param {(String|Symbol)} [event] The event name.
  2127. * @returns {EventEmitter} `this`.
  2128. * @public
  2129. */
  2130. EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
  2131. var evt;
  2132. if (event) {
  2133. evt = prefix ? prefix + event : event;
  2134. if (this._events[evt]) clearEvent(this, evt);
  2135. } else {
  2136. this._events = new Events();
  2137. this._eventsCount = 0;
  2138. }
  2139. return this;
  2140. };
  2141. //
  2142. // Alias methods names because people roll like that.
  2143. //
  2144. EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
  2145. EventEmitter.prototype.addListener = EventEmitter.prototype.on;
  2146. //
  2147. // Expose the prefix.
  2148. //
  2149. EventEmitter.prefixed = prefix;
  2150. //
  2151. // Allow `EventEmitter` to be imported as module namespace.
  2152. //
  2153. EventEmitter.EventEmitter = EventEmitter;
  2154. //
  2155. // Expose the module.
  2156. //
  2157. if (true) {
  2158. module.exports = EventEmitter;
  2159. }
  2160. /***/ }),
  2161. /* 12 */
  2162. /***/ (function(module, exports, __webpack_require__) {
  2163. /**
  2164. * @author Richard Davey <rich@photonstorm.com>
  2165. * @copyright 2019 Photon Storm Ltd.
  2166. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2167. */
  2168. var MATH = __webpack_require__(20);
  2169. var GetValue = __webpack_require__(4);
  2170. /**
  2171. * Retrieves a value from an object. Allows for more advanced selection options, including:
  2172. *
  2173. * Allowed types:
  2174. *
  2175. * Implicit
  2176. * {
  2177. * x: 4
  2178. * }
  2179. *
  2180. * From function
  2181. * {
  2182. * x: function ()
  2183. * }
  2184. *
  2185. * Randomly pick one element from the array
  2186. * {
  2187. * x: [a, b, c, d, e, f]
  2188. * }
  2189. *
  2190. * Random integer between min and max:
  2191. * {
  2192. * x: { randInt: [min, max] }
  2193. * }
  2194. *
  2195. * Random float between min and max:
  2196. * {
  2197. * x: { randFloat: [min, max] }
  2198. * }
  2199. *
  2200. *
  2201. * @function Phaser.Utils.Objects.GetAdvancedValue
  2202. * @since 3.0.0
  2203. *
  2204. * @param {object} source - The object to retrieve the value from.
  2205. * @param {string} key - The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`) - `banner.hideBanner` would return the value of the `hideBanner` property from the object stored in the `banner` property of the `source` object.
  2206. * @param {*} defaultValue - The value to return if the `key` isn't found in the `source` object.
  2207. *
  2208. * @return {*} The value of the requested key.
  2209. */
  2210. var GetAdvancedValue = function (source, key, defaultValue)
  2211. {
  2212. var value = GetValue(source, key, null);
  2213. if (value === null)
  2214. {
  2215. return defaultValue;
  2216. }
  2217. else if (Array.isArray(value))
  2218. {
  2219. return MATH.RND.pick(value);
  2220. }
  2221. else if (typeof value === 'object')
  2222. {
  2223. if (value.hasOwnProperty('randInt'))
  2224. {
  2225. return MATH.RND.integerInRange(value.randInt[0], value.randInt[1]);
  2226. }
  2227. else if (value.hasOwnProperty('randFloat'))
  2228. {
  2229. return MATH.RND.realInRange(value.randFloat[0], value.randFloat[1]);
  2230. }
  2231. }
  2232. else if (typeof value === 'function')
  2233. {
  2234. return value(key);
  2235. }
  2236. return value;
  2237. };
  2238. module.exports = GetAdvancedValue;
  2239. /***/ }),
  2240. /* 13 */
  2241. /***/ (function(module, exports, __webpack_require__) {
  2242. /**
  2243. * @author Richard Davey <rich@photonstorm.com>
  2244. * @copyright 2019 Photon Storm Ltd.
  2245. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2246. */
  2247. /**
  2248. * @namespace Phaser.GameObjects.Components
  2249. */
  2250. module.exports = {
  2251. Alpha: __webpack_require__(435),
  2252. Animation: __webpack_require__(460),
  2253. BlendMode: __webpack_require__(432),
  2254. ComputedSize: __webpack_require__(1248),
  2255. Crop: __webpack_require__(1247),
  2256. Depth: __webpack_require__(431),
  2257. Flip: __webpack_require__(1246),
  2258. GetBounds: __webpack_require__(1245),
  2259. Mask: __webpack_require__(427),
  2260. Origin: __webpack_require__(1244),
  2261. Pipeline: __webpack_require__(200),
  2262. ScaleMode: __webpack_require__(1243),
  2263. ScrollFactor: __webpack_require__(424),
  2264. Size: __webpack_require__(1242),
  2265. Texture: __webpack_require__(1241),
  2266. TextureCrop: __webpack_require__(1240),
  2267. Tint: __webpack_require__(1239),
  2268. ToJSON: __webpack_require__(423),
  2269. Transform: __webpack_require__(422),
  2270. TransformMatrix: __webpack_require__(41),
  2271. Visible: __webpack_require__(421)
  2272. };
  2273. /***/ }),
  2274. /* 14 */
  2275. /***/ (function(module, exports, __webpack_require__) {
  2276. /**
  2277. * @author Richard Davey <rich@photonstorm.com>
  2278. * @copyright 2019 Photon Storm Ltd.
  2279. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2280. */
  2281. var Class = __webpack_require__(0);
  2282. var PluginCache = __webpack_require__(17);
  2283. var SceneEvents = __webpack_require__(16);
  2284. /**
  2285. * @classdesc
  2286. * The Game Object Creator is a Scene plugin that allows you to quickly create many common
  2287. * types of Game Objects and return them. Unlike the Game Object Factory, they are not automatically
  2288. * added to the Scene.
  2289. *
  2290. * Game Objects directly register themselves with the Creator and inject their own creation
  2291. * methods into the class.
  2292. *
  2293. * @class GameObjectCreator
  2294. * @memberof Phaser.GameObjects
  2295. * @constructor
  2296. * @since 3.0.0
  2297. *
  2298. * @param {Phaser.Scene} scene - The Scene to which this Game Object Factory belongs.
  2299. */
  2300. var GameObjectCreator = new Class({
  2301. initialize:
  2302. function GameObjectCreator (scene)
  2303. {
  2304. /**
  2305. * The Scene to which this Game Object Creator belongs.
  2306. *
  2307. * @name Phaser.GameObjects.GameObjectCreator#scene
  2308. * @type {Phaser.Scene}
  2309. * @protected
  2310. * @since 3.0.0
  2311. */
  2312. this.scene = scene;
  2313. /**
  2314. * A reference to the Scene.Systems.
  2315. *
  2316. * @name Phaser.GameObjects.GameObjectCreator#systems
  2317. * @type {Phaser.Scenes.Systems}
  2318. * @protected
  2319. * @since 3.0.0
  2320. */
  2321. this.systems = scene.sys;
  2322. /**
  2323. * A reference to the Scene Display List.
  2324. *
  2325. * @name Phaser.GameObjects.GameObjectCreator#displayList
  2326. * @type {Phaser.GameObjects.DisplayList}
  2327. * @protected
  2328. * @since 3.0.0
  2329. */
  2330. this.displayList;
  2331. /**
  2332. * A reference to the Scene Update List.
  2333. *
  2334. * @name Phaser.GameObjects.GameObjectCreator#updateList;
  2335. * @type {Phaser.GameObjects.UpdateList}
  2336. * @protected
  2337. * @since 3.0.0
  2338. */
  2339. this.updateList;
  2340. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  2341. scene.sys.events.on(SceneEvents.START, this.start, this);
  2342. },
  2343. /**
  2344. * This method is called automatically, only once, when the Scene is first created.
  2345. * Do not invoke it directly.
  2346. *
  2347. * @method Phaser.GameObjects.GameObjectCreator#boot
  2348. * @private
  2349. * @since 3.5.1
  2350. */
  2351. boot: function ()
  2352. {
  2353. this.displayList = this.systems.displayList;
  2354. this.updateList = this.systems.updateList;
  2355. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  2356. },
  2357. /**
  2358. * This method is called automatically by the Scene when it is starting up.
  2359. * It is responsible for creating local systems, properties and listening for Scene events.
  2360. * Do not invoke it directly.
  2361. *
  2362. * @method Phaser.GameObjects.GameObjectCreator#start
  2363. * @private
  2364. * @since 3.5.0
  2365. */
  2366. start: function ()
  2367. {
  2368. this.systems.events.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  2369. },
  2370. /**
  2371. * The Scene that owns this plugin is shutting down.
  2372. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  2373. *
  2374. * @method Phaser.GameObjects.GameObjectCreator#shutdown
  2375. * @private
  2376. * @since 3.0.0
  2377. */
  2378. shutdown: function ()
  2379. {
  2380. this.systems.events.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  2381. },
  2382. /**
  2383. * The Scene that owns this plugin is being destroyed.
  2384. * We need to shutdown and then kill off all external references.
  2385. *
  2386. * @method Phaser.GameObjects.GameObjectCreator#destroy
  2387. * @private
  2388. * @since 3.0.0
  2389. */
  2390. destroy: function ()
  2391. {
  2392. this.shutdown();
  2393. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  2394. this.scene = null;
  2395. this.systems = null;
  2396. this.displayList = null;
  2397. this.updateList = null;
  2398. }
  2399. });
  2400. // Static method called directly by the Game Object creator functions
  2401. GameObjectCreator.register = function (factoryType, factoryFunction)
  2402. {
  2403. if (!GameObjectCreator.prototype.hasOwnProperty(factoryType))
  2404. {
  2405. GameObjectCreator.prototype[factoryType] = factoryFunction;
  2406. }
  2407. };
  2408. PluginCache.register('GameObjectCreator', GameObjectCreator, 'make');
  2409. module.exports = GameObjectCreator;
  2410. /***/ }),
  2411. /* 15 */
  2412. /***/ (function(module, exports) {
  2413. /**
  2414. * @author Richard Davey <rich@photonstorm.com>
  2415. * @copyright 2019 Photon Storm Ltd.
  2416. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2417. */
  2418. var FILE_CONST = {
  2419. /**
  2420. * The Loader is idle.
  2421. *
  2422. * @name Phaser.Loader.LOADER_IDLE
  2423. * @type {integer}
  2424. * @since 3.0.0
  2425. */
  2426. LOADER_IDLE: 0,
  2427. /**
  2428. * The Loader is actively loading.
  2429. *
  2430. * @name Phaser.Loader.LOADER_LOADING
  2431. * @type {integer}
  2432. * @since 3.0.0
  2433. */
  2434. LOADER_LOADING: 1,
  2435. /**
  2436. * The Loader is processing files is has loaded.
  2437. *
  2438. * @name Phaser.Loader.LOADER_PROCESSING
  2439. * @type {integer}
  2440. * @since 3.0.0
  2441. */
  2442. LOADER_PROCESSING: 2,
  2443. /**
  2444. * The Loader has completed loading and processing.
  2445. *
  2446. * @name Phaser.Loader.LOADER_COMPLETE
  2447. * @type {integer}
  2448. * @since 3.0.0
  2449. */
  2450. LOADER_COMPLETE: 3,
  2451. /**
  2452. * The Loader is shutting down.
  2453. *
  2454. * @name Phaser.Loader.LOADER_SHUTDOWN
  2455. * @type {integer}
  2456. * @since 3.0.0
  2457. */
  2458. LOADER_SHUTDOWN: 4,
  2459. /**
  2460. * The Loader has been destroyed.
  2461. *
  2462. * @name Phaser.Loader.LOADER_DESTROYED
  2463. * @type {integer}
  2464. * @since 3.0.0
  2465. */
  2466. LOADER_DESTROYED: 5,
  2467. /**
  2468. * File is in the load queue but not yet started
  2469. *
  2470. * @name Phaser.Loader.FILE_PENDING
  2471. * @type {integer}
  2472. * @since 3.0.0
  2473. */
  2474. FILE_PENDING: 10,
  2475. /**
  2476. * File has been started to load by the loader (onLoad called)
  2477. *
  2478. * @name Phaser.Loader.FILE_LOADING
  2479. * @type {integer}
  2480. * @since 3.0.0
  2481. */
  2482. FILE_LOADING: 11,
  2483. /**
  2484. * File has loaded successfully, awaiting processing
  2485. *
  2486. * @name Phaser.Loader.FILE_LOADED
  2487. * @type {integer}
  2488. * @since 3.0.0
  2489. */
  2490. FILE_LOADED: 12,
  2491. /**
  2492. * File failed to load
  2493. *
  2494. * @name Phaser.Loader.FILE_FAILED
  2495. * @type {integer}
  2496. * @since 3.0.0
  2497. */
  2498. FILE_FAILED: 13,
  2499. /**
  2500. * File is being processed (onProcess callback)
  2501. *
  2502. * @name Phaser.Loader.FILE_PROCESSING
  2503. * @type {integer}
  2504. * @since 3.0.0
  2505. */
  2506. FILE_PROCESSING: 14,
  2507. /**
  2508. * The File has errored somehow during processing.
  2509. *
  2510. * @name Phaser.Loader.FILE_ERRORED
  2511. * @type {integer}
  2512. * @since 3.0.0
  2513. */
  2514. FILE_ERRORED: 16,
  2515. /**
  2516. * File has finished processing.
  2517. *
  2518. * @name Phaser.Loader.FILE_COMPLETE
  2519. * @type {integer}
  2520. * @since 3.0.0
  2521. */
  2522. FILE_COMPLETE: 17,
  2523. /**
  2524. * File has been destroyed
  2525. *
  2526. * @name Phaser.Loader.FILE_DESTROYED
  2527. * @type {integer}
  2528. * @since 3.0.0
  2529. */
  2530. FILE_DESTROYED: 18,
  2531. /**
  2532. * File was populated from local data and doesn't need an HTTP request
  2533. *
  2534. * @name Phaser.Loader.FILE_POPULATED
  2535. * @type {integer}
  2536. * @since 3.0.0
  2537. */
  2538. FILE_POPULATED: 19
  2539. };
  2540. module.exports = FILE_CONST;
  2541. /***/ }),
  2542. /* 16 */
  2543. /***/ (function(module, exports, __webpack_require__) {
  2544. /**
  2545. * @author Richard Davey <rich@photonstorm.com>
  2546. * @copyright 2019 Photon Storm Ltd.
  2547. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2548. */
  2549. /**
  2550. * @namespace Phaser.Scenes.Events
  2551. */
  2552. module.exports = {
  2553. BOOT: __webpack_require__(1115),
  2554. DESTROY: __webpack_require__(1114),
  2555. PAUSE: __webpack_require__(1113),
  2556. POST_UPDATE: __webpack_require__(1112),
  2557. PRE_UPDATE: __webpack_require__(1111),
  2558. READY: __webpack_require__(1110),
  2559. RENDER: __webpack_require__(1109),
  2560. RESUME: __webpack_require__(1108),
  2561. SHUTDOWN: __webpack_require__(1107),
  2562. SLEEP: __webpack_require__(1106),
  2563. START: __webpack_require__(1105),
  2564. TRANSITION_COMPLETE: __webpack_require__(1104),
  2565. TRANSITION_INIT: __webpack_require__(1103),
  2566. TRANSITION_OUT: __webpack_require__(1102),
  2567. TRANSITION_START: __webpack_require__(1101),
  2568. TRANSITION_WAKE: __webpack_require__(1100),
  2569. UPDATE: __webpack_require__(1099),
  2570. WAKE: __webpack_require__(1098)
  2571. };
  2572. /***/ }),
  2573. /* 17 */
  2574. /***/ (function(module, exports) {
  2575. /**
  2576. * @author Richard Davey <rich@photonstorm.com>
  2577. * @copyright 2019 Photon Storm Ltd.
  2578. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2579. */
  2580. // Contains the plugins that Phaser uses globally and locally.
  2581. // These are the source objects, not instantiated.
  2582. var corePlugins = {};
  2583. // Contains the plugins that the dev has loaded into their game
  2584. // These are the source objects, not instantiated.
  2585. var customPlugins = {};
  2586. /**
  2587. * @typedef {object} CorePluginContainer
  2588. *
  2589. * @property {string} key - The unique name of this plugin in the core plugin cache.
  2590. * @property {function} plugin - The plugin to be stored. Should be the source object, not instantiated.
  2591. * @property {string} [mapping] - If this plugin is to be injected into the Scene Systems, this is the property key map used.
  2592. * @property {boolean} [custom=false] - Core Scene plugin or a Custom Scene plugin?
  2593. */
  2594. /**
  2595. * @typedef {object} CustomPluginContainer
  2596. *
  2597. * @property {string} key - The unique name of this plugin in the custom plugin cache.
  2598. * @property {function} plugin - The plugin to be stored. Should be the source object, not instantiated.
  2599. */
  2600. var PluginCache = {};
  2601. /**
  2602. * @namespace Phaser.Plugins.PluginCache
  2603. */
  2604. /**
  2605. * Static method called directly by the Core internal Plugins.
  2606. * Key is a reference used to get the plugin from the plugins object (i.e. InputPlugin)
  2607. * Plugin is the object to instantiate to create the plugin
  2608. * Mapping is what the plugin is injected into the Scene.Systems as (i.e. input)
  2609. *
  2610. * @method Phaser.Plugins.PluginCache.register
  2611. * @since 3.8.0
  2612. *
  2613. * @param {string} key - A reference used to get this plugin from the plugin cache.
  2614. * @param {function} plugin - The plugin to be stored. Should be the core object, not instantiated.
  2615. * @param {string} mapping - If this plugin is to be injected into the Scene Systems, this is the property key map used.
  2616. * @param {boolean} [custom=false] - Core Scene plugin or a Custom Scene plugin?
  2617. */
  2618. PluginCache.register = function (key, plugin, mapping, custom)
  2619. {
  2620. if (custom === undefined) { custom = false; }
  2621. corePlugins[key] = { plugin: plugin, mapping: mapping, custom: custom };
  2622. };
  2623. /**
  2624. * Stores a custom plugin in the global plugin cache.
  2625. * The key must be unique, within the scope of the cache.
  2626. *
  2627. * @method Phaser.Plugins.PluginCache.registerCustom
  2628. * @since 3.8.0
  2629. *
  2630. * @param {string} key - A reference used to get this plugin from the plugin cache.
  2631. * @param {function} plugin - The plugin to be stored. Should be the core object, not instantiated.
  2632. * @param {string} mapping - If this plugin is to be injected into the Scene Systems, this is the property key map used.
  2633. * @param {?any} data - A value to be passed to the plugin's `init` method.
  2634. */
  2635. PluginCache.registerCustom = function (key, plugin, mapping, data)
  2636. {
  2637. customPlugins[key] = { plugin: plugin, mapping: mapping, data: data };
  2638. };
  2639. /**
  2640. * Checks if the given key is already being used in the core plugin cache.
  2641. *
  2642. * @method Phaser.Plugins.PluginCache.hasCore
  2643. * @since 3.8.0
  2644. *
  2645. * @param {string} key - The key to check for.
  2646. *
  2647. * @return {boolean} `true` if the key is already in use in the core cache, otherwise `false`.
  2648. */
  2649. PluginCache.hasCore = function (key)
  2650. {
  2651. return corePlugins.hasOwnProperty(key);
  2652. };
  2653. /**
  2654. * Checks if the given key is already being used in the custom plugin cache.
  2655. *
  2656. * @method Phaser.Plugins.PluginCache.hasCustom
  2657. * @since 3.8.0
  2658. *
  2659. * @param {string} key - The key to check for.
  2660. *
  2661. * @return {boolean} `true` if the key is already in use in the custom cache, otherwise `false`.
  2662. */
  2663. PluginCache.hasCustom = function (key)
  2664. {
  2665. return customPlugins.hasOwnProperty(key);
  2666. };
  2667. /**
  2668. * Returns the core plugin object from the cache based on the given key.
  2669. *
  2670. * @method Phaser.Plugins.PluginCache.getCore
  2671. * @since 3.8.0
  2672. *
  2673. * @param {string} key - The key of the core plugin to get.
  2674. *
  2675. * @return {CorePluginContainer} The core plugin object.
  2676. */
  2677. PluginCache.getCore = function (key)
  2678. {
  2679. return corePlugins[key];
  2680. };
  2681. /**
  2682. * Returns the custom plugin object from the cache based on the given key.
  2683. *
  2684. * @method Phaser.Plugins.PluginCache.getCustom
  2685. * @since 3.8.0
  2686. *
  2687. * @param {string} key - The key of the custom plugin to get.
  2688. *
  2689. * @return {CustomPluginContainer} The custom plugin object.
  2690. */
  2691. PluginCache.getCustom = function (key)
  2692. {
  2693. return customPlugins[key];
  2694. };
  2695. /**
  2696. * Returns an object from the custom cache based on the given key that can be instantiated.
  2697. *
  2698. * @method Phaser.Plugins.PluginCache.getCustomClass
  2699. * @since 3.8.0
  2700. *
  2701. * @param {string} key - The key of the custom plugin to get.
  2702. *
  2703. * @return {function} The custom plugin object.
  2704. */
  2705. PluginCache.getCustomClass = function (key)
  2706. {
  2707. return (customPlugins.hasOwnProperty(key)) ? customPlugins[key].plugin : null;
  2708. };
  2709. /**
  2710. * Removes a core plugin based on the given key.
  2711. *
  2712. * @method Phaser.Plugins.PluginCache.remove
  2713. * @since 3.8.0
  2714. *
  2715. * @param {string} key - The key of the core plugin to remove.
  2716. */
  2717. PluginCache.remove = function (key)
  2718. {
  2719. if (corePlugins.hasOwnProperty(key))
  2720. {
  2721. delete corePlugins[key];
  2722. }
  2723. };
  2724. /**
  2725. * Removes a custom plugin based on the given key.
  2726. *
  2727. * @method Phaser.Plugins.PluginCache.removeCustom
  2728. * @since 3.8.0
  2729. *
  2730. * @param {string} key - The key of the custom plugin to remove.
  2731. */
  2732. PluginCache.removeCustom = function (key)
  2733. {
  2734. if (customPlugins.hasOwnProperty(key))
  2735. {
  2736. delete customPlugins[key];
  2737. }
  2738. };
  2739. /**
  2740. * Removes all Core Plugins.
  2741. *
  2742. * This includes all of the internal system plugins that Phaser needs, like the Input Plugin and Loader Plugin.
  2743. * So be sure you only call this if you do not wish to run Phaser again.
  2744. *
  2745. * @method Phaser.Plugins.PluginCache.destroyCorePlugins
  2746. * @since 3.12.0
  2747. */
  2748. PluginCache.destroyCorePlugins = function ()
  2749. {
  2750. for (var key in corePlugins)
  2751. {
  2752. if (corePlugins.hasOwnProperty(key))
  2753. {
  2754. delete corePlugins[key];
  2755. }
  2756. }
  2757. };
  2758. /**
  2759. * Removes all Custom Plugins.
  2760. *
  2761. * @method Phaser.Plugins.PluginCache.destroyCustomPlugins
  2762. * @since 3.12.0
  2763. */
  2764. PluginCache.destroyCustomPlugins = function ()
  2765. {
  2766. for (var key in customPlugins)
  2767. {
  2768. if (customPlugins.hasOwnProperty(key))
  2769. {
  2770. delete customPlugins[key];
  2771. }
  2772. }
  2773. };
  2774. module.exports = PluginCache;
  2775. /***/ }),
  2776. /* 18 */
  2777. /***/ (function(module, exports, __webpack_require__) {
  2778. /**
  2779. * @author Richard Davey <rich@photonstorm.com>
  2780. * @copyright 2019 Photon Storm Ltd.
  2781. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2782. */
  2783. var Class = __webpack_require__(0);
  2784. var ComponentsToJSON = __webpack_require__(423);
  2785. var DataManager = __webpack_require__(134);
  2786. var EventEmitter = __webpack_require__(11);
  2787. var Events = __webpack_require__(133);
  2788. /**
  2789. * @classdesc
  2790. * The base class that all Game Objects extend.
  2791. * You don't create GameObjects directly and they cannot be added to the display list.
  2792. * Instead, use them as the base for your own custom classes.
  2793. *
  2794. * @class GameObject
  2795. * @memberof Phaser.GameObjects
  2796. * @extends Phaser.Events.EventEmitter
  2797. * @constructor
  2798. * @since 3.0.0
  2799. *
  2800. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs.
  2801. * @param {string} type - A textual representation of the type of Game Object, i.e. `sprite`.
  2802. */
  2803. var GameObject = new Class({
  2804. Extends: EventEmitter,
  2805. initialize:
  2806. function GameObject (scene, type)
  2807. {
  2808. EventEmitter.call(this);
  2809. /**
  2810. * The Scene to which this Game Object belongs.
  2811. * Game Objects can only belong to one Scene.
  2812. *
  2813. * @name Phaser.GameObjects.GameObject#scene
  2814. * @type {Phaser.Scene}
  2815. * @protected
  2816. * @since 3.0.0
  2817. */
  2818. this.scene = scene;
  2819. /**
  2820. * A textual representation of this Game Object, i.e. `sprite`.
  2821. * Used internally by Phaser but is available for your own custom classes to populate.
  2822. *
  2823. * @name Phaser.GameObjects.GameObject#type
  2824. * @type {string}
  2825. * @since 3.0.0
  2826. */
  2827. this.type = type;
  2828. /**
  2829. * The current state of this Game Object.
  2830. *
  2831. * Phaser itself will never modify this value, although plugins may do so.
  2832. *
  2833. * Use this property to track the state of a Game Object during its lifetime. For example, it could move from
  2834. * a state of 'moving', to 'attacking', to 'dead'. The state value should be an integer (ideally mapped to a constant
  2835. * in your game code), or a string. These are recommended to keep it light and simple, with fast comparisons.
  2836. * If you need to store complex data about your Game Object, look at using the Data Component instead.
  2837. *
  2838. * @name Phaser.GameObjects.GameObject#state
  2839. * @type {(integer|string)}
  2840. * @since 3.16.0
  2841. */
  2842. this.state = 0;
  2843. /**
  2844. * The parent Container of this Game Object, if it has one.
  2845. *
  2846. * @name Phaser.GameObjects.GameObject#parentContainer
  2847. * @type {Phaser.GameObjects.Container}
  2848. * @since 3.4.0
  2849. */
  2850. this.parentContainer = null;
  2851. /**
  2852. * The name of this Game Object.
  2853. * Empty by default and never populated by Phaser, this is left for developers to use.
  2854. *
  2855. * @name Phaser.GameObjects.GameObject#name
  2856. * @type {string}
  2857. * @default ''
  2858. * @since 3.0.0
  2859. */
  2860. this.name = '';
  2861. /**
  2862. * The active state of this Game Object.
  2863. * A Game Object with an active state of `true` is processed by the Scenes UpdateList, if added to it.
  2864. * An active object is one which is having its logic and internal systems updated.
  2865. *
  2866. * @name Phaser.GameObjects.GameObject#active
  2867. * @type {boolean}
  2868. * @default true
  2869. * @since 3.0.0
  2870. */
  2871. this.active = true;
  2872. /**
  2873. * The Tab Index of the Game Object.
  2874. * Reserved for future use by plugins and the Input Manager.
  2875. *
  2876. * @name Phaser.GameObjects.GameObject#tabIndex
  2877. * @type {integer}
  2878. * @default -1
  2879. * @since 3.0.0
  2880. */
  2881. this.tabIndex = -1;
  2882. /**
  2883. * A Data Manager.
  2884. * It allows you to store, query and get key/value paired information specific to this Game Object.
  2885. * `null` by default. Automatically created if you use `getData` or `setData` or `setDataEnabled`.
  2886. *
  2887. * @name Phaser.GameObjects.GameObject#data
  2888. * @type {Phaser.Data.DataManager}
  2889. * @default null
  2890. * @since 3.0.0
  2891. */
  2892. this.data = null;
  2893. /**
  2894. * The flags that are compared against `RENDER_MASK` to determine if this Game Object will render or not.
  2895. * The bits are 0001 | 0010 | 0100 | 1000 set by the components Visible, Alpha, Transform and Texture respectively.
  2896. * If those components are not used by your custom class then you can use this bitmask as you wish.
  2897. *
  2898. * @name Phaser.GameObjects.GameObject#renderFlags
  2899. * @type {integer}
  2900. * @default 15
  2901. * @since 3.0.0
  2902. */
  2903. this.renderFlags = 15;
  2904. /**
  2905. * A bitmask that controls if this Game Object is drawn by a Camera or not.
  2906. * Not usually set directly, instead call `Camera.ignore`, however you can
  2907. * set this property directly using the Camera.id property:
  2908. *
  2909. * @example
  2910. * this.cameraFilter |= camera.id
  2911. *
  2912. * @name Phaser.GameObjects.GameObject#cameraFilter
  2913. * @type {number}
  2914. * @default 0
  2915. * @since 3.0.0
  2916. */
  2917. this.cameraFilter = 0;
  2918. /**
  2919. * If this Game Object is enabled for input then this property will contain an InteractiveObject instance.
  2920. * Not usually set directly. Instead call `GameObject.setInteractive()`.
  2921. *
  2922. * @name Phaser.GameObjects.GameObject#input
  2923. * @type {?Phaser.Input.InteractiveObject}
  2924. * @default null
  2925. * @since 3.0.0
  2926. */
  2927. this.input = null;
  2928. /**
  2929. * If this Game Object is enabled for physics then this property will contain a reference to a Physics Body.
  2930. *
  2931. * @name Phaser.GameObjects.GameObject#body
  2932. * @type {?(object|Phaser.Physics.Arcade.Body|Phaser.Physics.Impact.Body)}
  2933. * @default null
  2934. * @since 3.0.0
  2935. */
  2936. this.body = null;
  2937. /**
  2938. * This Game Object will ignore all calls made to its destroy method if this flag is set to `true`.
  2939. * This includes calls that may come from a Group, Container or the Scene itself.
  2940. * While it allows you to persist a Game Object across Scenes, please understand you are entirely
  2941. * responsible for managing references to and from this Game Object.
  2942. *
  2943. * @name Phaser.GameObjects.GameObject#ignoreDestroy
  2944. * @type {boolean}
  2945. * @default false
  2946. * @since 3.5.0
  2947. */
  2948. this.ignoreDestroy = false;
  2949. // Tell the Scene to re-sort the children
  2950. scene.sys.queueDepthSort();
  2951. },
  2952. /**
  2953. * Sets the `active` property of this Game Object and returns this Game Object for further chaining.
  2954. * A Game Object with its `active` property set to `true` will be updated by the Scenes UpdateList.
  2955. *
  2956. * @method Phaser.GameObjects.GameObject#setActive
  2957. * @since 3.0.0
  2958. *
  2959. * @param {boolean} value - True if this Game Object should be set as active, false if not.
  2960. *
  2961. * @return {this} This GameObject.
  2962. */
  2963. setActive: function (value)
  2964. {
  2965. this.active = value;
  2966. return this;
  2967. },
  2968. /**
  2969. * Sets the `name` property of this Game Object and returns this Game Object for further chaining.
  2970. * The `name` property is not populated by Phaser and is presented for your own use.
  2971. *
  2972. * @method Phaser.GameObjects.GameObject#setName
  2973. * @since 3.0.0
  2974. *
  2975. * @param {string} value - The name to be given to this Game Object.
  2976. *
  2977. * @return {this} This GameObject.
  2978. */
  2979. setName: function (value)
  2980. {
  2981. this.name = value;
  2982. return this;
  2983. },
  2984. /**
  2985. * Sets the current state of this Game Object.
  2986. *
  2987. * Phaser itself will never modify the State of a Game Object, although plugins may do so.
  2988. *
  2989. * For example, a Game Object could change from a state of 'moving', to 'attacking', to 'dead'.
  2990. * The state value should typically be an integer (ideally mapped to a constant
  2991. * in your game code), but could also be a string. It is recommended to keep it light and simple.
  2992. * If you need to store complex data about your Game Object, look at using the Data Component instead.
  2993. *
  2994. * @method Phaser.GameObjects.GameObject#setState
  2995. * @since 3.16.0
  2996. *
  2997. * @param {(integer|string)} value - The state of the Game Object.
  2998. *
  2999. * @return {this} This GameObject.
  3000. */
  3001. setState: function (value)
  3002. {
  3003. this.state = value;
  3004. return this;
  3005. },
  3006. /**
  3007. * Adds a Data Manager component to this Game Object.
  3008. *
  3009. * @method Phaser.GameObjects.GameObject#setDataEnabled
  3010. * @since 3.0.0
  3011. * @see Phaser.Data.DataManager
  3012. *
  3013. * @return {this} This GameObject.
  3014. */
  3015. setDataEnabled: function ()
  3016. {
  3017. if (!this.data)
  3018. {
  3019. this.data = new DataManager(this);
  3020. }
  3021. return this;
  3022. },
  3023. /**
  3024. * Allows you to store a key value pair within this Game Objects Data Manager.
  3025. *
  3026. * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled
  3027. * before setting the value.
  3028. *
  3029. * If the key doesn't already exist in the Data Manager then it is created.
  3030. *
  3031. * ```javascript
  3032. * sprite.setData('name', 'Red Gem Stone');
  3033. * ```
  3034. *
  3035. * You can also pass in an object of key value pairs as the first argument:
  3036. *
  3037. * ```javascript
  3038. * sprite.setData({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 });
  3039. * ```
  3040. *
  3041. * To get a value back again you can call `getData`:
  3042. *
  3043. * ```javascript
  3044. * sprite.getData('gold');
  3045. * ```
  3046. *
  3047. * Or you can access the value directly via the `values` property, where it works like any other variable:
  3048. *
  3049. * ```javascript
  3050. * sprite.data.values.gold += 50;
  3051. * ```
  3052. *
  3053. * When the value is first set, a `setdata` event is emitted from this Game Object.
  3054. *
  3055. * If the key already exists, a `changedata` event is emitted instead, along an event named after the key.
  3056. * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata-PlayerLives`.
  3057. * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter.
  3058. *
  3059. * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings.
  3060. * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager.
  3061. *
  3062. * @method Phaser.GameObjects.GameObject#setData
  3063. * @since 3.0.0
  3064. *
  3065. * @param {(string|object)} key - The key to set the value for. Or an object or key value pairs. If an object the `data` argument is ignored.
  3066. * @param {*} data - The value to set for the given key. If an object is provided as the key this argument is ignored.
  3067. *
  3068. * @return {this} This GameObject.
  3069. */
  3070. setData: function (key, value)
  3071. {
  3072. if (!this.data)
  3073. {
  3074. this.data = new DataManager(this);
  3075. }
  3076. this.data.set(key, value);
  3077. return this;
  3078. },
  3079. /**
  3080. * Retrieves the value for the given key in this Game Objects Data Manager, or undefined if it doesn't exist.
  3081. *
  3082. * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either:
  3083. *
  3084. * ```javascript
  3085. * sprite.getData('gold');
  3086. * ```
  3087. *
  3088. * Or access the value directly:
  3089. *
  3090. * ```javascript
  3091. * sprite.data.values.gold;
  3092. * ```
  3093. *
  3094. * You can also pass in an array of keys, in which case an array of values will be returned:
  3095. *
  3096. * ```javascript
  3097. * sprite.getData([ 'gold', 'armor', 'health' ]);
  3098. * ```
  3099. *
  3100. * This approach is useful for destructuring arrays in ES6.
  3101. *
  3102. * @method Phaser.GameObjects.GameObject#getData
  3103. * @since 3.0.0
  3104. *
  3105. * @param {(string|string[])} key - The key of the value to retrieve, or an array of keys.
  3106. *
  3107. * @return {*} The value belonging to the given key, or an array of values, the order of which will match the input array.
  3108. */
  3109. getData: function (key)
  3110. {
  3111. if (!this.data)
  3112. {
  3113. this.data = new DataManager(this);
  3114. }
  3115. return this.data.get(key);
  3116. },
  3117. /**
  3118. * Pass this Game Object to the Input Manager to enable it for Input.
  3119. *
  3120. * Input works by using hit areas, these are nearly always geometric shapes, such as rectangles or circles, that act as the hit area
  3121. * for the Game Object. However, you can provide your own hit area shape and callback, should you wish to handle some more advanced
  3122. * input detection.
  3123. *
  3124. * If no arguments are provided it will try and create a rectangle hit area based on the texture frame the Game Object is using. If
  3125. * this isn't a texture-bound object, such as a Graphics or BitmapText object, this will fail, and you'll need to provide a specific
  3126. * shape for it to use.
  3127. *
  3128. * You can also provide an Input Configuration Object as the only argument to this method.
  3129. *
  3130. * @method Phaser.GameObjects.GameObject#setInteractive
  3131. * @since 3.0.0
  3132. *
  3133. * @param {(Phaser.Input.InputConfiguration|any)} [shape] - Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not specified a Rectangle will be used.
  3134. * @param {HitAreaCallback} [callback] - A callback to be invoked when the Game Object is interacted with. If you provide a shape you must also provide a callback.
  3135. * @param {boolean} [dropZone=false] - Should this Game Object be treated as a drop zone target?
  3136. *
  3137. * @return {this} This GameObject.
  3138. */
  3139. setInteractive: function (shape, callback, dropZone)
  3140. {
  3141. this.scene.sys.input.enable(this, shape, callback, dropZone);
  3142. return this;
  3143. },
  3144. /**
  3145. * If this Game Object has previously been enabled for input, this will disable it.
  3146. *
  3147. * An object that is disabled for input stops processing or being considered for
  3148. * input events, but can be turned back on again at any time by simply calling
  3149. * `setInteractive()` with no arguments provided.
  3150. *
  3151. * If want to completely remove interaction from this Game Object then use `removeInteractive` instead.
  3152. *
  3153. * @method Phaser.GameObjects.GameObject#disableInteractive
  3154. * @since 3.7.0
  3155. *
  3156. * @return {this} This GameObject.
  3157. */
  3158. disableInteractive: function ()
  3159. {
  3160. if (this.input)
  3161. {
  3162. this.input.enabled = false;
  3163. }
  3164. return this;
  3165. },
  3166. /**
  3167. * If this Game Object has previously been enabled for input, this will queue it
  3168. * for removal, causing it to no longer be interactive. The removal happens on
  3169. * the next game step, it is not immediate.
  3170. *
  3171. * The Interactive Object that was assigned to this Game Object will be destroyed,
  3172. * removed from the Input Manager and cleared from this Game Object.
  3173. *
  3174. * If you wish to re-enable this Game Object at a later date you will need to
  3175. * re-create its InteractiveObject by calling `setInteractive` again.
  3176. *
  3177. * If you wish to only temporarily stop an object from receiving input then use
  3178. * `disableInteractive` instead, as that toggles the interactive state, where-as
  3179. * this erases it completely.
  3180. *
  3181. * If you wish to resize a hit area, don't remove and then set it as being
  3182. * interactive. Instead, access the hitarea object directly and resize the shape
  3183. * being used. I.e.: `sprite.input.hitArea.setSize(width, height)` (assuming the
  3184. * shape is a Rectangle, which it is by default.)
  3185. *
  3186. * @method Phaser.GameObjects.GameObject#removeInteractive
  3187. * @since 3.7.0
  3188. *
  3189. * @return {this} This GameObject.
  3190. */
  3191. removeInteractive: function ()
  3192. {
  3193. this.scene.sys.input.clear(this);
  3194. this.input = undefined;
  3195. return this;
  3196. },
  3197. /**
  3198. * To be overridden by custom GameObjects. Allows base objects to be used in a Pool.
  3199. *
  3200. * @method Phaser.GameObjects.GameObject#update
  3201. * @since 3.0.0
  3202. *
  3203. * @param {...*} [args] - args
  3204. */
  3205. update: function ()
  3206. {
  3207. },
  3208. /**
  3209. * Returns a JSON representation of the Game Object.
  3210. *
  3211. * @method Phaser.GameObjects.GameObject#toJSON
  3212. * @since 3.0.0
  3213. *
  3214. * @return {JSONGameObject} A JSON representation of the Game Object.
  3215. */
  3216. toJSON: function ()
  3217. {
  3218. return ComponentsToJSON(this);
  3219. },
  3220. /**
  3221. * Compares the renderMask with the renderFlags to see if this Game Object will render or not.
  3222. * Also checks the Game Object against the given Cameras exclusion list.
  3223. *
  3224. * @method Phaser.GameObjects.GameObject#willRender
  3225. * @since 3.0.0
  3226. *
  3227. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to check against this Game Object.
  3228. *
  3229. * @return {boolean} True if the Game Object should be rendered, otherwise false.
  3230. */
  3231. willRender: function (camera)
  3232. {
  3233. return !(GameObject.RENDER_MASK !== this.renderFlags || (this.cameraFilter !== 0 && (this.cameraFilter & camera.id)));
  3234. },
  3235. /**
  3236. * Returns an array containing the display list index of either this Game Object, or if it has one,
  3237. * its parent Container. It then iterates up through all of the parent containers until it hits the
  3238. * root of the display list (which is index 0 in the returned array).
  3239. *
  3240. * Used internally by the InputPlugin but also useful if you wish to find out the display depth of
  3241. * this Game Object and all of its ancestors.
  3242. *
  3243. * @method Phaser.GameObjects.GameObject#getIndexList
  3244. * @since 3.4.0
  3245. *
  3246. * @return {integer[]} An array of display list position indexes.
  3247. */
  3248. getIndexList: function ()
  3249. {
  3250. // eslint-disable-next-line consistent-this
  3251. var child = this;
  3252. var parent = this.parentContainer;
  3253. var indexes = [];
  3254. while (parent)
  3255. {
  3256. // indexes.unshift([parent.getIndex(child), parent.name]);
  3257. indexes.unshift(parent.getIndex(child));
  3258. child = parent;
  3259. if (!parent.parentContainer)
  3260. {
  3261. break;
  3262. }
  3263. else
  3264. {
  3265. parent = parent.parentContainer;
  3266. }
  3267. }
  3268. // indexes.unshift([this.scene.sys.displayList.getIndex(child), 'root']);
  3269. indexes.unshift(this.scene.sys.displayList.getIndex(child));
  3270. return indexes;
  3271. },
  3272. /**
  3273. * Destroys this Game Object removing it from the Display List and Update List and
  3274. * severing all ties to parent resources.
  3275. *
  3276. * Also removes itself from the Input Manager and Physics Manager if previously enabled.
  3277. *
  3278. * Use this to remove a Game Object from your game if you don't ever plan to use it again.
  3279. * As long as no reference to it exists within your own code it should become free for
  3280. * garbage collection by the browser.
  3281. *
  3282. * If you just want to temporarily disable an object then look at using the
  3283. * Game Object Pool instead of destroying it, as destroyed objects cannot be resurrected.
  3284. *
  3285. * @method Phaser.GameObjects.GameObject#destroy
  3286. * @fires Phaser.GameObjects.Events#DESTROY
  3287. * @since 3.0.0
  3288. *
  3289. * @param {boolean} [fromScene=false] - Is this Game Object being destroyed as the result of a Scene shutdown?
  3290. */
  3291. destroy: function (fromScene)
  3292. {
  3293. if (fromScene === undefined) { fromScene = false; }
  3294. // This Game Object has already been destroyed
  3295. if (!this.scene || this.ignoreDestroy)
  3296. {
  3297. return;
  3298. }
  3299. if (this.preDestroy)
  3300. {
  3301. this.preDestroy.call(this);
  3302. }
  3303. this.emit(Events.DESTROY, this);
  3304. var sys = this.scene.sys;
  3305. if (!fromScene)
  3306. {
  3307. sys.displayList.remove(this);
  3308. sys.updateList.remove(this);
  3309. }
  3310. if (this.input)
  3311. {
  3312. sys.input.clear(this);
  3313. this.input = undefined;
  3314. }
  3315. if (this.data)
  3316. {
  3317. this.data.destroy();
  3318. this.data = undefined;
  3319. }
  3320. if (this.body)
  3321. {
  3322. this.body.destroy();
  3323. this.body = undefined;
  3324. }
  3325. // Tell the Scene to re-sort the children
  3326. if (!fromScene)
  3327. {
  3328. sys.queueDepthSort();
  3329. }
  3330. this.active = false;
  3331. this.visible = false;
  3332. this.scene = undefined;
  3333. this.parentContainer = undefined;
  3334. this.removeAllListeners();
  3335. }
  3336. });
  3337. /**
  3338. * The bitmask that `GameObject.renderFlags` is compared against to determine if the Game Object will render or not.
  3339. *
  3340. * @constant {integer} RENDER_MASK
  3341. * @memberof Phaser.GameObjects.GameObject
  3342. * @default
  3343. */
  3344. GameObject.RENDER_MASK = 15;
  3345. module.exports = GameObject;
  3346. /***/ }),
  3347. /* 19 */
  3348. /***/ (function(module, exports, __webpack_require__) {
  3349. /**
  3350. * @author Richard Davey <rich@photonstorm.com>
  3351. * @copyright 2019 Photon Storm Ltd.
  3352. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3353. */
  3354. var IsPlainObject = __webpack_require__(8);
  3355. // @param {boolean} deep - Perform a deep copy?
  3356. // @param {object} target - The target object to copy to.
  3357. // @return {object} The extended object.
  3358. /**
  3359. * This is a slightly modified version of http://api.jquery.com/jQuery.extend/
  3360. *
  3361. * @function Phaser.Utils.Objects.Extend
  3362. * @since 3.0.0
  3363. *
  3364. * @return {object} The extended object.
  3365. */
  3366. var Extend = function ()
  3367. {
  3368. var options, name, src, copy, copyIsArray, clone,
  3369. target = arguments[0] || {},
  3370. i = 1,
  3371. length = arguments.length,
  3372. deep = false;
  3373. // Handle a deep copy situation
  3374. if (typeof target === 'boolean')
  3375. {
  3376. deep = target;
  3377. target = arguments[1] || {};
  3378. // skip the boolean and the target
  3379. i = 2;
  3380. }
  3381. // extend Phaser if only one argument is passed
  3382. if (length === i)
  3383. {
  3384. target = this;
  3385. --i;
  3386. }
  3387. for (; i < length; i++)
  3388. {
  3389. // Only deal with non-null/undefined values
  3390. if ((options = arguments[i]) != null)
  3391. {
  3392. // Extend the base object
  3393. for (name in options)
  3394. {
  3395. src = target[name];
  3396. copy = options[name];
  3397. // Prevent never-ending loop
  3398. if (target === copy)
  3399. {
  3400. continue;
  3401. }
  3402. // Recurse if we're merging plain objects or arrays
  3403. if (deep && copy && (IsPlainObject(copy) || (copyIsArray = Array.isArray(copy))))
  3404. {
  3405. if (copyIsArray)
  3406. {
  3407. copyIsArray = false;
  3408. clone = src && Array.isArray(src) ? src : [];
  3409. }
  3410. else
  3411. {
  3412. clone = src && IsPlainObject(src) ? src : {};
  3413. }
  3414. // Never move original objects, clone them
  3415. target[name] = Extend(deep, clone, copy);
  3416. // Don't bring in undefined values
  3417. }
  3418. else if (copy !== undefined)
  3419. {
  3420. target[name] = copy;
  3421. }
  3422. }
  3423. }
  3424. }
  3425. // Return the modified object
  3426. return target;
  3427. };
  3428. module.exports = Extend;
  3429. /***/ }),
  3430. /* 20 */
  3431. /***/ (function(module, exports) {
  3432. /**
  3433. * @author Richard Davey <rich@photonstorm.com>
  3434. * @copyright 2019 Photon Storm Ltd.
  3435. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3436. */
  3437. var MATH_CONST = {
  3438. /**
  3439. * The value of PI * 2.
  3440. *
  3441. * @name Phaser.Math.PI2
  3442. * @type {number}
  3443. * @since 3.0.0
  3444. */
  3445. PI2: Math.PI * 2,
  3446. /**
  3447. * The value of PI * 0.5.
  3448. *
  3449. * @name Phaser.Math.TAU
  3450. * @type {number}
  3451. * @since 3.0.0
  3452. */
  3453. TAU: Math.PI * 0.5,
  3454. /**
  3455. * An epsilon value (1.0e-6)
  3456. *
  3457. * @name Phaser.Math.EPSILON
  3458. * @type {number}
  3459. * @since 3.0.0
  3460. */
  3461. EPSILON: 1.0e-6,
  3462. /**
  3463. * For converting degrees to radians (PI / 180)
  3464. *
  3465. * @name Phaser.Math.DEG_TO_RAD
  3466. * @type {number}
  3467. * @since 3.0.0
  3468. */
  3469. DEG_TO_RAD: Math.PI / 180,
  3470. /**
  3471. * For converting radians to degrees (180 / PI)
  3472. *
  3473. * @name Phaser.Math.RAD_TO_DEG
  3474. * @type {number}
  3475. * @since 3.0.0
  3476. */
  3477. RAD_TO_DEG: 180 / Math.PI,
  3478. /**
  3479. * An instance of the Random Number Generator.
  3480. * This is not set until the Game boots.
  3481. *
  3482. * @name Phaser.Math.RND
  3483. * @type {Phaser.Math.RandomDataGenerator}
  3484. * @since 3.0.0
  3485. */
  3486. RND: null
  3487. };
  3488. module.exports = MATH_CONST;
  3489. /***/ }),
  3490. /* 21 */
  3491. /***/ (function(module, exports, __webpack_require__) {
  3492. /**
  3493. * @author Richard Davey <rich@photonstorm.com>
  3494. * @copyright 2019 Photon Storm Ltd.
  3495. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3496. */
  3497. var GetFastValue = __webpack_require__(2);
  3498. /**
  3499. * @typedef {object} GetTilesWithinFilteringOptions
  3500. *
  3501. * @property {boolean} [isNotEmpty=false] - If true, only return tiles that don't have -1 for an index.
  3502. * @property {boolean} [isColliding=false] - If true, only return tiles that collide on at least one side.
  3503. * @property {boolean} [hasInterestingFace=false] - If true, only return tiles that have at least one interesting face.
  3504. */
  3505. /**
  3506. * Gets the tiles in the given rectangular area (in tile coordinates) of the layer.
  3507. *
  3508. * @function Phaser.Tilemaps.Components.GetTilesWithin
  3509. * @private
  3510. * @since 3.0.0
  3511. *
  3512. * @param {integer} tileX - The left most tile index (in tile coordinates) to use as the origin of the area.
  3513. * @param {integer} tileY - The top most tile index (in tile coordinates) to use as the origin of the area.
  3514. * @param {integer} width - How many tiles wide from the `tileX` index the area will be.
  3515. * @param {integer} height - How many tiles tall from the `tileY` index the area will be.
  3516. * @param {object} GetTilesWithinFilteringOptions - Optional filters to apply when getting the tiles.
  3517. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  3518. *
  3519. * @return {Phaser.Tilemaps.Tile[]} Array of Tile objects.
  3520. */
  3521. var GetTilesWithin = function (tileX, tileY, width, height, filteringOptions, layer)
  3522. {
  3523. if (tileX === undefined) { tileX = 0; }
  3524. if (tileY === undefined) { tileY = 0; }
  3525. if (width === undefined) { width = layer.width; }
  3526. if (height === undefined) { height = layer.height; }
  3527. var isNotEmpty = GetFastValue(filteringOptions, 'isNotEmpty', false);
  3528. var isColliding = GetFastValue(filteringOptions, 'isColliding', false);
  3529. var hasInterestingFace = GetFastValue(filteringOptions, 'hasInterestingFace', false);
  3530. // Clip x, y to top left of map, while shrinking width/height to match.
  3531. if (tileX < 0)
  3532. {
  3533. width += tileX;
  3534. tileX = 0;
  3535. }
  3536. if (tileY < 0)
  3537. {
  3538. height += tileY;
  3539. tileY = 0;
  3540. }
  3541. // Clip width and height to bottom right of map.
  3542. if (tileX + width > layer.width)
  3543. {
  3544. width = Math.max(layer.width - tileX, 0);
  3545. }
  3546. if (tileY + height > layer.height)
  3547. {
  3548. height = Math.max(layer.height - tileY, 0);
  3549. }
  3550. var results = [];
  3551. for (var ty = tileY; ty < tileY + height; ty++)
  3552. {
  3553. for (var tx = tileX; tx < tileX + width; tx++)
  3554. {
  3555. var tile = layer.data[ty][tx];
  3556. if (tile !== null)
  3557. {
  3558. if (isNotEmpty && tile.index === -1) { continue; }
  3559. if (isColliding && !tile.collides) { continue; }
  3560. if (hasInterestingFace && !tile.hasInterestingFace) { continue; }
  3561. results.push(tile);
  3562. }
  3563. }
  3564. }
  3565. return results;
  3566. };
  3567. module.exports = GetTilesWithin;
  3568. /***/ }),
  3569. /* 22 */
  3570. /***/ (function(module, exports, __webpack_require__) {
  3571. /**
  3572. * @author Richard Davey <rich@photonstorm.com>
  3573. * @copyright 2019 Photon Storm Ltd.
  3574. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3575. */
  3576. var Class = __webpack_require__(0);
  3577. var CONST = __webpack_require__(15);
  3578. var Events = __webpack_require__(75);
  3579. var GetFastValue = __webpack_require__(2);
  3580. var GetURL = __webpack_require__(152);
  3581. var MergeXHRSettings = __webpack_require__(151);
  3582. var XHRLoader = __webpack_require__(259);
  3583. var XHRSettings = __webpack_require__(112);
  3584. /**
  3585. * @typedef {object} FileConfig
  3586. *
  3587. * @property {string} type - The file type string (image, json, etc) for sorting within the Loader.
  3588. * @property {string} key - Unique cache key (unique within its file type)
  3589. * @property {string} [url] - The URL of the file, not including baseURL.
  3590. * @property {string} [path] - The path of the file, not including the baseURL.
  3591. * @property {string} [extension] - The default extension this file uses.
  3592. * @property {XMLHttpRequestResponseType} [responseType] - The responseType to be used by the XHR request.
  3593. * @property {(XHRSettingsObject|false)} [xhrSettings=false] - Custom XHR Settings specific to this file and merged with the Loader defaults.
  3594. * @property {any} [config] - A config object that can be used by file types to store transitional data.
  3595. */
  3596. /**
  3597. * @classdesc
  3598. * The base File class used by all File Types that the Loader can support.
  3599. * You shouldn't create an instance of a File directly, but should extend it with your own class, setting a custom type and processing methods.
  3600. *
  3601. * @class File
  3602. * @memberof Phaser.Loader
  3603. * @constructor
  3604. * @since 3.0.0
  3605. *
  3606. * @param {Phaser.Loader.LoaderPlugin} loader - The Loader that is going to load this File.
  3607. * @param {FileConfig} fileConfig - The file configuration object, as created by the file type.
  3608. */
  3609. var File = new Class({
  3610. initialize:
  3611. function File (loader, fileConfig)
  3612. {
  3613. /**
  3614. * A reference to the Loader that is going to load this file.
  3615. *
  3616. * @name Phaser.Loader.File#loader
  3617. * @type {Phaser.Loader.LoaderPlugin}
  3618. * @since 3.0.0
  3619. */
  3620. this.loader = loader;
  3621. /**
  3622. * A reference to the Cache, or Texture Manager, that is going to store this file if it loads.
  3623. *
  3624. * @name Phaser.Loader.File#cache
  3625. * @type {(Phaser.Cache.BaseCache|Phaser.Textures.TextureManager)}
  3626. * @since 3.7.0
  3627. */
  3628. this.cache = GetFastValue(fileConfig, 'cache', false);
  3629. /**
  3630. * The file type string (image, json, etc) for sorting within the Loader.
  3631. *
  3632. * @name Phaser.Loader.File#type
  3633. * @type {string}
  3634. * @since 3.0.0
  3635. */
  3636. this.type = GetFastValue(fileConfig, 'type', false);
  3637. /**
  3638. * Unique cache key (unique within its file type)
  3639. *
  3640. * @name Phaser.Loader.File#key
  3641. * @type {string}
  3642. * @since 3.0.0
  3643. */
  3644. this.key = GetFastValue(fileConfig, 'key', false);
  3645. var loadKey = this.key;
  3646. if (loader.prefix && loader.prefix !== '')
  3647. {
  3648. this.key = loader.prefix + loadKey;
  3649. }
  3650. if (!this.type || !this.key)
  3651. {
  3652. throw new Error('Error calling \'Loader.' + this.type + '\' invalid key provided.');
  3653. }
  3654. /**
  3655. * The URL of the file, not including baseURL.
  3656. * Automatically has Loader.path prepended to it.
  3657. *
  3658. * @name Phaser.Loader.File#url
  3659. * @type {string}
  3660. * @since 3.0.0
  3661. */
  3662. this.url = GetFastValue(fileConfig, 'url');
  3663. if (this.url === undefined)
  3664. {
  3665. this.url = loader.path + loadKey + '.' + GetFastValue(fileConfig, 'extension', '');
  3666. }
  3667. else if (typeof(this.url) !== 'function')
  3668. {
  3669. this.url = loader.path + this.url;
  3670. }
  3671. /**
  3672. * The final URL this file will load from, including baseURL and path.
  3673. * Set automatically when the Loader calls 'load' on this file.
  3674. *
  3675. * @name Phaser.Loader.File#src
  3676. * @type {string}
  3677. * @since 3.0.0
  3678. */
  3679. this.src = '';
  3680. /**
  3681. * The merged XHRSettings for this file.
  3682. *
  3683. * @name Phaser.Loader.File#xhrSettings
  3684. * @type {XHRSettingsObject}
  3685. * @since 3.0.0
  3686. */
  3687. this.xhrSettings = XHRSettings(GetFastValue(fileConfig, 'responseType', undefined));
  3688. if (GetFastValue(fileConfig, 'xhrSettings', false))
  3689. {
  3690. this.xhrSettings = MergeXHRSettings(this.xhrSettings, GetFastValue(fileConfig, 'xhrSettings', {}));
  3691. }
  3692. /**
  3693. * The XMLHttpRequest instance (as created by XHR Loader) that is loading this File.
  3694. *
  3695. * @name Phaser.Loader.File#xhrLoader
  3696. * @type {?XMLHttpRequest}
  3697. * @since 3.0.0
  3698. */
  3699. this.xhrLoader = null;
  3700. /**
  3701. * The current state of the file. One of the FILE_CONST values.
  3702. *
  3703. * @name Phaser.Loader.File#state
  3704. * @type {integer}
  3705. * @since 3.0.0
  3706. */
  3707. this.state = (typeof(this.url) === 'function') ? CONST.FILE_POPULATED : CONST.FILE_PENDING;
  3708. /**
  3709. * The total size of this file.
  3710. * Set by onProgress and only if loading via XHR.
  3711. *
  3712. * @name Phaser.Loader.File#bytesTotal
  3713. * @type {number}
  3714. * @default 0
  3715. * @since 3.0.0
  3716. */
  3717. this.bytesTotal = 0;
  3718. /**
  3719. * Updated as the file loads.
  3720. * Only set if loading via XHR.
  3721. *
  3722. * @name Phaser.Loader.File#bytesLoaded
  3723. * @type {number}
  3724. * @default -1
  3725. * @since 3.0.0
  3726. */
  3727. this.bytesLoaded = -1;
  3728. /**
  3729. * A percentage value between 0 and 1 indicating how much of this file has loaded.
  3730. * Only set if loading via XHR.
  3731. *
  3732. * @name Phaser.Loader.File#percentComplete
  3733. * @type {number}
  3734. * @default -1
  3735. * @since 3.0.0
  3736. */
  3737. this.percentComplete = -1;
  3738. /**
  3739. * For CORs based loading.
  3740. * If this is undefined then the File will check BaseLoader.crossOrigin and use that (if set)
  3741. *
  3742. * @name Phaser.Loader.File#crossOrigin
  3743. * @type {(string|undefined)}
  3744. * @since 3.0.0
  3745. */
  3746. this.crossOrigin = undefined;
  3747. /**
  3748. * The processed file data, stored here after the file has loaded.
  3749. *
  3750. * @name Phaser.Loader.File#data
  3751. * @type {*}
  3752. * @since 3.0.0
  3753. */
  3754. this.data = undefined;
  3755. /**
  3756. * A config object that can be used by file types to store transitional data.
  3757. *
  3758. * @name Phaser.Loader.File#config
  3759. * @type {*}
  3760. * @since 3.0.0
  3761. */
  3762. this.config = GetFastValue(fileConfig, 'config', {});
  3763. /**
  3764. * If this is a multipart file, i.e. an atlas and its json together, then this is a reference
  3765. * to the parent MultiFile. Set and used internally by the Loader or specific file types.
  3766. *
  3767. * @name Phaser.Loader.File#multiFile
  3768. * @type {?Phaser.Loader.MultiFile}
  3769. * @since 3.7.0
  3770. */
  3771. this.multiFile;
  3772. /**
  3773. * Does this file have an associated linked file? Such as an image and a normal map.
  3774. * Atlases and Bitmap Fonts use the multiFile, because those files need loading together but aren't
  3775. * actually bound by data, where-as a linkFile is.
  3776. *
  3777. * @name Phaser.Loader.File#linkFile
  3778. * @type {?Phaser.Loader.File}
  3779. * @since 3.7.0
  3780. */
  3781. this.linkFile;
  3782. },
  3783. /**
  3784. * Links this File with another, so they depend upon each other for loading and processing.
  3785. *
  3786. * @method Phaser.Loader.File#setLink
  3787. * @since 3.7.0
  3788. *
  3789. * @param {Phaser.Loader.File} fileB - The file to link to this one.
  3790. */
  3791. setLink: function (fileB)
  3792. {
  3793. this.linkFile = fileB;
  3794. fileB.linkFile = this;
  3795. },
  3796. /**
  3797. * Resets the XHRLoader instance this file is using.
  3798. *
  3799. * @method Phaser.Loader.File#resetXHR
  3800. * @since 3.0.0
  3801. */
  3802. resetXHR: function ()
  3803. {
  3804. if (this.xhrLoader)
  3805. {
  3806. this.xhrLoader.onload = undefined;
  3807. this.xhrLoader.onerror = undefined;
  3808. this.xhrLoader.onprogress = undefined;
  3809. }
  3810. },
  3811. /**
  3812. * Called by the Loader, starts the actual file downloading.
  3813. * During the load the methods onLoad, onError and onProgress are called, based on the XHR events.
  3814. * You shouldn't normally call this method directly, it's meant to be invoked by the Loader.
  3815. *
  3816. * @method Phaser.Loader.File#load
  3817. * @since 3.0.0
  3818. */
  3819. load: function ()
  3820. {
  3821. if (this.state === CONST.FILE_POPULATED)
  3822. {
  3823. // Can happen for example in a JSONFile if they've provided a JSON object instead of a URL
  3824. this.loader.nextFile(this, true);
  3825. }
  3826. else
  3827. {
  3828. this.src = GetURL(this, this.loader.baseURL);
  3829. if (this.src.indexOf('data:') === 0)
  3830. {
  3831. console.warn('Local data URIs are not supported: ' + this.key);
  3832. }
  3833. else
  3834. {
  3835. // The creation of this XHRLoader starts the load process going.
  3836. // It will automatically call the following, based on the load outcome:
  3837. //
  3838. // xhr.onload = this.onLoad
  3839. // xhr.onerror = this.onError
  3840. // xhr.onprogress = this.onProgress
  3841. this.xhrLoader = XHRLoader(this, this.loader.xhr);
  3842. }
  3843. }
  3844. },
  3845. /**
  3846. * Called when the file finishes loading, is sent a DOM ProgressEvent.
  3847. *
  3848. * @method Phaser.Loader.File#onLoad
  3849. * @since 3.0.0
  3850. *
  3851. * @param {XMLHttpRequest} xhr - The XMLHttpRequest that caused this onload event.
  3852. * @param {ProgressEvent} event - The DOM ProgressEvent that resulted from this load.
  3853. */
  3854. onLoad: function (xhr, event)
  3855. {
  3856. var localFileOk = ((xhr.responseURL && xhr.responseURL.indexOf('file://') === 0 && event.target.status === 0));
  3857. var success = !(event.target && event.target.status !== 200) || localFileOk;
  3858. // Handle HTTP status codes of 4xx and 5xx as errors, even if xhr.onerror was not called.
  3859. if (xhr.readyState === 4 && xhr.status >= 400 && xhr.status <= 599)
  3860. {
  3861. success = false;
  3862. }
  3863. this.resetXHR();
  3864. this.loader.nextFile(this, success);
  3865. },
  3866. /**
  3867. * Called if the file errors while loading, is sent a DOM ProgressEvent.
  3868. *
  3869. * @method Phaser.Loader.File#onError
  3870. * @since 3.0.0
  3871. *
  3872. * @param {XMLHttpRequest} xhr - The XMLHttpRequest that caused this onload event.
  3873. * @param {ProgressEvent} event - The DOM ProgressEvent that resulted from this error.
  3874. */
  3875. onError: function ()
  3876. {
  3877. this.resetXHR();
  3878. this.loader.nextFile(this, false);
  3879. },
  3880. /**
  3881. * Called during the file load progress. Is sent a DOM ProgressEvent.
  3882. *
  3883. * @method Phaser.Loader.File#onProgress
  3884. * @fires Phaser.Loader.Events#FILE_PROGRESS
  3885. * @since 3.0.0
  3886. *
  3887. * @param {ProgressEvent} event - The DOM ProgressEvent.
  3888. */
  3889. onProgress: function (event)
  3890. {
  3891. if (event.lengthComputable)
  3892. {
  3893. this.bytesLoaded = event.loaded;
  3894. this.bytesTotal = event.total;
  3895. this.percentComplete = Math.min((this.bytesLoaded / this.bytesTotal), 1);
  3896. this.loader.emit(Events.FILE_PROGRESS, this, this.percentComplete);
  3897. }
  3898. },
  3899. /**
  3900. * Usually overridden by the FileTypes and is called by Loader.nextFile.
  3901. * This method controls what extra work this File does with its loaded data, for example a JSON file will parse itself during this stage.
  3902. *
  3903. * @method Phaser.Loader.File#onProcess
  3904. * @since 3.0.0
  3905. */
  3906. onProcess: function ()
  3907. {
  3908. this.state = CONST.FILE_PROCESSING;
  3909. this.onProcessComplete();
  3910. },
  3911. /**
  3912. * Called when the File has completed processing.
  3913. * Checks on the state of its multifile, if set.
  3914. *
  3915. * @method Phaser.Loader.File#onProcessComplete
  3916. * @since 3.7.0
  3917. */
  3918. onProcessComplete: function ()
  3919. {
  3920. this.state = CONST.FILE_COMPLETE;
  3921. if (this.multiFile)
  3922. {
  3923. this.multiFile.onFileComplete(this);
  3924. }
  3925. this.loader.fileProcessComplete(this);
  3926. },
  3927. /**
  3928. * Called when the File has completed processing but it generated an error.
  3929. * Checks on the state of its multifile, if set.
  3930. *
  3931. * @method Phaser.Loader.File#onProcessError
  3932. * @since 3.7.0
  3933. */
  3934. onProcessError: function ()
  3935. {
  3936. this.state = CONST.FILE_ERRORED;
  3937. if (this.multiFile)
  3938. {
  3939. this.multiFile.onFileFailed(this);
  3940. }
  3941. this.loader.fileProcessComplete(this);
  3942. },
  3943. /**
  3944. * Checks if a key matching the one used by this file exists in the target Cache or not.
  3945. * This is called automatically by the LoaderPlugin to decide if the file can be safely
  3946. * loaded or will conflict.
  3947. *
  3948. * @method Phaser.Loader.File#hasCacheConflict
  3949. * @since 3.7.0
  3950. *
  3951. * @return {boolean} `true` if adding this file will cause a conflict, otherwise `false`.
  3952. */
  3953. hasCacheConflict: function ()
  3954. {
  3955. return (this.cache && this.cache.exists(this.key));
  3956. },
  3957. /**
  3958. * Adds this file to its target cache upon successful loading and processing.
  3959. * This method is often overridden by specific file types.
  3960. *
  3961. * @method Phaser.Loader.File#addToCache
  3962. * @since 3.7.0
  3963. */
  3964. addToCache: function ()
  3965. {
  3966. if (this.cache)
  3967. {
  3968. this.cache.add(this.key, this.data);
  3969. }
  3970. this.pendingDestroy();
  3971. },
  3972. /**
  3973. * Called once the file has been added to its cache and is now ready for deletion from the Loader.
  3974. * It will emit a `filecomplete` event from the LoaderPlugin.
  3975. *
  3976. * @method Phaser.Loader.File#pendingDestroy
  3977. * @fires Phaser.Loader.Events#FILE_COMPLETE
  3978. * @fires Phaser.Loader.Events#FILE_KEY_COMPLETE
  3979. * @since 3.7.0
  3980. */
  3981. pendingDestroy: function (data)
  3982. {
  3983. if (data === undefined) { data = this.data; }
  3984. var key = this.key;
  3985. var type = this.type;
  3986. this.loader.emit(Events.FILE_COMPLETE, key, type, data);
  3987. this.loader.emit(Events.FILE_KEY_COMPLETE + type + '-' + key, key, type, data);
  3988. this.loader.flagForRemoval(this);
  3989. },
  3990. /**
  3991. * Destroy this File and any references it holds.
  3992. *
  3993. * @method Phaser.Loader.File#destroy
  3994. * @since 3.7.0
  3995. */
  3996. destroy: function ()
  3997. {
  3998. this.loader = null;
  3999. this.cache = null;
  4000. this.xhrSettings = null;
  4001. this.multiFile = null;
  4002. this.linkFile = null;
  4003. this.data = null;
  4004. }
  4005. });
  4006. /**
  4007. * Static method for creating object URL using URL API and setting it as image 'src' attribute.
  4008. * If URL API is not supported (usually on old browsers) it falls back to creating Base64 encoded url using FileReader.
  4009. *
  4010. * @method Phaser.Loader.File.createObjectURL
  4011. * @static
  4012. * @param {HTMLImageElement} image - Image object which 'src' attribute should be set to object URL.
  4013. * @param {Blob} blob - A Blob object to create an object URL for.
  4014. * @param {string} defaultType - Default mime type used if blob type is not available.
  4015. */
  4016. File.createObjectURL = function (image, blob, defaultType)
  4017. {
  4018. if (typeof URL === 'function')
  4019. {
  4020. image.src = URL.createObjectURL(blob);
  4021. }
  4022. else
  4023. {
  4024. var reader = new FileReader();
  4025. reader.onload = function ()
  4026. {
  4027. image.removeAttribute('crossOrigin');
  4028. image.src = 'data:' + (blob.type || defaultType) + ';base64,' + reader.result.split(',')[1];
  4029. };
  4030. reader.onerror = image.onerror;
  4031. reader.readAsDataURL(blob);
  4032. }
  4033. };
  4034. /**
  4035. * Static method for releasing an existing object URL which was previously created
  4036. * by calling {@link File#createObjectURL} method.
  4037. *
  4038. * @method Phaser.Loader.File.revokeObjectURL
  4039. * @static
  4040. * @param {HTMLImageElement} image - Image object which 'src' attribute should be revoked.
  4041. */
  4042. File.revokeObjectURL = function (image)
  4043. {
  4044. if (typeof URL === 'function')
  4045. {
  4046. URL.revokeObjectURL(image.src);
  4047. }
  4048. };
  4049. module.exports = File;
  4050. /***/ }),
  4051. /* 23 */
  4052. /***/ (function(module, exports) {
  4053. /**
  4054. * @author Richard Davey <rich@photonstorm.com>
  4055. * @copyright 2019 Photon Storm Ltd.
  4056. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4057. */
  4058. /**
  4059. * Force a value within the boundaries by clamping it to the range `min`, `max`.
  4060. *
  4061. * @function Phaser.Math.Clamp
  4062. * @since 3.0.0
  4063. *
  4064. * @param {number} value - The value to be clamped.
  4065. * @param {number} min - The minimum bounds.
  4066. * @param {number} max - The maximum bounds.
  4067. *
  4068. * @return {number} The clamped value.
  4069. */
  4070. var Clamp = function (value, min, max)
  4071. {
  4072. return Math.max(min, Math.min(max, value));
  4073. };
  4074. module.exports = Clamp;
  4075. /***/ }),
  4076. /* 24 */
  4077. /***/ (function(module, exports, __webpack_require__) {
  4078. /**
  4079. * @author Richard Davey <rich@photonstorm.com>
  4080. * @copyright 2019 Photon Storm Ltd.
  4081. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4082. */
  4083. var CONST = __webpack_require__(28);
  4084. var Smoothing = __webpack_require__(130);
  4085. // The pool into which the canvas elements are placed.
  4086. var pool = [];
  4087. // Automatically apply smoothing(false) to created Canvas elements
  4088. var _disableContextSmoothing = false;
  4089. /**
  4090. * The CanvasPool is a global static object, that allows Phaser to recycle and pool 2D Context Canvas DOM elements.
  4091. * It does not pool WebGL Contexts, because once the context options are set they cannot be modified again,
  4092. * which is useless for some of the Phaser pipelines / renderer.
  4093. *
  4094. * This singleton is instantiated as soon as Phaser loads, before a Phaser.Game instance has even been created.
  4095. * Which means all instances of Phaser Games on the same page can share the one single pool.
  4096. *
  4097. * @namespace Phaser.Display.Canvas.CanvasPool
  4098. * @since 3.0.0
  4099. */
  4100. var CanvasPool = function ()
  4101. {
  4102. /**
  4103. * Creates a new Canvas DOM element, or pulls one from the pool if free.
  4104. *
  4105. * @function Phaser.Display.Canvas.CanvasPool.create
  4106. * @since 3.0.0
  4107. *
  4108. * @param {*} parent - The parent of the Canvas object.
  4109. * @param {integer} [width=1] - The width of the Canvas.
  4110. * @param {integer} [height=1] - The height of the Canvas.
  4111. * @param {integer} [canvasType=Phaser.CANVAS] - The type of the Canvas. Either `Phaser.CANVAS` or `Phaser.WEBGL`.
  4112. * @param {boolean} [selfParent=false] - Use the generated Canvas element as the parent?
  4113. *
  4114. * @return {HTMLCanvasElement} The canvas element that was created or pulled from the pool
  4115. */
  4116. var create = function (parent, width, height, canvasType, selfParent)
  4117. {
  4118. if (width === undefined) { width = 1; }
  4119. if (height === undefined) { height = 1; }
  4120. if (canvasType === undefined) { canvasType = CONST.CANVAS; }
  4121. if (selfParent === undefined) { selfParent = false; }
  4122. var canvas;
  4123. var container = first(canvasType);
  4124. if (container === null)
  4125. {
  4126. container = {
  4127. parent: parent,
  4128. canvas: document.createElement('canvas'),
  4129. type: canvasType
  4130. };
  4131. if (canvasType === CONST.CANVAS)
  4132. {
  4133. pool.push(container);
  4134. }
  4135. canvas = container.canvas;
  4136. }
  4137. else
  4138. {
  4139. container.parent = parent;
  4140. canvas = container.canvas;
  4141. }
  4142. if (selfParent)
  4143. {
  4144. container.parent = canvas;
  4145. }
  4146. canvas.width = width;
  4147. canvas.height = height;
  4148. if (_disableContextSmoothing && canvasType === CONST.CANVAS)
  4149. {
  4150. Smoothing.disable(canvas.getContext('2d'));
  4151. }
  4152. return canvas;
  4153. };
  4154. /**
  4155. * Creates a new Canvas DOM element, or pulls one from the pool if free.
  4156. *
  4157. * @function Phaser.Display.Canvas.CanvasPool.create2D
  4158. * @since 3.0.0
  4159. *
  4160. * @param {*} parent - The parent of the Canvas object.
  4161. * @param {integer} [width=1] - The width of the Canvas.
  4162. * @param {integer} [height=1] - The height of the Canvas.
  4163. *
  4164. * @return {HTMLCanvasElement} The created canvas.
  4165. */
  4166. var create2D = function (parent, width, height)
  4167. {
  4168. return create(parent, width, height, CONST.CANVAS);
  4169. };
  4170. /**
  4171. * Creates a new Canvas DOM element, or pulls one from the pool if free.
  4172. *
  4173. * @function Phaser.Display.Canvas.CanvasPool.createWebGL
  4174. * @since 3.0.0
  4175. *
  4176. * @param {*} parent - The parent of the Canvas object.
  4177. * @param {integer} [width=1] - The width of the Canvas.
  4178. * @param {integer} [height=1] - The height of the Canvas.
  4179. *
  4180. * @return {HTMLCanvasElement} The created WebGL canvas.
  4181. */
  4182. var createWebGL = function (parent, width, height)
  4183. {
  4184. return create(parent, width, height, CONST.WEBGL);
  4185. };
  4186. /**
  4187. * Gets the first free canvas index from the pool.
  4188. *
  4189. * @function Phaser.Display.Canvas.CanvasPool.first
  4190. * @since 3.0.0
  4191. *
  4192. * @param {integer} [canvasType=Phaser.CANVAS] - The type of the Canvas. Either `Phaser.CANVAS` or `Phaser.WEBGL`.
  4193. *
  4194. * @return {HTMLCanvasElement} The first free canvas, or `null` if a WebGL canvas was requested or if the pool doesn't have free canvases.
  4195. */
  4196. var first = function (canvasType)
  4197. {
  4198. if (canvasType === undefined) { canvasType = CONST.CANVAS; }
  4199. if (canvasType === CONST.WEBGL)
  4200. {
  4201. return null;
  4202. }
  4203. for (var i = 0; i < pool.length; i++)
  4204. {
  4205. var container = pool[i];
  4206. if (!container.parent && container.type === canvasType)
  4207. {
  4208. return container;
  4209. }
  4210. }
  4211. return null;
  4212. };
  4213. /**
  4214. * Looks up a canvas based on its parent, and if found puts it back in the pool, freeing it up for re-use.
  4215. * The canvas has its width and height set to 1, and its parent attribute nulled.
  4216. *
  4217. * @function Phaser.Display.Canvas.CanvasPool.remove
  4218. * @since 3.0.0
  4219. *
  4220. * @param {*} parent - The canvas or the parent of the canvas to free.
  4221. */
  4222. var remove = function (parent)
  4223. {
  4224. // Check to see if the parent is a canvas object
  4225. var isCanvas = parent instanceof HTMLCanvasElement;
  4226. pool.forEach(function (container)
  4227. {
  4228. if ((isCanvas && container.canvas === parent) || (!isCanvas && container.parent === parent))
  4229. {
  4230. container.parent = null;
  4231. container.canvas.width = 1;
  4232. container.canvas.height = 1;
  4233. }
  4234. });
  4235. };
  4236. /**
  4237. * Gets the total number of used canvas elements in the pool.
  4238. *
  4239. * @function Phaser.Display.Canvas.CanvasPool.total
  4240. * @since 3.0.0
  4241. *
  4242. * @return {integer} The number of used canvases.
  4243. */
  4244. var total = function ()
  4245. {
  4246. var c = 0;
  4247. pool.forEach(function (container)
  4248. {
  4249. if (container.parent)
  4250. {
  4251. c++;
  4252. }
  4253. });
  4254. return c;
  4255. };
  4256. /**
  4257. * Gets the total number of free canvas elements in the pool.
  4258. *
  4259. * @function Phaser.Display.Canvas.CanvasPool.free
  4260. * @since 3.0.0
  4261. *
  4262. * @return {integer} The number of free canvases.
  4263. */
  4264. var free = function ()
  4265. {
  4266. return pool.length - total();
  4267. };
  4268. /**
  4269. * Disable context smoothing on any new Canvas element created.
  4270. *
  4271. * @function Phaser.Display.Canvas.CanvasPool.disableSmoothing
  4272. * @since 3.0.0
  4273. */
  4274. var disableSmoothing = function ()
  4275. {
  4276. _disableContextSmoothing = true;
  4277. };
  4278. /**
  4279. * Enable context smoothing on any new Canvas element created.
  4280. *
  4281. * @function Phaser.Display.Canvas.CanvasPool.enableSmoothing
  4282. * @since 3.0.0
  4283. */
  4284. var enableSmoothing = function ()
  4285. {
  4286. _disableContextSmoothing = false;
  4287. };
  4288. return {
  4289. create2D: create2D,
  4290. create: create,
  4291. createWebGL: createWebGL,
  4292. disableSmoothing: disableSmoothing,
  4293. enableSmoothing: enableSmoothing,
  4294. first: first,
  4295. free: free,
  4296. pool: pool,
  4297. remove: remove,
  4298. total: total
  4299. };
  4300. };
  4301. // If we export the called function here, it'll only be invoked once (not every time it's required).
  4302. module.exports = CanvasPool();
  4303. /***/ }),
  4304. /* 25 */
  4305. /***/ (function(module, exports) {
  4306. /**
  4307. * @author Richard Davey <rich@photonstorm.com>
  4308. * @copyright 2019 Photon Storm Ltd.
  4309. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4310. */
  4311. /**
  4312. * Takes a reference to the Canvas Renderer, a Canvas Rendering Context, a Game Object, a Camera and a parent matrix
  4313. * and then performs the following steps:
  4314. *
  4315. * 1. Checks the alpha of the source combined with the Camera alpha. If 0 or less it aborts.
  4316. * 2. Takes the Camera and Game Object matrix and multiplies them, combined with the parent matrix if given.
  4317. * 3. Sets the blend mode of the context to be that used by the Game Object.
  4318. * 4. Sets the alpha value of the context to be that used by the Game Object combined with the Camera.
  4319. * 5. Saves the context state.
  4320. * 6. Sets the final matrix values into the context via setTransform.
  4321. *
  4322. * This function is only meant to be used internally. Most of the Canvas Renderer classes use it.
  4323. *
  4324. * @function Phaser.Renderer.Canvas.SetTransform
  4325. * @since 3.12.0
  4326. *
  4327. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  4328. * @param {CanvasRenderingContext2D} ctx - The canvas context to set the transform on.
  4329. * @param {Phaser.GameObjects.GameObject} src - The Game Object being rendered. Can be any type that extends the base class.
  4330. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  4331. * @param {Phaser.GameObjects.Components.TransformMatrix} [parentMatrix] - A parent transform matrix to apply to the Game Object before rendering.
  4332. *
  4333. * @return {boolean} `true` if the Game Object context was set, otherwise `false`.
  4334. */
  4335. var SetTransform = function (renderer, ctx, src, camera, parentMatrix)
  4336. {
  4337. var alpha = camera.alpha * src.alpha;
  4338. if (alpha <= 0)
  4339. {
  4340. // Nothing to see, so don't waste time calculating stuff
  4341. return false;
  4342. }
  4343. var camMatrix = renderer._tempMatrix1.copyFromArray(camera.matrix.matrix);
  4344. var gameObjectMatrix = renderer._tempMatrix2.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  4345. var calcMatrix = renderer._tempMatrix3;
  4346. if (parentMatrix)
  4347. {
  4348. // Multiply the camera by the parent matrix
  4349. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  4350. // Undo the camera scroll
  4351. gameObjectMatrix.e = src.x;
  4352. gameObjectMatrix.f = src.y;
  4353. // Multiply by the Sprite matrix, store result in calcMatrix
  4354. camMatrix.multiply(gameObjectMatrix, calcMatrix);
  4355. }
  4356. else
  4357. {
  4358. gameObjectMatrix.e -= camera.scrollX * src.scrollFactorX;
  4359. gameObjectMatrix.f -= camera.scrollY * src.scrollFactorY;
  4360. // Multiply by the Sprite matrix, store result in calcMatrix
  4361. camMatrix.multiply(gameObjectMatrix, calcMatrix);
  4362. }
  4363. // Blend Mode
  4364. ctx.globalCompositeOperation = renderer.blendModes[src.blendMode];
  4365. // Alpha
  4366. ctx.globalAlpha = alpha;
  4367. ctx.save();
  4368. calcMatrix.setToContext(ctx);
  4369. return true;
  4370. };
  4371. module.exports = SetTransform;
  4372. /***/ }),
  4373. /* 26 */
  4374. /***/ (function(module, exports, __webpack_require__) {
  4375. /**
  4376. * @author Richard Davey <rich@photonstorm.com>
  4377. * @copyright 2019 Photon Storm Ltd.
  4378. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4379. */
  4380. /**
  4381. * @namespace Phaser.Core.Events
  4382. */
  4383. module.exports = {
  4384. BLUR: __webpack_require__(1190),
  4385. BOOT: __webpack_require__(1189),
  4386. DESTROY: __webpack_require__(1188),
  4387. FOCUS: __webpack_require__(1187),
  4388. HIDDEN: __webpack_require__(1186),
  4389. PAUSE: __webpack_require__(1185),
  4390. POST_RENDER: __webpack_require__(1184),
  4391. POST_STEP: __webpack_require__(1183),
  4392. PRE_RENDER: __webpack_require__(1182),
  4393. PRE_STEP: __webpack_require__(1181),
  4394. READY: __webpack_require__(1180),
  4395. RESUME: __webpack_require__(1179),
  4396. STEP: __webpack_require__(1178),
  4397. VISIBLE: __webpack_require__(1177)
  4398. };
  4399. /***/ }),
  4400. /* 27 */
  4401. /***/ (function(module, exports) {
  4402. /**
  4403. * @author Richard Davey <rich@photonstorm.com>
  4404. * @copyright 2019 Photon Storm Ltd.
  4405. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4406. */
  4407. /**
  4408. * Takes an array of Game Objects, or any objects that have a public property as defined in `key`,
  4409. * and then sets it to the given value.
  4410. *
  4411. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  4412. *
  4413. * To use this with a Group: `PropertyValueSet(group.getChildren(), key, value, step)`
  4414. *
  4415. * @function Phaser.Actions.PropertyValueSet
  4416. * @since 3.3.0
  4417. *
  4418. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  4419. *
  4420. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  4421. * @param {string} key - The property to be updated.
  4422. * @param {number} value - The amount to set the property to.
  4423. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  4424. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  4425. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  4426. *
  4427. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  4428. */
  4429. var PropertyValueSet = function (items, key, value, step, index, direction)
  4430. {
  4431. if (step === undefined) { step = 0; }
  4432. if (index === undefined) { index = 0; }
  4433. if (direction === undefined) { direction = 1; }
  4434. var i;
  4435. var t = 0;
  4436. var end = items.length;
  4437. if (direction === 1)
  4438. {
  4439. // Start to End
  4440. for (i = index; i < end; i++)
  4441. {
  4442. items[i][key] = value + (t * step);
  4443. t++;
  4444. }
  4445. }
  4446. else
  4447. {
  4448. // End to Start
  4449. for (i = index; i >= 0; i--)
  4450. {
  4451. items[i][key] = value + (t * step);
  4452. t++;
  4453. }
  4454. }
  4455. return items;
  4456. };
  4457. module.exports = PropertyValueSet;
  4458. /***/ }),
  4459. /* 28 */
  4460. /***/ (function(module, exports, __webpack_require__) {
  4461. /**
  4462. * @author Richard Davey <rich@photonstorm.com>
  4463. * @copyright 2019 Photon Storm Ltd.
  4464. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4465. */
  4466. /**
  4467. * Global consts.
  4468. *
  4469. * @ignore
  4470. */
  4471. var CONST = {
  4472. /**
  4473. * Phaser Release Version
  4474. *
  4475. * @name Phaser.VERSION
  4476. * @readonly
  4477. * @type {string}
  4478. * @since 3.0.0
  4479. */
  4480. VERSION: '3.16.2',
  4481. BlendModes: __webpack_require__(60),
  4482. ScaleModes: __webpack_require__(101),
  4483. /**
  4484. * AUTO Detect Renderer.
  4485. *
  4486. * @name Phaser.AUTO
  4487. * @readonly
  4488. * @type {integer}
  4489. * @since 3.0.0
  4490. */
  4491. AUTO: 0,
  4492. /**
  4493. * Canvas Renderer.
  4494. *
  4495. * @name Phaser.CANVAS
  4496. * @readonly
  4497. * @type {integer}
  4498. * @since 3.0.0
  4499. */
  4500. CANVAS: 1,
  4501. /**
  4502. * WebGL Renderer.
  4503. *
  4504. * @name Phaser.WEBGL
  4505. * @readonly
  4506. * @type {integer}
  4507. * @since 3.0.0
  4508. */
  4509. WEBGL: 2,
  4510. /**
  4511. * Headless Renderer.
  4512. *
  4513. * @name Phaser.HEADLESS
  4514. * @readonly
  4515. * @type {integer}
  4516. * @since 3.0.0
  4517. */
  4518. HEADLESS: 3,
  4519. /**
  4520. * In Phaser the value -1 means 'forever' in lots of cases, this const allows you to use it instead
  4521. * to help you remember what the value is doing in your code.
  4522. *
  4523. * @name Phaser.FOREVER
  4524. * @readonly
  4525. * @type {integer}
  4526. * @since 3.0.0
  4527. */
  4528. FOREVER: -1,
  4529. /**
  4530. * Direction constant.
  4531. *
  4532. * @name Phaser.NONE
  4533. * @readonly
  4534. * @type {integer}
  4535. * @since 3.0.0
  4536. */
  4537. NONE: 4,
  4538. /**
  4539. * Direction constant.
  4540. *
  4541. * @name Phaser.UP
  4542. * @readonly
  4543. * @type {integer}
  4544. * @since 3.0.0
  4545. */
  4546. UP: 5,
  4547. /**
  4548. * Direction constant.
  4549. *
  4550. * @name Phaser.DOWN
  4551. * @readonly
  4552. * @type {integer}
  4553. * @since 3.0.0
  4554. */
  4555. DOWN: 6,
  4556. /**
  4557. * Direction constant.
  4558. *
  4559. * @name Phaser.LEFT
  4560. * @readonly
  4561. * @type {integer}
  4562. * @since 3.0.0
  4563. */
  4564. LEFT: 7,
  4565. /**
  4566. * Direction constant.
  4567. *
  4568. * @name Phaser.RIGHT
  4569. * @readonly
  4570. * @type {integer}
  4571. * @since 3.0.0
  4572. */
  4573. RIGHT: 8
  4574. };
  4575. module.exports = CONST;
  4576. /***/ }),
  4577. /* 29 */
  4578. /***/ (function(module, exports, __webpack_require__) {
  4579. /**
  4580. * @author Richard Davey <rich@photonstorm.com>
  4581. * @copyright 2019 Photon Storm Ltd.
  4582. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4583. */
  4584. var Class = __webpack_require__(0);
  4585. var Components = __webpack_require__(13);
  4586. var GameObject = __webpack_require__(18);
  4587. var Line = __webpack_require__(59);
  4588. /**
  4589. * @classdesc
  4590. * The Shape Game Object is a base class for the various different shapes, such as the Arc, Star or Polygon.
  4591. * You cannot add a Shape directly to your Scene, it is meant as a base for your own custom Shape classes.
  4592. *
  4593. * @class Shape
  4594. * @extends Phaser.GameObjects.GameObject
  4595. * @memberof Phaser.GameObjects
  4596. * @constructor
  4597. * @since 3.13.0
  4598. *
  4599. * @extends Phaser.GameObjects.Components.Alpha
  4600. * @extends Phaser.GameObjects.Components.BlendMode
  4601. * @extends Phaser.GameObjects.Components.ComputedSize
  4602. * @extends Phaser.GameObjects.Components.Depth
  4603. * @extends Phaser.GameObjects.Components.GetBounds
  4604. * @extends Phaser.GameObjects.Components.Mask
  4605. * @extends Phaser.GameObjects.Components.Origin
  4606. * @extends Phaser.GameObjects.Components.Pipeline
  4607. * @extends Phaser.GameObjects.Components.ScaleMode
  4608. * @extends Phaser.GameObjects.Components.ScrollFactor
  4609. * @extends Phaser.GameObjects.Components.Transform
  4610. * @extends Phaser.GameObjects.Components.Visible
  4611. *
  4612. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  4613. * @param {string} [type] - The internal type of the Shape.
  4614. * @param {any} [data] - The data of the source shape geometry, if any.
  4615. */
  4616. var Shape = new Class({
  4617. Extends: GameObject,
  4618. Mixins: [
  4619. Components.Alpha,
  4620. Components.BlendMode,
  4621. Components.ComputedSize,
  4622. Components.Depth,
  4623. Components.GetBounds,
  4624. Components.Mask,
  4625. Components.Origin,
  4626. Components.Pipeline,
  4627. Components.ScaleMode,
  4628. Components.ScrollFactor,
  4629. Components.Transform,
  4630. Components.Visible
  4631. ],
  4632. initialize:
  4633. function Shape (scene, type, data)
  4634. {
  4635. if (type === undefined) { type = 'Shape'; }
  4636. GameObject.call(this, scene, type);
  4637. /**
  4638. * The source Shape data. Typically a geometry object.
  4639. * You should not manipulate this directly.
  4640. *
  4641. * @name Phaser.GameObjects.Shape#data
  4642. * @type {any}
  4643. * @readonly
  4644. * @since 3.13.0
  4645. */
  4646. this.geom = data;
  4647. /**
  4648. * Holds the polygon path data for filled rendering.
  4649. *
  4650. * @name Phaser.GameObjects.Shape#pathData
  4651. * @type {number[]}
  4652. * @readonly
  4653. * @since 3.13.0
  4654. */
  4655. this.pathData = [];
  4656. /**
  4657. * Holds the earcut polygon path index data for filled rendering.
  4658. *
  4659. * @name Phaser.GameObjects.Shape#pathIndexes
  4660. * @type {integer[]}
  4661. * @readonly
  4662. * @since 3.13.0
  4663. */
  4664. this.pathIndexes = [];
  4665. /**
  4666. * The fill color used by this Shape.
  4667. *
  4668. * @name Phaser.GameObjects.Shape#fillColor
  4669. * @type {number}
  4670. * @since 3.13.0
  4671. */
  4672. this.fillColor = 0xffffff;
  4673. /**
  4674. * The fill alpha value used by this Shape.
  4675. *
  4676. * @name Phaser.GameObjects.Shape#fillAlpha
  4677. * @type {number}
  4678. * @since 3.13.0
  4679. */
  4680. this.fillAlpha = 1;
  4681. /**
  4682. * The stroke color used by this Shape.
  4683. *
  4684. * @name Phaser.GameObjects.Shape#strokeColor
  4685. * @type {number}
  4686. * @since 3.13.0
  4687. */
  4688. this.strokeColor = 0xffffff;
  4689. /**
  4690. * The stroke alpha value used by this Shape.
  4691. *
  4692. * @name Phaser.GameObjects.Shape#strokeAlpha
  4693. * @type {number}
  4694. * @since 3.13.0
  4695. */
  4696. this.strokeAlpha = 1;
  4697. /**
  4698. * The stroke line width used by this Shape.
  4699. *
  4700. * @name Phaser.GameObjects.Shape#lineWidth
  4701. * @type {number}
  4702. * @since 3.13.0
  4703. */
  4704. this.lineWidth = 1;
  4705. /**
  4706. * Controls if this Shape is filled or not.
  4707. * Note that some Shapes do not support being filled (such as Line shapes)
  4708. *
  4709. * @name Phaser.GameObjects.Shape#isFilled
  4710. * @type {boolean}
  4711. * @since 3.13.0
  4712. */
  4713. this.isFilled = false;
  4714. /**
  4715. * Controls if this Shape is stroked or not.
  4716. * Note that some Shapes do not support being stroked (such as Iso Box shapes)
  4717. *
  4718. * @name Phaser.GameObjects.Shape#isStroked
  4719. * @type {boolean}
  4720. * @since 3.13.0
  4721. */
  4722. this.isStroked = false;
  4723. /**
  4724. * Controls if this Shape path is closed during rendering when stroked.
  4725. * Note that some Shapes are always closed when stroked (such as Ellipse shapes)
  4726. *
  4727. * @name Phaser.GameObjects.Shape#closePath
  4728. * @type {boolean}
  4729. * @since 3.13.0
  4730. */
  4731. this.closePath = true;
  4732. /**
  4733. * Private internal value.
  4734. * A Line used when parsing internal path data to avoid constant object re-creation.
  4735. *
  4736. * @name Phaser.GameObjects.Curve#_tempLine
  4737. * @type {Phaser.Geom.Line}
  4738. * @private
  4739. * @since 3.13.0
  4740. */
  4741. this._tempLine = new Line();
  4742. this.initPipeline();
  4743. },
  4744. /**
  4745. * Sets the fill color and alpha for this Shape.
  4746. *
  4747. * If you wish for the Shape to not be filled then call this method with no arguments, or just set `isFilled` to `false`.
  4748. *
  4749. * Note that some Shapes do not support fill colors, such as the Line shape.
  4750. *
  4751. * This call can be chained.
  4752. *
  4753. * @method Phaser.GameObjects.Shape#setFillStyle
  4754. * @since 3.13.0
  4755. *
  4756. * @param {number} [color] - The color used to fill this shape. If not provided the Shape will not be filled.
  4757. * @param {number} [alpha=1] - The alpha value used when filling this shape, if a fill color is given.
  4758. *
  4759. * @return {this} This Game Object instance.
  4760. */
  4761. setFillStyle: function (color, alpha)
  4762. {
  4763. if (alpha === undefined) { alpha = 1; }
  4764. if (color === undefined)
  4765. {
  4766. this.isFilled = false;
  4767. }
  4768. else
  4769. {
  4770. this.fillColor = color;
  4771. this.fillAlpha = alpha;
  4772. this.isFilled = true;
  4773. }
  4774. return this;
  4775. },
  4776. /**
  4777. * Sets the stroke color and alpha for this Shape.
  4778. *
  4779. * If you wish for the Shape to not be stroked then call this method with no arguments, or just set `isStroked` to `false`.
  4780. *
  4781. * Note that some Shapes do not support being stroked, such as the Iso Box shape.
  4782. *
  4783. * This call can be chained.
  4784. *
  4785. * @method Phaser.GameObjects.Shape#setStrokeStyle
  4786. * @since 3.13.0
  4787. *
  4788. * @param {number} [lineWidth] - The width of line to stroke with. If not provided or undefined the Shape will not be stroked.
  4789. * @param {number} [color] - The color used to stroke this shape. If not provided the Shape will not be stroked.
  4790. * @param {number} [alpha=1] - The alpha value used when stroking this shape, if a stroke color is given.
  4791. *
  4792. * @return {this} This Game Object instance.
  4793. */
  4794. setStrokeStyle: function (lineWidth, color, alpha)
  4795. {
  4796. if (alpha === undefined) { alpha = 1; }
  4797. if (lineWidth === undefined)
  4798. {
  4799. this.isStroked = false;
  4800. }
  4801. else
  4802. {
  4803. this.lineWidth = lineWidth;
  4804. this.strokeColor = color;
  4805. this.strokeAlpha = alpha;
  4806. this.isStroked = true;
  4807. }
  4808. return this;
  4809. },
  4810. /**
  4811. * Sets if this Shape path is closed during rendering when stroked.
  4812. * Note that some Shapes are always closed when stroked (such as Ellipse shapes)
  4813. *
  4814. * This call can be chained.
  4815. *
  4816. * @method Phaser.GameObjects.Shape#setClosePath
  4817. * @since 3.13.0
  4818. *
  4819. * @param {boolean} value - Set to `true` if the Shape should be closed when stroked, otherwise `false`.
  4820. *
  4821. * @return {this} This Game Object instance.
  4822. */
  4823. setClosePath: function (value)
  4824. {
  4825. this.closePath = value;
  4826. return this;
  4827. },
  4828. /**
  4829. * Internal destroy handler, called as part of the destroy process.
  4830. *
  4831. * @method Phaser.GameObjects.Shape#preDestroy
  4832. * @protected
  4833. * @since 3.13.0
  4834. */
  4835. preDestroy: function ()
  4836. {
  4837. this.geom = null;
  4838. this._tempLine = null;
  4839. this.pathData = [];
  4840. this.pathIndexes = [];
  4841. }
  4842. });
  4843. module.exports = Shape;
  4844. /***/ }),
  4845. /* 30 */
  4846. /***/ (function(module, exports, __webpack_require__) {
  4847. /**
  4848. * @author Richard Davey <rich@photonstorm.com>
  4849. * @copyright 2019 Photon Storm Ltd.
  4850. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4851. */
  4852. var BlendModes = __webpack_require__(60);
  4853. var GetAdvancedValue = __webpack_require__(12);
  4854. var ScaleModes = __webpack_require__(101);
  4855. /**
  4856. * @typedef {object} GameObjectConfig
  4857. *
  4858. * @property {number} [x=0] - The x position of the Game Object.
  4859. * @property {number} [y=0] - The y position of the Game Object.
  4860. * @property {number} [depth=0] - The depth of the GameObject.
  4861. * @property {boolean} [flipX=false] - The horizontally flipped state of the Game Object.
  4862. * @property {boolean} [flipY=false] - The vertically flipped state of the Game Object.
  4863. * @property {?(number|object)} [scale=null] - The scale of the GameObject.
  4864. * @property {?(number|object)} [scrollFactor=null] - The scroll factor of the GameObject.
  4865. * @property {number} [rotation=0] - The rotation angle of the Game Object, in radians.
  4866. * @property {?number} [angle=null] - The rotation angle of the Game Object, in degrees.
  4867. * @property {number} [alpha=1] - The alpha (opacity) of the Game Object.
  4868. * @property {?(number|object)} [origin=null] - The origin of the Game Object.
  4869. * @property {number} [scaleMode=ScaleModes.DEFAULT] - The scale mode of the GameObject.
  4870. * @property {number} [blendMode=BlendModes.DEFAULT] - The blend mode of the GameObject.
  4871. * @property {boolean} [visible=true] - The visible state of the Game Object.
  4872. * @property {boolean} [add=true] - Add the GameObject to the scene.
  4873. */
  4874. /**
  4875. * Builds a Game Object using the provided configuration object.
  4876. *
  4877. * @function Phaser.GameObjects.BuildGameObject
  4878. * @since 3.0.0
  4879. *
  4880. * @param {Phaser.Scene} scene - A reference to the Scene.
  4881. * @param {Phaser.GameObjects.GameObject} gameObject - The initial GameObject.
  4882. * @param {GameObjectConfig} config - The config to build the GameObject with.
  4883. *
  4884. * @return {Phaser.GameObjects.GameObject} The built Game Object.
  4885. */
  4886. var BuildGameObject = function (scene, gameObject, config)
  4887. {
  4888. // Position
  4889. gameObject.x = GetAdvancedValue(config, 'x', 0);
  4890. gameObject.y = GetAdvancedValue(config, 'y', 0);
  4891. gameObject.depth = GetAdvancedValue(config, 'depth', 0);
  4892. // Flip
  4893. gameObject.flipX = GetAdvancedValue(config, 'flipX', false);
  4894. gameObject.flipY = GetAdvancedValue(config, 'flipY', false);
  4895. // Scale
  4896. // Either: { scale: 2 } or { scale: { x: 2, y: 2 }}
  4897. var scale = GetAdvancedValue(config, 'scale', null);
  4898. if (typeof scale === 'number')
  4899. {
  4900. gameObject.setScale(scale);
  4901. }
  4902. else if (scale !== null)
  4903. {
  4904. gameObject.scaleX = GetAdvancedValue(scale, 'x', 1);
  4905. gameObject.scaleY = GetAdvancedValue(scale, 'y', 1);
  4906. }
  4907. // ScrollFactor
  4908. // Either: { scrollFactor: 2 } or { scrollFactor: { x: 2, y: 2 }}
  4909. var scrollFactor = GetAdvancedValue(config, 'scrollFactor', null);
  4910. if (typeof scrollFactor === 'number')
  4911. {
  4912. gameObject.setScrollFactor(scrollFactor);
  4913. }
  4914. else if (scrollFactor !== null)
  4915. {
  4916. gameObject.scrollFactorX = GetAdvancedValue(scrollFactor, 'x', 1);
  4917. gameObject.scrollFactorY = GetAdvancedValue(scrollFactor, 'y', 1);
  4918. }
  4919. // Rotation
  4920. gameObject.rotation = GetAdvancedValue(config, 'rotation', 0);
  4921. var angle = GetAdvancedValue(config, 'angle', null);
  4922. if (angle !== null)
  4923. {
  4924. gameObject.angle = angle;
  4925. }
  4926. // Alpha
  4927. gameObject.alpha = GetAdvancedValue(config, 'alpha', 1);
  4928. // Origin
  4929. // Either: { origin: 0.5 } or { origin: { x: 0.5, y: 0.5 }}
  4930. var origin = GetAdvancedValue(config, 'origin', null);
  4931. if (typeof origin === 'number')
  4932. {
  4933. gameObject.setOrigin(origin);
  4934. }
  4935. else if (origin !== null)
  4936. {
  4937. var ox = GetAdvancedValue(origin, 'x', 0.5);
  4938. var oy = GetAdvancedValue(origin, 'y', 0.5);
  4939. gameObject.setOrigin(ox, oy);
  4940. }
  4941. // ScaleMode
  4942. gameObject.scaleMode = GetAdvancedValue(config, 'scaleMode', ScaleModes.DEFAULT);
  4943. // BlendMode
  4944. gameObject.blendMode = GetAdvancedValue(config, 'blendMode', BlendModes.NORMAL);
  4945. // Visible
  4946. gameObject.visible = GetAdvancedValue(config, 'visible', true);
  4947. // Add to Scene
  4948. var add = GetAdvancedValue(config, 'add', true);
  4949. if (add)
  4950. {
  4951. scene.sys.displayList.add(gameObject);
  4952. }
  4953. if (gameObject.preUpdate)
  4954. {
  4955. scene.sys.updateList.add(gameObject);
  4956. }
  4957. return gameObject;
  4958. };
  4959. module.exports = BuildGameObject;
  4960. /***/ }),
  4961. /* 31 */
  4962. /***/ (function(module, exports) {
  4963. /**
  4964. * @author Richard Davey <rich@photonstorm.com>
  4965. * @copyright 2019 Photon Storm Ltd.
  4966. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4967. */
  4968. /**
  4969. * @namespace Phaser.Tilemaps.Formats
  4970. */
  4971. module.exports = {
  4972. /**
  4973. * CSV Map Type
  4974. *
  4975. * @name Phaser.Tilemaps.Formats.CSV
  4976. * @type {number}
  4977. * @since 3.0.0
  4978. */
  4979. CSV: 0,
  4980. /**
  4981. * Tiled JSON Map Type
  4982. *
  4983. * @name Phaser.Tilemaps.Formats.TILED_JSON
  4984. * @type {number}
  4985. * @since 3.0.0
  4986. */
  4987. TILED_JSON: 1,
  4988. /**
  4989. * 2D Array Map Type
  4990. *
  4991. * @name Phaser.Tilemaps.Formats.ARRAY_2D
  4992. * @type {number}
  4993. * @since 3.0.0
  4994. */
  4995. ARRAY_2D: 2,
  4996. /**
  4997. * Weltmeister (Impact.js) Map Type
  4998. *
  4999. * @name Phaser.Tilemaps.Formats.WELTMEISTER
  5000. * @type {number}
  5001. * @since 3.0.0
  5002. */
  5003. WELTMEISTER: 3
  5004. };
  5005. /***/ }),
  5006. /* 32 */
  5007. /***/ (function(module, exports, __webpack_require__) {
  5008. /**
  5009. * @author Richard Davey <rich@photonstorm.com>
  5010. * @copyright 2019 Photon Storm Ltd.
  5011. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  5012. */
  5013. var Class = __webpack_require__(0);
  5014. var GetColor = __webpack_require__(191);
  5015. var GetColor32 = __webpack_require__(409);
  5016. var HSVToRGB = __webpack_require__(190);
  5017. var RGBToHSV = __webpack_require__(408);
  5018. /**
  5019. * @namespace Phaser.Display.Color
  5020. */
  5021. /**
  5022. * @classdesc
  5023. * The Color class holds a single color value and allows for easy modification and reading of it.
  5024. *
  5025. * @class Color
  5026. * @memberof Phaser.Display
  5027. * @constructor
  5028. * @since 3.0.0
  5029. *
  5030. * @param {integer} [red=0] - The red color value. A number between 0 and 255.
  5031. * @param {integer} [green=0] - The green color value. A number between 0 and 255.
  5032. * @param {integer} [blue=0] - The blue color value. A number between 0 and 255.
  5033. * @param {integer} [alpha=255] - The alpha value. A number between 0 and 255.
  5034. */
  5035. var Color = new Class({
  5036. initialize:
  5037. function Color (red, green, blue, alpha)
  5038. {
  5039. if (red === undefined) { red = 0; }
  5040. if (green === undefined) { green = 0; }
  5041. if (blue === undefined) { blue = 0; }
  5042. if (alpha === undefined) { alpha = 255; }
  5043. /**
  5044. * The internal red color value.
  5045. *
  5046. * @name Phaser.Display.Color#r
  5047. * @type {number}
  5048. * @private
  5049. * @default 0
  5050. * @since 3.0.0
  5051. */
  5052. this.r = 0;
  5053. /**
  5054. * The internal green color value.
  5055. *
  5056. * @name Phaser.Display.Color#g
  5057. * @type {number}
  5058. * @private
  5059. * @default 0
  5060. * @since 3.0.0
  5061. */
  5062. this.g = 0;
  5063. /**
  5064. * The internal blue color value.
  5065. *
  5066. * @name Phaser.Display.Color#b
  5067. * @type {number}
  5068. * @private
  5069. * @default 0
  5070. * @since 3.0.0
  5071. */
  5072. this.b = 0;
  5073. /**
  5074. * The internal alpha color value.
  5075. *
  5076. * @name Phaser.Display.Color#a
  5077. * @type {number}
  5078. * @private
  5079. * @default 255
  5080. * @since 3.0.0
  5081. */
  5082. this.a = 255;
  5083. /**
  5084. * The hue color value. A number between 0 and 1.
  5085. * This is the base color.
  5086. *
  5087. * @name Phaser.Display.Color#_h
  5088. * @type {number}
  5089. * @default 0
  5090. * @private
  5091. * @since 3.13.0
  5092. */
  5093. this._h = 0;
  5094. /**
  5095. * The saturation color value. A number between 0 and 1.
  5096. * This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white.
  5097. *
  5098. * @name Phaser.Display.Color#_s
  5099. * @type {number}
  5100. * @default 0
  5101. * @private
  5102. * @since 3.13.0
  5103. */
  5104. this._s = 0;
  5105. /**
  5106. * The lightness color value. A number between 0 and 1.
  5107. * This controls how dark the color is. Where 1 is as bright as possible and 0 is black.
  5108. *
  5109. * @name Phaser.Display.Color#_v
  5110. * @type {number}
  5111. * @default 0
  5112. * @private
  5113. * @since 3.13.0
  5114. */
  5115. this._v = 0;
  5116. /**
  5117. * Is this color update locked?
  5118. *
  5119. * @name Phaser.Display.Color#_locked
  5120. * @type {boolean}
  5121. * @private
  5122. * @since 3.13.0
  5123. */
  5124. this._locked = false;
  5125. /**
  5126. * An array containing the calculated color values for WebGL use.
  5127. *
  5128. * @name Phaser.Display.Color#gl
  5129. * @type {number[]}
  5130. * @since 3.0.0
  5131. */
  5132. this.gl = [ 0, 0, 0, 1 ];
  5133. /**
  5134. * Pre-calculated internal color value.
  5135. *
  5136. * @name Phaser.Display.Color#_color
  5137. * @type {number}
  5138. * @private
  5139. * @default 0
  5140. * @since 3.0.0
  5141. */
  5142. this._color = 0;
  5143. /**
  5144. * Pre-calculated internal color32 value.
  5145. *
  5146. * @name Phaser.Display.Color#_color32
  5147. * @type {number}
  5148. * @private
  5149. * @default 0
  5150. * @since 3.0.0
  5151. */
  5152. this._color32 = 0;
  5153. /**
  5154. * Pre-calculated internal color rgb string value.
  5155. *
  5156. * @name Phaser.Display.Color#_rgba
  5157. * @type {string}
  5158. * @private
  5159. * @default ''
  5160. * @since 3.0.0
  5161. */
  5162. this._rgba = '';
  5163. this.setTo(red, green, blue, alpha);
  5164. },
  5165. /**
  5166. * Sets this color to be transparent. Sets all values to zero.
  5167. *
  5168. * @method Phaser.Display.Color#transparent
  5169. * @since 3.0.0
  5170. *
  5171. * @return {Phaser.Display.Color} This Color object.
  5172. */
  5173. transparent: function ()
  5174. {
  5175. this._locked = true;
  5176. this.red = 0;
  5177. this.green = 0;
  5178. this.blue = 0;
  5179. this.alpha = 0;
  5180. this._locked = false;
  5181. return this.update(true);
  5182. },
  5183. /**
  5184. * Sets the color of this Color component.
  5185. *
  5186. * @method Phaser.Display.Color#setTo
  5187. * @since 3.0.0
  5188. *
  5189. * @param {integer} red - The red color value. A number between 0 and 255.
  5190. * @param {integer} green - The green color value. A number between 0 and 255.
  5191. * @param {integer} blue - The blue color value. A number between 0 and 255.
  5192. * @param {integer} [alpha=255] - The alpha value. A number between 0 and 255.
  5193. * @param {boolean} [updateHSV=true] - Update the HSV values after setting the RGB values?
  5194. *
  5195. * @return {Phaser.Display.Color} This Color object.
  5196. */
  5197. setTo: function (red, green, blue, alpha, updateHSV)
  5198. {
  5199. if (alpha === undefined) { alpha = 255; }
  5200. if (updateHSV === undefined) { updateHSV = true; }
  5201. this._locked = true;
  5202. this.red = red;
  5203. this.green = green;
  5204. this.blue = blue;
  5205. this.alpha = alpha;
  5206. this._locked = false;
  5207. return this.update(updateHSV);
  5208. },
  5209. /**
  5210. * Sets the red, green, blue and alpha GL values of this Color component.
  5211. *
  5212. * @method Phaser.Display.Color#setGLTo
  5213. * @since 3.0.0
  5214. *
  5215. * @param {number} red - The red color value. A number between 0 and 1.
  5216. * @param {number} green - The green color value. A number between 0 and 1.
  5217. * @param {number} blue - The blue color value. A number between 0 and 1.
  5218. * @param {number} [alpha=1] - The alpha value. A number between 0 and 1.
  5219. *
  5220. * @return {Phaser.Display.Color} This Color object.
  5221. */
  5222. setGLTo: function (red, green, blue, alpha)
  5223. {
  5224. if (alpha === undefined) { alpha = 1; }
  5225. this._locked = true;
  5226. this.redGL = red;
  5227. this.greenGL = green;
  5228. this.blueGL = blue;
  5229. this.alphaGL = alpha;
  5230. this._locked = false;
  5231. return this.update(true);
  5232. },
  5233. /**
  5234. * Sets the color based on the color object given.
  5235. *
  5236. * @method Phaser.Display.Color#setFromRGB
  5237. * @since 3.0.0
  5238. *
  5239. * @param {InputColorObject} color - An object containing `r`, `g`, `b` and optionally `a` values in the range 0 to 255.
  5240. *
  5241. * @return {Phaser.Display.Color} This Color object.
  5242. */
  5243. setFromRGB: function (color)
  5244. {
  5245. this._locked = true;
  5246. this.red = color.r;
  5247. this.green = color.g;
  5248. this.blue = color.b;
  5249. if (color.hasOwnProperty('a'))
  5250. {
  5251. this.alpha = color.a;
  5252. }
  5253. this._locked = false;
  5254. return this.update(true);
  5255. },
  5256. /**
  5257. * Sets the color based on the hue, saturation and lightness values given.
  5258. *
  5259. * @method Phaser.Display.Color#setFromHSV
  5260. * @since 3.13.0
  5261. *
  5262. * @param {number} h - The hue, in the range 0 - 1. This is the base color.
  5263. * @param {number} s - The saturation, in the range 0 - 1. This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white.
  5264. * @param {number} v - The value, in the range 0 - 1. This controls how dark the color is. Where 1 is as bright as possible and 0 is black.
  5265. *
  5266. * @return {Phaser.Display.Color} This Color object.
  5267. */
  5268. setFromHSV: function (h, s, v)
  5269. {
  5270. return HSVToRGB(h, s, v, this);
  5271. },
  5272. /**
  5273. * Updates the internal cache values.
  5274. *
  5275. * @method Phaser.Display.Color#update
  5276. * @private
  5277. * @since 3.0.0
  5278. *
  5279. * @return {Phaser.Display.Color} This Color object.
  5280. */
  5281. update: function (updateHSV)
  5282. {
  5283. if (updateHSV === undefined) { updateHSV = false; }
  5284. if (this._locked)
  5285. {
  5286. return this;
  5287. }
  5288. var r = this.r;
  5289. var g = this.g;
  5290. var b = this.b;
  5291. var a = this.a;
  5292. this._color = GetColor(r, g, b);
  5293. this._color32 = GetColor32(r, g, b, a);
  5294. this._rgba = 'rgba(' + r + ',' + g + ',' + b + ',' + (a / 255) + ')';
  5295. if (updateHSV)
  5296. {
  5297. RGBToHSV(r, g, b, this);
  5298. }
  5299. return this;
  5300. },
  5301. /**
  5302. * Updates the internal hsv cache values.
  5303. *
  5304. * @method Phaser.Display.Color#updateHSV
  5305. * @private
  5306. * @since 3.13.0
  5307. *
  5308. * @return {Phaser.Display.Color} This Color object.
  5309. */
  5310. updateHSV: function ()
  5311. {
  5312. var r = this.r;
  5313. var g = this.g;
  5314. var b = this.b;
  5315. RGBToHSV(r, g, b, this);
  5316. return this;
  5317. },
  5318. /**
  5319. * Returns a new Color component using the values from this one.
  5320. *
  5321. * @method Phaser.Display.Color#clone
  5322. * @since 3.0.0
  5323. *
  5324. * @return {Phaser.Display.Color} A new Color object.
  5325. */
  5326. clone: function ()
  5327. {
  5328. return new Color(this.r, this.g, this.b, this.a);
  5329. },
  5330. /**
  5331. * Sets this Color object to be grayscaled based on the shade value given.
  5332. *
  5333. * @method Phaser.Display.Color#gray
  5334. * @since 3.13.0
  5335. *
  5336. * @param {integer} shade - A value between 0 and 255.
  5337. *
  5338. * @return {Phaser.Display.Color} This Color object.
  5339. */
  5340. gray: function (shade)
  5341. {
  5342. return this.setTo(shade, shade, shade);
  5343. },
  5344. /**
  5345. * Sets this Color object to be a random color between the `min` and `max` values given.
  5346. *
  5347. * @method Phaser.Display.Color#random
  5348. * @since 3.13.0
  5349. *
  5350. * @param {integer} [min=0] - The minimum random color value. Between 0 and 255.
  5351. * @param {integer} [max=255] - The maximum random color value. Between 0 and 255.
  5352. *
  5353. * @return {Phaser.Display.Color} This Color object.
  5354. */
  5355. random: function (min, max)
  5356. {
  5357. if (min === undefined) { min = 0; }
  5358. if (max === undefined) { max = 255; }
  5359. var r = Math.floor(min + Math.random() * (max - min));
  5360. var g = Math.floor(min + Math.random() * (max - min));
  5361. var b = Math.floor(min + Math.random() * (max - min));
  5362. return this.setTo(r, g, b);
  5363. },
  5364. /**
  5365. * Sets this Color object to be a random grayscale color between the `min` and `max` values given.
  5366. *
  5367. * @method Phaser.Display.Color#randomGray
  5368. * @since 3.13.0
  5369. *
  5370. * @param {integer} [min=0] - The minimum random color value. Between 0 and 255.
  5371. * @param {integer} [max=255] - The maximum random color value. Between 0 and 255.
  5372. *
  5373. * @return {Phaser.Display.Color} This Color object.
  5374. */
  5375. randomGray: function (min, max)
  5376. {
  5377. if (min === undefined) { min = 0; }
  5378. if (max === undefined) { max = 255; }
  5379. var s = Math.floor(min + Math.random() * (max - min));
  5380. return this.setTo(s, s, s);
  5381. },
  5382. /**
  5383. * Increase the saturation of this Color by the percentage amount given.
  5384. * The saturation is the amount of the base color in the hue.
  5385. *
  5386. * @method Phaser.Display.Color#saturate
  5387. * @since 3.13.0
  5388. *
  5389. * @param {integer} amount - The percentage amount to change this color by. A value between 0 and 100.
  5390. *
  5391. * @return {Phaser.Display.Color} This Color object.
  5392. */
  5393. saturate: function (amount)
  5394. {
  5395. this.s += amount / 100;
  5396. return this;
  5397. },
  5398. /**
  5399. * Decrease the saturation of this Color by the percentage amount given.
  5400. * The saturation is the amount of the base color in the hue.
  5401. *
  5402. * @method Phaser.Display.Color#desaturate
  5403. * @since 3.13.0
  5404. *
  5405. * @param {integer} amount - The percentage amount to change this color by. A value between 0 and 100.
  5406. *
  5407. * @return {Phaser.Display.Color} This Color object.
  5408. */
  5409. desaturate: function (amount)
  5410. {
  5411. this.s -= amount / 100;
  5412. return this;
  5413. },
  5414. /**
  5415. * Increase the lightness of this Color by the percentage amount given.
  5416. *
  5417. * @method Phaser.Display.Color#lighten
  5418. * @since 3.13.0
  5419. *
  5420. * @param {integer} amount - The percentage amount to change this color by. A value between 0 and 100.
  5421. *
  5422. * @return {Phaser.Display.Color} This Color object.
  5423. */
  5424. lighten: function (amount)
  5425. {
  5426. this.v += amount / 100;
  5427. return this;
  5428. },
  5429. /**
  5430. * Decrease the lightness of this Color by the percentage amount given.
  5431. *
  5432. * @method Phaser.Display.Color#darken
  5433. * @since 3.13.0
  5434. *
  5435. * @param {integer} amount - The percentage amount to change this color by. A value between 0 and 100.
  5436. *
  5437. * @return {Phaser.Display.Color} This Color object.
  5438. */
  5439. darken: function (amount)
  5440. {
  5441. this.v -= amount / 100;
  5442. return this;
  5443. },
  5444. /**
  5445. * Brighten this Color by the percentage amount given.
  5446. *
  5447. * @method Phaser.Display.Color#brighten
  5448. * @since 3.13.0
  5449. *
  5450. * @param {integer} amount - The percentage amount to change this color by. A value between 0 and 100.
  5451. *
  5452. * @return {Phaser.Display.Color} This Color object.
  5453. */
  5454. brighten: function (amount)
  5455. {
  5456. var r = this.r;
  5457. var g = this.g;
  5458. var b = this.b;
  5459. r = Math.max(0, Math.min(255, r - Math.round(255 * - (amount / 100))));
  5460. g = Math.max(0, Math.min(255, g - Math.round(255 * - (amount / 100))));
  5461. b = Math.max(0, Math.min(255, b - Math.round(255 * - (amount / 100))));
  5462. return this.setTo(r, g, b);
  5463. },
  5464. /**
  5465. * The color of this Color component, not including the alpha channel.
  5466. *
  5467. * @name Phaser.Display.Color#color
  5468. * @type {number}
  5469. * @readonly
  5470. * @since 3.0.0
  5471. */
  5472. color: {
  5473. get: function ()
  5474. {
  5475. return this._color;
  5476. }
  5477. },
  5478. /**
  5479. * The color of this Color component, including the alpha channel.
  5480. *
  5481. * @name Phaser.Display.Color#color32
  5482. * @type {number}
  5483. * @readonly
  5484. * @since 3.0.0
  5485. */
  5486. color32: {
  5487. get: function ()
  5488. {
  5489. return this._color32;
  5490. }
  5491. },
  5492. /**
  5493. * The color of this Color component as a string which can be used in CSS color values.
  5494. *
  5495. * @name Phaser.Display.Color#rgba
  5496. * @type {string}
  5497. * @readonly
  5498. * @since 3.0.0
  5499. */
  5500. rgba: {
  5501. get: function ()
  5502. {
  5503. return this._rgba;
  5504. }
  5505. },
  5506. /**
  5507. * The red color value, normalized to the range 0 to 1.
  5508. *
  5509. * @name Phaser.Display.Color#redGL
  5510. * @type {number}
  5511. * @since 3.0.0
  5512. */
  5513. redGL: {
  5514. get: function ()
  5515. {
  5516. return this.gl[0];
  5517. },
  5518. set: function (value)
  5519. {
  5520. this.gl[0] = Math.min(Math.abs(value), 1);
  5521. this.r = Math.floor(this.gl[0] * 255);
  5522. this.update(true);
  5523. }
  5524. },
  5525. /**
  5526. * The green color value, normalized to the range 0 to 1.
  5527. *
  5528. * @name Phaser.Display.Color#greenGL
  5529. * @type {number}
  5530. * @since 3.0.0
  5531. */
  5532. greenGL: {
  5533. get: function ()
  5534. {
  5535. return this.gl[1];
  5536. },
  5537. set: function (value)
  5538. {
  5539. this.gl[1] = Math.min(Math.abs(value), 1);
  5540. this.g = Math.floor(this.gl[1] * 255);
  5541. this.update(true);
  5542. }
  5543. },
  5544. /**
  5545. * The blue color value, normalized to the range 0 to 1.
  5546. *
  5547. * @name Phaser.Display.Color#blueGL
  5548. * @type {number}
  5549. * @since 3.0.0
  5550. */
  5551. blueGL: {
  5552. get: function ()
  5553. {
  5554. return this.gl[2];
  5555. },
  5556. set: function (value)
  5557. {
  5558. this.gl[2] = Math.min(Math.abs(value), 1);
  5559. this.b = Math.floor(this.gl[2] * 255);
  5560. this.update(true);
  5561. }
  5562. },
  5563. /**
  5564. * The alpha color value, normalized to the range 0 to 1.
  5565. *
  5566. * @name Phaser.Display.Color#alphaGL
  5567. * @type {number}
  5568. * @since 3.0.0
  5569. */
  5570. alphaGL: {
  5571. get: function ()
  5572. {
  5573. return this.gl[3];
  5574. },
  5575. set: function (value)
  5576. {
  5577. this.gl[3] = Math.min(Math.abs(value), 1);
  5578. this.a = Math.floor(this.gl[3] * 255);
  5579. this.update();
  5580. }
  5581. },
  5582. /**
  5583. * The red color value, normalized to the range 0 to 255.
  5584. *
  5585. * @name Phaser.Display.Color#red
  5586. * @type {number}
  5587. * @since 3.0.0
  5588. */
  5589. red: {
  5590. get: function ()
  5591. {
  5592. return this.r;
  5593. },
  5594. set: function (value)
  5595. {
  5596. value = Math.floor(Math.abs(value));
  5597. this.r = Math.min(value, 255);
  5598. this.gl[0] = value / 255;
  5599. this.update(true);
  5600. }
  5601. },
  5602. /**
  5603. * The green color value, normalized to the range 0 to 255.
  5604. *
  5605. * @name Phaser.Display.Color#green
  5606. * @type {number}
  5607. * @since 3.0.0
  5608. */
  5609. green: {
  5610. get: function ()
  5611. {
  5612. return this.g;
  5613. },
  5614. set: function (value)
  5615. {
  5616. value = Math.floor(Math.abs(value));
  5617. this.g = Math.min(value, 255);
  5618. this.gl[1] = value / 255;
  5619. this.update(true);
  5620. }
  5621. },
  5622. /**
  5623. * The blue color value, normalized to the range 0 to 255.
  5624. *
  5625. * @name Phaser.Display.Color#blue
  5626. * @type {number}
  5627. * @since 3.0.0
  5628. */
  5629. blue: {
  5630. get: function ()
  5631. {
  5632. return this.b;
  5633. },
  5634. set: function (value)
  5635. {
  5636. value = Math.floor(Math.abs(value));
  5637. this.b = Math.min(value, 255);
  5638. this.gl[2] = value / 255;
  5639. this.update(true);
  5640. }
  5641. },
  5642. /**
  5643. * The alpha color value, normalized to the range 0 to 255.
  5644. *
  5645. * @name Phaser.Display.Color#alpha
  5646. * @type {number}
  5647. * @since 3.0.0
  5648. */
  5649. alpha: {
  5650. get: function ()
  5651. {
  5652. return this.a;
  5653. },
  5654. set: function (value)
  5655. {
  5656. value = Math.floor(Math.abs(value));
  5657. this.a = Math.min(value, 255);
  5658. this.gl[3] = value / 255;
  5659. this.update();
  5660. }
  5661. },
  5662. /**
  5663. * The hue color value. A number between 0 and 1.
  5664. * This is the base color.
  5665. *
  5666. * @name Phaser.Display.Color#h
  5667. * @type {number}
  5668. * @since 3.13.0
  5669. */
  5670. h: {
  5671. get: function ()
  5672. {
  5673. return this._h;
  5674. },
  5675. set: function (value)
  5676. {
  5677. this._h = value;
  5678. HSVToRGB(value, this._s, this._v, this);
  5679. }
  5680. },
  5681. /**
  5682. * The saturation color value. A number between 0 and 1.
  5683. * This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white.
  5684. *
  5685. * @name Phaser.Display.Color#s
  5686. * @type {number}
  5687. * @since 3.13.0
  5688. */
  5689. s: {
  5690. get: function ()
  5691. {
  5692. return this._s;
  5693. },
  5694. set: function (value)
  5695. {
  5696. this._s = value;
  5697. HSVToRGB(this._h, value, this._v, this);
  5698. }
  5699. },
  5700. /**
  5701. * The lightness color value. A number between 0 and 1.
  5702. * This controls how dark the color is. Where 1 is as bright as possible and 0 is black.
  5703. *
  5704. * @name Phaser.Display.Color#v
  5705. * @type {number}
  5706. * @since 3.13.0
  5707. */
  5708. v: {
  5709. get: function ()
  5710. {
  5711. return this._v;
  5712. },
  5713. set: function (value)
  5714. {
  5715. this._v = value;
  5716. HSVToRGB(this._h, this._s, value, this);
  5717. }
  5718. }
  5719. });
  5720. module.exports = Color;
  5721. /***/ }),
  5722. /* 33 */
  5723. /***/ (function(module, exports) {
  5724. /**
  5725. * @author Richard Davey <rich@photonstorm.com>
  5726. * @copyright 2019 Photon Storm Ltd.
  5727. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  5728. */
  5729. /**
  5730. * Sets the fillStyle on the target context based on the given Shape.
  5731. *
  5732. * @method Phaser.GameObjects.Shape#FillStyleCanvas
  5733. * @since 3.13.0
  5734. * @private
  5735. *
  5736. * @param {CanvasRenderingContext2D} ctx - The context to set the fill style on.
  5737. * @param {Phaser.GameObjects.Shape} src - The Game Object to set the fill style from.
  5738. */
  5739. var FillStyleCanvas = function (ctx, src, altColor)
  5740. {
  5741. var fillColor = (altColor) ? altColor : src.fillColor;
  5742. var fillAlpha = src.fillAlpha;
  5743. var red = ((fillColor & 0xFF0000) >>> 16);
  5744. var green = ((fillColor & 0xFF00) >>> 8);
  5745. var blue = (fillColor & 0xFF);
  5746. ctx.fillStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + fillAlpha + ')';
  5747. };
  5748. module.exports = FillStyleCanvas;
  5749. /***/ }),
  5750. /* 34 */
  5751. /***/ (function(module, exports, __webpack_require__) {
  5752. /**
  5753. * @author Richard Davey <rich@photonstorm.com>
  5754. * @copyright 2019 Photon Storm Ltd.
  5755. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  5756. */
  5757. var CONST = __webpack_require__(20);
  5758. /**
  5759. * Convert the given angle from degrees, to the equivalent angle in radians.
  5760. *
  5761. * @function Phaser.Math.DegToRad
  5762. * @since 3.0.0
  5763. *
  5764. * @param {integer} degrees - The angle (in degrees) to convert to radians.
  5765. *
  5766. * @return {number} The given angle converted to radians.
  5767. */
  5768. var DegToRad = function (degrees)
  5769. {
  5770. return degrees * CONST.DEG_TO_RAD;
  5771. };
  5772. module.exports = DegToRad;
  5773. /***/ }),
  5774. /* 35 */
  5775. /***/ (function(module, exports) {
  5776. /**
  5777. * @author Richard Davey <rich@photonstorm.com>
  5778. * @copyright 2019 Photon Storm Ltd.
  5779. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  5780. */
  5781. /**
  5782. * Takes an array of Game Objects, or any objects that have a public property as defined in `key`,
  5783. * and then adds the given value to it.
  5784. *
  5785. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  5786. *
  5787. * To use this with a Group: `PropertyValueInc(group.getChildren(), key, value, step)`
  5788. *
  5789. * @function Phaser.Actions.PropertyValueInc
  5790. * @since 3.3.0
  5791. *
  5792. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  5793. *
  5794. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  5795. * @param {string} key - The property to be updated.
  5796. * @param {number} value - The amount to be added to the property.
  5797. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  5798. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  5799. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  5800. *
  5801. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  5802. */
  5803. var PropertyValueInc = function (items, key, value, step, index, direction)
  5804. {
  5805. if (step === undefined) { step = 0; }
  5806. if (index === undefined) { index = 0; }
  5807. if (direction === undefined) { direction = 1; }
  5808. var i;
  5809. var t = 0;
  5810. var end = items.length;
  5811. if (direction === 1)
  5812. {
  5813. // Start to End
  5814. for (i = index; i < end; i++)
  5815. {
  5816. items[i][key] += value + (t * step);
  5817. t++;
  5818. }
  5819. }
  5820. else
  5821. {
  5822. // End to Start
  5823. for (i = index; i >= 0; i--)
  5824. {
  5825. items[i][key] += value + (t * step);
  5826. t++;
  5827. }
  5828. }
  5829. return items;
  5830. };
  5831. module.exports = PropertyValueInc;
  5832. /***/ }),
  5833. /* 36 */
  5834. /***/ (function(module, exports, __webpack_require__) {
  5835. /* WEBPACK VAR INJECTION */(function(global) {/**
  5836. * The `Matter.Common` module contains utility functions that are common to all modules.
  5837. *
  5838. * @class Common
  5839. */
  5840. var Common = {};
  5841. module.exports = Common;
  5842. (function() {
  5843. Common._nextId = 0;
  5844. Common._seed = 0;
  5845. Common._nowStartTime = +(new Date());
  5846. /**
  5847. * Extends the object in the first argument using the object in the second argument.
  5848. * @method extend
  5849. * @param {} obj
  5850. * @param {boolean} deep
  5851. * @return {} obj extended
  5852. */
  5853. Common.extend = function(obj, deep) {
  5854. var argsStart,
  5855. args,
  5856. deepClone;
  5857. if (typeof deep === 'boolean') {
  5858. argsStart = 2;
  5859. deepClone = deep;
  5860. } else {
  5861. argsStart = 1;
  5862. deepClone = true;
  5863. }
  5864. for (var i = argsStart; i < arguments.length; i++) {
  5865. var source = arguments[i];
  5866. if (source) {
  5867. for (var prop in source) {
  5868. if (deepClone && source[prop] && source[prop].constructor === Object) {
  5869. if (!obj[prop] || obj[prop].constructor === Object) {
  5870. obj[prop] = obj[prop] || {};
  5871. Common.extend(obj[prop], deepClone, source[prop]);
  5872. } else {
  5873. obj[prop] = source[prop];
  5874. }
  5875. } else {
  5876. obj[prop] = source[prop];
  5877. }
  5878. }
  5879. }
  5880. }
  5881. return obj;
  5882. };
  5883. /**
  5884. * Creates a new clone of the object, if deep is true references will also be cloned.
  5885. * @method clone
  5886. * @param {} obj
  5887. * @param {bool} deep
  5888. * @return {} obj cloned
  5889. */
  5890. Common.clone = function(obj, deep) {
  5891. return Common.extend({}, deep, obj);
  5892. };
  5893. /**
  5894. * Returns the list of keys for the given object.
  5895. * @method keys
  5896. * @param {} obj
  5897. * @return {string[]} keys
  5898. */
  5899. Common.keys = function(obj) {
  5900. if (Object.keys)
  5901. return Object.keys(obj);
  5902. // avoid hasOwnProperty for performance
  5903. var keys = [];
  5904. for (var key in obj)
  5905. keys.push(key);
  5906. return keys;
  5907. };
  5908. /**
  5909. * Returns the list of values for the given object.
  5910. * @method values
  5911. * @param {} obj
  5912. * @return {array} Array of the objects property values
  5913. */
  5914. Common.values = function(obj) {
  5915. var values = [];
  5916. if (Object.keys) {
  5917. var keys = Object.keys(obj);
  5918. for (var i = 0; i < keys.length; i++) {
  5919. values.push(obj[keys[i]]);
  5920. }
  5921. return values;
  5922. }
  5923. // avoid hasOwnProperty for performance
  5924. for (var key in obj)
  5925. values.push(obj[key]);
  5926. return values;
  5927. };
  5928. /**
  5929. * Gets a value from `base` relative to the `path` string.
  5930. * @method get
  5931. * @param {} obj The base object
  5932. * @param {string} path The path relative to `base`, e.g. 'Foo.Bar.baz'
  5933. * @param {number} [begin] Path slice begin
  5934. * @param {number} [end] Path slice end
  5935. * @return {} The object at the given path
  5936. */
  5937. Common.get = function(obj, path, begin, end) {
  5938. path = path.split('.').slice(begin, end);
  5939. for (var i = 0; i < path.length; i += 1) {
  5940. obj = obj[path[i]];
  5941. }
  5942. return obj;
  5943. };
  5944. /**
  5945. * Sets a value on `base` relative to the given `path` string.
  5946. * @method set
  5947. * @param {} obj The base object
  5948. * @param {string} path The path relative to `base`, e.g. 'Foo.Bar.baz'
  5949. * @param {} val The value to set
  5950. * @param {number} [begin] Path slice begin
  5951. * @param {number} [end] Path slice end
  5952. * @return {} Pass through `val` for chaining
  5953. */
  5954. Common.set = function(obj, path, val, begin, end) {
  5955. var parts = path.split('.').slice(begin, end);
  5956. Common.get(obj, path, 0, -1)[parts[parts.length - 1]] = val;
  5957. return val;
  5958. };
  5959. /**
  5960. * Shuffles the given array in-place.
  5961. * The function uses a seeded random generator.
  5962. * @method shuffle
  5963. * @param {array} array
  5964. * @return {array} array shuffled randomly
  5965. */
  5966. Common.shuffle = function(array) {
  5967. for (var i = array.length - 1; i > 0; i--) {
  5968. var j = Math.floor(Common.random() * (i + 1));
  5969. var temp = array[i];
  5970. array[i] = array[j];
  5971. array[j] = temp;
  5972. }
  5973. return array;
  5974. };
  5975. /**
  5976. * Randomly chooses a value from a list with equal probability.
  5977. * The function uses a seeded random generator.
  5978. * @method choose
  5979. * @param {array} choices
  5980. * @return {object} A random choice object from the array
  5981. */
  5982. Common.choose = function(choices) {
  5983. return choices[Math.floor(Common.random() * choices.length)];
  5984. };
  5985. /**
  5986. * Returns true if the object is a HTMLElement, otherwise false.
  5987. * @method isElement
  5988. * @param {object} obj
  5989. * @return {boolean} True if the object is a HTMLElement, otherwise false
  5990. */
  5991. Common.isElement = function(obj) {
  5992. if (typeof HTMLElement !== 'undefined') {
  5993. return obj instanceof HTMLElement;
  5994. }
  5995. return !!(obj && obj.nodeType && obj.nodeName);
  5996. };
  5997. /**
  5998. * Returns true if the object is an array.
  5999. * @method isArray
  6000. * @param {object} obj
  6001. * @return {boolean} True if the object is an array, otherwise false
  6002. */
  6003. Common.isArray = function(obj) {
  6004. return Object.prototype.toString.call(obj) === '[object Array]';
  6005. };
  6006. /**
  6007. * Returns true if the object is a function.
  6008. * @method isFunction
  6009. * @param {object} obj
  6010. * @return {boolean} True if the object is a function, otherwise false
  6011. */
  6012. Common.isFunction = function(obj) {
  6013. return typeof obj === "function";
  6014. };
  6015. /**
  6016. * Returns true if the object is a plain object.
  6017. * @method isPlainObject
  6018. * @param {object} obj
  6019. * @return {boolean} True if the object is a plain object, otherwise false
  6020. */
  6021. Common.isPlainObject = function(obj) {
  6022. return typeof obj === 'object' && obj.constructor === Object;
  6023. };
  6024. /**
  6025. * Returns true if the object is a string.
  6026. * @method isString
  6027. * @param {object} obj
  6028. * @return {boolean} True if the object is a string, otherwise false
  6029. */
  6030. Common.isString = function(obj) {
  6031. return toString.call(obj) === '[object String]';
  6032. };
  6033. /**
  6034. * Returns the given value clamped between a minimum and maximum value.
  6035. * @method clamp
  6036. * @param {number} value
  6037. * @param {number} min
  6038. * @param {number} max
  6039. * @return {number} The value clamped between min and max inclusive
  6040. */
  6041. Common.clamp = function(value, min, max) {
  6042. if (value < min)
  6043. return min;
  6044. if (value > max)
  6045. return max;
  6046. return value;
  6047. };
  6048. /**
  6049. * Returns the sign of the given value.
  6050. * @method sign
  6051. * @param {number} value
  6052. * @return {number} -1 if negative, +1 if 0 or positive
  6053. */
  6054. Common.sign = function(value) {
  6055. return value < 0 ? -1 : 1;
  6056. };
  6057. /**
  6058. * Returns the current timestamp since the time origin (e.g. from page load).
  6059. * The result will be high-resolution including decimal places if available.
  6060. * @method now
  6061. * @return {number} the current timestamp
  6062. */
  6063. Common.now = function() {
  6064. if (window.performance) {
  6065. if (window.performance.now) {
  6066. return window.performance.now();
  6067. } else if (window.performance.webkitNow) {
  6068. return window.performance.webkitNow();
  6069. }
  6070. }
  6071. return (new Date()) - Common._nowStartTime;
  6072. };
  6073. /**
  6074. * Returns a random value between a minimum and a maximum value inclusive.
  6075. * The function uses a seeded random generator.
  6076. * @method random
  6077. * @param {number} min
  6078. * @param {number} max
  6079. * @return {number} A random number between min and max inclusive
  6080. */
  6081. Common.random = function(min, max) {
  6082. min = (typeof min !== "undefined") ? min : 0;
  6083. max = (typeof max !== "undefined") ? max : 1;
  6084. return min + _seededRandom() * (max - min);
  6085. };
  6086. var _seededRandom = function() {
  6087. // https://en.wikipedia.org/wiki/Linear_congruential_generator
  6088. Common._seed = (Common._seed * 9301 + 49297) % 233280;
  6089. return Common._seed / 233280;
  6090. };
  6091. /**
  6092. * Converts a CSS hex colour string into an integer.
  6093. * @method colorToNumber
  6094. * @param {string} colorString
  6095. * @return {number} An integer representing the CSS hex string
  6096. */
  6097. Common.colorToNumber = function(colorString) {
  6098. colorString = colorString.replace('#','');
  6099. if (colorString.length == 3) {
  6100. colorString = colorString.charAt(0) + colorString.charAt(0)
  6101. + colorString.charAt(1) + colorString.charAt(1)
  6102. + colorString.charAt(2) + colorString.charAt(2);
  6103. }
  6104. return parseInt(colorString, 16);
  6105. };
  6106. /**
  6107. * The console logging level to use, where each level includes all levels above and excludes the levels below.
  6108. * The default level is 'debug' which shows all console messages.
  6109. *
  6110. * Possible level values are:
  6111. * - 0 = None
  6112. * - 1 = Debug
  6113. * - 2 = Info
  6114. * - 3 = Warn
  6115. * - 4 = Error
  6116. * @property Common.logLevel
  6117. * @type {Number}
  6118. * @default 1
  6119. */
  6120. Common.logLevel = 1;
  6121. /**
  6122. * Shows a `console.log` message only if the current `Common.logLevel` allows it.
  6123. * The message will be prefixed with 'matter-js' to make it easily identifiable.
  6124. * @method log
  6125. * @param ...objs {} The objects to log.
  6126. */
  6127. Common.log = function() {
  6128. if (console && Common.logLevel > 0 && Common.logLevel <= 3) {
  6129. console.log.apply(console, ['matter-js:'].concat(Array.prototype.slice.call(arguments)));
  6130. }
  6131. };
  6132. /**
  6133. * Shows a `console.info` message only if the current `Common.logLevel` allows it.
  6134. * The message will be prefixed with 'matter-js' to make it easily identifiable.
  6135. * @method info
  6136. * @param ...objs {} The objects to log.
  6137. */
  6138. Common.info = function() {
  6139. if (console && Common.logLevel > 0 && Common.logLevel <= 2) {
  6140. console.info.apply(console, ['matter-js:'].concat(Array.prototype.slice.call(arguments)));
  6141. }
  6142. };
  6143. /**
  6144. * Shows a `console.warn` message only if the current `Common.logLevel` allows it.
  6145. * The message will be prefixed with 'matter-js' to make it easily identifiable.
  6146. * @method warn
  6147. * @param ...objs {} The objects to log.
  6148. */
  6149. Common.warn = function() {
  6150. if (console && Common.logLevel > 0 && Common.logLevel <= 3) {
  6151. console.warn.apply(console, ['matter-js:'].concat(Array.prototype.slice.call(arguments)));
  6152. }
  6153. };
  6154. /**
  6155. * Returns the next unique sequential ID.
  6156. * @method nextId
  6157. * @return {Number} Unique sequential ID
  6158. */
  6159. Common.nextId = function() {
  6160. return Common._nextId++;
  6161. };
  6162. /**
  6163. * A cross browser compatible indexOf implementation.
  6164. * @method indexOf
  6165. * @param {array} haystack
  6166. * @param {object} needle
  6167. * @return {number} The position of needle in haystack, otherwise -1.
  6168. */
  6169. Common.indexOf = function(haystack, needle) {
  6170. if (haystack.indexOf)
  6171. return haystack.indexOf(needle);
  6172. for (var i = 0; i < haystack.length; i++) {
  6173. if (haystack[i] === needle)
  6174. return i;
  6175. }
  6176. return -1;
  6177. };
  6178. /**
  6179. * A cross browser compatible array map implementation.
  6180. * @method map
  6181. * @param {array} list
  6182. * @param {function} func
  6183. * @return {array} Values from list transformed by func.
  6184. */
  6185. Common.map = function(list, func) {
  6186. if (list.map) {
  6187. return list.map(func);
  6188. }
  6189. var mapped = [];
  6190. for (var i = 0; i < list.length; i += 1) {
  6191. mapped.push(func(list[i]));
  6192. }
  6193. return mapped;
  6194. };
  6195. /**
  6196. * Takes a directed graph and returns the partially ordered set of vertices in topological order.
  6197. * Circular dependencies are allowed.
  6198. * @method topologicalSort
  6199. * @param {object} graph
  6200. * @return {array} Partially ordered set of vertices in topological order.
  6201. */
  6202. Common.topologicalSort = function(graph) {
  6203. // https://github.com/mgechev/javascript-algorithms
  6204. // Copyright (c) Minko Gechev (MIT license)
  6205. // Modifications: tidy formatting and naming
  6206. var result = [],
  6207. visited = [],
  6208. temp = [];
  6209. for (var node in graph) {
  6210. if (!visited[node] && !temp[node]) {
  6211. Common._topologicalSort(node, visited, temp, graph, result);
  6212. }
  6213. }
  6214. return result;
  6215. };
  6216. Common._topologicalSort = function(node, visited, temp, graph, result) {
  6217. var neighbors = graph[node] || [];
  6218. temp[node] = true;
  6219. for (var i = 0; i < neighbors.length; i += 1) {
  6220. var neighbor = neighbors[i];
  6221. if (temp[neighbor]) {
  6222. // skip circular dependencies
  6223. continue;
  6224. }
  6225. if (!visited[neighbor]) {
  6226. Common._topologicalSort(neighbor, visited, temp, graph, result);
  6227. }
  6228. }
  6229. temp[node] = false;
  6230. visited[node] = true;
  6231. result.push(node);
  6232. };
  6233. /**
  6234. * Takes _n_ functions as arguments and returns a new function that calls them in order.
  6235. * The arguments applied when calling the new function will also be applied to every function passed.
  6236. * The value of `this` refers to the last value returned in the chain that was not `undefined`.
  6237. * Therefore if a passed function does not return a value, the previously returned value is maintained.
  6238. * After all passed functions have been called the new function returns the last returned value (if any).
  6239. * If any of the passed functions are a chain, then the chain will be flattened.
  6240. * @method chain
  6241. * @param ...funcs {function} The functions to chain.
  6242. * @return {function} A new function that calls the passed functions in order.
  6243. */
  6244. Common.chain = function() {
  6245. var funcs = [];
  6246. for (var i = 0; i < arguments.length; i += 1) {
  6247. var func = arguments[i];
  6248. if (func._chained) {
  6249. // flatten already chained functions
  6250. funcs.push.apply(funcs, func._chained);
  6251. } else {
  6252. funcs.push(func);
  6253. }
  6254. }
  6255. var chain = function() {
  6256. // https://github.com/GoogleChrome/devtools-docs/issues/53#issuecomment-51941358
  6257. var lastResult,
  6258. args = new Array(arguments.length);
  6259. for (var i = 0, l = arguments.length; i < l; i++) {
  6260. args[i] = arguments[i];
  6261. }
  6262. for (i = 0; i < funcs.length; i += 1) {
  6263. var result = funcs[i].apply(lastResult, args);
  6264. if (typeof result !== 'undefined') {
  6265. lastResult = result;
  6266. }
  6267. }
  6268. return lastResult;
  6269. };
  6270. chain._chained = funcs;
  6271. return chain;
  6272. };
  6273. /**
  6274. * Chains a function to excute before the original function on the given `path` relative to `base`.
  6275. * See also docs for `Common.chain`.
  6276. * @method chainPathBefore
  6277. * @param {} base The base object
  6278. * @param {string} path The path relative to `base`
  6279. * @param {function} func The function to chain before the original
  6280. * @return {function} The chained function that replaced the original
  6281. */
  6282. Common.chainPathBefore = function(base, path, func) {
  6283. return Common.set(base, path, Common.chain(
  6284. func,
  6285. Common.get(base, path)
  6286. ));
  6287. };
  6288. /**
  6289. * Chains a function to excute after the original function on the given `path` relative to `base`.
  6290. * See also docs for `Common.chain`.
  6291. * @method chainPathAfter
  6292. * @param {} base The base object
  6293. * @param {string} path The path relative to `base`
  6294. * @param {function} func The function to chain after the original
  6295. * @return {function} The chained function that replaced the original
  6296. */
  6297. Common.chainPathAfter = function(base, path, func) {
  6298. return Common.set(base, path, Common.chain(
  6299. Common.get(base, path),
  6300. func
  6301. ));
  6302. };
  6303. /**
  6304. * Used to require external libraries outside of the bundle.
  6305. * It first looks for the `globalName` on the environment's global namespace.
  6306. * If the global is not found, it will fall back to using the standard `require` using the `moduleName`.
  6307. * @private
  6308. * @method _requireGlobal
  6309. * @param {string} globalName The global module name
  6310. * @param {string} moduleName The fallback CommonJS module name
  6311. * @return {} The loaded module
  6312. */
  6313. Common._requireGlobal = function(globalName, moduleName) {
  6314. var obj = (typeof window !== 'undefined' ? window[globalName] : typeof global !== 'undefined' ? global[globalName] : null);
  6315. // Breaks webpack :(
  6316. // return obj || require(moduleName);
  6317. return obj;
  6318. };
  6319. })();
  6320. /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(215)))
  6321. /***/ }),
  6322. /* 37 */
  6323. /***/ (function(module, exports, __webpack_require__) {
  6324. /**
  6325. * @author Richard Davey <rich@photonstorm.com>
  6326. * @copyright 2019 Photon Storm Ltd.
  6327. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6328. */
  6329. var GetTileAt = __webpack_require__(109);
  6330. var GetTilesWithin = __webpack_require__(21);
  6331. /**
  6332. * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the
  6333. * layer. Interesting faces are used internally for optimizing collisions against tiles. This method
  6334. * is mostly used internally.
  6335. *
  6336. * @function Phaser.Tilemaps.Components.CalculateFacesWithin
  6337. * @private
  6338. * @since 3.0.0
  6339. *
  6340. * @param {integer} tileX - The left most tile index (in tile coordinates) to use as the origin of the area.
  6341. * @param {integer} tileY - The top most tile index (in tile coordinates) to use as the origin of the area.
  6342. * @param {integer} width - How many tiles wide from the `tileX` index the area will be.
  6343. * @param {integer} height - How many tiles tall from the `tileY` index the area will be.
  6344. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  6345. */
  6346. var CalculateFacesWithin = function (tileX, tileY, width, height, layer)
  6347. {
  6348. var above = null;
  6349. var below = null;
  6350. var left = null;
  6351. var right = null;
  6352. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  6353. for (var i = 0; i < tiles.length; i++)
  6354. {
  6355. var tile = tiles[i];
  6356. if (tile)
  6357. {
  6358. if (tile.collides)
  6359. {
  6360. above = GetTileAt(tile.x, tile.y - 1, true, layer);
  6361. below = GetTileAt(tile.x, tile.y + 1, true, layer);
  6362. left = GetTileAt(tile.x - 1, tile.y, true, layer);
  6363. right = GetTileAt(tile.x + 1, tile.y, true, layer);
  6364. tile.faceTop = (above && above.collides) ? false : true;
  6365. tile.faceBottom = (below && below.collides) ? false : true;
  6366. tile.faceLeft = (left && left.collides) ? false : true;
  6367. tile.faceRight = (right && right.collides) ? false : true;
  6368. }
  6369. else
  6370. {
  6371. tile.resetFaces();
  6372. }
  6373. }
  6374. }
  6375. };
  6376. module.exports = CalculateFacesWithin;
  6377. /***/ }),
  6378. /* 38 */
  6379. /***/ (function(module, exports) {
  6380. /**
  6381. * @author Richard Davey <rich@photonstorm.com>
  6382. * @copyright 2019 Photon Storm Ltd.
  6383. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6384. */
  6385. /**
  6386. * Arcade Physics consts.
  6387. *
  6388. * @ignore
  6389. */
  6390. var CONST = {
  6391. /**
  6392. * Dynamic Body.
  6393. *
  6394. * @name Phaser.Physics.Arcade.DYNAMIC_BODY
  6395. * @readonly
  6396. * @type {number}
  6397. * @since 3.0.0
  6398. *
  6399. * @see Phaser.Physics.Arcade.Body#physicsType
  6400. * @see Phaser.Physics.Arcade.Group#physicsType
  6401. */
  6402. DYNAMIC_BODY: 0,
  6403. /**
  6404. * Static Body.
  6405. *
  6406. * @name Phaser.Physics.Arcade.STATIC_BODY
  6407. * @readonly
  6408. * @type {number}
  6409. * @since 3.0.0
  6410. *
  6411. * @see Phaser.Physics.Arcade.Body#physicsType
  6412. * @see Phaser.Physics.Arcade.StaticBody#physicsType
  6413. */
  6414. STATIC_BODY: 1,
  6415. /**
  6416. * Arcade Physics Group containing Dynamic Bodies.
  6417. *
  6418. * @name Phaser.Physics.Arcade.GROUP
  6419. * @readonly
  6420. * @type {number}
  6421. * @since 3.0.0
  6422. */
  6423. GROUP: 2,
  6424. /**
  6425. * A Tilemap Layer.
  6426. *
  6427. * @name Phaser.Physics.Arcade.TILEMAPLAYER
  6428. * @readonly
  6429. * @type {number}
  6430. * @since 3.0.0
  6431. */
  6432. TILEMAPLAYER: 3,
  6433. /**
  6434. * Facing no direction (initial value).
  6435. *
  6436. * @name Phaser.Physics.Arcade.FACING_NONE
  6437. * @readonly
  6438. * @type {number}
  6439. * @since 3.0.0
  6440. *
  6441. * @see Phaser.Physics.Arcade.Body#facing
  6442. */
  6443. FACING_NONE: 10,
  6444. /**
  6445. * Facing up.
  6446. *
  6447. * @name Phaser.Physics.Arcade.FACING_UP
  6448. * @readonly
  6449. * @type {number}
  6450. * @since 3.0.0
  6451. *
  6452. * @see Phaser.Physics.Arcade.Body#facing
  6453. */
  6454. FACING_UP: 11,
  6455. /**
  6456. * Facing down.
  6457. *
  6458. * @name Phaser.Physics.Arcade.FACING_DOWN
  6459. * @readonly
  6460. * @type {number}
  6461. * @since 3.0.0
  6462. *
  6463. * @see Phaser.Physics.Arcade.Body#facing
  6464. */
  6465. FACING_DOWN: 12,
  6466. /**
  6467. * Facing left.
  6468. *
  6469. * @name Phaser.Physics.Arcade.FACING_LEFT
  6470. * @readonly
  6471. * @type {number}
  6472. * @since 3.0.0
  6473. *
  6474. * @see Phaser.Physics.Arcade.Body#facing
  6475. */
  6476. FACING_LEFT: 13,
  6477. /**
  6478. * Facing right.
  6479. *
  6480. * @name Phaser.Physics.Arcade.FACING_RIGHT
  6481. * @readonly
  6482. * @type {number}
  6483. * @since 3.0.0
  6484. *
  6485. * @see Phaser.Physics.Arcade.Body#facing
  6486. */
  6487. FACING_RIGHT: 14
  6488. };
  6489. module.exports = CONST;
  6490. /***/ }),
  6491. /* 39 */
  6492. /***/ (function(module, exports) {
  6493. /**
  6494. * @author Richard Davey <rich@photonstorm.com>
  6495. * @copyright 2019 Photon Storm Ltd.
  6496. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6497. */
  6498. /**
  6499. * Sets the strokeStyle and lineWidth on the target context based on the given Shape.
  6500. *
  6501. * @method Phaser.GameObjects.Shape#LineStyleCanvas
  6502. * @since 3.13.0
  6503. * @private
  6504. *
  6505. * @param {CanvasRenderingContext2D} ctx - The context to set the stroke style on.
  6506. * @param {Phaser.GameObjects.Shape} src - The Game Object to set the stroke style from.
  6507. */
  6508. var LineStyleCanvas = function (ctx, src)
  6509. {
  6510. var strokeColor = src.strokeColor;
  6511. var strokeAlpha = src.strokeAlpha;
  6512. var red = ((strokeColor & 0xFF0000) >>> 16);
  6513. var green = ((strokeColor & 0xFF00) >>> 8);
  6514. var blue = (strokeColor & 0xFF);
  6515. ctx.strokeStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + strokeAlpha + ')';
  6516. ctx.lineWidth = src.lineWidth;
  6517. };
  6518. module.exports = LineStyleCanvas;
  6519. /***/ }),
  6520. /* 40 */
  6521. /***/ (function(module, exports, __webpack_require__) {
  6522. /**
  6523. * @author Richard Davey <rich@photonstorm.com>
  6524. * @copyright 2019 Photon Storm Ltd.
  6525. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6526. */
  6527. /**
  6528. * @namespace Phaser.Cameras.Scene2D.Events
  6529. */
  6530. module.exports = {
  6531. DESTROY: __webpack_require__(1168),
  6532. FADE_IN_COMPLETE: __webpack_require__(1167),
  6533. FADE_IN_START: __webpack_require__(1166),
  6534. FADE_OUT_COMPLETE: __webpack_require__(1165),
  6535. FADE_OUT_START: __webpack_require__(1164),
  6536. FLASH_COMPLETE: __webpack_require__(1163),
  6537. FLASH_START: __webpack_require__(1162),
  6538. PAN_COMPLETE: __webpack_require__(1161),
  6539. PAN_START: __webpack_require__(1160),
  6540. POST_RENDER: __webpack_require__(1159),
  6541. PRE_RENDER: __webpack_require__(1158),
  6542. SHAKE_COMPLETE: __webpack_require__(1157),
  6543. SHAKE_START: __webpack_require__(1156),
  6544. ZOOM_COMPLETE: __webpack_require__(1155),
  6545. ZOOM_START: __webpack_require__(1154)
  6546. };
  6547. /***/ }),
  6548. /* 41 */
  6549. /***/ (function(module, exports, __webpack_require__) {
  6550. /**
  6551. * @author Richard Davey <rich@photonstorm.com>
  6552. * @copyright 2019 Photon Storm Ltd.
  6553. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6554. */
  6555. var Class = __webpack_require__(0);
  6556. var Vector2 = __webpack_require__(3);
  6557. /**
  6558. * @classdesc
  6559. * A Matrix used for display transformations for rendering.
  6560. *
  6561. * It is represented like so:
  6562. *
  6563. * ```
  6564. * | a | c | tx |
  6565. * | b | d | ty |
  6566. * | 0 | 0 | 1 |
  6567. * ```
  6568. *
  6569. * @class TransformMatrix
  6570. * @memberof Phaser.GameObjects.Components
  6571. * @constructor
  6572. * @since 3.0.0
  6573. *
  6574. * @param {number} [a=1] - The Scale X value.
  6575. * @param {number} [b=0] - The Shear Y value.
  6576. * @param {number} [c=0] - The Shear X value.
  6577. * @param {number} [d=1] - The Scale Y value.
  6578. * @param {number} [tx=0] - The Translate X value.
  6579. * @param {number} [ty=0] - The Translate Y value.
  6580. */
  6581. var TransformMatrix = new Class({
  6582. initialize:
  6583. function TransformMatrix (a, b, c, d, tx, ty)
  6584. {
  6585. if (a === undefined) { a = 1; }
  6586. if (b === undefined) { b = 0; }
  6587. if (c === undefined) { c = 0; }
  6588. if (d === undefined) { d = 1; }
  6589. if (tx === undefined) { tx = 0; }
  6590. if (ty === undefined) { ty = 0; }
  6591. /**
  6592. * The matrix values.
  6593. *
  6594. * @name Phaser.GameObjects.Components.TransformMatrix#matrix
  6595. * @type {Float32Array}
  6596. * @since 3.0.0
  6597. */
  6598. this.matrix = new Float32Array([ a, b, c, d, tx, ty, 0, 0, 1 ]);
  6599. /**
  6600. * The decomposed matrix.
  6601. *
  6602. * @name Phaser.GameObjects.Components.TransformMatrix#decomposedMatrix
  6603. * @type {object}
  6604. * @since 3.0.0
  6605. */
  6606. this.decomposedMatrix = {
  6607. translateX: 0,
  6608. translateY: 0,
  6609. scaleX: 1,
  6610. scaleY: 1,
  6611. rotation: 0
  6612. };
  6613. },
  6614. /**
  6615. * The Scale X value.
  6616. *
  6617. * @name Phaser.GameObjects.Components.TransformMatrix#a
  6618. * @type {number}
  6619. * @since 3.4.0
  6620. */
  6621. a: {
  6622. get: function ()
  6623. {
  6624. return this.matrix[0];
  6625. },
  6626. set: function (value)
  6627. {
  6628. this.matrix[0] = value;
  6629. }
  6630. },
  6631. /**
  6632. * The Shear Y value.
  6633. *
  6634. * @name Phaser.GameObjects.Components.TransformMatrix#b
  6635. * @type {number}
  6636. * @since 3.4.0
  6637. */
  6638. b: {
  6639. get: function ()
  6640. {
  6641. return this.matrix[1];
  6642. },
  6643. set: function (value)
  6644. {
  6645. this.matrix[1] = value;
  6646. }
  6647. },
  6648. /**
  6649. * The Shear X value.
  6650. *
  6651. * @name Phaser.GameObjects.Components.TransformMatrix#c
  6652. * @type {number}
  6653. * @since 3.4.0
  6654. */
  6655. c: {
  6656. get: function ()
  6657. {
  6658. return this.matrix[2];
  6659. },
  6660. set: function (value)
  6661. {
  6662. this.matrix[2] = value;
  6663. }
  6664. },
  6665. /**
  6666. * The Scale Y value.
  6667. *
  6668. * @name Phaser.GameObjects.Components.TransformMatrix#d
  6669. * @type {number}
  6670. * @since 3.4.0
  6671. */
  6672. d: {
  6673. get: function ()
  6674. {
  6675. return this.matrix[3];
  6676. },
  6677. set: function (value)
  6678. {
  6679. this.matrix[3] = value;
  6680. }
  6681. },
  6682. /**
  6683. * The Translate X value.
  6684. *
  6685. * @name Phaser.GameObjects.Components.TransformMatrix#e
  6686. * @type {number}
  6687. * @since 3.11.0
  6688. */
  6689. e: {
  6690. get: function ()
  6691. {
  6692. return this.matrix[4];
  6693. },
  6694. set: function (value)
  6695. {
  6696. this.matrix[4] = value;
  6697. }
  6698. },
  6699. /**
  6700. * The Translate Y value.
  6701. *
  6702. * @name Phaser.GameObjects.Components.TransformMatrix#f
  6703. * @type {number}
  6704. * @since 3.11.0
  6705. */
  6706. f: {
  6707. get: function ()
  6708. {
  6709. return this.matrix[5];
  6710. },
  6711. set: function (value)
  6712. {
  6713. this.matrix[5] = value;
  6714. }
  6715. },
  6716. /**
  6717. * The Translate X value.
  6718. *
  6719. * @name Phaser.GameObjects.Components.TransformMatrix#tx
  6720. * @type {number}
  6721. * @since 3.4.0
  6722. */
  6723. tx: {
  6724. get: function ()
  6725. {
  6726. return this.matrix[4];
  6727. },
  6728. set: function (value)
  6729. {
  6730. this.matrix[4] = value;
  6731. }
  6732. },
  6733. /**
  6734. * The Translate Y value.
  6735. *
  6736. * @name Phaser.GameObjects.Components.TransformMatrix#ty
  6737. * @type {number}
  6738. * @since 3.4.0
  6739. */
  6740. ty: {
  6741. get: function ()
  6742. {
  6743. return this.matrix[5];
  6744. },
  6745. set: function (value)
  6746. {
  6747. this.matrix[5] = value;
  6748. }
  6749. },
  6750. /**
  6751. * The rotation of the Matrix.
  6752. *
  6753. * @name Phaser.GameObjects.Components.TransformMatrix#rotation
  6754. * @type {number}
  6755. * @readonly
  6756. * @since 3.4.0
  6757. */
  6758. rotation: {
  6759. get: function ()
  6760. {
  6761. return Math.acos(this.a / this.scaleX) * (Math.atan(-this.c / this.a) < 0 ? -1 : 1);
  6762. }
  6763. },
  6764. /**
  6765. * The horizontal scale of the Matrix.
  6766. *
  6767. * @name Phaser.GameObjects.Components.TransformMatrix#scaleX
  6768. * @type {number}
  6769. * @readonly
  6770. * @since 3.4.0
  6771. */
  6772. scaleX: {
  6773. get: function ()
  6774. {
  6775. return Math.sqrt((this.a * this.a) + (this.c * this.c));
  6776. }
  6777. },
  6778. /**
  6779. * The vertical scale of the Matrix.
  6780. *
  6781. * @name Phaser.GameObjects.Components.TransformMatrix#scaleY
  6782. * @type {number}
  6783. * @readonly
  6784. * @since 3.4.0
  6785. */
  6786. scaleY: {
  6787. get: function ()
  6788. {
  6789. return Math.sqrt((this.b * this.b) + (this.d * this.d));
  6790. }
  6791. },
  6792. /**
  6793. * Reset the Matrix to an identity matrix.
  6794. *
  6795. * @method Phaser.GameObjects.Components.TransformMatrix#loadIdentity
  6796. * @since 3.0.0
  6797. *
  6798. * @return {this} This TransformMatrix.
  6799. */
  6800. loadIdentity: function ()
  6801. {
  6802. var matrix = this.matrix;
  6803. matrix[0] = 1;
  6804. matrix[1] = 0;
  6805. matrix[2] = 0;
  6806. matrix[3] = 1;
  6807. matrix[4] = 0;
  6808. matrix[5] = 0;
  6809. return this;
  6810. },
  6811. /**
  6812. * Translate the Matrix.
  6813. *
  6814. * @method Phaser.GameObjects.Components.TransformMatrix#translate
  6815. * @since 3.0.0
  6816. *
  6817. * @param {number} x - The horizontal translation value.
  6818. * @param {number} y - The vertical translation value.
  6819. *
  6820. * @return {this} This TransformMatrix.
  6821. */
  6822. translate: function (x, y)
  6823. {
  6824. var matrix = this.matrix;
  6825. matrix[4] = matrix[0] * x + matrix[2] * y + matrix[4];
  6826. matrix[5] = matrix[1] * x + matrix[3] * y + matrix[5];
  6827. return this;
  6828. },
  6829. /**
  6830. * Scale the Matrix.
  6831. *
  6832. * @method Phaser.GameObjects.Components.TransformMatrix#scale
  6833. * @since 3.0.0
  6834. *
  6835. * @param {number} x - The horizontal scale value.
  6836. * @param {number} y - The vertical scale value.
  6837. *
  6838. * @return {this} This TransformMatrix.
  6839. */
  6840. scale: function (x, y)
  6841. {
  6842. var matrix = this.matrix;
  6843. matrix[0] *= x;
  6844. matrix[1] *= x;
  6845. matrix[2] *= y;
  6846. matrix[3] *= y;
  6847. return this;
  6848. },
  6849. /**
  6850. * Rotate the Matrix.
  6851. *
  6852. * @method Phaser.GameObjects.Components.TransformMatrix#rotate
  6853. * @since 3.0.0
  6854. *
  6855. * @param {number} angle - The angle of rotation in radians.
  6856. *
  6857. * @return {this} This TransformMatrix.
  6858. */
  6859. rotate: function (angle)
  6860. {
  6861. var sin = Math.sin(angle);
  6862. var cos = Math.cos(angle);
  6863. var matrix = this.matrix;
  6864. var a = matrix[0];
  6865. var b = matrix[1];
  6866. var c = matrix[2];
  6867. var d = matrix[3];
  6868. matrix[0] = a * cos + c * sin;
  6869. matrix[1] = b * cos + d * sin;
  6870. matrix[2] = a * -sin + c * cos;
  6871. matrix[3] = b * -sin + d * cos;
  6872. return this;
  6873. },
  6874. /**
  6875. * Multiply this Matrix by the given Matrix.
  6876. *
  6877. * If an `out` Matrix is given then the results will be stored in it.
  6878. * If it is not given, this matrix will be updated in place instead.
  6879. * Use an `out` Matrix if you do not wish to mutate this matrix.
  6880. *
  6881. * @method Phaser.GameObjects.Components.TransformMatrix#multiply
  6882. * @since 3.0.0
  6883. *
  6884. * @param {Phaser.GameObjects.Components.TransformMatrix} rhs - The Matrix to multiply by.
  6885. * @param {Phaser.GameObjects.Components.TransformMatrix} [out] - An optional Matrix to store the results in.
  6886. *
  6887. * @return {Phaser.GameObjects.Components.TransformMatrix} Either this TransformMatrix, or the `out` Matrix, if given in the arguments.
  6888. */
  6889. multiply: function (rhs, out)
  6890. {
  6891. var matrix = this.matrix;
  6892. var source = rhs.matrix;
  6893. var localA = matrix[0];
  6894. var localB = matrix[1];
  6895. var localC = matrix[2];
  6896. var localD = matrix[3];
  6897. var localE = matrix[4];
  6898. var localF = matrix[5];
  6899. var sourceA = source[0];
  6900. var sourceB = source[1];
  6901. var sourceC = source[2];
  6902. var sourceD = source[3];
  6903. var sourceE = source[4];
  6904. var sourceF = source[5];
  6905. var destinationMatrix = (out === undefined) ? this : out;
  6906. destinationMatrix.a = (sourceA * localA) + (sourceB * localC);
  6907. destinationMatrix.b = (sourceA * localB) + (sourceB * localD);
  6908. destinationMatrix.c = (sourceC * localA) + (sourceD * localC);
  6909. destinationMatrix.d = (sourceC * localB) + (sourceD * localD);
  6910. destinationMatrix.e = (sourceE * localA) + (sourceF * localC) + localE;
  6911. destinationMatrix.f = (sourceE * localB) + (sourceF * localD) + localF;
  6912. return destinationMatrix;
  6913. },
  6914. /**
  6915. * Multiply this Matrix by the matrix given, including the offset.
  6916. *
  6917. * The offsetX is added to the tx value: `offsetX * a + offsetY * c + tx`.
  6918. * The offsetY is added to the ty value: `offsetY * b + offsetY * d + ty`.
  6919. *
  6920. * @method Phaser.GameObjects.Components.TransformMatrix#multiplyWithOffset
  6921. * @since 3.11.0
  6922. *
  6923. * @param {Phaser.GameObjects.Components.TransformMatrix} src - The source Matrix to copy from.
  6924. * @param {number} offsetX - Horizontal offset to factor in to the multiplication.
  6925. * @param {number} offsetY - Vertical offset to factor in to the multiplication.
  6926. *
  6927. * @return {this} This TransformMatrix.
  6928. */
  6929. multiplyWithOffset: function (src, offsetX, offsetY)
  6930. {
  6931. var matrix = this.matrix;
  6932. var otherMatrix = src.matrix;
  6933. var a0 = matrix[0];
  6934. var b0 = matrix[1];
  6935. var c0 = matrix[2];
  6936. var d0 = matrix[3];
  6937. var tx0 = matrix[4];
  6938. var ty0 = matrix[5];
  6939. var pse = offsetX * a0 + offsetY * c0 + tx0;
  6940. var psf = offsetX * b0 + offsetY * d0 + ty0;
  6941. var a1 = otherMatrix[0];
  6942. var b1 = otherMatrix[1];
  6943. var c1 = otherMatrix[2];
  6944. var d1 = otherMatrix[3];
  6945. var tx1 = otherMatrix[4];
  6946. var ty1 = otherMatrix[5];
  6947. matrix[0] = a1 * a0 + b1 * c0;
  6948. matrix[1] = a1 * b0 + b1 * d0;
  6949. matrix[2] = c1 * a0 + d1 * c0;
  6950. matrix[3] = c1 * b0 + d1 * d0;
  6951. matrix[4] = tx1 * a0 + ty1 * c0 + pse;
  6952. matrix[5] = tx1 * b0 + ty1 * d0 + psf;
  6953. return this;
  6954. },
  6955. /**
  6956. * Transform the Matrix.
  6957. *
  6958. * @method Phaser.GameObjects.Components.TransformMatrix#transform
  6959. * @since 3.0.0
  6960. *
  6961. * @param {number} a - The Scale X value.
  6962. * @param {number} b - The Shear Y value.
  6963. * @param {number} c - The Shear X value.
  6964. * @param {number} d - The Scale Y value.
  6965. * @param {number} tx - The Translate X value.
  6966. * @param {number} ty - The Translate Y value.
  6967. *
  6968. * @return {this} This TransformMatrix.
  6969. */
  6970. transform: function (a, b, c, d, tx, ty)
  6971. {
  6972. var matrix = this.matrix;
  6973. var a0 = matrix[0];
  6974. var b0 = matrix[1];
  6975. var c0 = matrix[2];
  6976. var d0 = matrix[3];
  6977. var tx0 = matrix[4];
  6978. var ty0 = matrix[5];
  6979. matrix[0] = a * a0 + b * c0;
  6980. matrix[1] = a * b0 + b * d0;
  6981. matrix[2] = c * a0 + d * c0;
  6982. matrix[3] = c * b0 + d * d0;
  6983. matrix[4] = tx * a0 + ty * c0 + tx0;
  6984. matrix[5] = tx * b0 + ty * d0 + ty0;
  6985. return this;
  6986. },
  6987. /**
  6988. * Transform a point using this Matrix.
  6989. *
  6990. * @method Phaser.GameObjects.Components.TransformMatrix#transformPoint
  6991. * @since 3.0.0
  6992. *
  6993. * @param {number} x - The x coordinate of the point to transform.
  6994. * @param {number} y - The y coordinate of the point to transform.
  6995. * @param {(Phaser.Geom.Point|Phaser.Math.Vector2|object)} point - The Point object to store the transformed coordinates.
  6996. *
  6997. * @return {(Phaser.Geom.Point|Phaser.Math.Vector2|object)} The Point containing the transformed coordinates.
  6998. */
  6999. transformPoint: function (x, y, point)
  7000. {
  7001. if (point === undefined) { point = { x: 0, y: 0 }; }
  7002. var matrix = this.matrix;
  7003. var a = matrix[0];
  7004. var b = matrix[1];
  7005. var c = matrix[2];
  7006. var d = matrix[3];
  7007. var tx = matrix[4];
  7008. var ty = matrix[5];
  7009. point.x = x * a + y * c + tx;
  7010. point.y = x * b + y * d + ty;
  7011. return point;
  7012. },
  7013. /**
  7014. * Invert the Matrix.
  7015. *
  7016. * @method Phaser.GameObjects.Components.TransformMatrix#invert
  7017. * @since 3.0.0
  7018. *
  7019. * @return {this} This TransformMatrix.
  7020. */
  7021. invert: function ()
  7022. {
  7023. var matrix = this.matrix;
  7024. var a = matrix[0];
  7025. var b = matrix[1];
  7026. var c = matrix[2];
  7027. var d = matrix[3];
  7028. var tx = matrix[4];
  7029. var ty = matrix[5];
  7030. var n = a * d - b * c;
  7031. matrix[0] = d / n;
  7032. matrix[1] = -b / n;
  7033. matrix[2] = -c / n;
  7034. matrix[3] = a / n;
  7035. matrix[4] = (c * ty - d * tx) / n;
  7036. matrix[5] = -(a * ty - b * tx) / n;
  7037. return this;
  7038. },
  7039. /**
  7040. * Set the values of this Matrix to copy those of the matrix given.
  7041. *
  7042. * @method Phaser.GameObjects.Components.TransformMatrix#copyFrom
  7043. * @since 3.11.0
  7044. *
  7045. * @param {Phaser.GameObjects.Components.TransformMatrix} src - The source Matrix to copy from.
  7046. *
  7047. * @return {this} This TransformMatrix.
  7048. */
  7049. copyFrom: function (src)
  7050. {
  7051. var matrix = this.matrix;
  7052. matrix[0] = src.a;
  7053. matrix[1] = src.b;
  7054. matrix[2] = src.c;
  7055. matrix[3] = src.d;
  7056. matrix[4] = src.e;
  7057. matrix[5] = src.f;
  7058. return this;
  7059. },
  7060. /**
  7061. * Set the values of this Matrix to copy those of the array given.
  7062. * Where array indexes 0, 1, 2, 3, 4 and 5 are mapped to a, b, c, d, e and f.
  7063. *
  7064. * @method Phaser.GameObjects.Components.TransformMatrix#copyFromArray
  7065. * @since 3.11.0
  7066. *
  7067. * @param {array} src - The array of values to set into this matrix.
  7068. *
  7069. * @return {this} This TransformMatrix.
  7070. */
  7071. copyFromArray: function (src)
  7072. {
  7073. var matrix = this.matrix;
  7074. matrix[0] = src[0];
  7075. matrix[1] = src[1];
  7076. matrix[2] = src[2];
  7077. matrix[3] = src[3];
  7078. matrix[4] = src[4];
  7079. matrix[5] = src[5];
  7080. return this;
  7081. },
  7082. /**
  7083. * Copy the values from this Matrix to the given Canvas Rendering Context.
  7084. * This will use the Context.transform method.
  7085. *
  7086. * @method Phaser.GameObjects.Components.TransformMatrix#copyToContext
  7087. * @since 3.12.0
  7088. *
  7089. * @param {CanvasRenderingContext2D} ctx - The Canvas Rendering Context to copy the matrix values to.
  7090. *
  7091. * @return {CanvasRenderingContext2D} The Canvas Rendering Context.
  7092. */
  7093. copyToContext: function (ctx)
  7094. {
  7095. var matrix = this.matrix;
  7096. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  7097. return ctx;
  7098. },
  7099. /**
  7100. * Copy the values from this Matrix to the given Canvas Rendering Context.
  7101. * This will use the Context.setTransform method.
  7102. *
  7103. * @method Phaser.GameObjects.Components.TransformMatrix#setToContext
  7104. * @since 3.12.0
  7105. *
  7106. * @param {CanvasRenderingContext2D} ctx - The Canvas Rendering Context to copy the matrix values to.
  7107. *
  7108. * @return {CanvasRenderingContext2D} The Canvas Rendering Context.
  7109. */
  7110. setToContext: function (ctx)
  7111. {
  7112. var matrix = this.matrix;
  7113. ctx.setTransform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  7114. return ctx;
  7115. },
  7116. /**
  7117. * Copy the values in this Matrix to the array given.
  7118. *
  7119. * Where array indexes 0, 1, 2, 3, 4 and 5 are mapped to a, b, c, d, e and f.
  7120. *
  7121. * @method Phaser.GameObjects.Components.TransformMatrix#copyToArray
  7122. * @since 3.12.0
  7123. *
  7124. * @param {array} [out] - The array to copy the matrix values in to.
  7125. *
  7126. * @return {array} An array where elements 0 to 5 contain the values from this matrix.
  7127. */
  7128. copyToArray: function (out)
  7129. {
  7130. var matrix = this.matrix;
  7131. if (out === undefined)
  7132. {
  7133. out = [ matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5] ];
  7134. }
  7135. else
  7136. {
  7137. out[0] = matrix[0];
  7138. out[1] = matrix[1];
  7139. out[2] = matrix[2];
  7140. out[3] = matrix[3];
  7141. out[4] = matrix[4];
  7142. out[5] = matrix[5];
  7143. }
  7144. return out;
  7145. },
  7146. /**
  7147. * Set the values of this Matrix.
  7148. *
  7149. * @method Phaser.GameObjects.Components.TransformMatrix#setTransform
  7150. * @since 3.0.0
  7151. *
  7152. * @param {number} a - The Scale X value.
  7153. * @param {number} b - The Shear Y value.
  7154. * @param {number} c - The Shear X value.
  7155. * @param {number} d - The Scale Y value.
  7156. * @param {number} tx - The Translate X value.
  7157. * @param {number} ty - The Translate Y value.
  7158. *
  7159. * @return {this} This TransformMatrix.
  7160. */
  7161. setTransform: function (a, b, c, d, tx, ty)
  7162. {
  7163. var matrix = this.matrix;
  7164. matrix[0] = a;
  7165. matrix[1] = b;
  7166. matrix[2] = c;
  7167. matrix[3] = d;
  7168. matrix[4] = tx;
  7169. matrix[5] = ty;
  7170. return this;
  7171. },
  7172. /**
  7173. * Decompose this Matrix into its translation, scale and rotation values using QR decomposition.
  7174. *
  7175. * The result must be applied in the following order to reproduce the current matrix:
  7176. *
  7177. * translate -> rotate -> scale
  7178. *
  7179. * @method Phaser.GameObjects.Components.TransformMatrix#decomposeMatrix
  7180. * @since 3.0.0
  7181. *
  7182. * @return {object} The decomposed Matrix.
  7183. */
  7184. decomposeMatrix: function ()
  7185. {
  7186. var decomposedMatrix = this.decomposedMatrix;
  7187. var matrix = this.matrix;
  7188. // a = scale X (1)
  7189. // b = shear Y (0)
  7190. // c = shear X (0)
  7191. // d = scale Y (1)
  7192. var a = matrix[0];
  7193. var b = matrix[1];
  7194. var c = matrix[2];
  7195. var d = matrix[3];
  7196. var determ = a * d - b * c;
  7197. decomposedMatrix.translateX = matrix[4];
  7198. decomposedMatrix.translateY = matrix[5];
  7199. if (a || b)
  7200. {
  7201. var r = Math.sqrt(a * a + b * b);
  7202. decomposedMatrix.rotation = (b > 0) ? Math.acos(a / r) : -Math.acos(a / r);
  7203. decomposedMatrix.scaleX = r;
  7204. decomposedMatrix.scaleY = determ / r;
  7205. }
  7206. else if (c || d)
  7207. {
  7208. var s = Math.sqrt(c * c + d * d);
  7209. decomposedMatrix.rotation = Math.PI * 0.5 - (d > 0 ? Math.acos(-c / s) : -Math.acos(c / s));
  7210. decomposedMatrix.scaleX = determ / s;
  7211. decomposedMatrix.scaleY = s;
  7212. }
  7213. else
  7214. {
  7215. decomposedMatrix.rotation = 0;
  7216. decomposedMatrix.scaleX = 0;
  7217. decomposedMatrix.scaleY = 0;
  7218. }
  7219. return decomposedMatrix;
  7220. },
  7221. /**
  7222. * Apply the identity, translate, rotate and scale operations on the Matrix.
  7223. *
  7224. * @method Phaser.GameObjects.Components.TransformMatrix#applyITRS
  7225. * @since 3.0.0
  7226. *
  7227. * @param {number} x - The horizontal translation.
  7228. * @param {number} y - The vertical translation.
  7229. * @param {number} rotation - The angle of rotation in radians.
  7230. * @param {number} scaleX - The horizontal scale.
  7231. * @param {number} scaleY - The vertical scale.
  7232. *
  7233. * @return {this} This TransformMatrix.
  7234. */
  7235. applyITRS: function (x, y, rotation, scaleX, scaleY)
  7236. {
  7237. var matrix = this.matrix;
  7238. var radianSin = Math.sin(rotation);
  7239. var radianCos = Math.cos(rotation);
  7240. // Translate
  7241. matrix[4] = x;
  7242. matrix[5] = y;
  7243. // Rotate and Scale
  7244. matrix[0] = radianCos * scaleX;
  7245. matrix[1] = radianSin * scaleX;
  7246. matrix[2] = -radianSin * scaleY;
  7247. matrix[3] = radianCos * scaleY;
  7248. return this;
  7249. },
  7250. /**
  7251. * Takes the `x` and `y` values and returns a new position in the `output` vector that is the inverse of
  7252. * the current matrix with its transformation applied.
  7253. *
  7254. * Can be used to translate points from world to local space.
  7255. *
  7256. * @method Phaser.GameObjects.Components.TransformMatrix#applyInverse
  7257. * @since 3.12.0
  7258. *
  7259. * @param {number} x - The x position to translate.
  7260. * @param {number} y - The y position to translate.
  7261. * @param {Phaser.Math.Vector2} [output] - A Vector2, or point-like object, to store the results in.
  7262. *
  7263. * @return {Phaser.Math.Vector2} The coordinates, inverse-transformed through this matrix.
  7264. */
  7265. applyInverse: function (x, y, output)
  7266. {
  7267. if (output === undefined) { output = new Vector2(); }
  7268. var matrix = this.matrix;
  7269. var a = matrix[0];
  7270. var b = matrix[1];
  7271. var c = matrix[2];
  7272. var d = matrix[3];
  7273. var tx = matrix[4];
  7274. var ty = matrix[5];
  7275. var id = 1 / ((a * d) + (c * -b));
  7276. output.x = (d * id * x) + (-c * id * y) + (((ty * c) - (tx * d)) * id);
  7277. output.y = (a * id * y) + (-b * id * x) + (((-ty * a) + (tx * b)) * id);
  7278. return output;
  7279. },
  7280. /**
  7281. * Returns the X component of this matrix multiplied by the given values.
  7282. * This is the same as `x * a + y * c + e`.
  7283. *
  7284. * @method Phaser.GameObjects.Components.TransformMatrix#getX
  7285. * @since 3.12.0
  7286. *
  7287. * @param {number} x - The x value.
  7288. * @param {number} y - The y value.
  7289. *
  7290. * @return {number} The calculated x value.
  7291. */
  7292. getX: function (x, y)
  7293. {
  7294. return x * this.a + y * this.c + this.e;
  7295. },
  7296. /**
  7297. * Returns the Y component of this matrix multiplied by the given values.
  7298. * This is the same as `x * b + y * d + f`.
  7299. *
  7300. * @method Phaser.GameObjects.Components.TransformMatrix#getY
  7301. * @since 3.12.0
  7302. *
  7303. * @param {number} x - The x value.
  7304. * @param {number} y - The y value.
  7305. *
  7306. * @return {number} The calculated y value.
  7307. */
  7308. getY: function (x, y)
  7309. {
  7310. return x * this.b + y * this.d + this.f;
  7311. },
  7312. /**
  7313. * Returns a string that can be used in a CSS Transform call as a `matrix` property.
  7314. *
  7315. * @method Phaser.GameObjects.Components.TransformMatrix#getCSSMatrix
  7316. * @since 3.12.0
  7317. *
  7318. * @return {string} A string containing the CSS Transform matrix values.
  7319. */
  7320. getCSSMatrix: function ()
  7321. {
  7322. var m = this.matrix;
  7323. return 'matrix(' + m[0] + ',' + m[1] + ',' + m[2] + ',' + m[3] + ',' + m[4] + ',' + m[5] + ')';
  7324. },
  7325. /**
  7326. * Destroys this Transform Matrix.
  7327. *
  7328. * @method Phaser.GameObjects.Components.TransformMatrix#destroy
  7329. * @since 3.4.0
  7330. */
  7331. destroy: function ()
  7332. {
  7333. this.matrix = null;
  7334. this.decomposedMatrix = null;
  7335. }
  7336. });
  7337. module.exports = TransformMatrix;
  7338. /***/ }),
  7339. /* 42 */
  7340. /***/ (function(module, exports) {
  7341. /**
  7342. * @author Richard Davey <rich@photonstorm.com>
  7343. * @copyright 2019 Photon Storm Ltd.
  7344. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7345. */
  7346. /**
  7347. * Checks if a given point is inside a Rectangle's bounds.
  7348. *
  7349. * @function Phaser.Geom.Rectangle.Contains
  7350. * @since 3.0.0
  7351. *
  7352. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to check.
  7353. * @param {number} x - The X coordinate of the point to check.
  7354. * @param {number} y - The Y coordinate of the point to check.
  7355. *
  7356. * @return {boolean} `true` if the point is within the Rectangle's bounds, otherwise `false`.
  7357. */
  7358. var Contains = function (rect, x, y)
  7359. {
  7360. if (rect.width <= 0 || rect.height <= 0)
  7361. {
  7362. return false;
  7363. }
  7364. return (rect.x <= x && rect.x + rect.width >= x && rect.y <= y && rect.y + rect.height >= y);
  7365. };
  7366. module.exports = Contains;
  7367. /***/ }),
  7368. /* 43 */
  7369. /***/ (function(module, exports) {
  7370. /**
  7371. * @author Richard Davey <rich@photonstorm.com>
  7372. * @copyright 2019 Photon Storm Ltd.
  7373. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7374. */
  7375. /**
  7376. * Check to see if the Circle contains the given x / y coordinates.
  7377. *
  7378. * @function Phaser.Geom.Circle.Contains
  7379. * @since 3.0.0
  7380. *
  7381. * @param {Phaser.Geom.Circle} circle - The Circle to check.
  7382. * @param {number} x - The x coordinate to check within the circle.
  7383. * @param {number} y - The y coordinate to check within the circle.
  7384. *
  7385. * @return {boolean} True if the coordinates are within the circle, otherwise false.
  7386. */
  7387. var Contains = function (circle, x, y)
  7388. {
  7389. // Check if x/y are within the bounds first
  7390. if (circle.radius > 0 && x >= circle.left && x <= circle.right && y >= circle.top && y <= circle.bottom)
  7391. {
  7392. var dx = (circle.x - x) * (circle.x - x);
  7393. var dy = (circle.y - y) * (circle.y - y);
  7394. return (dx + dy) <= (circle.radius * circle.radius);
  7395. }
  7396. else
  7397. {
  7398. return false;
  7399. }
  7400. };
  7401. module.exports = Contains;
  7402. /***/ }),
  7403. /* 44 */
  7404. /***/ (function(module, exports) {
  7405. /**
  7406. * @author Richard Davey <rich@photonstorm.com>
  7407. * @copyright 2019 Photon Storm Ltd.
  7408. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7409. */
  7410. /**
  7411. * Positions the Game Object so that the top of its bounds aligns with the given coordinate.
  7412. *
  7413. * @function Phaser.Display.Bounds.SetTop
  7414. * @since 3.0.0
  7415. *
  7416. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  7417. *
  7418. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  7419. * @param {number} value - The coordinate to position the Game Object bounds on.
  7420. *
  7421. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  7422. */
  7423. var SetTop = function (gameObject, value)
  7424. {
  7425. gameObject.y = value + (gameObject.height * gameObject.originY);
  7426. return gameObject;
  7427. };
  7428. module.exports = SetTop;
  7429. /***/ }),
  7430. /* 45 */
  7431. /***/ (function(module, exports) {
  7432. /**
  7433. * @author Richard Davey <rich@photonstorm.com>
  7434. * @copyright 2019 Photon Storm Ltd.
  7435. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7436. */
  7437. /**
  7438. * Returns the top coordinate from the bounds of the Game Object.
  7439. *
  7440. * @function Phaser.Display.Bounds.GetTop
  7441. * @since 3.0.0
  7442. *
  7443. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  7444. *
  7445. * @return {number} The top coordinate of the bounds of the Game Object.
  7446. */
  7447. var GetTop = function (gameObject)
  7448. {
  7449. return gameObject.y - (gameObject.height * gameObject.originY);
  7450. };
  7451. module.exports = GetTop;
  7452. /***/ }),
  7453. /* 46 */
  7454. /***/ (function(module, exports) {
  7455. /**
  7456. * @author Richard Davey <rich@photonstorm.com>
  7457. * @copyright 2019 Photon Storm Ltd.
  7458. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7459. */
  7460. /**
  7461. * Positions the Game Object so that the left of its bounds aligns with the given coordinate.
  7462. *
  7463. * @function Phaser.Display.Bounds.SetRight
  7464. * @since 3.0.0
  7465. *
  7466. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  7467. *
  7468. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  7469. * @param {number} value - The coordinate to position the Game Object bounds on.
  7470. *
  7471. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  7472. */
  7473. var SetRight = function (gameObject, value)
  7474. {
  7475. gameObject.x = (value - gameObject.width) + (gameObject.width * gameObject.originX);
  7476. return gameObject;
  7477. };
  7478. module.exports = SetRight;
  7479. /***/ }),
  7480. /* 47 */
  7481. /***/ (function(module, exports) {
  7482. /**
  7483. * @author Richard Davey <rich@photonstorm.com>
  7484. * @copyright 2019 Photon Storm Ltd.
  7485. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7486. */
  7487. /**
  7488. * Returns the right coordinate from the bounds of the Game Object.
  7489. *
  7490. * @function Phaser.Display.Bounds.GetRight
  7491. * @since 3.0.0
  7492. *
  7493. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  7494. *
  7495. * @return {number} The right coordinate of the bounds of the Game Object.
  7496. */
  7497. var GetRight = function (gameObject)
  7498. {
  7499. return (gameObject.x + gameObject.width) - (gameObject.width * gameObject.originX);
  7500. };
  7501. module.exports = GetRight;
  7502. /***/ }),
  7503. /* 48 */
  7504. /***/ (function(module, exports) {
  7505. /**
  7506. * @author Richard Davey <rich@photonstorm.com>
  7507. * @copyright 2019 Photon Storm Ltd.
  7508. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7509. */
  7510. /**
  7511. * Positions the Game Object so that the left of its bounds aligns with the given coordinate.
  7512. *
  7513. * @function Phaser.Display.Bounds.SetLeft
  7514. * @since 3.0.0
  7515. *
  7516. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  7517. *
  7518. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  7519. * @param {number} value - The coordinate to position the Game Object bounds on.
  7520. *
  7521. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  7522. */
  7523. var SetLeft = function (gameObject, value)
  7524. {
  7525. gameObject.x = value + (gameObject.width * gameObject.originX);
  7526. return gameObject;
  7527. };
  7528. module.exports = SetLeft;
  7529. /***/ }),
  7530. /* 49 */
  7531. /***/ (function(module, exports) {
  7532. /**
  7533. * @author Richard Davey <rich@photonstorm.com>
  7534. * @copyright 2019 Photon Storm Ltd.
  7535. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7536. */
  7537. /**
  7538. * Returns the left coordinate from the bounds of the Game Object.
  7539. *
  7540. * @function Phaser.Display.Bounds.GetLeft
  7541. * @since 3.0.0
  7542. *
  7543. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  7544. *
  7545. * @return {number} The left coordinate of the bounds of the Game Object.
  7546. */
  7547. var GetLeft = function (gameObject)
  7548. {
  7549. return gameObject.x - (gameObject.width * gameObject.originX);
  7550. };
  7551. module.exports = GetLeft;
  7552. /***/ }),
  7553. /* 50 */
  7554. /***/ (function(module, exports) {
  7555. /**
  7556. * @author Richard Davey <rich@photonstorm.com>
  7557. * @copyright 2019 Photon Storm Ltd.
  7558. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7559. */
  7560. /**
  7561. * Positions the Game Object so that the bottom of its bounds aligns with the given coordinate.
  7562. *
  7563. * @function Phaser.Display.Bounds.SetBottom
  7564. * @since 3.0.0
  7565. *
  7566. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  7567. *
  7568. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  7569. * @param {number} value - The coordinate to position the Game Object bounds on.
  7570. *
  7571. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  7572. */
  7573. var SetBottom = function (gameObject, value)
  7574. {
  7575. gameObject.y = (value - gameObject.height) + (gameObject.height * gameObject.originY);
  7576. return gameObject;
  7577. };
  7578. module.exports = SetBottom;
  7579. /***/ }),
  7580. /* 51 */
  7581. /***/ (function(module, exports) {
  7582. /**
  7583. * @author Richard Davey <rich@photonstorm.com>
  7584. * @copyright 2019 Photon Storm Ltd.
  7585. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7586. */
  7587. /**
  7588. * Returns the bottom coordinate from the bounds of the Game Object.
  7589. *
  7590. * @function Phaser.Display.Bounds.GetBottom
  7591. * @since 3.0.0
  7592. *
  7593. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  7594. *
  7595. * @return {number} The bottom coordinate of the bounds of the Game Object.
  7596. */
  7597. var GetBottom = function (gameObject)
  7598. {
  7599. return (gameObject.y + gameObject.height) - (gameObject.height * gameObject.originY);
  7600. };
  7601. module.exports = GetBottom;
  7602. /***/ }),
  7603. /* 52 */
  7604. /***/ (function(module, exports, __webpack_require__) {
  7605. /**
  7606. * @author Richard Davey <rich@photonstorm.com>
  7607. * @copyright 2019 Photon Storm Ltd.
  7608. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7609. */
  7610. /**
  7611. * @namespace Phaser.Input.Events
  7612. */
  7613. module.exports = {
  7614. BOOT: __webpack_require__(994),
  7615. DESTROY: __webpack_require__(993),
  7616. DRAG_END: __webpack_require__(992),
  7617. DRAG_ENTER: __webpack_require__(991),
  7618. DRAG: __webpack_require__(990),
  7619. DRAG_LEAVE: __webpack_require__(989),
  7620. DRAG_OVER: __webpack_require__(988),
  7621. DRAG_START: __webpack_require__(987),
  7622. DROP: __webpack_require__(986),
  7623. GAME_OUT: __webpack_require__(985),
  7624. GAME_OVER: __webpack_require__(984),
  7625. GAMEOBJECT_DOWN: __webpack_require__(983),
  7626. GAMEOBJECT_DRAG_END: __webpack_require__(982),
  7627. GAMEOBJECT_DRAG_ENTER: __webpack_require__(981),
  7628. GAMEOBJECT_DRAG: __webpack_require__(980),
  7629. GAMEOBJECT_DRAG_LEAVE: __webpack_require__(979),
  7630. GAMEOBJECT_DRAG_OVER: __webpack_require__(978),
  7631. GAMEOBJECT_DRAG_START: __webpack_require__(977),
  7632. GAMEOBJECT_DROP: __webpack_require__(976),
  7633. GAMEOBJECT_MOVE: __webpack_require__(975),
  7634. GAMEOBJECT_OUT: __webpack_require__(974),
  7635. GAMEOBJECT_OVER: __webpack_require__(973),
  7636. GAMEOBJECT_POINTER_DOWN: __webpack_require__(972),
  7637. GAMEOBJECT_POINTER_MOVE: __webpack_require__(971),
  7638. GAMEOBJECT_POINTER_OUT: __webpack_require__(970),
  7639. GAMEOBJECT_POINTER_OVER: __webpack_require__(969),
  7640. GAMEOBJECT_POINTER_UP: __webpack_require__(968),
  7641. GAMEOBJECT_UP: __webpack_require__(967),
  7642. MANAGER_BOOT: __webpack_require__(966),
  7643. MANAGER_PROCESS: __webpack_require__(965),
  7644. MANAGER_UPDATE: __webpack_require__(964),
  7645. POINTER_DOWN: __webpack_require__(963),
  7646. POINTER_DOWN_OUTSIDE: __webpack_require__(962),
  7647. POINTER_MOVE: __webpack_require__(961),
  7648. POINTER_OUT: __webpack_require__(960),
  7649. POINTER_OVER: __webpack_require__(959),
  7650. POINTER_UP: __webpack_require__(958),
  7651. POINTER_UP_OUTSIDE: __webpack_require__(957),
  7652. POINTERLOCK_CHANGE: __webpack_require__(956),
  7653. PRE_UPDATE: __webpack_require__(955),
  7654. SHUTDOWN: __webpack_require__(954),
  7655. START: __webpack_require__(953),
  7656. UPDATE: __webpack_require__(952)
  7657. };
  7658. /***/ }),
  7659. /* 53 */
  7660. /***/ (function(module, exports) {
  7661. /**
  7662. * @author Richard Davey <rich@photonstorm.com>
  7663. * @copyright 2019 Photon Storm Ltd.
  7664. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7665. */
  7666. /**
  7667. * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the
  7668. * layer's position, scale and scroll.
  7669. *
  7670. * @function Phaser.Tilemaps.Components.WorldToTileY
  7671. * @private
  7672. * @since 3.0.0
  7673. *
  7674. * @param {number} worldY - The y coordinate to be converted, in pixels, not tiles.
  7675. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the nearest integer.
  7676. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  7677. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  7678. *
  7679. * @return {number} The Y location in tile units.
  7680. */
  7681. var WorldToTileY = function (worldY, snapToFloor, camera, layer)
  7682. {
  7683. if (snapToFloor === undefined) { snapToFloor = true; }
  7684. var tileHeight = layer.baseTileHeight;
  7685. var tilemapLayer = layer.tilemapLayer;
  7686. if (tilemapLayer)
  7687. {
  7688. if (camera === undefined) { camera = tilemapLayer.scene.cameras.main; }
  7689. // Find the world position relative to the static or dynamic layer's top left origin,
  7690. // factoring in the camera's vertical scroll
  7691. worldY = worldY - (tilemapLayer.y + camera.scrollY * (1 - tilemapLayer.scrollFactorY));
  7692. tileHeight *= tilemapLayer.scaleY;
  7693. }
  7694. return snapToFloor
  7695. ? Math.floor(worldY / tileHeight)
  7696. : worldY / tileHeight;
  7697. };
  7698. module.exports = WorldToTileY;
  7699. /***/ }),
  7700. /* 54 */
  7701. /***/ (function(module, exports) {
  7702. /**
  7703. * @author Richard Davey <rich@photonstorm.com>
  7704. * @copyright 2019 Photon Storm Ltd.
  7705. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7706. */
  7707. /**
  7708. * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the
  7709. * layer's position, scale and scroll.
  7710. *
  7711. * @function Phaser.Tilemaps.Components.WorldToTileX
  7712. * @private
  7713. * @since 3.0.0
  7714. *
  7715. * @param {number} worldX - The x coordinate to be converted, in pixels, not tiles.
  7716. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the nearest integer.
  7717. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  7718. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  7719. *
  7720. * @return {number} The X location in tile units.
  7721. */
  7722. var WorldToTileX = function (worldX, snapToFloor, camera, layer)
  7723. {
  7724. if (snapToFloor === undefined) { snapToFloor = true; }
  7725. var tileWidth = layer.baseTileWidth;
  7726. var tilemapLayer = layer.tilemapLayer;
  7727. if (tilemapLayer)
  7728. {
  7729. if (camera === undefined) { camera = tilemapLayer.scene.cameras.main; }
  7730. // Find the world position relative to the static or dynamic layer's top left origin,
  7731. // factoring in the camera's horizontal scroll
  7732. worldX = worldX - (tilemapLayer.x + camera.scrollX * (1 - tilemapLayer.scrollFactorX));
  7733. tileWidth *= tilemapLayer.scaleX;
  7734. }
  7735. return snapToFloor
  7736. ? Math.floor(worldX / tileWidth)
  7737. : worldX / tileWidth;
  7738. };
  7739. module.exports = WorldToTileX;
  7740. /***/ }),
  7741. /* 55 */
  7742. /***/ (function(module, exports, __webpack_require__) {
  7743. /**
  7744. * @author Richard Davey <rich@photonstorm.com>
  7745. * @copyright 2019 Photon Storm Ltd.
  7746. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7747. */
  7748. var Class = __webpack_require__(0);
  7749. var CONST = __webpack_require__(15);
  7750. var File = __webpack_require__(22);
  7751. var FileTypesManager = __webpack_require__(7);
  7752. var GetFastValue = __webpack_require__(2);
  7753. var GetValue = __webpack_require__(4);
  7754. var IsPlainObject = __webpack_require__(8);
  7755. /**
  7756. * @typedef {object} Phaser.Loader.FileTypes.JSONFileConfig
  7757. *
  7758. * @property {string} key - The key of the file. Must be unique within both the Loader and the JSON Cache.
  7759. * @property {string|any} [url] - The absolute or relative URL to load the file from. Or can be a ready formed JSON object, in which case it will be directly added to the Cache.
  7760. * @property {string} [extension='json'] - The default file extension to use if no url is provided.
  7761. * @property {string} [dataKey] - If specified instead of the whole JSON file being parsed and added to the Cache, only the section corresponding to this property key will be added. If the property you want to extract is nested, use periods to divide it.
  7762. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  7763. */
  7764. /**
  7765. * @classdesc
  7766. * A single JSON File suitable for loading by the Loader.
  7767. *
  7768. * These are created when you use the Phaser.Loader.LoaderPlugin#json method and are not typically created directly.
  7769. *
  7770. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#json.
  7771. *
  7772. * @class JSONFile
  7773. * @extends Phaser.Loader.File
  7774. * @memberof Phaser.Loader.FileTypes
  7775. * @constructor
  7776. * @since 3.0.0
  7777. *
  7778. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  7779. * @param {(string|Phaser.Loader.FileTypes.JSONFileConfig)} key - The key to use for this file, or a file configuration object.
  7780. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  7781. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  7782. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  7783. */
  7784. var JSONFile = new Class({
  7785. Extends: File,
  7786. initialize:
  7787. // url can either be a string, in which case it is treated like a proper url, or an object, in which case it is treated as a ready-made JS Object
  7788. // dataKey allows you to pluck a specific object out of the JSON and put just that into the cache, rather than the whole thing
  7789. function JSONFile (loader, key, url, xhrSettings, dataKey)
  7790. {
  7791. var extension = 'json';
  7792. if (IsPlainObject(key))
  7793. {
  7794. var config = key;
  7795. key = GetFastValue(config, 'key');
  7796. url = GetFastValue(config, 'url');
  7797. xhrSettings = GetFastValue(config, 'xhrSettings');
  7798. extension = GetFastValue(config, 'extension', extension);
  7799. dataKey = GetFastValue(config, 'dataKey', dataKey);
  7800. }
  7801. var fileConfig = {
  7802. type: 'json',
  7803. cache: loader.cacheManager.json,
  7804. extension: extension,
  7805. responseType: 'text',
  7806. key: key,
  7807. url: url,
  7808. xhrSettings: xhrSettings,
  7809. config: dataKey
  7810. };
  7811. File.call(this, loader, fileConfig);
  7812. if (IsPlainObject(url))
  7813. {
  7814. // Object provided instead of a URL, so no need to actually load it (populate data with value)
  7815. if (dataKey)
  7816. {
  7817. this.data = GetValue(url, dataKey);
  7818. }
  7819. else
  7820. {
  7821. this.data = url;
  7822. }
  7823. this.state = CONST.FILE_POPULATED;
  7824. }
  7825. },
  7826. /**
  7827. * Called automatically by Loader.nextFile.
  7828. * This method controls what extra work this File does with its loaded data.
  7829. *
  7830. * @method Phaser.Loader.FileTypes.JSONFile#onProcess
  7831. * @since 3.7.0
  7832. */
  7833. onProcess: function ()
  7834. {
  7835. if (this.state !== CONST.FILE_POPULATED)
  7836. {
  7837. this.state = CONST.FILE_PROCESSING;
  7838. var json = JSON.parse(this.xhrLoader.responseText);
  7839. var key = this.config;
  7840. if (typeof key === 'string')
  7841. {
  7842. this.data = GetValue(json, key, json);
  7843. }
  7844. else
  7845. {
  7846. this.data = json;
  7847. }
  7848. }
  7849. this.onProcessComplete();
  7850. }
  7851. });
  7852. /**
  7853. * Adds a JSON file, or array of JSON files, to the current load queue.
  7854. *
  7855. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  7856. *
  7857. * ```javascript
  7858. * function preload ()
  7859. * {
  7860. * this.load.json('wavedata', 'files/AlienWaveData.json');
  7861. * }
  7862. * ```
  7863. *
  7864. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  7865. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  7866. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  7867. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  7868. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  7869. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  7870. * loaded.
  7871. *
  7872. * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load.
  7873. * The key should be unique both in terms of files being loaded and files already present in the JSON Cache.
  7874. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  7875. * then remove it from the JSON Cache first, before loading a new one.
  7876. *
  7877. * Instead of passing arguments you can pass a configuration object, such as:
  7878. *
  7879. * ```javascript
  7880. * this.load.json({
  7881. * key: 'wavedata',
  7882. * url: 'files/AlienWaveData.json'
  7883. * });
  7884. * ```
  7885. *
  7886. * See the documentation for `Phaser.Loader.FileTypes.JSONFileConfig` for more details.
  7887. *
  7888. * Once the file has finished loading you can access it from its Cache using its key:
  7889. *
  7890. * ```javascript
  7891. * this.load.json('wavedata', 'files/AlienWaveData.json');
  7892. * // and later in your game ...
  7893. * var data = this.cache.json.get('wavedata');
  7894. * ```
  7895. *
  7896. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  7897. * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and
  7898. * this is what you would use to retrieve the text from the JSON Cache.
  7899. *
  7900. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  7901. *
  7902. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data"
  7903. * and no URL is given then the Loader will set the URL to be "data.json". It will always add `.json` as the extension, although
  7904. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  7905. *
  7906. * You can also optionally provide a `dataKey` to use. This allows you to extract only a part of the JSON and store it in the Cache,
  7907. * rather than the whole file. For example, if your JSON data had a structure like this:
  7908. *
  7909. * ```json
  7910. * {
  7911. * "level1": {
  7912. * "baddies": {
  7913. * "aliens": {},
  7914. * "boss": {}
  7915. * }
  7916. * },
  7917. * "level2": {},
  7918. * "level3": {}
  7919. * }
  7920. * ```
  7921. *
  7922. * And you only wanted to store the `boss` data in the Cache, then you could pass `level1.baddies.boss`as the `dataKey`.
  7923. *
  7924. * Note: The ability to load this type of file will only be available if the JSON File type has been built into Phaser.
  7925. * It is available in the default build but can be excluded from custom builds.
  7926. *
  7927. * @method Phaser.Loader.LoaderPlugin#json
  7928. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  7929. * @since 3.0.0
  7930. *
  7931. * @param {(string|Phaser.Loader.FileTypes.JSONFileConfig|Phaser.Loader.FileTypes.JSONFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  7932. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  7933. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  7934. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  7935. *
  7936. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  7937. */
  7938. FileTypesManager.register('json', function (key, url, dataKey, xhrSettings)
  7939. {
  7940. if (Array.isArray(key))
  7941. {
  7942. for (var i = 0; i < key.length; i++)
  7943. {
  7944. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  7945. this.addFile(new JSONFile(this, key[i]));
  7946. }
  7947. }
  7948. else
  7949. {
  7950. this.addFile(new JSONFile(this, key, url, xhrSettings, dataKey));
  7951. }
  7952. return this;
  7953. });
  7954. module.exports = JSONFile;
  7955. /***/ }),
  7956. /* 56 */
  7957. /***/ (function(module, exports) {
  7958. /**
  7959. * @author Richard Davey <rich@photonstorm.com>
  7960. * @copyright 2019 Photon Storm Ltd.
  7961. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7962. */
  7963. /**
  7964. * Calculate the distance between two sets of coordinates (points).
  7965. *
  7966. * @function Phaser.Math.Distance.Between
  7967. * @since 3.0.0
  7968. *
  7969. * @param {number} x1 - The x coordinate of the first point.
  7970. * @param {number} y1 - The y coordinate of the first point.
  7971. * @param {number} x2 - The x coordinate of the second point.
  7972. * @param {number} y2 - The y coordinate of the second point.
  7973. *
  7974. * @return {number} The distance between each point.
  7975. */
  7976. var DistanceBetween = function (x1, y1, x2, y2)
  7977. {
  7978. var dx = x1 - x2;
  7979. var dy = y1 - y2;
  7980. return Math.sqrt(dx * dx + dy * dy);
  7981. };
  7982. module.exports = DistanceBetween;
  7983. /***/ }),
  7984. /* 57 */
  7985. /***/ (function(module, exports) {
  7986. /**
  7987. * @author Richard Davey <rich@photonstorm.com>
  7988. * @copyright 2019 Photon Storm Ltd.
  7989. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7990. */
  7991. /**
  7992. * Wrap the given `value` between `min` and `max.
  7993. *
  7994. * @function Phaser.Math.Wrap
  7995. * @since 3.0.0
  7996. *
  7997. * @param {number} value - The value to wrap.
  7998. * @param {number} min - The minimum value.
  7999. * @param {number} max - The maximum value.
  8000. *
  8001. * @return {number} The wrapped value.
  8002. */
  8003. var Wrap = function (value, min, max)
  8004. {
  8005. var range = max - min;
  8006. return (min + ((((value - min) % range) + range) % range));
  8007. };
  8008. module.exports = Wrap;
  8009. /***/ }),
  8010. /* 58 */
  8011. /***/ (function(module, exports) {
  8012. /**
  8013. * @author Richard Davey <rich@photonstorm.com>
  8014. * @copyright 2019 Photon Storm Ltd.
  8015. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8016. */
  8017. /**
  8018. * Calculate the length of the given line.
  8019. *
  8020. * @function Phaser.Geom.Line.Length
  8021. * @since 3.0.0
  8022. *
  8023. * @param {Phaser.Geom.Line} line - The line to calculate the length of.
  8024. *
  8025. * @return {number} The length of the line.
  8026. */
  8027. var Length = function (line)
  8028. {
  8029. return Math.sqrt((line.x2 - line.x1) * (line.x2 - line.x1) + (line.y2 - line.y1) * (line.y2 - line.y1));
  8030. };
  8031. module.exports = Length;
  8032. /***/ }),
  8033. /* 59 */
  8034. /***/ (function(module, exports, __webpack_require__) {
  8035. /**
  8036. * @author Richard Davey <rich@photonstorm.com>
  8037. * @copyright 2019 Photon Storm Ltd.
  8038. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8039. */
  8040. var Class = __webpack_require__(0);
  8041. var GetPoint = __webpack_require__(429);
  8042. var GetPoints = __webpack_require__(203);
  8043. var Random = __webpack_require__(202);
  8044. var Vector2 = __webpack_require__(3);
  8045. /**
  8046. * @classdesc
  8047. * Defines a Line segment, a part of a line between two endpoints.
  8048. *
  8049. * @class Line
  8050. * @memberof Phaser.Geom
  8051. * @constructor
  8052. * @since 3.0.0
  8053. *
  8054. * @param {number} [x1=0] - The x coordinate of the lines starting point.
  8055. * @param {number} [y1=0] - The y coordinate of the lines starting point.
  8056. * @param {number} [x2=0] - The x coordinate of the lines ending point.
  8057. * @param {number} [y2=0] - The y coordinate of the lines ending point.
  8058. */
  8059. var Line = new Class({
  8060. initialize:
  8061. function Line (x1, y1, x2, y2)
  8062. {
  8063. if (x1 === undefined) { x1 = 0; }
  8064. if (y1 === undefined) { y1 = 0; }
  8065. if (x2 === undefined) { x2 = 0; }
  8066. if (y2 === undefined) { y2 = 0; }
  8067. /**
  8068. * The x coordinate of the lines starting point.
  8069. *
  8070. * @name Phaser.Geom.Line#x1
  8071. * @type {number}
  8072. * @since 3.0.0
  8073. */
  8074. this.x1 = x1;
  8075. /**
  8076. * The y coordinate of the lines starting point.
  8077. *
  8078. * @name Phaser.Geom.Line#y1
  8079. * @type {number}
  8080. * @since 3.0.0
  8081. */
  8082. this.y1 = y1;
  8083. /**
  8084. * The x coordinate of the lines ending point.
  8085. *
  8086. * @name Phaser.Geom.Line#x2
  8087. * @type {number}
  8088. * @since 3.0.0
  8089. */
  8090. this.x2 = x2;
  8091. /**
  8092. * The y coordinate of the lines ending point.
  8093. *
  8094. * @name Phaser.Geom.Line#y2
  8095. * @type {number}
  8096. * @since 3.0.0
  8097. */
  8098. this.y2 = y2;
  8099. },
  8100. /**
  8101. * Get a point on a line that's a given percentage along its length.
  8102. *
  8103. * @method Phaser.Geom.Line#getPoint
  8104. * @since 3.0.0
  8105. *
  8106. * @generic {Phaser.Geom.Point} O - [output,$return]
  8107. *
  8108. * @param {number} position - A value between 0 and 1, where 0 is the start, 0.5 is the middle and 1 is the end of the line.
  8109. * @param {(Phaser.Geom.Point|object)} [output] - An optional point, or point-like object, to store the coordinates of the point on the line.
  8110. *
  8111. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point on the line.
  8112. */
  8113. getPoint: function (position, output)
  8114. {
  8115. return GetPoint(this, position, output);
  8116. },
  8117. /**
  8118. * Get a number of points along a line's length.
  8119. *
  8120. * Provide a `quantity` to get an exact number of points along the line.
  8121. *
  8122. * Provide a `stepRate` to ensure a specific distance between each point on the line. Set `quantity` to `0` when
  8123. * providing a `stepRate`.
  8124. *
  8125. * @method Phaser.Geom.Line#getPoints
  8126. * @since 3.0.0
  8127. *
  8128. * @generic {Phaser.Geom.Point} O - [output,$return]
  8129. *
  8130. * @param {integer} quantity - The number of points to place on the line. Set to `0` to use `stepRate` instead.
  8131. * @param {integer} [stepRate] - The distance between each point on the line. When set, `quantity` is implied and should be set to `0`.
  8132. * @param {(array|Phaser.Geom.Point[])} [output] - An optional array of Points, or point-like objects, to store the coordinates of the points on the line.
  8133. *
  8134. * @return {(array|Phaser.Geom.Point[])} An array of Points, or point-like objects, containing the coordinates of the points on the line.
  8135. */
  8136. getPoints: function (quantity, stepRate, output)
  8137. {
  8138. return GetPoints(this, quantity, stepRate, output);
  8139. },
  8140. /**
  8141. * Get a random Point on the Line.
  8142. *
  8143. * @method Phaser.Geom.Line#getRandomPoint
  8144. * @since 3.0.0
  8145. *
  8146. * @generic {Phaser.Geom.Point} O - [point,$return]
  8147. *
  8148. * @param {(Phaser.Geom.Point|object)} [point] - An instance of a Point to be modified.
  8149. *
  8150. * @return {Phaser.Geom.Point} A random Point on the Line.
  8151. */
  8152. getRandomPoint: function (point)
  8153. {
  8154. return Random(this, point);
  8155. },
  8156. /**
  8157. * Set new coordinates for the line endpoints.
  8158. *
  8159. * @method Phaser.Geom.Line#setTo
  8160. * @since 3.0.0
  8161. *
  8162. * @param {number} [x1=0] - The x coordinate of the lines starting point.
  8163. * @param {number} [y1=0] - The y coordinate of the lines starting point.
  8164. * @param {number} [x2=0] - The x coordinate of the lines ending point.
  8165. * @param {number} [y2=0] - The y coordinate of the lines ending point.
  8166. *
  8167. * @return {Phaser.Geom.Line} This Line object.
  8168. */
  8169. setTo: function (x1, y1, x2, y2)
  8170. {
  8171. if (x1 === undefined) { x1 = 0; }
  8172. if (y1 === undefined) { y1 = 0; }
  8173. if (x2 === undefined) { x2 = 0; }
  8174. if (y2 === undefined) { y2 = 0; }
  8175. this.x1 = x1;
  8176. this.y1 = y1;
  8177. this.x2 = x2;
  8178. this.y2 = y2;
  8179. return this;
  8180. },
  8181. /**
  8182. * Returns a Vector2 object that corresponds to the start of this Line.
  8183. *
  8184. * @method Phaser.Geom.Line#getPointA
  8185. * @since 3.0.0
  8186. *
  8187. * @generic {Phaser.Math.Vector2} O - [vec2,$return]
  8188. *
  8189. * @param {Phaser.Math.Vector2} [vec2] - A Vector2 object to set the results in. If `undefined` a new Vector2 will be created.
  8190. *
  8191. * @return {Phaser.Math.Vector2} A Vector2 object that corresponds to the start of this Line.
  8192. */
  8193. getPointA: function (vec2)
  8194. {
  8195. if (vec2 === undefined) { vec2 = new Vector2(); }
  8196. vec2.set(this.x1, this.y1);
  8197. return vec2;
  8198. },
  8199. /**
  8200. * Returns a Vector2 object that corresponds to the end of this Line.
  8201. *
  8202. * @method Phaser.Geom.Line#getPointB
  8203. * @since 3.0.0
  8204. *
  8205. * @generic {Phaser.Math.Vector2} O - [vec2,$return]
  8206. *
  8207. * @param {Phaser.Math.Vector2} [vec2] - A Vector2 object to set the results in. If `undefined` a new Vector2 will be created.
  8208. *
  8209. * @return {Phaser.Math.Vector2} A Vector2 object that corresponds to the end of this Line.
  8210. */
  8211. getPointB: function (vec2)
  8212. {
  8213. if (vec2 === undefined) { vec2 = new Vector2(); }
  8214. vec2.set(this.x2, this.y2);
  8215. return vec2;
  8216. },
  8217. /**
  8218. * The left position of the Line.
  8219. *
  8220. * @name Phaser.Geom.Line#left
  8221. * @type {number}
  8222. * @since 3.0.0
  8223. */
  8224. left: {
  8225. get: function ()
  8226. {
  8227. return Math.min(this.x1, this.x2);
  8228. },
  8229. set: function (value)
  8230. {
  8231. if (this.x1 <= this.x2)
  8232. {
  8233. this.x1 = value;
  8234. }
  8235. else
  8236. {
  8237. this.x2 = value;
  8238. }
  8239. }
  8240. },
  8241. /**
  8242. * The right position of the Line.
  8243. *
  8244. * @name Phaser.Geom.Line#right
  8245. * @type {number}
  8246. * @since 3.0.0
  8247. */
  8248. right: {
  8249. get: function ()
  8250. {
  8251. return Math.max(this.x1, this.x2);
  8252. },
  8253. set: function (value)
  8254. {
  8255. if (this.x1 > this.x2)
  8256. {
  8257. this.x1 = value;
  8258. }
  8259. else
  8260. {
  8261. this.x2 = value;
  8262. }
  8263. }
  8264. },
  8265. /**
  8266. * The top position of the Line.
  8267. *
  8268. * @name Phaser.Geom.Line#top
  8269. * @type {number}
  8270. * @since 3.0.0
  8271. */
  8272. top: {
  8273. get: function ()
  8274. {
  8275. return Math.min(this.y1, this.y2);
  8276. },
  8277. set: function (value)
  8278. {
  8279. if (this.y1 <= this.y2)
  8280. {
  8281. this.y1 = value;
  8282. }
  8283. else
  8284. {
  8285. this.y2 = value;
  8286. }
  8287. }
  8288. },
  8289. /**
  8290. * The bottom position of the Line.
  8291. *
  8292. * @name Phaser.Geom.Line#bottom
  8293. * @type {number}
  8294. * @since 3.0.0
  8295. */
  8296. bottom: {
  8297. get: function ()
  8298. {
  8299. return Math.max(this.y1, this.y2);
  8300. },
  8301. set: function (value)
  8302. {
  8303. if (this.y1 > this.y2)
  8304. {
  8305. this.y1 = value;
  8306. }
  8307. else
  8308. {
  8309. this.y2 = value;
  8310. }
  8311. }
  8312. }
  8313. });
  8314. module.exports = Line;
  8315. /***/ }),
  8316. /* 60 */
  8317. /***/ (function(module, exports) {
  8318. /**
  8319. * @author Richard Davey <rich@photonstorm.com>
  8320. * @copyright 2019 Photon Storm Ltd.
  8321. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8322. */
  8323. /**
  8324. * Phaser Blend Modes.
  8325. *
  8326. * @name Phaser.BlendModes
  8327. * @enum {integer}
  8328. * @memberof Phaser
  8329. * @readonly
  8330. * @since 3.0.0
  8331. */
  8332. module.exports = {
  8333. /**
  8334. * Skips the Blend Mode check in the renderer.
  8335. *
  8336. * @name Phaser.BlendModes.SKIP_CHECK
  8337. */
  8338. SKIP_CHECK: -1,
  8339. /**
  8340. * Normal blend mode. For Canvas and WebGL.
  8341. * This is the default setting and draws new shapes on top of the existing canvas content.
  8342. *
  8343. * @name Phaser.BlendModes.NORMAL
  8344. */
  8345. NORMAL: 0,
  8346. /**
  8347. * Add blend mode. For Canvas and WebGL.
  8348. * Where both shapes overlap the color is determined by adding color values.
  8349. *
  8350. * @name Phaser.BlendModes.ADD
  8351. */
  8352. ADD: 1,
  8353. /**
  8354. * Multiply blend mode. For Canvas and WebGL.
  8355. * The pixels are of the top layer are multiplied with the corresponding pixel of the bottom layer. A darker picture is the result.
  8356. *
  8357. * @name Phaser.BlendModes.MULTIPLY
  8358. */
  8359. MULTIPLY: 2,
  8360. /**
  8361. * Screen blend mode. For Canvas and WebGL.
  8362. * The pixels are inverted, multiplied, and inverted again. A lighter picture is the result (opposite of multiply)
  8363. *
  8364. * @name Phaser.BlendModes.SCREEN
  8365. */
  8366. SCREEN: 3,
  8367. /**
  8368. * Overlay blend mode. For Canvas only.
  8369. * A combination of multiply and screen. Dark parts on the base layer become darker, and light parts become lighter.
  8370. *
  8371. * @name Phaser.BlendModes.OVERLAY
  8372. */
  8373. OVERLAY: 4,
  8374. /**
  8375. * Darken blend mode. For Canvas only.
  8376. * Retains the darkest pixels of both layers.
  8377. *
  8378. * @name Phaser.BlendModes.DARKEN
  8379. */
  8380. DARKEN: 5,
  8381. /**
  8382. * Lighten blend mode. For Canvas only.
  8383. * Retains the lightest pixels of both layers.
  8384. *
  8385. * @name Phaser.BlendModes.LIGHTEN
  8386. */
  8387. LIGHTEN: 6,
  8388. /**
  8389. * Color Dodge blend mode. For Canvas only.
  8390. * Divides the bottom layer by the inverted top layer.
  8391. *
  8392. * @name Phaser.BlendModes.COLOR_DODGE
  8393. */
  8394. COLOR_DODGE: 7,
  8395. /**
  8396. * Color Burn blend mode. For Canvas only.
  8397. * Divides the inverted bottom layer by the top layer, and then inverts the result.
  8398. *
  8399. * @name Phaser.BlendModes.COLOR_BURN
  8400. */
  8401. COLOR_BURN: 8,
  8402. /**
  8403. * Hard Light blend mode. For Canvas only.
  8404. * A combination of multiply and screen like overlay, but with top and bottom layer swapped.
  8405. *
  8406. * @name Phaser.BlendModes.HARD_LIGHT
  8407. */
  8408. HARD_LIGHT: 9,
  8409. /**
  8410. * Soft Light blend mode. For Canvas only.
  8411. * A softer version of hard-light. Pure black or white does not result in pure black or white.
  8412. *
  8413. * @name Phaser.BlendModes.SOFT_LIGHT
  8414. */
  8415. SOFT_LIGHT: 10,
  8416. /**
  8417. * Difference blend mode. For Canvas only.
  8418. * Subtracts the bottom layer from the top layer or the other way round to always get a positive value.
  8419. *
  8420. * @name Phaser.BlendModes.DIFFERENCE
  8421. */
  8422. DIFFERENCE: 11,
  8423. /**
  8424. * Exclusion blend mode. For Canvas only.
  8425. * Like difference, but with lower contrast.
  8426. *
  8427. * @name Phaser.BlendModes.EXCLUSION
  8428. */
  8429. EXCLUSION: 12,
  8430. /**
  8431. * Hue blend mode. For Canvas only.
  8432. * Preserves the luma and chroma of the bottom layer, while adopting the hue of the top layer.
  8433. *
  8434. * @name Phaser.BlendModes.HUE
  8435. */
  8436. HUE: 13,
  8437. /**
  8438. * Saturation blend mode. For Canvas only.
  8439. * Preserves the luma and hue of the bottom layer, while adopting the chroma of the top layer.
  8440. *
  8441. * @name Phaser.BlendModes.SATURATION
  8442. */
  8443. SATURATION: 14,
  8444. /**
  8445. * Color blend mode. For Canvas only.
  8446. * Preserves the luma of the bottom layer, while adopting the hue and chroma of the top layer.
  8447. *
  8448. * @name Phaser.BlendModes.COLOR
  8449. */
  8450. COLOR: 15,
  8451. /**
  8452. * Luminosity blend mode. For Canvas only.
  8453. * Preserves the hue and chroma of the bottom layer, while adopting the luma of the top layer.
  8454. *
  8455. * @name Phaser.BlendModes.LUMINOSITY
  8456. */
  8457. LUMINOSITY: 16,
  8458. /**
  8459. * Alpha erase blend mode. For Canvas and WebGL.
  8460. *
  8461. * @name Phaser.BlendModes.ERASE
  8462. */
  8463. ERASE: 17,
  8464. /**
  8465. * Source-in blend mode. For Canvas only.
  8466. * The new shape is drawn only where both the new shape and the destination canvas overlap. Everything else is made transparent.
  8467. *
  8468. * @name Phaser.BlendModes.SOURCE_IN
  8469. */
  8470. SOURCE_IN: 18,
  8471. /**
  8472. * Source-out blend mode. For Canvas only.
  8473. * The new shape is drawn where it doesn't overlap the existing canvas content.
  8474. *
  8475. * @name Phaser.BlendModes.SOURCE_OUT
  8476. */
  8477. SOURCE_OUT: 19,
  8478. /**
  8479. * Source-out blend mode. For Canvas only.
  8480. * The new shape is only drawn where it overlaps the existing canvas content.
  8481. *
  8482. * @name Phaser.BlendModes.SOURCE_ATOP
  8483. */
  8484. SOURCE_ATOP: 20,
  8485. /**
  8486. * Destination-over blend mode. For Canvas only.
  8487. * New shapes are drawn behind the existing canvas content.
  8488. *
  8489. * @name Phaser.BlendModes.DESTINATION_OVER
  8490. */
  8491. DESTINATION_OVER: 21,
  8492. /**
  8493. * Destination-in blend mode. For Canvas only.
  8494. * The existing canvas content is kept where both the new shape and existing canvas content overlap. Everything else is made transparent.
  8495. *
  8496. * @name Phaser.BlendModes.DESTINATION_IN
  8497. */
  8498. DESTINATION_IN: 22,
  8499. /**
  8500. * Destination-out blend mode. For Canvas only.
  8501. * The existing content is kept where it doesn't overlap the new shape.
  8502. *
  8503. * @name Phaser.BlendModes.DESTINATION_OUT
  8504. */
  8505. DESTINATION_OUT: 23,
  8506. /**
  8507. * Destination-out blend mode. For Canvas only.
  8508. * The existing canvas is only kept where it overlaps the new shape. The new shape is drawn behind the canvas content.
  8509. *
  8510. * @name Phaser.BlendModes.DESTINATION_ATOP
  8511. */
  8512. DESTINATION_ATOP: 24,
  8513. /**
  8514. * Lighten blend mode. For Canvas only.
  8515. * Where both shapes overlap the color is determined by adding color values.
  8516. *
  8517. * @name Phaser.BlendModes.LIGHTER
  8518. */
  8519. LIGHTER: 25,
  8520. /**
  8521. * Copy blend mode. For Canvas only.
  8522. * Only the new shape is shown.
  8523. *
  8524. * @name Phaser.BlendModes.COPY
  8525. */
  8526. COPY: 26,
  8527. /**
  8528. * xor blend mode. For Canvas only.
  8529. * Shapes are made transparent where both overlap and drawn normal everywhere else.
  8530. *
  8531. * @name Phaser.BlendModes.XOR
  8532. */
  8533. XOR: 27
  8534. };
  8535. /***/ }),
  8536. /* 61 */
  8537. /***/ (function(module, exports, __webpack_require__) {
  8538. /**
  8539. * @author Richard Davey <rich@photonstorm.com>
  8540. * @copyright 2019 Photon Storm Ltd.
  8541. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8542. */
  8543. var Class = __webpack_require__(0);
  8544. var Components = __webpack_require__(13);
  8545. var Rectangle = __webpack_require__(270);
  8546. /**
  8547. * @classdesc
  8548. * A Tile is a representation of a single tile within the Tilemap. This is a lightweight data
  8549. * representation, so its position information is stored without factoring in scroll, layer
  8550. * scale or layer position.
  8551. *
  8552. * @class Tile
  8553. * @memberof Phaser.Tilemaps
  8554. * @constructor
  8555. * @since 3.0.0
  8556. *
  8557. * @extends Phaser.GameObjects.Components.Alpha
  8558. * @extends Phaser.GameObjects.Components.Flip
  8559. * @extends Phaser.GameObjects.Components.Visible
  8560. *
  8561. * @param {Phaser.Tilemaps.LayerData} layer - The LayerData object in the Tilemap that this tile belongs to.
  8562. * @param {integer} index - The unique index of this tile within the map.
  8563. * @param {integer} x - The x coordinate of this tile in tile coordinates.
  8564. * @param {integer} y - The y coordinate of this tile in tile coordinates.
  8565. * @param {integer} width - Width of the tile in pixels.
  8566. * @param {integer} height - Height of the tile in pixels.
  8567. * @param {integer} baseWidth - The base width a tile in the map (in pixels). Tiled maps support
  8568. * multiple tileset sizes within one map, but they are still placed at intervals of the base
  8569. * tile width.
  8570. * @param {integer} baseHeight - The base height of the tile in pixels (in pixels). Tiled maps
  8571. * support multiple tileset sizes within one map, but they are still placed at intervals of the
  8572. * base tile height.
  8573. */
  8574. var Tile = new Class({
  8575. Mixins: [
  8576. Components.Alpha,
  8577. Components.Flip,
  8578. Components.Visible
  8579. ],
  8580. initialize:
  8581. function Tile (layer, index, x, y, width, height, baseWidth, baseHeight)
  8582. {
  8583. /**
  8584. * The LayerData in the Tilemap data that this tile belongs to.
  8585. *
  8586. * @name Phaser.Tilemaps.Tile#layer
  8587. * @type {Phaser.Tilemaps.LayerData}
  8588. * @since 3.0.0
  8589. */
  8590. this.layer = layer;
  8591. /**
  8592. * The index of this tile within the map data corresponding to the tileset, or -1 if this
  8593. * represents a blank tile.
  8594. *
  8595. * @name Phaser.Tilemaps.Tile#index
  8596. * @type {integer}
  8597. * @since 3.0.0
  8598. */
  8599. this.index = index;
  8600. /**
  8601. * The x map coordinate of this tile in tile units.
  8602. *
  8603. * @name Phaser.Tilemaps.Tile#x
  8604. * @type {integer}
  8605. * @since 3.0.0
  8606. */
  8607. this.x = x;
  8608. /**
  8609. * The y map coordinate of this tile in tile units.
  8610. *
  8611. * @name Phaser.Tilemaps.Tile#y
  8612. * @type {integer}
  8613. * @since 3.0.0
  8614. */
  8615. this.y = y;
  8616. /**
  8617. * The width of the tile in pixels.
  8618. *
  8619. * @name Phaser.Tilemaps.Tile#width
  8620. * @type {integer}
  8621. * @since 3.0.0
  8622. */
  8623. this.width = width;
  8624. /**
  8625. * The height of the tile in pixels.
  8626. *
  8627. * @name Phaser.Tilemaps.Tile#height
  8628. * @type {integer}
  8629. * @since 3.0.0
  8630. */
  8631. this.height = height;
  8632. /**
  8633. * The map's base width of a tile in pixels. Tiled maps support multiple tileset sizes
  8634. * within one map, but they are still placed at intervals of the base tile size.
  8635. *
  8636. * @name Phaser.Tilemaps.Tile#baseWidth
  8637. * @type {integer}
  8638. * @since 3.0.0
  8639. */
  8640. this.baseWidth = (baseWidth !== undefined) ? baseWidth : width;
  8641. /**
  8642. * The map's base height of a tile in pixels. Tiled maps support multiple tileset sizes
  8643. * within one map, but they are still placed at intervals of the base tile size.
  8644. *
  8645. * @name Phaser.Tilemaps.Tile#baseHeight
  8646. * @type {integer}
  8647. * @since 3.0.0
  8648. */
  8649. this.baseHeight = (baseHeight !== undefined) ? baseHeight : height;
  8650. /**
  8651. * The x coordinate of the top left of this tile in pixels. This is relative to the top left
  8652. * of the layer this tile is being rendered within. This property does NOT factor in camera
  8653. * scroll, layer scale or layer position.
  8654. *
  8655. * @name Phaser.Tilemaps.Tile#pixelX
  8656. * @type {number}
  8657. * @since 3.0.0
  8658. */
  8659. this.pixelX = 0;
  8660. /**
  8661. * The y coordinate of the top left of this tile in pixels. This is relative to the top left
  8662. * of the layer this tile is being rendered within. This property does NOT factor in camera
  8663. * scroll, layer scale or layer position.
  8664. *
  8665. * @name Phaser.Tilemaps.Tile#pixelY
  8666. * @type {number}
  8667. * @since 3.0.0
  8668. */
  8669. this.pixelY = 0;
  8670. this.updatePixelXY();
  8671. /**
  8672. * Tile specific properties. These usually come from Tiled.
  8673. *
  8674. * @name Phaser.Tilemaps.Tile#properties
  8675. * @type {object}
  8676. * @since 3.0.0
  8677. */
  8678. this.properties = {};
  8679. /**
  8680. * The rotation angle of this tile.
  8681. *
  8682. * @name Phaser.Tilemaps.Tile#rotation
  8683. * @type {number}
  8684. * @since 3.0.0
  8685. */
  8686. this.rotation = 0;
  8687. /**
  8688. * Whether the tile should collide with any object on the left side.
  8689. *
  8690. * @name Phaser.Tilemaps.Tile#collideLeft
  8691. * @type {boolean}
  8692. * @since 3.0.0
  8693. */
  8694. this.collideLeft = false;
  8695. /**
  8696. * Whether the tile should collide with any object on the right side.
  8697. *
  8698. * @name Phaser.Tilemaps.Tile#collideRight
  8699. * @type {boolean}
  8700. * @since 3.0.0
  8701. */
  8702. this.collideRight = false;
  8703. /**
  8704. * Whether the tile should collide with any object on the top side.
  8705. *
  8706. * @name Phaser.Tilemaps.Tile#collideUp
  8707. * @type {boolean}
  8708. * @since 3.0.0
  8709. */
  8710. this.collideUp = false;
  8711. /**
  8712. * Whether the tile should collide with any object on the bottom side.
  8713. *
  8714. * @name Phaser.Tilemaps.Tile#collideDown
  8715. * @type {boolean}
  8716. * @since 3.0.0
  8717. */
  8718. this.collideDown = false;
  8719. /**
  8720. * Whether the tile's left edge is interesting for collisions.
  8721. *
  8722. * @name Phaser.Tilemaps.Tile#faceLeft
  8723. * @type {boolean}
  8724. * @since 3.0.0
  8725. */
  8726. this.faceLeft = false;
  8727. /**
  8728. * Whether the tile's right edge is interesting for collisions.
  8729. *
  8730. * @name Phaser.Tilemaps.Tile#faceRight
  8731. * @type {boolean}
  8732. * @since 3.0.0
  8733. */
  8734. this.faceRight = false;
  8735. /**
  8736. * Whether the tile's top edge is interesting for collisions.
  8737. *
  8738. * @name Phaser.Tilemaps.Tile#faceTop
  8739. * @type {boolean}
  8740. * @since 3.0.0
  8741. */
  8742. this.faceTop = false;
  8743. /**
  8744. * Whether the tile's bottom edge is interesting for collisions.
  8745. *
  8746. * @name Phaser.Tilemaps.Tile#faceBottom
  8747. * @type {boolean}
  8748. * @since 3.0.0
  8749. */
  8750. this.faceBottom = false;
  8751. /**
  8752. * Tile collision callback.
  8753. *
  8754. * @name Phaser.Tilemaps.Tile#collisionCallback
  8755. * @type {function}
  8756. * @since 3.0.0
  8757. */
  8758. this.collisionCallback = null;
  8759. /**
  8760. * The context in which the collision callback will be called.
  8761. *
  8762. * @name Phaser.Tilemaps.Tile#collisionCallbackContext
  8763. * @type {object}
  8764. * @since 3.0.0
  8765. */
  8766. this.collisionCallbackContext = this;
  8767. /**
  8768. * The tint to apply to this tile. Note: tint is currently a single color value instead of
  8769. * the 4 corner tint component on other GameObjects.
  8770. *
  8771. * @name Phaser.Tilemaps.Tile#tint
  8772. * @type {number}
  8773. * @default
  8774. * @since 3.0.0
  8775. */
  8776. this.tint = 0xffffff;
  8777. /**
  8778. * An empty object where physics-engine specific information (e.g. bodies) may be stored.
  8779. *
  8780. * @name Phaser.Tilemaps.Tile#physics
  8781. * @type {object}
  8782. * @since 3.0.0
  8783. */
  8784. this.physics = {};
  8785. },
  8786. /**
  8787. * Check if the given x and y world coordinates are within this Tile. This does not factor in
  8788. * camera scroll, layer scale or layer position.
  8789. *
  8790. * @method Phaser.Tilemaps.Tile#containsPoint
  8791. * @since 3.0.0
  8792. *
  8793. * @param {number} x - The x coordinate to test.
  8794. * @param {number} y - The y coordinate to test.
  8795. *
  8796. * @return {boolean} True if the coordinates are within this Tile, otherwise false.
  8797. */
  8798. containsPoint: function (x, y)
  8799. {
  8800. return !(x < this.pixelX || y < this.pixelY || x > this.right || y > this.bottom);
  8801. },
  8802. /**
  8803. * Copies the tile data & properties from the given tile to this tile. This copies everything
  8804. * except for position and interesting faces.
  8805. *
  8806. * @method Phaser.Tilemaps.Tile#copy
  8807. * @since 3.0.0
  8808. *
  8809. * @param {Phaser.Tilemaps.Tile} tile - The tile to copy from.
  8810. *
  8811. * @return {Phaser.Tilemaps.Tile} This Tile object.
  8812. */
  8813. copy: function (tile)
  8814. {
  8815. this.index = tile.index;
  8816. this.alpha = tile.alpha;
  8817. this.properties = tile.properties;
  8818. this.visible = tile.visible;
  8819. this.setFlip(tile.flipX, tile.flipY);
  8820. this.tint = tile.tint;
  8821. this.rotation = tile.rotation;
  8822. this.collideUp = tile.collideUp;
  8823. this.collideDown = tile.collideDown;
  8824. this.collideLeft = tile.collideLeft;
  8825. this.collideRight = tile.collideRight;
  8826. this.collisionCallback = tile.collisionCallback;
  8827. this.collisionCallbackContext = tile.collisionCallbackContext;
  8828. return this;
  8829. },
  8830. /**
  8831. * The collision group for this Tile, defined within the Tileset. This returns a reference to
  8832. * the collision group stored within the Tileset, so any modification of the returned object
  8833. * will impact all tiles that have the same index as this tile.
  8834. *
  8835. * @method Phaser.Tilemaps.Tile#getCollisionGroup
  8836. * @since 3.0.0
  8837. *
  8838. * @return {?object} tileset
  8839. */
  8840. getCollisionGroup: function ()
  8841. {
  8842. return this.tileset ? this.tileset.getTileCollisionGroup(this.index) : null;
  8843. },
  8844. /**
  8845. * The tile data for this Tile, defined within the Tileset. This typically contains Tiled
  8846. * collision data, tile animations and terrain information. This returns a reference to the tile
  8847. * data stored within the Tileset, so any modification of the returned object will impact all
  8848. * tiles that have the same index as this tile.
  8849. *
  8850. * @method Phaser.Tilemaps.Tile#getTileData
  8851. * @since 3.0.0
  8852. *
  8853. * @return {?object} tileset
  8854. */
  8855. getTileData: function ()
  8856. {
  8857. return this.tileset ? this.tileset.getTileData(this.index) : null;
  8858. },
  8859. /**
  8860. * Gets the world X position of the left side of the tile, factoring in the layers position,
  8861. * scale and scroll.
  8862. *
  8863. * @method Phaser.Tilemaps.Tile#getLeft
  8864. * @since 3.0.0
  8865. *
  8866. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8867. *
  8868. * @return {number}
  8869. */
  8870. getLeft: function (camera)
  8871. {
  8872. var tilemapLayer = this.tilemapLayer;
  8873. return (tilemapLayer) ? tilemapLayer.tileToWorldX(this.x, camera) : this.x * this.baseWidth;
  8874. },
  8875. /**
  8876. * Gets the world X position of the right side of the tile, factoring in the layer's position,
  8877. * scale and scroll.
  8878. *
  8879. * @method Phaser.Tilemaps.Tile#getRight
  8880. * @since 3.0.0
  8881. *
  8882. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8883. *
  8884. * @return {number}
  8885. */
  8886. getRight: function (camera)
  8887. {
  8888. var tilemapLayer = this.tilemapLayer;
  8889. return (tilemapLayer) ? this.getLeft(camera) + this.width * tilemapLayer.scaleX : this.getLeft(camera) + this.width;
  8890. },
  8891. /**
  8892. * Gets the world Y position of the top side of the tile, factoring in the layer's position,
  8893. * scale and scroll.
  8894. *
  8895. * @method Phaser.Tilemaps.Tile#getTop
  8896. * @since 3.0.0
  8897. *
  8898. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8899. *
  8900. * @return {number}
  8901. */
  8902. getTop: function (camera)
  8903. {
  8904. var tilemapLayer = this.tilemapLayer;
  8905. // Tiled places tiles on a grid of baseWidth x baseHeight. The origin for a tile in grid
  8906. // units is the bottom left, so the y coordinate needs to be adjusted by the difference
  8907. // between the base size and this tile's size.
  8908. return tilemapLayer
  8909. ? tilemapLayer.tileToWorldY(this.y, camera) - (this.height - this.baseHeight) * tilemapLayer.scaleY
  8910. : this.y * this.baseHeight - (this.height - this.baseHeight);
  8911. },
  8912. /**
  8913. * Gets the world Y position of the bottom side of the tile, factoring in the layer's position,
  8914. * scale and scroll.
  8915. * @method Phaser.Tilemaps.Tile#getBottom
  8916. * @since 3.0.0
  8917. *
  8918. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8919. *
  8920. * @return {number}
  8921. */
  8922. getBottom: function (camera)
  8923. {
  8924. var tilemapLayer = this.tilemapLayer;
  8925. return tilemapLayer
  8926. ? this.getTop(camera) + this.height * tilemapLayer.scaleY
  8927. : this.getTop(camera) + this.height;
  8928. },
  8929. /**
  8930. * Gets the world rectangle bounding box for the tile, factoring in the layers position,
  8931. * scale and scroll.
  8932. *
  8933. * @method Phaser.Tilemaps.Tile#getBounds
  8934. * @since 3.0.0
  8935. *
  8936. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8937. * @param {object} [output] - [description]
  8938. *
  8939. * @return {(Phaser.Geom.Rectangle|object)}
  8940. */
  8941. getBounds: function (camera, output)
  8942. {
  8943. if (output === undefined) { output = new Rectangle(); }
  8944. output.x = this.getLeft();
  8945. output.y = this.getTop();
  8946. output.width = this.getRight() - output.x;
  8947. output.height = this.getBottom() - output.y;
  8948. return output;
  8949. },
  8950. /**
  8951. * Gets the world X position of the center of the tile, factoring in the layer's position,
  8952. * scale and scroll.
  8953. *
  8954. * @method Phaser.Tilemaps.Tile#getCenterX
  8955. * @since 3.0.0
  8956. *
  8957. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8958. *
  8959. * @return {number}
  8960. */
  8961. getCenterX: function (camera)
  8962. {
  8963. return this.getLeft(camera) + this.width / 2;
  8964. },
  8965. /**
  8966. * Gets the world Y position of the center of the tile, factoring in the layer's position,
  8967. * scale and scroll.
  8968. *
  8969. * @method Phaser.Tilemaps.Tile#getCenterY
  8970. * @since 3.0.0
  8971. *
  8972. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8973. *
  8974. * @return {number}
  8975. */
  8976. getCenterY: function (camera)
  8977. {
  8978. return this.getTop(camera) + this.height / 2;
  8979. },
  8980. /**
  8981. * Clean up memory.
  8982. *
  8983. * @method Phaser.Tilemaps.Tile#destroy
  8984. * @since 3.0.0
  8985. */
  8986. destroy: function ()
  8987. {
  8988. this.collisionCallback = undefined;
  8989. this.collisionCallbackContext = undefined;
  8990. this.properties = undefined;
  8991. },
  8992. /**
  8993. * Check for intersection with this tile. This does not factor in camera scroll, layer scale or
  8994. * layer position.
  8995. *
  8996. * @method Phaser.Tilemaps.Tile#intersects
  8997. * @since 3.0.0
  8998. *
  8999. * @param {number} x - The x axis in pixels.
  9000. * @param {number} y - The y axis in pixels.
  9001. * @param {number} right - The right point.
  9002. * @param {number} bottom - The bottom point.
  9003. *
  9004. * @return {boolean}
  9005. */
  9006. intersects: function (x, y, right, bottom)
  9007. {
  9008. return !(
  9009. right <= this.pixelX || bottom <= this.pixelY ||
  9010. x >= this.right || y >= this.bottom
  9011. );
  9012. },
  9013. /**
  9014. * Checks if the tile is interesting.
  9015. *
  9016. * @method Phaser.Tilemaps.Tile#isInteresting
  9017. * @since 3.0.0
  9018. *
  9019. * @param {boolean} collides - If true, will consider the tile interesting if it collides on any side.
  9020. * @param {boolean} faces - If true, will consider the tile interesting if it has an interesting face.
  9021. *
  9022. * @return {boolean} True if the Tile is interesting, otherwise false.
  9023. */
  9024. isInteresting: function (collides, faces)
  9025. {
  9026. if (collides && faces) { return (this.canCollide || this.hasInterestingFace); }
  9027. else if (collides) { return this.collides; }
  9028. else if (faces) { return this.hasInterestingFace; }
  9029. return false;
  9030. },
  9031. /**
  9032. * Reset collision status flags.
  9033. *
  9034. * @method Phaser.Tilemaps.Tile#resetCollision
  9035. * @since 3.0.0
  9036. *
  9037. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate interesting faces for this tile and its neighbors.
  9038. *
  9039. * @return {Phaser.Tilemaps.Tile} This Tile object.
  9040. */
  9041. resetCollision: function (recalculateFaces)
  9042. {
  9043. if (recalculateFaces === undefined) { recalculateFaces = true; }
  9044. this.collideLeft = false;
  9045. this.collideRight = false;
  9046. this.collideUp = false;
  9047. this.collideDown = false;
  9048. this.faceTop = false;
  9049. this.faceBottom = false;
  9050. this.faceLeft = false;
  9051. this.faceRight = false;
  9052. if (recalculateFaces)
  9053. {
  9054. var tilemapLayer = this.tilemapLayer;
  9055. if (tilemapLayer)
  9056. {
  9057. this.tilemapLayer.calculateFacesAt(this.x, this.y);
  9058. }
  9059. }
  9060. return this;
  9061. },
  9062. /**
  9063. * Reset faces.
  9064. *
  9065. * @method Phaser.Tilemaps.Tile#resetFaces
  9066. * @since 3.0.0
  9067. *
  9068. * @return {Phaser.Tilemaps.Tile} This Tile object.
  9069. */
  9070. resetFaces: function ()
  9071. {
  9072. this.faceTop = false;
  9073. this.faceBottom = false;
  9074. this.faceLeft = false;
  9075. this.faceRight = false;
  9076. return this;
  9077. },
  9078. /**
  9079. * Sets the collision flags for each side of this tile and updates the interesting faces list.
  9080. *
  9081. * @method Phaser.Tilemaps.Tile#setCollision
  9082. * @since 3.0.0
  9083. *
  9084. * @param {boolean} left - Indicating collide with any object on the left.
  9085. * @param {boolean} [right] - Indicating collide with any object on the right.
  9086. * @param {boolean} [up] - Indicating collide with any object on the top.
  9087. * @param {boolean} [down] - Indicating collide with any object on the bottom.
  9088. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate interesting faces
  9089. * for this tile and its neighbors.
  9090. *
  9091. * @return {Phaser.Tilemaps.Tile} This Tile object.
  9092. */
  9093. setCollision: function (left, right, up, down, recalculateFaces)
  9094. {
  9095. if (right === undefined) { right = left; }
  9096. if (up === undefined) { up = left; }
  9097. if (down === undefined) { down = left; }
  9098. if (recalculateFaces === undefined) { recalculateFaces = true; }
  9099. this.collideLeft = left;
  9100. this.collideRight = right;
  9101. this.collideUp = up;
  9102. this.collideDown = down;
  9103. this.faceLeft = left;
  9104. this.faceRight = right;
  9105. this.faceTop = up;
  9106. this.faceBottom = down;
  9107. if (recalculateFaces)
  9108. {
  9109. var tilemapLayer = this.tilemapLayer;
  9110. if (tilemapLayer)
  9111. {
  9112. this.tilemapLayer.calculateFacesAt(this.x, this.y);
  9113. }
  9114. }
  9115. return this;
  9116. },
  9117. /**
  9118. * Set a callback to be called when this tile is hit by an object. The callback must true for
  9119. * collision processing to take place.
  9120. *
  9121. * @method Phaser.Tilemaps.Tile#setCollisionCallback
  9122. * @since 3.0.0
  9123. *
  9124. * @param {function} callback - Callback function.
  9125. * @param {object} context - Callback will be called within this context.
  9126. *
  9127. * @return {Phaser.Tilemaps.Tile} This Tile object.
  9128. */
  9129. setCollisionCallback: function (callback, context)
  9130. {
  9131. if (callback === null)
  9132. {
  9133. this.collisionCallback = undefined;
  9134. this.collisionCallbackContext = undefined;
  9135. }
  9136. else
  9137. {
  9138. this.collisionCallback = callback;
  9139. this.collisionCallbackContext = context;
  9140. }
  9141. return this;
  9142. },
  9143. /**
  9144. * Sets the size of the tile and updates its pixelX and pixelY.
  9145. *
  9146. * @method Phaser.Tilemaps.Tile#setSize
  9147. * @since 3.0.0
  9148. *
  9149. * @param {integer} tileWidth - The width of the tile in pixels.
  9150. * @param {integer} tileHeight - The height of the tile in pixels.
  9151. * @param {integer} baseWidth - The base width a tile in the map (in pixels).
  9152. * @param {integer} baseHeight - The base height of the tile in pixels (in pixels).
  9153. *
  9154. * @return {Phaser.Tilemaps.Tile} This Tile object.
  9155. */
  9156. setSize: function (tileWidth, tileHeight, baseWidth, baseHeight)
  9157. {
  9158. if (tileWidth !== undefined) { this.width = tileWidth; }
  9159. if (tileHeight !== undefined) { this.height = tileHeight; }
  9160. if (baseWidth !== undefined) { this.baseWidth = baseWidth; }
  9161. if (baseHeight !== undefined) { this.baseHeight = baseHeight; }
  9162. this.updatePixelXY();
  9163. return this;
  9164. },
  9165. /**
  9166. * Used internally. Updates the tile's world XY position based on the current tile size.
  9167. *
  9168. * @method Phaser.Tilemaps.Tile#updatePixelXY
  9169. * @since 3.0.0
  9170. *
  9171. * @return {Phaser.Tilemaps.Tile} This Tile object.
  9172. */
  9173. updatePixelXY: function ()
  9174. {
  9175. // Tiled places tiles on a grid of baseWidth x baseHeight. The origin for a tile is the
  9176. // bottom left, while the Phaser renderer assumes the origin is the top left. The y
  9177. // coordinate needs to be adjusted by the difference.
  9178. this.pixelX = this.x * this.baseWidth;
  9179. this.pixelY = this.y * this.baseHeight;
  9180. // this.pixelY = this.y * this.baseHeight - (this.height - this.baseHeight);
  9181. return this;
  9182. },
  9183. /**
  9184. * True if this tile can collide on any of its faces or has a collision callback set.
  9185. *
  9186. * @name Phaser.Tilemaps.Tile#canCollide
  9187. * @type {boolean}
  9188. * @readonly
  9189. * @since 3.0.0
  9190. */
  9191. canCollide: {
  9192. get: function ()
  9193. {
  9194. return (this.collideLeft || this.collideRight || this.collideUp || this.collideDown || this.collisionCallback);
  9195. }
  9196. },
  9197. /**
  9198. * True if this tile can collide on any of its faces.
  9199. *
  9200. * @name Phaser.Tilemaps.Tile#collides
  9201. * @type {boolean}
  9202. * @readonly
  9203. * @since 3.0.0
  9204. */
  9205. collides: {
  9206. get: function ()
  9207. {
  9208. return (this.collideLeft || this.collideRight || this.collideUp || this.collideDown);
  9209. }
  9210. },
  9211. /**
  9212. * True if this tile has any interesting faces.
  9213. *
  9214. * @name Phaser.Tilemaps.Tile#hasInterestingFace
  9215. * @type {boolean}
  9216. * @readonly
  9217. * @since 3.0.0
  9218. */
  9219. hasInterestingFace: {
  9220. get: function ()
  9221. {
  9222. return (this.faceTop || this.faceBottom || this.faceLeft || this.faceRight);
  9223. }
  9224. },
  9225. /**
  9226. * The tileset that contains this Tile. This is null if accessed from a LayerData instance
  9227. * before the tile is placed in a StaticTilemapLayer or DynamicTilemapLayer, or if the tile has
  9228. * an index that doesn't correspond to any of the map's tilesets.
  9229. *
  9230. * @name Phaser.Tilemaps.Tile#tileset
  9231. * @type {?Phaser.Tilemaps.Tileset}
  9232. * @readonly
  9233. * @since 3.0.0
  9234. */
  9235. tileset: {
  9236. get: function ()
  9237. {
  9238. var tilemapLayer = this.layer.tilemapLayer;
  9239. if (tilemapLayer)
  9240. {
  9241. var tileset = tilemapLayer.gidMap[this.index];
  9242. if (tileset)
  9243. {
  9244. return tileset;
  9245. }
  9246. }
  9247. return null;
  9248. }
  9249. },
  9250. /**
  9251. * The tilemap layer that contains this Tile. This will only return null if accessed from a
  9252. * LayerData instance before the tile is placed within a StaticTilemapLayer or
  9253. * DynamicTilemapLayer.
  9254. *
  9255. * @name Phaser.Tilemaps.Tile#tilemapLayer
  9256. * @type {?Phaser.Tilemaps.StaticTilemapLayer|Phaser.Tilemaps.DynamicTilemapLayer}
  9257. * @readonly
  9258. * @since 3.0.0
  9259. */
  9260. tilemapLayer: {
  9261. get: function ()
  9262. {
  9263. return this.layer.tilemapLayer;
  9264. }
  9265. },
  9266. /**
  9267. * The tilemap that contains this Tile. This will only return null if accessed from a LayerData
  9268. * instance before the tile is placed within a StaticTilemapLayer or DynamicTilemapLayer.
  9269. *
  9270. * @name Phaser.Tilemaps.Tile#tilemap
  9271. * @type {?Phaser.Tilemaps.Tilemap}
  9272. * @readonly
  9273. * @since 3.0.0
  9274. */
  9275. tilemap: {
  9276. get: function ()
  9277. {
  9278. var tilemapLayer = this.tilemapLayer;
  9279. return tilemapLayer ? tilemapLayer.tilemap : null;
  9280. }
  9281. }
  9282. });
  9283. module.exports = Tile;
  9284. /***/ }),
  9285. /* 62 */
  9286. /***/ (function(module, exports) {
  9287. /**
  9288. * @author Richard Davey <rich@photonstorm.com>
  9289. * @copyright 2019 Photon Storm Ltd.
  9290. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  9291. */
  9292. /**
  9293. * Internally used method to set the colliding state of a tile. This does not recalculate
  9294. * interesting faces.
  9295. *
  9296. * @function Phaser.Tilemaps.Components.SetTileCollision
  9297. * @private
  9298. * @since 3.0.0
  9299. *
  9300. * @param {Phaser.Tilemaps.Tile} tile - The Tile to set the collision on.
  9301. * @param {boolean} [collides=true] - Should the tile index collide or not?
  9302. */
  9303. var SetTileCollision = function (tile, collides)
  9304. {
  9305. if (collides)
  9306. {
  9307. tile.setCollision(true, true, true, true, false);
  9308. }
  9309. else
  9310. {
  9311. tile.resetCollision(false);
  9312. }
  9313. };
  9314. module.exports = SetTileCollision;
  9315. /***/ }),
  9316. /* 63 */
  9317. /***/ (function(module, exports, __webpack_require__) {
  9318. /**
  9319. * @author Richard Davey <rich@photonstorm.com>
  9320. * @copyright 2019 Photon Storm Ltd.
  9321. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  9322. */
  9323. var Class = __webpack_require__(0);
  9324. /**
  9325. * @classdesc
  9326. * A MultiFile is a special kind of parent that contains two, or more, Files as children and looks after
  9327. * the loading and processing of them all. It is commonly extended and used as a base class for file types such as AtlasJSON or BitmapFont.
  9328. *
  9329. * You shouldn't create an instance of a MultiFile directly, but should extend it with your own class, setting a custom type and processing methods.
  9330. *
  9331. * @class MultiFile
  9332. * @memberof Phaser.Loader
  9333. * @constructor
  9334. * @since 3.7.0
  9335. *
  9336. * @param {Phaser.Loader.LoaderPlugin} loader - The Loader that is going to load this File.
  9337. * @param {string} type - The file type string for sorting within the Loader.
  9338. * @param {string} key - The key of the file within the loader.
  9339. * @param {Phaser.Loader.File[]} files - An array of Files that make-up this MultiFile.
  9340. */
  9341. var MultiFile = new Class({
  9342. initialize:
  9343. function MultiFile (loader, type, key, files)
  9344. {
  9345. /**
  9346. * A reference to the Loader that is going to load this file.
  9347. *
  9348. * @name Phaser.Loader.MultiFile#loader
  9349. * @type {Phaser.Loader.LoaderPlugin}
  9350. * @since 3.7.0
  9351. */
  9352. this.loader = loader;
  9353. /**
  9354. * The file type string for sorting within the Loader.
  9355. *
  9356. * @name Phaser.Loader.MultiFile#type
  9357. * @type {string}
  9358. * @since 3.7.0
  9359. */
  9360. this.type = type;
  9361. /**
  9362. * Unique cache key (unique within its file type)
  9363. *
  9364. * @name Phaser.Loader.MultiFile#key
  9365. * @type {string}
  9366. * @since 3.7.0
  9367. */
  9368. this.key = key;
  9369. /**
  9370. * Array of files that make up this MultiFile.
  9371. *
  9372. * @name Phaser.Loader.MultiFile#files
  9373. * @type {Phaser.Loader.File[]}
  9374. * @since 3.7.0
  9375. */
  9376. this.files = files;
  9377. /**
  9378. * The completion status of this MultiFile.
  9379. *
  9380. * @name Phaser.Loader.MultiFile#complete
  9381. * @type {boolean}
  9382. * @default false
  9383. * @since 3.7.0
  9384. */
  9385. this.complete = false;
  9386. /**
  9387. * The number of files to load.
  9388. *
  9389. * @name Phaser.Loader.MultiFile#pending
  9390. * @type {integer}
  9391. * @since 3.7.0
  9392. */
  9393. this.pending = files.length;
  9394. /**
  9395. * The number of files that failed to load.
  9396. *
  9397. * @name Phaser.Loader.MultiFile#failed
  9398. * @type {integer}
  9399. * @default 0
  9400. * @since 3.7.0
  9401. */
  9402. this.failed = 0;
  9403. /**
  9404. * A storage container for transient data that the loading files need.
  9405. *
  9406. * @name Phaser.Loader.MultiFile#config
  9407. * @type {any}
  9408. * @since 3.7.0
  9409. */
  9410. this.config = {};
  9411. // Link the files
  9412. for (var i = 0; i < files.length; i++)
  9413. {
  9414. files[i].multiFile = this;
  9415. }
  9416. },
  9417. /**
  9418. * Checks if this MultiFile is ready to process its children or not.
  9419. *
  9420. * @method Phaser.Loader.MultiFile#isReadyToProcess
  9421. * @since 3.7.0
  9422. *
  9423. * @return {boolean} `true` if all children of this MultiFile have loaded, otherwise `false`.
  9424. */
  9425. isReadyToProcess: function ()
  9426. {
  9427. return (this.pending === 0 && this.failed === 0 && !this.complete);
  9428. },
  9429. /**
  9430. * Adds another child to this MultiFile, increases the pending count and resets the completion status.
  9431. *
  9432. * @method Phaser.Loader.MultiFile#addToMultiFile
  9433. * @since 3.7.0
  9434. *
  9435. * @param {Phaser.Loader.File} files - The File to add to this MultiFile.
  9436. *
  9437. * @return {Phaser.Loader.MultiFile} This MultiFile instance.
  9438. */
  9439. addToMultiFile: function (file)
  9440. {
  9441. this.files.push(file);
  9442. file.multiFile = this;
  9443. this.pending++;
  9444. this.complete = false;
  9445. return this;
  9446. },
  9447. /**
  9448. * Called by each File when it finishes loading.
  9449. *
  9450. * @method Phaser.Loader.MultiFile#onFileComplete
  9451. * @since 3.7.0
  9452. *
  9453. * @param {Phaser.Loader.File} file - The File that has completed processing.
  9454. */
  9455. onFileComplete: function (file)
  9456. {
  9457. var index = this.files.indexOf(file);
  9458. if (index !== -1)
  9459. {
  9460. this.pending--;
  9461. }
  9462. },
  9463. /**
  9464. * Called by each File that fails to load.
  9465. *
  9466. * @method Phaser.Loader.MultiFile#onFileFailed
  9467. * @since 3.7.0
  9468. *
  9469. * @param {Phaser.Loader.File} file - The File that has failed to load.
  9470. */
  9471. onFileFailed: function (file)
  9472. {
  9473. var index = this.files.indexOf(file);
  9474. if (index !== -1)
  9475. {
  9476. this.failed++;
  9477. }
  9478. }
  9479. });
  9480. module.exports = MultiFile;
  9481. /***/ }),
  9482. /* 64 */
  9483. /***/ (function(module, exports, __webpack_require__) {
  9484. /**
  9485. * @author Richard Davey <rich@photonstorm.com>
  9486. * @copyright 2019 Photon Storm Ltd.
  9487. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  9488. */
  9489. var Class = __webpack_require__(0);
  9490. var CONST = __webpack_require__(15);
  9491. var File = __webpack_require__(22);
  9492. var FileTypesManager = __webpack_require__(7);
  9493. var GetFastValue = __webpack_require__(2);
  9494. var IsPlainObject = __webpack_require__(8);
  9495. /**
  9496. * @typedef {object} Phaser.Loader.FileTypes.ImageFrameConfig
  9497. *
  9498. * @property {integer} frameWidth - The width of the frame in pixels.
  9499. * @property {integer} [frameHeight] - The height of the frame in pixels. Uses the `frameWidth` value if not provided.
  9500. * @property {integer} [startFrame=0] - The first frame to start parsing from.
  9501. * @property {integer} [endFrame] - The frame to stop parsing at. If not provided it will calculate the value based on the image and frame dimensions.
  9502. * @property {integer} [margin=0] - The margin in the image. This is the space around the edge of the frames.
  9503. * @property {integer} [spacing=0] - The spacing between each frame in the image.
  9504. */
  9505. /**
  9506. * @typedef {object} Phaser.Loader.FileTypes.ImageFileConfig
  9507. *
  9508. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  9509. * @property {string} [url] - The absolute or relative URL to load the file from.
  9510. * @property {string} [extension='png'] - The default file extension to use if no url is provided.
  9511. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the image.
  9512. * @property {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object. Only provided for, and used by, Sprite Sheets.
  9513. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  9514. */
  9515. /**
  9516. * @classdesc
  9517. * A single Image File suitable for loading by the Loader.
  9518. *
  9519. * These are created when you use the Phaser.Loader.LoaderPlugin#image method and are not typically created directly.
  9520. *
  9521. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#image.
  9522. *
  9523. * @class ImageFile
  9524. * @extends Phaser.Loader.File
  9525. * @memberof Phaser.Loader.FileTypes
  9526. * @constructor
  9527. * @since 3.0.0
  9528. *
  9529. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  9530. * @param {(string|Phaser.Loader.FileTypes.ImageFileConfig)} key - The key to use for this file, or a file configuration object.
  9531. * @param {string|string[]} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  9532. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  9533. * @param {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object. Only provided for, and used by, Sprite Sheets.
  9534. */
  9535. var ImageFile = new Class({
  9536. Extends: File,
  9537. initialize:
  9538. function ImageFile (loader, key, url, xhrSettings, frameConfig)
  9539. {
  9540. var extension = 'png';
  9541. var normalMapURL;
  9542. if (IsPlainObject(key))
  9543. {
  9544. var config = key;
  9545. key = GetFastValue(config, 'key');
  9546. url = GetFastValue(config, 'url');
  9547. normalMapURL = GetFastValue(config, 'normalMap');
  9548. xhrSettings = GetFastValue(config, 'xhrSettings');
  9549. extension = GetFastValue(config, 'extension', extension);
  9550. frameConfig = GetFastValue(config, 'frameConfig');
  9551. }
  9552. if (Array.isArray(url))
  9553. {
  9554. normalMapURL = url[1];
  9555. url = url[0];
  9556. }
  9557. var fileConfig = {
  9558. type: 'image',
  9559. cache: loader.textureManager,
  9560. extension: extension,
  9561. responseType: 'blob',
  9562. key: key,
  9563. url: url,
  9564. xhrSettings: xhrSettings,
  9565. config: frameConfig
  9566. };
  9567. File.call(this, loader, fileConfig);
  9568. // Do we have a normal map to load as well?
  9569. if (normalMapURL)
  9570. {
  9571. var normalMap = new ImageFile(loader, this.key, normalMapURL, xhrSettings, frameConfig);
  9572. normalMap.type = 'normalMap';
  9573. this.setLink(normalMap);
  9574. loader.addFile(normalMap);
  9575. }
  9576. },
  9577. /**
  9578. * Called automatically by Loader.nextFile.
  9579. * This method controls what extra work this File does with its loaded data.
  9580. *
  9581. * @method Phaser.Loader.FileTypes.ImageFile#onProcess
  9582. * @since 3.7.0
  9583. */
  9584. onProcess: function ()
  9585. {
  9586. this.state = CONST.FILE_PROCESSING;
  9587. this.data = new Image();
  9588. this.data.crossOrigin = this.crossOrigin;
  9589. var _this = this;
  9590. this.data.onload = function ()
  9591. {
  9592. File.revokeObjectURL(_this.data);
  9593. _this.onProcessComplete();
  9594. };
  9595. this.data.onerror = function ()
  9596. {
  9597. File.revokeObjectURL(_this.data);
  9598. _this.onProcessError();
  9599. };
  9600. File.createObjectURL(this.data, this.xhrLoader.response, 'image/png');
  9601. },
  9602. /**
  9603. * Adds this file to its target cache upon successful loading and processing.
  9604. *
  9605. * @method Phaser.Loader.FileTypes.ImageFile#addToCache
  9606. * @since 3.7.0
  9607. */
  9608. addToCache: function ()
  9609. {
  9610. var texture;
  9611. var linkFile = this.linkFile;
  9612. if (linkFile && linkFile.state === CONST.FILE_COMPLETE)
  9613. {
  9614. if (this.type === 'image')
  9615. {
  9616. texture = this.cache.addImage(this.key, this.data, linkFile.data);
  9617. }
  9618. else
  9619. {
  9620. texture = this.cache.addImage(linkFile.key, linkFile.data, this.data);
  9621. }
  9622. this.pendingDestroy(texture);
  9623. linkFile.pendingDestroy(texture);
  9624. }
  9625. else if (!linkFile)
  9626. {
  9627. texture = this.cache.addImage(this.key, this.data);
  9628. this.pendingDestroy(texture);
  9629. }
  9630. }
  9631. });
  9632. /**
  9633. * Adds an Image, or array of Images, to the current load queue.
  9634. *
  9635. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  9636. *
  9637. * ```javascript
  9638. * function preload ()
  9639. * {
  9640. * this.load.image('logo', 'images/phaserLogo.png');
  9641. * }
  9642. * ```
  9643. *
  9644. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  9645. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  9646. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  9647. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  9648. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  9649. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  9650. * loaded.
  9651. *
  9652. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  9653. * If you try to load an animated gif only the first frame will be rendered. Browsers do not natively support playback
  9654. * of animated gifs to Canvas elements.
  9655. *
  9656. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  9657. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  9658. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  9659. * then remove it from the Texture Manager first, before loading a new one.
  9660. *
  9661. * Instead of passing arguments you can pass a configuration object, such as:
  9662. *
  9663. * ```javascript
  9664. * this.load.image({
  9665. * key: 'logo',
  9666. * url: 'images/AtariLogo.png'
  9667. * });
  9668. * ```
  9669. *
  9670. * See the documentation for `Phaser.Loader.FileTypes.ImageFileConfig` for more details.
  9671. *
  9672. * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key:
  9673. *
  9674. * ```javascript
  9675. * this.load.image('logo', 'images/AtariLogo.png');
  9676. * // and later in your game ...
  9677. * this.add.image(x, y, 'logo');
  9678. * ```
  9679. *
  9680. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  9681. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  9682. * this is what you would use to retrieve the image from the Texture Manager.
  9683. *
  9684. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  9685. *
  9686. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  9687. * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although
  9688. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  9689. *
  9690. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  9691. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  9692. *
  9693. * ```javascript
  9694. * this.load.image('logo', [ 'images/AtariLogo.png', 'images/AtariLogo-n.png' ]);
  9695. * ```
  9696. *
  9697. * Or, if you are using a config object use the `normalMap` property:
  9698. *
  9699. * ```javascript
  9700. * this.load.image({
  9701. * key: 'logo',
  9702. * url: 'images/AtariLogo.png',
  9703. * normalMap: 'images/AtariLogo-n.png'
  9704. * });
  9705. * ```
  9706. *
  9707. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  9708. * Normal maps are a WebGL only feature.
  9709. *
  9710. * Note: The ability to load this type of file will only be available if the Image File type has been built into Phaser.
  9711. * It is available in the default build but can be excluded from custom builds.
  9712. *
  9713. * @method Phaser.Loader.LoaderPlugin#image
  9714. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  9715. * @since 3.0.0
  9716. *
  9717. * @param {(string|Phaser.Loader.FileTypes.ImageFileConfig|Phaser.Loader.FileTypes.ImageFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  9718. * @param {string|string[]} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  9719. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  9720. *
  9721. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  9722. */
  9723. FileTypesManager.register('image', function (key, url, xhrSettings)
  9724. {
  9725. if (Array.isArray(key))
  9726. {
  9727. for (var i = 0; i < key.length; i++)
  9728. {
  9729. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  9730. this.addFile(new ImageFile(this, key[i]));
  9731. }
  9732. }
  9733. else
  9734. {
  9735. this.addFile(new ImageFile(this, key, url, xhrSettings));
  9736. }
  9737. return this;
  9738. });
  9739. module.exports = ImageFile;
  9740. /***/ }),
  9741. /* 65 */
  9742. /***/ (function(module, exports, __webpack_require__) {
  9743. /**
  9744. * @author Richard Davey <rich@photonstorm.com>
  9745. * @copyright 2019 Photon Storm Ltd.
  9746. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  9747. */
  9748. var Class = __webpack_require__(0);
  9749. var Contains = __webpack_require__(74);
  9750. var GetPoint = __webpack_require__(283);
  9751. var GetPoints = __webpack_require__(282);
  9752. var Line = __webpack_require__(59);
  9753. var Random = __webpack_require__(198);
  9754. /**
  9755. * @classdesc
  9756. * A triangle is a plane created by connecting three points.
  9757. * The first two arguments specify the first point, the middle two arguments
  9758. * specify the second point, and the last two arguments specify the third point.
  9759. *
  9760. * @class Triangle
  9761. * @memberof Phaser.Geom
  9762. * @constructor
  9763. * @since 3.0.0
  9764. *
  9765. * @param {number} [x1=0] - `x` coordinate of the first point.
  9766. * @param {number} [y1=0] - `y` coordinate of the first point.
  9767. * @param {number} [x2=0] - `x` coordinate of the second point.
  9768. * @param {number} [y2=0] - `y` coordinate of the second point.
  9769. * @param {number} [x3=0] - `x` coordinate of the third point.
  9770. * @param {number} [y3=0] - `y` coordinate of the third point.
  9771. */
  9772. var Triangle = new Class({
  9773. initialize:
  9774. function Triangle (x1, y1, x2, y2, x3, y3)
  9775. {
  9776. if (x1 === undefined) { x1 = 0; }
  9777. if (y1 === undefined) { y1 = 0; }
  9778. if (x2 === undefined) { x2 = 0; }
  9779. if (y2 === undefined) { y2 = 0; }
  9780. if (x3 === undefined) { x3 = 0; }
  9781. if (y3 === undefined) { y3 = 0; }
  9782. /**
  9783. * `x` coordinate of the first point.
  9784. *
  9785. * @name Phaser.Geom.Triangle#x1
  9786. * @type {number}
  9787. * @default 0
  9788. * @since 3.0.0
  9789. */
  9790. this.x1 = x1;
  9791. /**
  9792. * `y` coordinate of the first point.
  9793. *
  9794. * @name Phaser.Geom.Triangle#y1
  9795. * @type {number}
  9796. * @default 0
  9797. * @since 3.0.0
  9798. */
  9799. this.y1 = y1;
  9800. /**
  9801. * `x` coordinate of the second point.
  9802. *
  9803. * @name Phaser.Geom.Triangle#x2
  9804. * @type {number}
  9805. * @default 0
  9806. * @since 3.0.0
  9807. */
  9808. this.x2 = x2;
  9809. /**
  9810. * `y` coordinate of the second point.
  9811. *
  9812. * @name Phaser.Geom.Triangle#y2
  9813. * @type {number}
  9814. * @default 0
  9815. * @since 3.0.0
  9816. */
  9817. this.y2 = y2;
  9818. /**
  9819. * `x` coordinate of the third point.
  9820. *
  9821. * @name Phaser.Geom.Triangle#x3
  9822. * @type {number}
  9823. * @default 0
  9824. * @since 3.0.0
  9825. */
  9826. this.x3 = x3;
  9827. /**
  9828. * `y` coordinate of the third point.
  9829. *
  9830. * @name Phaser.Geom.Triangle#y3
  9831. * @type {number}
  9832. * @default 0
  9833. * @since 3.0.0
  9834. */
  9835. this.y3 = y3;
  9836. },
  9837. /**
  9838. * Checks whether a given points lies within the triangle.
  9839. *
  9840. * @method Phaser.Geom.Triangle#contains
  9841. * @since 3.0.0
  9842. *
  9843. * @param {number} x - The x coordinate of the point to check.
  9844. * @param {number} y - The y coordinate of the point to check.
  9845. *
  9846. * @return {boolean} `true` if the coordinate pair is within the triangle, otherwise `false`.
  9847. */
  9848. contains: function (x, y)
  9849. {
  9850. return Contains(this, x, y);
  9851. },
  9852. /**
  9853. * Returns a specific point on the triangle.
  9854. *
  9855. * @method Phaser.Geom.Triangle#getPoint
  9856. * @since 3.0.0
  9857. *
  9858. * @generic {Phaser.Geom.Point} O - [output,$return]
  9859. *
  9860. * @param {number} position - Position as float within `0` and `1`. `0` equals the first point.
  9861. * @param {(Phaser.Geom.Point|object)} [output] - Optional Point, or point-like object, that the calculated point will be written to.
  9862. *
  9863. * @return {(Phaser.Geom.Point|object)} Calculated `Point` that represents the requested position. It is the same as `output` when this parameter has been given.
  9864. */
  9865. getPoint: function (position, output)
  9866. {
  9867. return GetPoint(this, position, output);
  9868. },
  9869. /**
  9870. * Calculates a list of evenly distributed points on the triangle. It is either possible to pass an amount of points to be generated (`quantity`) or the distance between two points (`stepRate`).
  9871. *
  9872. * @method Phaser.Geom.Triangle#getPoints
  9873. * @since 3.0.0
  9874. *
  9875. * @generic {Phaser.Geom.Point[]} O - [output,$return]
  9876. *
  9877. * @param {integer} quantity - Number of points to be generated. Can be falsey when `stepRate` should be used. All points have the same distance along the triangle.
  9878. * @param {number} [stepRate] - Distance between two points. Will only be used when `quantity` is falsey.
  9879. * @param {(array|Phaser.Geom.Point[])} [output] - Optional Array for writing the calculated points into. Otherwise a new array will be created.
  9880. *
  9881. * @return {(array|Phaser.Geom.Point[])} Returns a list of calculated `Point` instances or the filled array passed as parameter `output`.
  9882. */
  9883. getPoints: function (quantity, stepRate, output)
  9884. {
  9885. return GetPoints(this, quantity, stepRate, output);
  9886. },
  9887. /**
  9888. * Returns a random point along the triangle.
  9889. *
  9890. * @method Phaser.Geom.Triangle#getRandomPoint
  9891. * @since 3.0.0
  9892. *
  9893. * @generic {Phaser.Geom.Point} O - [point,$return]
  9894. *
  9895. * @param {Phaser.Geom.Point} [point] - Optional `Point` that should be modified. Otherwise a new one will be created.
  9896. *
  9897. * @return {Phaser.Geom.Point} Random `Point`. When parameter `point` has been provided it will be returned.
  9898. */
  9899. getRandomPoint: function (point)
  9900. {
  9901. return Random(this, point);
  9902. },
  9903. /**
  9904. * Sets all three points of the triangle. Leaving out any coordinate sets it to be `0`.
  9905. *
  9906. * @method Phaser.Geom.Triangle#setTo
  9907. * @since 3.0.0
  9908. *
  9909. * @param {number} [x1=0] - `x` coordinate of the first point.
  9910. * @param {number} [y1=0] - `y` coordinate of the first point.
  9911. * @param {number} [x2=0] - `x` coordinate of the second point.
  9912. * @param {number} [y2=0] - `y` coordinate of the second point.
  9913. * @param {number} [x3=0] - `x` coordinate of the third point.
  9914. * @param {number} [y3=0] - `y` coordinate of the third point.
  9915. *
  9916. * @return {Phaser.Geom.Triangle} This Triangle object.
  9917. */
  9918. setTo: function (x1, y1, x2, y2, x3, y3)
  9919. {
  9920. if (x1 === undefined) { x1 = 0; }
  9921. if (y1 === undefined) { y1 = 0; }
  9922. if (x2 === undefined) { x2 = 0; }
  9923. if (y2 === undefined) { y2 = 0; }
  9924. if (x3 === undefined) { x3 = 0; }
  9925. if (y3 === undefined) { y3 = 0; }
  9926. this.x1 = x1;
  9927. this.y1 = y1;
  9928. this.x2 = x2;
  9929. this.y2 = y2;
  9930. this.x3 = x3;
  9931. this.y3 = y3;
  9932. return this;
  9933. },
  9934. /**
  9935. * Returns a Line object that corresponds to Line A of this Triangle.
  9936. *
  9937. * @method Phaser.Geom.Triangle#getLineA
  9938. * @since 3.0.0
  9939. *
  9940. * @generic {Phaser.Geom.Line} O - [line,$return]
  9941. *
  9942. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  9943. *
  9944. * @return {Phaser.Geom.Line} A Line object that corresponds to line A of this Triangle.
  9945. */
  9946. getLineA: function (line)
  9947. {
  9948. if (line === undefined) { line = new Line(); }
  9949. line.setTo(this.x1, this.y1, this.x2, this.y2);
  9950. return line;
  9951. },
  9952. /**
  9953. * Returns a Line object that corresponds to Line B of this Triangle.
  9954. *
  9955. * @method Phaser.Geom.Triangle#getLineB
  9956. * @since 3.0.0
  9957. *
  9958. * @generic {Phaser.Geom.Line} O - [line,$return]
  9959. *
  9960. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  9961. *
  9962. * @return {Phaser.Geom.Line} A Line object that corresponds to line B of this Triangle.
  9963. */
  9964. getLineB: function (line)
  9965. {
  9966. if (line === undefined) { line = new Line(); }
  9967. line.setTo(this.x2, this.y2, this.x3, this.y3);
  9968. return line;
  9969. },
  9970. /**
  9971. * Returns a Line object that corresponds to Line C of this Triangle.
  9972. *
  9973. * @method Phaser.Geom.Triangle#getLineC
  9974. * @since 3.0.0
  9975. *
  9976. * @generic {Phaser.Geom.Line} O - [line,$return]
  9977. *
  9978. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  9979. *
  9980. * @return {Phaser.Geom.Line} A Line object that corresponds to line C of this Triangle.
  9981. */
  9982. getLineC: function (line)
  9983. {
  9984. if (line === undefined) { line = new Line(); }
  9985. line.setTo(this.x3, this.y3, this.x1, this.y1);
  9986. return line;
  9987. },
  9988. /**
  9989. * Left most X coordinate of the triangle. Setting it moves the triangle on the X axis accordingly.
  9990. *
  9991. * @name Phaser.Geom.Triangle#left
  9992. * @type {number}
  9993. * @since 3.0.0
  9994. */
  9995. left: {
  9996. get: function ()
  9997. {
  9998. return Math.min(this.x1, this.x2, this.x3);
  9999. },
  10000. set: function (value)
  10001. {
  10002. var diff = 0;
  10003. if (this.x1 <= this.x2 && this.x1 <= this.x3)
  10004. {
  10005. diff = this.x1 - value;
  10006. }
  10007. else if (this.x2 <= this.x1 && this.x2 <= this.x3)
  10008. {
  10009. diff = this.x2 - value;
  10010. }
  10011. else
  10012. {
  10013. diff = this.x3 - value;
  10014. }
  10015. this.x1 -= diff;
  10016. this.x2 -= diff;
  10017. this.x3 -= diff;
  10018. }
  10019. },
  10020. /**
  10021. * Right most X coordinate of the triangle. Setting it moves the triangle on the X axis accordingly.
  10022. *
  10023. * @name Phaser.Geom.Triangle#right
  10024. * @type {number}
  10025. * @since 3.0.0
  10026. */
  10027. right: {
  10028. get: function ()
  10029. {
  10030. return Math.max(this.x1, this.x2, this.x3);
  10031. },
  10032. set: function (value)
  10033. {
  10034. var diff = 0;
  10035. if (this.x1 >= this.x2 && this.x1 >= this.x3)
  10036. {
  10037. diff = this.x1 - value;
  10038. }
  10039. else if (this.x2 >= this.x1 && this.x2 >= this.x3)
  10040. {
  10041. diff = this.x2 - value;
  10042. }
  10043. else
  10044. {
  10045. diff = this.x3 - value;
  10046. }
  10047. this.x1 -= diff;
  10048. this.x2 -= diff;
  10049. this.x3 -= diff;
  10050. }
  10051. },
  10052. /**
  10053. * Top most Y coordinate of the triangle. Setting it moves the triangle on the Y axis accordingly.
  10054. *
  10055. * @name Phaser.Geom.Triangle#top
  10056. * @type {number}
  10057. * @since 3.0.0
  10058. */
  10059. top: {
  10060. get: function ()
  10061. {
  10062. return Math.min(this.y1, this.y2, this.y3);
  10063. },
  10064. set: function (value)
  10065. {
  10066. var diff = 0;
  10067. if (this.y1 <= this.y2 && this.y1 <= this.y3)
  10068. {
  10069. diff = this.y1 - value;
  10070. }
  10071. else if (this.y2 <= this.y1 && this.y2 <= this.y3)
  10072. {
  10073. diff = this.y2 - value;
  10074. }
  10075. else
  10076. {
  10077. diff = this.y3 - value;
  10078. }
  10079. this.y1 -= diff;
  10080. this.y2 -= diff;
  10081. this.y3 -= diff;
  10082. }
  10083. },
  10084. /**
  10085. * Bottom most Y coordinate of the triangle. Setting it moves the triangle on the Y axis accordingly.
  10086. *
  10087. * @name Phaser.Geom.Triangle#bottom
  10088. * @type {number}
  10089. * @since 3.0.0
  10090. */
  10091. bottom: {
  10092. get: function ()
  10093. {
  10094. return Math.max(this.y1, this.y2, this.y3);
  10095. },
  10096. set: function (value)
  10097. {
  10098. var diff = 0;
  10099. if (this.y1 >= this.y2 && this.y1 >= this.y3)
  10100. {
  10101. diff = this.y1 - value;
  10102. }
  10103. else if (this.y2 >= this.y1 && this.y2 >= this.y3)
  10104. {
  10105. diff = this.y2 - value;
  10106. }
  10107. else
  10108. {
  10109. diff = this.y3 - value;
  10110. }
  10111. this.y1 -= diff;
  10112. this.y2 -= diff;
  10113. this.y3 -= diff;
  10114. }
  10115. }
  10116. });
  10117. module.exports = Triangle;
  10118. /***/ }),
  10119. /* 66 */
  10120. /***/ (function(module, exports, __webpack_require__) {
  10121. /**
  10122. * @author Richard Davey <rich@photonstorm.com>
  10123. * @copyright 2019 Photon Storm Ltd.
  10124. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  10125. */
  10126. var Utils = __webpack_require__(9);
  10127. /**
  10128. * Renders a stroke outline around the given Shape.
  10129. *
  10130. * @method Phaser.GameObjects.Shape#StrokePathWebGL
  10131. * @since 3.13.0
  10132. * @private
  10133. *
  10134. * @param {Phaser.Renderer.WebGL.WebGLPipeline} pipeline - The WebGL Pipeline used to render this Shape.
  10135. * @param {Phaser.GameObjects.Shape} src - The Game Object shape being rendered in this call.
  10136. * @param {number} alpha - The base alpha value.
  10137. * @param {number} dx - The source displayOriginX.
  10138. * @param {number} dy - The source displayOriginY.
  10139. */
  10140. var StrokePathWebGL = function (pipeline, src, alpha, dx, dy)
  10141. {
  10142. var strokeTint = pipeline.strokeTint;
  10143. var strokeTintColor = Utils.getTintAppendFloatAlphaAndSwap(src.strokeColor, src.strokeAlpha * alpha);
  10144. strokeTint.TL = strokeTintColor;
  10145. strokeTint.TR = strokeTintColor;
  10146. strokeTint.BL = strokeTintColor;
  10147. strokeTint.BR = strokeTintColor;
  10148. var path = src.pathData;
  10149. var pathLength = path.length - 1;
  10150. var lineWidth = src.lineWidth;
  10151. var halfLineWidth = lineWidth / 2;
  10152. var px1 = path[0] - dx;
  10153. var py1 = path[1] - dy;
  10154. if (!src.closePath)
  10155. {
  10156. pathLength -= 2;
  10157. }
  10158. for (var i = 2; i < pathLength; i += 2)
  10159. {
  10160. var px2 = path[i] - dx;
  10161. var py2 = path[i + 1] - dy;
  10162. pipeline.setTexture2D();
  10163. pipeline.batchLine(
  10164. px1,
  10165. py1,
  10166. px2,
  10167. py2,
  10168. halfLineWidth,
  10169. halfLineWidth,
  10170. lineWidth,
  10171. i - 2,
  10172. (src.closePath) ? (i === pathLength - 1) : false
  10173. );
  10174. px1 = px2;
  10175. py1 = py2;
  10176. }
  10177. };
  10178. module.exports = StrokePathWebGL;
  10179. /***/ }),
  10180. /* 67 */
  10181. /***/ (function(module, exports, __webpack_require__) {
  10182. /**
  10183. * @author Richard Davey <rich@photonstorm.com>
  10184. * @copyright 2019 Photon Storm Ltd.
  10185. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  10186. */
  10187. var Class = __webpack_require__(0);
  10188. var Components = __webpack_require__(13);
  10189. var GameObject = __webpack_require__(18);
  10190. var SpriteRender = __webpack_require__(852);
  10191. /**
  10192. * @classdesc
  10193. * A Sprite Game Object.
  10194. *
  10195. * A Sprite Game Object is used for the display of both static and animated images in your game.
  10196. * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled
  10197. * and animated.
  10198. *
  10199. * The main difference between a Sprite and an Image Game Object is that you cannot animate Images.
  10200. * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation
  10201. * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases.
  10202. *
  10203. * @class Sprite
  10204. * @extends Phaser.GameObjects.GameObject
  10205. * @memberof Phaser.GameObjects
  10206. * @constructor
  10207. * @since 3.0.0
  10208. *
  10209. * @extends Phaser.GameObjects.Components.Alpha
  10210. * @extends Phaser.GameObjects.Components.BlendMode
  10211. * @extends Phaser.GameObjects.Components.Depth
  10212. * @extends Phaser.GameObjects.Components.Flip
  10213. * @extends Phaser.GameObjects.Components.GetBounds
  10214. * @extends Phaser.GameObjects.Components.Mask
  10215. * @extends Phaser.GameObjects.Components.Origin
  10216. * @extends Phaser.GameObjects.Components.Pipeline
  10217. * @extends Phaser.GameObjects.Components.ScaleMode
  10218. * @extends Phaser.GameObjects.Components.ScrollFactor
  10219. * @extends Phaser.GameObjects.Components.Size
  10220. * @extends Phaser.GameObjects.Components.TextureCrop
  10221. * @extends Phaser.GameObjects.Components.Tint
  10222. * @extends Phaser.GameObjects.Components.Transform
  10223. * @extends Phaser.GameObjects.Components.Visible
  10224. *
  10225. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  10226. * @param {number} x - The horizontal position of this Game Object in the world.
  10227. * @param {number} y - The vertical position of this Game Object in the world.
  10228. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  10229. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  10230. */
  10231. var Sprite = new Class({
  10232. Extends: GameObject,
  10233. Mixins: [
  10234. Components.Alpha,
  10235. Components.BlendMode,
  10236. Components.Depth,
  10237. Components.Flip,
  10238. Components.GetBounds,
  10239. Components.Mask,
  10240. Components.Origin,
  10241. Components.Pipeline,
  10242. Components.ScaleMode,
  10243. Components.ScrollFactor,
  10244. Components.Size,
  10245. Components.TextureCrop,
  10246. Components.Tint,
  10247. Components.Transform,
  10248. Components.Visible,
  10249. SpriteRender
  10250. ],
  10251. initialize:
  10252. function Sprite (scene, x, y, texture, frame)
  10253. {
  10254. GameObject.call(this, scene, 'Sprite');
  10255. /**
  10256. * The internal crop data object, as used by `setCrop` and passed to the `Frame.setCropUVs` method.
  10257. *
  10258. * @name Phaser.GameObjects.Sprite#_crop
  10259. * @type {object}
  10260. * @private
  10261. * @since 3.11.0
  10262. */
  10263. this._crop = this.resetCropObject();
  10264. /**
  10265. * The Animation Controller of this Sprite.
  10266. *
  10267. * @name Phaser.GameObjects.Sprite#anims
  10268. * @type {Phaser.GameObjects.Components.Animation}
  10269. * @since 3.0.0
  10270. */
  10271. this.anims = new Components.Animation(this);
  10272. this.setTexture(texture, frame);
  10273. this.setPosition(x, y);
  10274. this.setSizeToFrame();
  10275. this.setOriginFromFrame();
  10276. this.initPipeline();
  10277. },
  10278. /**
  10279. * Update this Sprite's animations.
  10280. *
  10281. * @method Phaser.GameObjects.Sprite#preUpdate
  10282. * @protected
  10283. * @since 3.0.0
  10284. *
  10285. * @param {number} time - The current timestamp.
  10286. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  10287. */
  10288. preUpdate: function (time, delta)
  10289. {
  10290. this.anims.update(time, delta);
  10291. },
  10292. /**
  10293. * Start playing the given animation.
  10294. *
  10295. * @method Phaser.GameObjects.Sprite#play
  10296. * @since 3.0.0
  10297. *
  10298. * @param {string} key - The string-based key of the animation to play.
  10299. * @param {boolean} [ignoreIfPlaying=false] - If an animation is already playing then ignore this call.
  10300. * @param {integer} [startFrame=0] - Optionally start the animation playing from this frame index.
  10301. *
  10302. * @return {Phaser.GameObjects.Sprite} This Game Object.
  10303. */
  10304. play: function (key, ignoreIfPlaying, startFrame)
  10305. {
  10306. this.anims.play(key, ignoreIfPlaying, startFrame);
  10307. return this;
  10308. },
  10309. /**
  10310. * Build a JSON representation of this Sprite.
  10311. *
  10312. * @method Phaser.GameObjects.Sprite#toJSON
  10313. * @since 3.0.0
  10314. *
  10315. * @return {JSONGameObject} A JSON representation of the Game Object.
  10316. */
  10317. toJSON: function ()
  10318. {
  10319. var data = Components.ToJSON(this);
  10320. // Extra Sprite data is added here
  10321. return data;
  10322. },
  10323. /**
  10324. * Handles the pre-destroy step for the Sprite, which removes the Animation component.
  10325. *
  10326. * @method Phaser.GameObjects.Sprite#preDestroy
  10327. * @private
  10328. * @since 3.14.0
  10329. */
  10330. preDestroy: function ()
  10331. {
  10332. this.anims.destroy();
  10333. this.anims = undefined;
  10334. }
  10335. });
  10336. module.exports = Sprite;
  10337. /***/ }),
  10338. /* 68 */
  10339. /***/ (function(module, exports) {
  10340. /**
  10341. * @author Richard Davey <rich@photonstorm.com>
  10342. * @copyright 2019 Photon Storm Ltd.
  10343. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  10344. */
  10345. /**
  10346. * Tests if the start and end indexes are a safe range for the given array.
  10347. *
  10348. * @function Phaser.Utils.Array.SafeRange
  10349. * @since 3.4.0
  10350. *
  10351. * @param {array} array - The array to check.
  10352. * @param {integer} startIndex - The start index.
  10353. * @param {integer} endIndex - The end index.
  10354. * @param {boolean} [throwError=true] - Throw an error if the range is out of bounds.
  10355. *
  10356. * @return {boolean} True if the range is safe, otherwise false.
  10357. */
  10358. var SafeRange = function (array, startIndex, endIndex, throwError)
  10359. {
  10360. var len = array.length;
  10361. if (startIndex < 0 ||
  10362. startIndex > len ||
  10363. startIndex >= endIndex ||
  10364. endIndex > len ||
  10365. startIndex + endIndex > len)
  10366. {
  10367. if (throwError)
  10368. {
  10369. throw new Error('Range Error: Values outside acceptable range');
  10370. }
  10371. return false;
  10372. }
  10373. else
  10374. {
  10375. return true;
  10376. }
  10377. };
  10378. module.exports = SafeRange;
  10379. /***/ }),
  10380. /* 69 */
  10381. /***/ (function(module, exports, __webpack_require__) {
  10382. /**
  10383. * @author Richard Davey <rich@photonstorm.com>
  10384. * @copyright 2019 Photon Storm Ltd.
  10385. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  10386. */
  10387. /**
  10388. * @namespace Phaser.Sound.Events
  10389. */
  10390. module.exports = {
  10391. COMPLETE: __webpack_require__(932),
  10392. DESTROY: __webpack_require__(931),
  10393. DETUNE: __webpack_require__(930),
  10394. GLOBAL_DETUNE: __webpack_require__(929),
  10395. GLOBAL_MUTE: __webpack_require__(928),
  10396. GLOBAL_RATE: __webpack_require__(927),
  10397. GLOBAL_VOLUME: __webpack_require__(926),
  10398. LOOP: __webpack_require__(925),
  10399. LOOPED: __webpack_require__(924),
  10400. MUTE: __webpack_require__(923),
  10401. PAUSE_ALL: __webpack_require__(922),
  10402. PAUSE: __webpack_require__(921),
  10403. PLAY: __webpack_require__(920),
  10404. RATE: __webpack_require__(919),
  10405. RESUME_ALL: __webpack_require__(918),
  10406. RESUME: __webpack_require__(917),
  10407. SEEK: __webpack_require__(916),
  10408. STOP_ALL: __webpack_require__(915),
  10409. STOP: __webpack_require__(914),
  10410. UNLOCKED: __webpack_require__(913),
  10411. VOLUME: __webpack_require__(912)
  10412. };
  10413. /***/ }),
  10414. /* 70 */
  10415. /***/ (function(module, exports) {
  10416. /**
  10417. * @author Richard Davey <rich@photonstorm.com>
  10418. * @copyright 2019 Photon Storm Ltd.
  10419. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  10420. */
  10421. /**
  10422. * Shallow Object Clone. Will not clone nested objects.
  10423. *
  10424. * @function Phaser.Utils.Objects.Clone
  10425. * @since 3.0.0
  10426. *
  10427. * @param {object} obj - the object from which to clone
  10428. *
  10429. * @return {object} a new object with the same properties as the input obj
  10430. */
  10431. var Clone = function (obj)
  10432. {
  10433. var clone = {};
  10434. for (var key in obj)
  10435. {
  10436. if (Array.isArray(obj[key]))
  10437. {
  10438. clone[key] = obj[key].slice(0);
  10439. }
  10440. else
  10441. {
  10442. clone[key] = obj[key];
  10443. }
  10444. }
  10445. return clone;
  10446. };
  10447. module.exports = Clone;
  10448. /***/ }),
  10449. /* 71 */
  10450. /***/ (function(module, exports, __webpack_require__) {
  10451. "use strict";
  10452. /**
  10453. * @author Richard Davey <rich@photonstorm.com>
  10454. * @copyright 2019 Photon Storm Ltd.
  10455. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  10456. */
  10457. // Earcut 2.1.4 (December 4th 2018)
  10458. /*
  10459. * ISC License
  10460. *
  10461. * Copyright (c) 2016, Mapbox
  10462. *
  10463. * Permission to use, copy, modify, and/or distribute this software for any purpose
  10464. * with or without fee is hereby granted, provided that the above copyright notice
  10465. * and this permission notice appear in all copies.
  10466. *
  10467. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
  10468. * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  10469. * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
  10470. * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  10471. * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  10472. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
  10473. * THIS SOFTWARE.
  10474. */
  10475. module.exports = earcut;
  10476. function earcut(data, holeIndices, dim) {
  10477. dim = dim || 2;
  10478. var hasHoles = holeIndices && holeIndices.length,
  10479. outerLen = hasHoles ? holeIndices[0] * dim : data.length,
  10480. outerNode = linkedList(data, 0, outerLen, dim, true),
  10481. triangles = [];
  10482. if (!outerNode || outerNode.next === outerNode.prev) return triangles;
  10483. var minX, minY, maxX, maxY, x, y, invSize;
  10484. if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
  10485. // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
  10486. if (data.length > 80 * dim) {
  10487. minX = maxX = data[0];
  10488. minY = maxY = data[1];
  10489. for (var i = dim; i < outerLen; i += dim) {
  10490. x = data[i];
  10491. y = data[i + 1];
  10492. if (x < minX) minX = x;
  10493. if (y < minY) minY = y;
  10494. if (x > maxX) maxX = x;
  10495. if (y > maxY) maxY = y;
  10496. }
  10497. // minX, minY and invSize are later used to transform coords into integers for z-order calculation
  10498. invSize = Math.max(maxX - minX, maxY - minY);
  10499. invSize = invSize !== 0 ? 1 / invSize : 0;
  10500. }
  10501. earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
  10502. return triangles;
  10503. }
  10504. // create a circular doubly linked list from polygon points in the specified winding order
  10505. function linkedList(data, start, end, dim, clockwise) {
  10506. var i, last;
  10507. if (clockwise === (signedArea(data, start, end, dim) > 0)) {
  10508. for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
  10509. } else {
  10510. for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
  10511. }
  10512. if (last && equals(last, last.next)) {
  10513. removeNode(last);
  10514. last = last.next;
  10515. }
  10516. return last;
  10517. }
  10518. // eliminate colinear or duplicate points
  10519. function filterPoints(start, end) {
  10520. if (!start) return start;
  10521. if (!end) end = start;
  10522. var p = start,
  10523. again;
  10524. do {
  10525. again = false;
  10526. if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
  10527. removeNode(p);
  10528. p = end = p.prev;
  10529. if (p === p.next) break;
  10530. again = true;
  10531. } else {
  10532. p = p.next;
  10533. }
  10534. } while (again || p !== end);
  10535. return end;
  10536. }
  10537. // main ear slicing loop which triangulates a polygon (given as a linked list)
  10538. function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
  10539. if (!ear) return;
  10540. // interlink polygon nodes in z-order
  10541. if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
  10542. var stop = ear,
  10543. prev, next;
  10544. // iterate through ears, slicing them one by one
  10545. while (ear.prev !== ear.next) {
  10546. prev = ear.prev;
  10547. next = ear.next;
  10548. if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
  10549. // cut off the triangle
  10550. triangles.push(prev.i / dim);
  10551. triangles.push(ear.i / dim);
  10552. triangles.push(next.i / dim);
  10553. removeNode(ear);
  10554. // skipping the next vertex leads to less sliver triangles
  10555. ear = next.next;
  10556. stop = next.next;
  10557. continue;
  10558. }
  10559. ear = next;
  10560. // if we looped through the whole remaining polygon and can't find any more ears
  10561. if (ear === stop) {
  10562. // try filtering points and slicing again
  10563. if (!pass) {
  10564. earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
  10565. // if this didn't work, try curing all small self-intersections locally
  10566. } else if (pass === 1) {
  10567. ear = cureLocalIntersections(ear, triangles, dim);
  10568. earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
  10569. // as a last resort, try splitting the remaining polygon into two
  10570. } else if (pass === 2) {
  10571. splitEarcut(ear, triangles, dim, minX, minY, invSize);
  10572. }
  10573. break;
  10574. }
  10575. }
  10576. }
  10577. // check whether a polygon node forms a valid ear with adjacent nodes
  10578. function isEar(ear) {
  10579. var a = ear.prev,
  10580. b = ear,
  10581. c = ear.next;
  10582. if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
  10583. // now make sure we don't have other points inside the potential ear
  10584. var p = ear.next.next;
  10585. while (p !== ear.prev) {
  10586. if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
  10587. area(p.prev, p, p.next) >= 0) return false;
  10588. p = p.next;
  10589. }
  10590. return true;
  10591. }
  10592. function isEarHashed(ear, minX, minY, invSize) {
  10593. var a = ear.prev,
  10594. b = ear,
  10595. c = ear.next;
  10596. if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
  10597. // triangle bbox; min & max are calculated like this for speed
  10598. var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
  10599. minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
  10600. maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
  10601. maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
  10602. // z-order range for the current triangle bbox;
  10603. var minZ = zOrder(minTX, minTY, minX, minY, invSize),
  10604. maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
  10605. var p = ear.prevZ,
  10606. n = ear.nextZ;
  10607. // look for points inside the triangle in both directions
  10608. while (p && p.z >= minZ && n && n.z <= maxZ) {
  10609. if (p !== ear.prev && p !== ear.next &&
  10610. pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
  10611. area(p.prev, p, p.next) >= 0) return false;
  10612. p = p.prevZ;
  10613. if (n !== ear.prev && n !== ear.next &&
  10614. pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
  10615. area(n.prev, n, n.next) >= 0) return false;
  10616. n = n.nextZ;
  10617. }
  10618. // look for remaining points in decreasing z-order
  10619. while (p && p.z >= minZ) {
  10620. if (p !== ear.prev && p !== ear.next &&
  10621. pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
  10622. area(p.prev, p, p.next) >= 0) return false;
  10623. p = p.prevZ;
  10624. }
  10625. // look for remaining points in increasing z-order
  10626. while (n && n.z <= maxZ) {
  10627. if (n !== ear.prev && n !== ear.next &&
  10628. pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
  10629. area(n.prev, n, n.next) >= 0) return false;
  10630. n = n.nextZ;
  10631. }
  10632. return true;
  10633. }
  10634. // go through all polygon nodes and cure small local self-intersections
  10635. function cureLocalIntersections(start, triangles, dim) {
  10636. var p = start;
  10637. do {
  10638. var a = p.prev,
  10639. b = p.next.next;
  10640. if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
  10641. triangles.push(a.i / dim);
  10642. triangles.push(p.i / dim);
  10643. triangles.push(b.i / dim);
  10644. // remove two nodes involved
  10645. removeNode(p);
  10646. removeNode(p.next);
  10647. p = start = b;
  10648. }
  10649. p = p.next;
  10650. } while (p !== start);
  10651. return p;
  10652. }
  10653. // try splitting polygon into two and triangulate them independently
  10654. function splitEarcut(start, triangles, dim, minX, minY, invSize) {
  10655. // look for a valid diagonal that divides the polygon into two
  10656. var a = start;
  10657. do {
  10658. var b = a.next.next;
  10659. while (b !== a.prev) {
  10660. if (a.i !== b.i && isValidDiagonal(a, b)) {
  10661. // split the polygon in two by the diagonal
  10662. var c = splitPolygon(a, b);
  10663. // filter colinear points around the cuts
  10664. a = filterPoints(a, a.next);
  10665. c = filterPoints(c, c.next);
  10666. // run earcut on each half
  10667. earcutLinked(a, triangles, dim, minX, minY, invSize);
  10668. earcutLinked(c, triangles, dim, minX, minY, invSize);
  10669. return;
  10670. }
  10671. b = b.next;
  10672. }
  10673. a = a.next;
  10674. } while (a !== start);
  10675. }
  10676. // link every hole into the outer loop, producing a single-ring polygon without holes
  10677. function eliminateHoles(data, holeIndices, outerNode, dim) {
  10678. var queue = [],
  10679. i, len, start, end, list;
  10680. for (i = 0, len = holeIndices.length; i < len; i++) {
  10681. start = holeIndices[i] * dim;
  10682. end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
  10683. list = linkedList(data, start, end, dim, false);
  10684. if (list === list.next) list.steiner = true;
  10685. queue.push(getLeftmost(list));
  10686. }
  10687. queue.sort(compareX);
  10688. // process holes from left to right
  10689. for (i = 0; i < queue.length; i++) {
  10690. eliminateHole(queue[i], outerNode);
  10691. outerNode = filterPoints(outerNode, outerNode.next);
  10692. }
  10693. return outerNode;
  10694. }
  10695. function compareX(a, b) {
  10696. return a.x - b.x;
  10697. }
  10698. // find a bridge between vertices that connects hole with an outer ring and and link it
  10699. function eliminateHole(hole, outerNode) {
  10700. outerNode = findHoleBridge(hole, outerNode);
  10701. if (outerNode) {
  10702. var b = splitPolygon(outerNode, hole);
  10703. filterPoints(b, b.next);
  10704. }
  10705. }
  10706. // David Eberly's algorithm for finding a bridge between hole and outer polygon
  10707. function findHoleBridge(hole, outerNode) {
  10708. var p = outerNode,
  10709. hx = hole.x,
  10710. hy = hole.y,
  10711. qx = -Infinity,
  10712. m;
  10713. // find a segment intersected by a ray from the hole's leftmost point to the left;
  10714. // segment's endpoint with lesser x will be potential connection point
  10715. do {
  10716. if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
  10717. var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
  10718. if (x <= hx && x > qx) {
  10719. qx = x;
  10720. if (x === hx) {
  10721. if (hy === p.y) return p;
  10722. if (hy === p.next.y) return p.next;
  10723. }
  10724. m = p.x < p.next.x ? p : p.next;
  10725. }
  10726. }
  10727. p = p.next;
  10728. } while (p !== outerNode);
  10729. if (!m) return null;
  10730. if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint
  10731. // look for points inside the triangle of hole point, segment intersection and endpoint;
  10732. // if there are no points found, we have a valid connection;
  10733. // otherwise choose the point of the minimum angle with the ray as connection point
  10734. var stop = m,
  10735. mx = m.x,
  10736. my = m.y,
  10737. tanMin = Infinity,
  10738. tan;
  10739. p = m.next;
  10740. while (p !== stop) {
  10741. if (hx >= p.x && p.x >= mx && hx !== p.x &&
  10742. pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
  10743. tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
  10744. if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {
  10745. m = p;
  10746. tanMin = tan;
  10747. }
  10748. }
  10749. p = p.next;
  10750. }
  10751. return m;
  10752. }
  10753. // interlink polygon nodes in z-order
  10754. function indexCurve(start, minX, minY, invSize) {
  10755. var p = start;
  10756. do {
  10757. if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);
  10758. p.prevZ = p.prev;
  10759. p.nextZ = p.next;
  10760. p = p.next;
  10761. } while (p !== start);
  10762. p.prevZ.nextZ = null;
  10763. p.prevZ = null;
  10764. sortLinked(p);
  10765. }
  10766. // Simon Tatham's linked list merge sort algorithm
  10767. // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
  10768. function sortLinked(list) {
  10769. var i, p, q, e, tail, numMerges, pSize, qSize,
  10770. inSize = 1;
  10771. do {
  10772. p = list;
  10773. list = null;
  10774. tail = null;
  10775. numMerges = 0;
  10776. while (p) {
  10777. numMerges++;
  10778. q = p;
  10779. pSize = 0;
  10780. for (i = 0; i < inSize; i++) {
  10781. pSize++;
  10782. q = q.nextZ;
  10783. if (!q) break;
  10784. }
  10785. qSize = inSize;
  10786. while (pSize > 0 || (qSize > 0 && q)) {
  10787. if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
  10788. e = p;
  10789. p = p.nextZ;
  10790. pSize--;
  10791. } else {
  10792. e = q;
  10793. q = q.nextZ;
  10794. qSize--;
  10795. }
  10796. if (tail) tail.nextZ = e;
  10797. else list = e;
  10798. e.prevZ = tail;
  10799. tail = e;
  10800. }
  10801. p = q;
  10802. }
  10803. tail.nextZ = null;
  10804. inSize *= 2;
  10805. } while (numMerges > 1);
  10806. return list;
  10807. }
  10808. // z-order of a point given coords and inverse of the longer side of data bbox
  10809. function zOrder(x, y, minX, minY, invSize) {
  10810. // coords are transformed into non-negative 15-bit integer range
  10811. x = 32767 * (x - minX) * invSize;
  10812. y = 32767 * (y - minY) * invSize;
  10813. x = (x | (x << 8)) & 0x00FF00FF;
  10814. x = (x | (x << 4)) & 0x0F0F0F0F;
  10815. x = (x | (x << 2)) & 0x33333333;
  10816. x = (x | (x << 1)) & 0x55555555;
  10817. y = (y | (y << 8)) & 0x00FF00FF;
  10818. y = (y | (y << 4)) & 0x0F0F0F0F;
  10819. y = (y | (y << 2)) & 0x33333333;
  10820. y = (y | (y << 1)) & 0x55555555;
  10821. return x | (y << 1);
  10822. }
  10823. // find the leftmost node of a polygon ring
  10824. function getLeftmost(start) {
  10825. var p = start,
  10826. leftmost = start;
  10827. do {
  10828. if (p.x < leftmost.x) leftmost = p;
  10829. p = p.next;
  10830. } while (p !== start);
  10831. return leftmost;
  10832. }
  10833. // check if a point lies within a convex triangle
  10834. function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
  10835. return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
  10836. (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
  10837. (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
  10838. }
  10839. // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
  10840. function isValidDiagonal(a, b) {
  10841. return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&
  10842. locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);
  10843. }
  10844. // signed area of a triangle
  10845. function area(p, q, r) {
  10846. return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
  10847. }
  10848. // check if two points are equal
  10849. function equals(p1, p2) {
  10850. return p1.x === p2.x && p1.y === p2.y;
  10851. }
  10852. // check if two segments intersect
  10853. function intersects(p1, q1, p2, q2) {
  10854. if ((equals(p1, q1) && equals(p2, q2)) ||
  10855. (equals(p1, q2) && equals(p2, q1))) return true;
  10856. return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&
  10857. area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;
  10858. }
  10859. // check if a polygon diagonal intersects any polygon segments
  10860. function intersectsPolygon(a, b) {
  10861. var p = a;
  10862. do {
  10863. if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
  10864. intersects(p, p.next, a, b)) return true;
  10865. p = p.next;
  10866. } while (p !== a);
  10867. return false;
  10868. }
  10869. // check if a polygon diagonal is locally inside the polygon
  10870. function locallyInside(a, b) {
  10871. return area(a.prev, a, a.next) < 0 ?
  10872. area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
  10873. area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
  10874. }
  10875. // check if the middle point of a polygon diagonal is inside the polygon
  10876. function middleInside(a, b) {
  10877. var p = a,
  10878. inside = false,
  10879. px = (a.x + b.x) / 2,
  10880. py = (a.y + b.y) / 2;
  10881. do {
  10882. if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
  10883. (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
  10884. inside = !inside;
  10885. p = p.next;
  10886. } while (p !== a);
  10887. return inside;
  10888. }
  10889. // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
  10890. // if one belongs to the outer ring and another to a hole, it merges it into a single ring
  10891. function splitPolygon(a, b) {
  10892. var a2 = new Node(a.i, a.x, a.y),
  10893. b2 = new Node(b.i, b.x, b.y),
  10894. an = a.next,
  10895. bp = b.prev;
  10896. a.next = b;
  10897. b.prev = a;
  10898. a2.next = an;
  10899. an.prev = a2;
  10900. b2.next = a2;
  10901. a2.prev = b2;
  10902. bp.next = b2;
  10903. b2.prev = bp;
  10904. return b2;
  10905. }
  10906. // create a node and optionally link it with previous one (in a circular doubly linked list)
  10907. function insertNode(i, x, y, last) {
  10908. var p = new Node(i, x, y);
  10909. if (!last) {
  10910. p.prev = p;
  10911. p.next = p;
  10912. } else {
  10913. p.next = last.next;
  10914. p.prev = last;
  10915. last.next.prev = p;
  10916. last.next = p;
  10917. }
  10918. return p;
  10919. }
  10920. function removeNode(p) {
  10921. p.next.prev = p.prev;
  10922. p.prev.next = p.next;
  10923. if (p.prevZ) p.prevZ.nextZ = p.nextZ;
  10924. if (p.nextZ) p.nextZ.prevZ = p.prevZ;
  10925. }
  10926. function Node(i, x, y) {
  10927. // vertex index in coordinates array
  10928. this.i = i;
  10929. // vertex coordinates
  10930. this.x = x;
  10931. this.y = y;
  10932. // previous and next vertex nodes in a polygon ring
  10933. this.prev = null;
  10934. this.next = null;
  10935. // z-order curve value
  10936. this.z = null;
  10937. // previous and next nodes in z-order
  10938. this.prevZ = null;
  10939. this.nextZ = null;
  10940. // indicates whether this is a steiner point
  10941. this.steiner = false;
  10942. }
  10943. // return a percentage difference between the polygon area and its triangulation area;
  10944. // used to verify correctness of triangulation
  10945. earcut.deviation = function (data, holeIndices, dim, triangles) {
  10946. var hasHoles = holeIndices && holeIndices.length;
  10947. var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
  10948. var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
  10949. if (hasHoles) {
  10950. for (var i = 0, len = holeIndices.length; i < len; i++) {
  10951. var start = holeIndices[i] * dim;
  10952. var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
  10953. polygonArea -= Math.abs(signedArea(data, start, end, dim));
  10954. }
  10955. }
  10956. var trianglesArea = 0;
  10957. for (i = 0; i < triangles.length; i += 3) {
  10958. var a = triangles[i] * dim;
  10959. var b = triangles[i + 1] * dim;
  10960. var c = triangles[i + 2] * dim;
  10961. trianglesArea += Math.abs(
  10962. (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
  10963. (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
  10964. }
  10965. return polygonArea === 0 && trianglesArea === 0 ? 0 :
  10966. Math.abs((trianglesArea - polygonArea) / polygonArea);
  10967. };
  10968. function signedArea(data, start, end, dim) {
  10969. var sum = 0;
  10970. for (var i = start, j = end - dim; i < end; i += dim) {
  10971. sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
  10972. j = i;
  10973. }
  10974. return sum;
  10975. }
  10976. // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
  10977. earcut.flatten = function (data) {
  10978. var dim = data[0][0].length,
  10979. result = {vertices: [], holes: [], dimensions: dim},
  10980. holeIndex = 0;
  10981. for (var i = 0; i < data.length; i++) {
  10982. for (var j = 0; j < data[i].length; j++) {
  10983. for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
  10984. }
  10985. if (i > 0) {
  10986. holeIndex += data[i - 1].length;
  10987. result.holes.push(holeIndex);
  10988. }
  10989. }
  10990. return result;
  10991. };
  10992. /***/ }),
  10993. /* 72 */
  10994. /***/ (function(module, exports, __webpack_require__) {
  10995. /**
  10996. * The `Matter.Body` module contains methods for creating and manipulating body models.
  10997. * A `Matter.Body` is a rigid body that can be simulated by a `Matter.Engine`.
  10998. * Factories for commonly used body configurations (such as rectangles, circles and other polygons) can be found in the module `Matter.Bodies`.
  10999. *
  11000. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  11001. * @class Body
  11002. */
  11003. var Body = {};
  11004. module.exports = Body;
  11005. var Vertices = __webpack_require__(82);
  11006. var Vector = __webpack_require__(87);
  11007. var Sleeping = __webpack_require__(238);
  11008. var Common = __webpack_require__(36);
  11009. var Bounds = __webpack_require__(86);
  11010. var Axes = __webpack_require__(546);
  11011. (function() {
  11012. Body._inertiaScale = 4;
  11013. Body._nextCollidingGroupId = 1;
  11014. Body._nextNonCollidingGroupId = -1;
  11015. Body._nextCategory = 0x0001;
  11016. /**
  11017. * Creates a new rigid body model. The options parameter is an object that specifies any properties you wish to override the defaults.
  11018. * All properties have default values, and many are pre-calculated automatically based on other properties.
  11019. * Vertices must be specified in clockwise order.
  11020. * See the properties section below for detailed information on what you can pass via the `options` object.
  11021. * @method create
  11022. * @param {} options
  11023. * @return {body} body
  11024. */
  11025. Body.create = function(options) {
  11026. var defaults = {
  11027. id: Common.nextId(),
  11028. type: 'body',
  11029. label: 'Body',
  11030. gameObject: null,
  11031. parts: [],
  11032. plugin: {},
  11033. angle: 0,
  11034. vertices: Vertices.fromPath('L 0 0 L 40 0 L 40 40 L 0 40'),
  11035. position: { x: 0, y: 0 },
  11036. force: { x: 0, y: 0 },
  11037. torque: 0,
  11038. positionImpulse: { x: 0, y: 0 },
  11039. previousPositionImpulse: { x: 0, y: 0 },
  11040. constraintImpulse: { x: 0, y: 0, angle: 0 },
  11041. totalContacts: 0,
  11042. speed: 0,
  11043. angularSpeed: 0,
  11044. velocity: { x: 0, y: 0 },
  11045. angularVelocity: 0,
  11046. isSensor: false,
  11047. isStatic: false,
  11048. isSleeping: false,
  11049. ignoreGravity: false,
  11050. ignorePointer: false,
  11051. motion: 0,
  11052. sleepThreshold: 60,
  11053. density: 0.001,
  11054. restitution: 0,
  11055. friction: 0.1,
  11056. frictionStatic: 0.5,
  11057. frictionAir: 0.01,
  11058. collisionFilter: {
  11059. category: 0x0001,
  11060. mask: 0xFFFFFFFF,
  11061. group: 0
  11062. },
  11063. slop: 0.05,
  11064. timeScale: 1,
  11065. render: {
  11066. visible: true,
  11067. opacity: 1,
  11068. sprite: {
  11069. xScale: 1,
  11070. yScale: 1,
  11071. xOffset: 0,
  11072. yOffset: 0
  11073. },
  11074. lineWidth: 0
  11075. },
  11076. events: null,
  11077. bounds: null,
  11078. chamfer: null,
  11079. circleRadius: 0,
  11080. positionPrev: null,
  11081. anglePrev: 0,
  11082. parent: null,
  11083. axes: null,
  11084. area: 0,
  11085. mass: 0,
  11086. inertia: 0,
  11087. _original: null
  11088. };
  11089. var body = Common.extend(defaults, options);
  11090. _initProperties(body, options);
  11091. return body;
  11092. };
  11093. /**
  11094. * Returns the next unique group index for which bodies will collide.
  11095. * If `isNonColliding` is `true`, returns the next unique group index for which bodies will _not_ collide.
  11096. * See `body.collisionFilter` for more information.
  11097. * @method nextGroup
  11098. * @param {bool} [isNonColliding=false]
  11099. * @return {Number} Unique group index
  11100. */
  11101. Body.nextGroup = function(isNonColliding) {
  11102. if (isNonColliding)
  11103. return Body._nextNonCollidingGroupId--;
  11104. return Body._nextCollidingGroupId++;
  11105. };
  11106. /**
  11107. * Returns the next unique category bitfield (starting after the initial default category `0x0001`).
  11108. * There are 32 available. See `body.collisionFilter` for more information.
  11109. * @method nextCategory
  11110. * @return {Number} Unique category bitfield
  11111. */
  11112. Body.nextCategory = function() {
  11113. Body._nextCategory = Body._nextCategory << 1;
  11114. return Body._nextCategory;
  11115. };
  11116. /**
  11117. * Initialises body properties.
  11118. * @method _initProperties
  11119. * @private
  11120. * @param {body} body
  11121. * @param {} [options]
  11122. */
  11123. var _initProperties = function(body, options) {
  11124. options = options || {};
  11125. // init required properties (order is important)
  11126. Body.set(body, {
  11127. bounds: body.bounds || Bounds.create(body.vertices),
  11128. positionPrev: body.positionPrev || Vector.clone(body.position),
  11129. anglePrev: body.anglePrev || body.angle,
  11130. vertices: body.vertices,
  11131. parts: body.parts || [body],
  11132. isStatic: body.isStatic,
  11133. isSleeping: body.isSleeping,
  11134. parent: body.parent || body
  11135. });
  11136. Vertices.rotate(body.vertices, body.angle, body.position);
  11137. Axes.rotate(body.axes, body.angle);
  11138. Bounds.update(body.bounds, body.vertices, body.velocity);
  11139. // allow options to override the automatically calculated properties
  11140. Body.set(body, {
  11141. axes: options.axes || body.axes,
  11142. area: options.area || body.area,
  11143. mass: options.mass || body.mass,
  11144. inertia: options.inertia || body.inertia
  11145. });
  11146. // render properties
  11147. var defaultFillStyle = (body.isStatic ? '#2e2b44' : Common.choose(['#006BA6', '#0496FF', '#FFBC42', '#D81159', '#8F2D56'])),
  11148. defaultStrokeStyle = '#000';
  11149. body.render.fillStyle = body.render.fillStyle || defaultFillStyle;
  11150. body.render.strokeStyle = body.render.strokeStyle || defaultStrokeStyle;
  11151. body.render.sprite.xOffset += -(body.bounds.min.x - body.position.x) / (body.bounds.max.x - body.bounds.min.x);
  11152. body.render.sprite.yOffset += -(body.bounds.min.y - body.position.y) / (body.bounds.max.y - body.bounds.min.y);
  11153. };
  11154. /**
  11155. * Given a property and a value (or map of), sets the property(s) on the body, using the appropriate setter functions if they exist.
  11156. * Prefer to use the actual setter functions in performance critical situations.
  11157. * @method set
  11158. * @param {body} body
  11159. * @param {} settings A property name (or map of properties and values) to set on the body.
  11160. * @param {} value The value to set if `settings` is a single property name.
  11161. */
  11162. Body.set = function(body, settings, value) {
  11163. var property;
  11164. if (typeof settings === 'string') {
  11165. property = settings;
  11166. settings = {};
  11167. settings[property] = value;
  11168. }
  11169. for (property in settings) {
  11170. if (!settings.hasOwnProperty(property))
  11171. continue;
  11172. value = settings[property];
  11173. switch (property) {
  11174. case 'isStatic':
  11175. Body.setStatic(body, value);
  11176. break;
  11177. case 'isSleeping':
  11178. Sleeping.set(body, value);
  11179. break;
  11180. case 'mass':
  11181. Body.setMass(body, value);
  11182. break;
  11183. case 'density':
  11184. Body.setDensity(body, value);
  11185. break;
  11186. case 'inertia':
  11187. Body.setInertia(body, value);
  11188. break;
  11189. case 'vertices':
  11190. Body.setVertices(body, value);
  11191. break;
  11192. case 'position':
  11193. Body.setPosition(body, value);
  11194. break;
  11195. case 'angle':
  11196. Body.setAngle(body, value);
  11197. break;
  11198. case 'velocity':
  11199. Body.setVelocity(body, value);
  11200. break;
  11201. case 'angularVelocity':
  11202. Body.setAngularVelocity(body, value);
  11203. break;
  11204. case 'parts':
  11205. Body.setParts(body, value);
  11206. break;
  11207. default:
  11208. body[property] = value;
  11209. }
  11210. }
  11211. };
  11212. /**
  11213. * Sets the body as static, including isStatic flag and setting mass and inertia to Infinity.
  11214. * @method setStatic
  11215. * @param {body} body
  11216. * @param {bool} isStatic
  11217. */
  11218. Body.setStatic = function(body, isStatic) {
  11219. for (var i = 0; i < body.parts.length; i++) {
  11220. var part = body.parts[i];
  11221. part.isStatic = isStatic;
  11222. if (isStatic) {
  11223. part._original = {
  11224. restitution: part.restitution,
  11225. friction: part.friction,
  11226. mass: part.mass,
  11227. inertia: part.inertia,
  11228. density: part.density,
  11229. inverseMass: part.inverseMass,
  11230. inverseInertia: part.inverseInertia
  11231. };
  11232. part.restitution = 0;
  11233. part.friction = 1;
  11234. part.mass = part.inertia = part.density = Infinity;
  11235. part.inverseMass = part.inverseInertia = 0;
  11236. part.positionPrev.x = part.position.x;
  11237. part.positionPrev.y = part.position.y;
  11238. part.anglePrev = part.angle;
  11239. part.angularVelocity = 0;
  11240. part.speed = 0;
  11241. part.angularSpeed = 0;
  11242. part.motion = 0;
  11243. } else if (part._original) {
  11244. part.restitution = part._original.restitution;
  11245. part.friction = part._original.friction;
  11246. part.mass = part._original.mass;
  11247. part.inertia = part._original.inertia;
  11248. part.density = part._original.density;
  11249. part.inverseMass = part._original.inverseMass;
  11250. part.inverseInertia = part._original.inverseInertia;
  11251. part._original = null;
  11252. }
  11253. }
  11254. };
  11255. /**
  11256. * Sets the mass of the body. Inverse mass, density and inertia are automatically updated to reflect the change.
  11257. * @method setMass
  11258. * @param {body} body
  11259. * @param {number} mass
  11260. */
  11261. Body.setMass = function(body, mass) {
  11262. var moment = body.inertia / (body.mass / 6);
  11263. body.inertia = moment * (mass / 6);
  11264. body.inverseInertia = 1 / body.inertia;
  11265. body.mass = mass;
  11266. body.inverseMass = 1 / body.mass;
  11267. body.density = body.mass / body.area;
  11268. };
  11269. /**
  11270. * Sets the density of the body. Mass and inertia are automatically updated to reflect the change.
  11271. * @method setDensity
  11272. * @param {body} body
  11273. * @param {number} density
  11274. */
  11275. Body.setDensity = function(body, density) {
  11276. Body.setMass(body, density * body.area);
  11277. body.density = density;
  11278. };
  11279. /**
  11280. * Sets the moment of inertia (i.e. second moment of area) of the body of the body.
  11281. * Inverse inertia is automatically updated to reflect the change. Mass is not changed.
  11282. * @method setInertia
  11283. * @param {body} body
  11284. * @param {number} inertia
  11285. */
  11286. Body.setInertia = function(body, inertia) {
  11287. body.inertia = inertia;
  11288. body.inverseInertia = 1 / body.inertia;
  11289. };
  11290. /**
  11291. * Sets the body's vertices and updates body properties accordingly, including inertia, area and mass (with respect to `body.density`).
  11292. * Vertices will be automatically transformed to be orientated around their centre of mass as the origin.
  11293. * They are then automatically translated to world space based on `body.position`.
  11294. *
  11295. * The `vertices` argument should be passed as an array of `Matter.Vector` points (or a `Matter.Vertices` array).
  11296. * Vertices must form a convex hull, concave hulls are not supported.
  11297. *
  11298. * @method setVertices
  11299. * @param {body} body
  11300. * @param {vector[]} vertices
  11301. */
  11302. Body.setVertices = function(body, vertices) {
  11303. // change vertices
  11304. if (vertices[0].body === body) {
  11305. body.vertices = vertices;
  11306. } else {
  11307. body.vertices = Vertices.create(vertices, body);
  11308. }
  11309. // update properties
  11310. body.axes = Axes.fromVertices(body.vertices);
  11311. body.area = Vertices.area(body.vertices);
  11312. Body.setMass(body, body.density * body.area);
  11313. // orient vertices around the centre of mass at origin (0, 0)
  11314. var centre = Vertices.centre(body.vertices);
  11315. Vertices.translate(body.vertices, centre, -1);
  11316. // update inertia while vertices are at origin (0, 0)
  11317. Body.setInertia(body, Body._inertiaScale * Vertices.inertia(body.vertices, body.mass));
  11318. // update geometry
  11319. Vertices.translate(body.vertices, body.position);
  11320. Bounds.update(body.bounds, body.vertices, body.velocity);
  11321. };
  11322. /**
  11323. * Sets the parts of the `body` and updates mass, inertia and centroid.
  11324. * Each part will have its parent set to `body`.
  11325. * By default the convex hull will be automatically computed and set on `body`, unless `autoHull` is set to `false.`
  11326. * Note that this method will ensure that the first part in `body.parts` will always be the `body`.
  11327. * @method setParts
  11328. * @param {body} body
  11329. * @param [body] parts
  11330. * @param {bool} [autoHull=true]
  11331. */
  11332. Body.setParts = function(body, parts, autoHull) {
  11333. var i;
  11334. // add all the parts, ensuring that the first part is always the parent body
  11335. parts = parts.slice(0);
  11336. body.parts.length = 0;
  11337. body.parts.push(body);
  11338. body.parent = body;
  11339. for (i = 0; i < parts.length; i++) {
  11340. var part = parts[i];
  11341. if (part !== body) {
  11342. part.parent = body;
  11343. body.parts.push(part);
  11344. }
  11345. }
  11346. if (body.parts.length === 1)
  11347. return;
  11348. autoHull = typeof autoHull !== 'undefined' ? autoHull : true;
  11349. // find the convex hull of all parts to set on the parent body
  11350. if (autoHull) {
  11351. var vertices = [];
  11352. for (i = 0; i < parts.length; i++) {
  11353. vertices = vertices.concat(parts[i].vertices);
  11354. }
  11355. Vertices.clockwiseSort(vertices);
  11356. var hull = Vertices.hull(vertices),
  11357. hullCentre = Vertices.centre(hull);
  11358. Body.setVertices(body, hull);
  11359. Vertices.translate(body.vertices, hullCentre);
  11360. }
  11361. // sum the properties of all compound parts of the parent body
  11362. var total = Body._totalProperties(body);
  11363. body.area = total.area;
  11364. body.parent = body;
  11365. body.position.x = total.centre.x;
  11366. body.position.y = total.centre.y;
  11367. body.positionPrev.x = total.centre.x;
  11368. body.positionPrev.y = total.centre.y;
  11369. Body.setMass(body, total.mass);
  11370. Body.setInertia(body, total.inertia);
  11371. Body.setPosition(body, total.centre);
  11372. };
  11373. /**
  11374. * Sets the position of the body instantly. Velocity, angle, force etc. are unchanged.
  11375. * @method setPosition
  11376. * @param {body} body
  11377. * @param {vector} position
  11378. */
  11379. Body.setPosition = function(body, position) {
  11380. var delta = Vector.sub(position, body.position);
  11381. body.positionPrev.x += delta.x;
  11382. body.positionPrev.y += delta.y;
  11383. for (var i = 0; i < body.parts.length; i++) {
  11384. var part = body.parts[i];
  11385. part.position.x += delta.x;
  11386. part.position.y += delta.y;
  11387. Vertices.translate(part.vertices, delta);
  11388. Bounds.update(part.bounds, part.vertices, body.velocity);
  11389. }
  11390. };
  11391. /**
  11392. * Sets the angle of the body instantly. Angular velocity, position, force etc. are unchanged.
  11393. * @method setAngle
  11394. * @param {body} body
  11395. * @param {number} angle
  11396. */
  11397. Body.setAngle = function(body, angle) {
  11398. var delta = angle - body.angle;
  11399. body.anglePrev += delta;
  11400. for (var i = 0; i < body.parts.length; i++) {
  11401. var part = body.parts[i];
  11402. part.angle += delta;
  11403. Vertices.rotate(part.vertices, delta, body.position);
  11404. Axes.rotate(part.axes, delta);
  11405. Bounds.update(part.bounds, part.vertices, body.velocity);
  11406. if (i > 0) {
  11407. Vector.rotateAbout(part.position, delta, body.position, part.position);
  11408. }
  11409. }
  11410. };
  11411. /**
  11412. * Sets the linear velocity of the body instantly. Position, angle, force etc. are unchanged. See also `Body.applyForce`.
  11413. * @method setVelocity
  11414. * @param {body} body
  11415. * @param {vector} velocity
  11416. */
  11417. Body.setVelocity = function(body, velocity) {
  11418. body.positionPrev.x = body.position.x - velocity.x;
  11419. body.positionPrev.y = body.position.y - velocity.y;
  11420. body.velocity.x = velocity.x;
  11421. body.velocity.y = velocity.y;
  11422. body.speed = Vector.magnitude(body.velocity);
  11423. };
  11424. /**
  11425. * Sets the angular velocity of the body instantly. Position, angle, force etc. are unchanged. See also `Body.applyForce`.
  11426. * @method setAngularVelocity
  11427. * @param {body} body
  11428. * @param {number} velocity
  11429. */
  11430. Body.setAngularVelocity = function(body, velocity) {
  11431. body.anglePrev = body.angle - velocity;
  11432. body.angularVelocity = velocity;
  11433. body.angularSpeed = Math.abs(body.angularVelocity);
  11434. };
  11435. /**
  11436. * Moves a body by a given vector relative to its current position, without imparting any velocity.
  11437. * @method translate
  11438. * @param {body} body
  11439. * @param {vector} translation
  11440. */
  11441. Body.translate = function(body, translation) {
  11442. Body.setPosition(body, Vector.add(body.position, translation));
  11443. };
  11444. /**
  11445. * Rotates a body by a given angle relative to its current angle, without imparting any angular velocity.
  11446. * @method rotate
  11447. * @param {body} body
  11448. * @param {number} rotation
  11449. * @param {vector} [point]
  11450. */
  11451. Body.rotate = function(body, rotation, point) {
  11452. if (!point) {
  11453. Body.setAngle(body, body.angle + rotation);
  11454. } else {
  11455. var cos = Math.cos(rotation),
  11456. sin = Math.sin(rotation),
  11457. dx = body.position.x - point.x,
  11458. dy = body.position.y - point.y;
  11459. Body.setPosition(body, {
  11460. x: point.x + (dx * cos - dy * sin),
  11461. y: point.y + (dx * sin + dy * cos)
  11462. });
  11463. Body.setAngle(body, body.angle + rotation);
  11464. }
  11465. };
  11466. /**
  11467. * Scales the body, including updating physical properties (mass, area, axes, inertia), from a world-space point (default is body centre).
  11468. * @method scale
  11469. * @param {body} body
  11470. * @param {number} scaleX
  11471. * @param {number} scaleY
  11472. * @param {vector} [point]
  11473. */
  11474. Body.scale = function(body, scaleX, scaleY, point) {
  11475. var totalArea = 0,
  11476. totalInertia = 0;
  11477. point = point || body.position;
  11478. for (var i = 0; i < body.parts.length; i++) {
  11479. var part = body.parts[i];
  11480. // scale vertices
  11481. Vertices.scale(part.vertices, scaleX, scaleY, point);
  11482. // update properties
  11483. part.axes = Axes.fromVertices(part.vertices);
  11484. part.area = Vertices.area(part.vertices);
  11485. Body.setMass(part, body.density * part.area);
  11486. // update inertia (requires vertices to be at origin)
  11487. Vertices.translate(part.vertices, { x: -part.position.x, y: -part.position.y });
  11488. Body.setInertia(part, Body._inertiaScale * Vertices.inertia(part.vertices, part.mass));
  11489. Vertices.translate(part.vertices, { x: part.position.x, y: part.position.y });
  11490. if (i > 0) {
  11491. totalArea += part.area;
  11492. totalInertia += part.inertia;
  11493. }
  11494. // scale position
  11495. part.position.x = point.x + (part.position.x - point.x) * scaleX;
  11496. part.position.y = point.y + (part.position.y - point.y) * scaleY;
  11497. // update bounds
  11498. Bounds.update(part.bounds, part.vertices, body.velocity);
  11499. }
  11500. // handle parent body
  11501. if (body.parts.length > 1) {
  11502. body.area = totalArea;
  11503. if (!body.isStatic) {
  11504. Body.setMass(body, body.density * totalArea);
  11505. Body.setInertia(body, totalInertia);
  11506. }
  11507. }
  11508. // handle circles
  11509. if (body.circleRadius) {
  11510. if (scaleX === scaleY) {
  11511. body.circleRadius *= scaleX;
  11512. } else {
  11513. // body is no longer a circle
  11514. body.circleRadius = null;
  11515. }
  11516. }
  11517. };
  11518. /**
  11519. * Performs a simulation step for the given `body`, including updating position and angle using Verlet integration.
  11520. * @method update
  11521. * @param {body} body
  11522. * @param {number} deltaTime
  11523. * @param {number} timeScale
  11524. * @param {number} correction
  11525. */
  11526. Body.update = function(body, deltaTime, timeScale, correction) {
  11527. var deltaTimeSquared = Math.pow(deltaTime * timeScale * body.timeScale, 2);
  11528. // from the previous step
  11529. var frictionAir = 1 - body.frictionAir * timeScale * body.timeScale,
  11530. velocityPrevX = body.position.x - body.positionPrev.x,
  11531. velocityPrevY = body.position.y - body.positionPrev.y;
  11532. // update velocity with Verlet integration
  11533. body.velocity.x = (velocityPrevX * frictionAir * correction) + (body.force.x / body.mass) * deltaTimeSquared;
  11534. body.velocity.y = (velocityPrevY * frictionAir * correction) + (body.force.y / body.mass) * deltaTimeSquared;
  11535. body.positionPrev.x = body.position.x;
  11536. body.positionPrev.y = body.position.y;
  11537. body.position.x += body.velocity.x;
  11538. body.position.y += body.velocity.y;
  11539. // update angular velocity with Verlet integration
  11540. body.angularVelocity = ((body.angle - body.anglePrev) * frictionAir * correction) + (body.torque / body.inertia) * deltaTimeSquared;
  11541. body.anglePrev = body.angle;
  11542. body.angle += body.angularVelocity;
  11543. // track speed and acceleration
  11544. body.speed = Vector.magnitude(body.velocity);
  11545. body.angularSpeed = Math.abs(body.angularVelocity);
  11546. // transform the body geometry
  11547. for (var i = 0; i < body.parts.length; i++) {
  11548. var part = body.parts[i];
  11549. Vertices.translate(part.vertices, body.velocity);
  11550. if (i > 0) {
  11551. part.position.x += body.velocity.x;
  11552. part.position.y += body.velocity.y;
  11553. }
  11554. if (body.angularVelocity !== 0) {
  11555. Vertices.rotate(part.vertices, body.angularVelocity, body.position);
  11556. Axes.rotate(part.axes, body.angularVelocity);
  11557. if (i > 0) {
  11558. Vector.rotateAbout(part.position, body.angularVelocity, body.position, part.position);
  11559. }
  11560. }
  11561. Bounds.update(part.bounds, part.vertices, body.velocity);
  11562. }
  11563. };
  11564. /**
  11565. * Applies a force to a body from a given world-space position, including resulting torque.
  11566. * @method applyForce
  11567. * @param {body} body
  11568. * @param {vector} position
  11569. * @param {vector} force
  11570. */
  11571. Body.applyForce = function(body, position, force) {
  11572. body.force.x += force.x;
  11573. body.force.y += force.y;
  11574. var offset = { x: position.x - body.position.x, y: position.y - body.position.y };
  11575. body.torque += offset.x * force.y - offset.y * force.x;
  11576. };
  11577. /**
  11578. * Returns the sums of the properties of all compound parts of the parent body.
  11579. * @method _totalProperties
  11580. * @private
  11581. * @param {body} body
  11582. * @return {}
  11583. */
  11584. Body._totalProperties = function(body) {
  11585. // from equations at:
  11586. // https://ecourses.ou.edu/cgi-bin/ebook.cgi?doc=&topic=st&chap_sec=07.2&page=theory
  11587. // http://output.to/sideway/default.asp?qno=121100087
  11588. var properties = {
  11589. mass: 0,
  11590. area: 0,
  11591. inertia: 0,
  11592. centre: { x: 0, y: 0 }
  11593. };
  11594. // sum the properties of all compound parts of the parent body
  11595. for (var i = body.parts.length === 1 ? 0 : 1; i < body.parts.length; i++) {
  11596. var part = body.parts[i],
  11597. mass = part.mass !== Infinity ? part.mass : 1;
  11598. properties.mass += mass;
  11599. properties.area += part.area;
  11600. properties.inertia += part.inertia;
  11601. properties.centre = Vector.add(properties.centre, Vector.mult(part.position, mass));
  11602. }
  11603. properties.centre = Vector.div(properties.centre, properties.mass);
  11604. return properties;
  11605. };
  11606. /*
  11607. *
  11608. * Events Documentation
  11609. *
  11610. */
  11611. /**
  11612. * Fired when a body starts sleeping (where `this` is the body).
  11613. *
  11614. * @event sleepStart
  11615. * @this {body} The body that has started sleeping
  11616. * @param {} event An event object
  11617. * @param {} event.source The source object of the event
  11618. * @param {} event.name The name of the event
  11619. */
  11620. /**
  11621. * Fired when a body ends sleeping (where `this` is the body).
  11622. *
  11623. * @event sleepEnd
  11624. * @this {body} The body that has ended sleeping
  11625. * @param {} event An event object
  11626. * @param {} event.source The source object of the event
  11627. * @param {} event.name The name of the event
  11628. */
  11629. /*
  11630. *
  11631. * Properties Documentation
  11632. *
  11633. */
  11634. /**
  11635. * An integer `Number` uniquely identifying number generated in `Body.create` by `Common.nextId`.
  11636. *
  11637. * @property id
  11638. * @type number
  11639. */
  11640. /**
  11641. * A `String` denoting the type of object.
  11642. *
  11643. * @property type
  11644. * @type string
  11645. * @default "body"
  11646. * @readOnly
  11647. */
  11648. /**
  11649. * An arbitrary `String` name to help the user identify and manage bodies.
  11650. *
  11651. * @property label
  11652. * @type string
  11653. * @default "Body"
  11654. */
  11655. /**
  11656. * An array of bodies that make up this body.
  11657. * The first body in the array must always be a self reference to the current body instance.
  11658. * All bodies in the `parts` array together form a single rigid compound body.
  11659. * Parts are allowed to overlap, have gaps or holes or even form concave bodies.
  11660. * Parts themselves should never be added to a `World`, only the parent body should be.
  11661. * Use `Body.setParts` when setting parts to ensure correct updates of all properties.
  11662. *
  11663. * @property parts
  11664. * @type body[]
  11665. */
  11666. /**
  11667. * An object reserved for storing plugin-specific properties.
  11668. *
  11669. * @property plugin
  11670. * @type {}
  11671. */
  11672. /**
  11673. * A self reference if the body is _not_ a part of another body.
  11674. * Otherwise this is a reference to the body that this is a part of.
  11675. * See `body.parts`.
  11676. *
  11677. * @property parent
  11678. * @type body
  11679. */
  11680. /**
  11681. * A `Number` specifying the angle of the body, in radians.
  11682. *
  11683. * @property angle
  11684. * @type number
  11685. * @default 0
  11686. */
  11687. /**
  11688. * An array of `Vector` objects that specify the convex hull of the rigid body.
  11689. * These should be provided about the origin `(0, 0)`. E.g.
  11690. *
  11691. * [{ x: 0, y: 0 }, { x: 25, y: 50 }, { x: 50, y: 0 }]
  11692. *
  11693. * When passed via `Body.create`, the vertices are translated relative to `body.position` (i.e. world-space, and constantly updated by `Body.update` during simulation).
  11694. * The `Vector` objects are also augmented with additional properties required for efficient collision detection.
  11695. *
  11696. * Other properties such as `inertia` and `bounds` are automatically calculated from the passed vertices (unless provided via `options`).
  11697. * Concave hulls are not currently supported. The module `Matter.Vertices` contains useful methods for working with vertices.
  11698. *
  11699. * @property vertices
  11700. * @type vector[]
  11701. */
  11702. /**
  11703. * A `Vector` that specifies the current world-space position of the body.
  11704. *
  11705. * @property position
  11706. * @type vector
  11707. * @default { x: 0, y: 0 }
  11708. */
  11709. /**
  11710. * A `Vector` that specifies the force to apply in the current step. It is zeroed after every `Body.update`. See also `Body.applyForce`.
  11711. *
  11712. * @property force
  11713. * @type vector
  11714. * @default { x: 0, y: 0 }
  11715. */
  11716. /**
  11717. * A `Number` that specifies the torque (turning force) to apply in the current step. It is zeroed after every `Body.update`.
  11718. *
  11719. * @property torque
  11720. * @type number
  11721. * @default 0
  11722. */
  11723. /**
  11724. * A `Number` that _measures_ the current speed of the body after the last `Body.update`. It is read-only and always positive (it's the magnitude of `body.velocity`).
  11725. *
  11726. * @readOnly
  11727. * @property speed
  11728. * @type number
  11729. * @default 0
  11730. */
  11731. /**
  11732. * A `Number` that _measures_ the current angular speed of the body after the last `Body.update`. It is read-only and always positive (it's the magnitude of `body.angularVelocity`).
  11733. *
  11734. * @readOnly
  11735. * @property angularSpeed
  11736. * @type number
  11737. * @default 0
  11738. */
  11739. /**
  11740. * A `Vector` that _measures_ the current velocity of the body after the last `Body.update`. It is read-only.
  11741. * If you need to modify a body's velocity directly, you should either apply a force or simply change the body's `position` (as the engine uses position-Verlet integration).
  11742. *
  11743. * @readOnly
  11744. * @property velocity
  11745. * @type vector
  11746. * @default { x: 0, y: 0 }
  11747. */
  11748. /**
  11749. * A `Number` that _measures_ the current angular velocity of the body after the last `Body.update`. It is read-only.
  11750. * If you need to modify a body's angular velocity directly, you should apply a torque or simply change the body's `angle` (as the engine uses position-Verlet integration).
  11751. *
  11752. * @readOnly
  11753. * @property angularVelocity
  11754. * @type number
  11755. * @default 0
  11756. */
  11757. /**
  11758. * A flag that indicates whether a body is considered static. A static body can never change position or angle and is completely fixed.
  11759. * If you need to set a body as static after its creation, you should use `Body.setStatic` as this requires more than just setting this flag.
  11760. *
  11761. * @property isStatic
  11762. * @type boolean
  11763. * @default false
  11764. */
  11765. /**
  11766. * A flag that indicates whether a body is a sensor. Sensor triggers collision events, but doesn't react with colliding body physically.
  11767. *
  11768. * @property isSensor
  11769. * @type boolean
  11770. * @default false
  11771. */
  11772. /**
  11773. * A flag that indicates whether the body is considered sleeping. A sleeping body acts similar to a static body, except it is only temporary and can be awoken.
  11774. * If you need to set a body as sleeping, you should use `Sleeping.set` as this requires more than just setting this flag.
  11775. *
  11776. * @property isSleeping
  11777. * @type boolean
  11778. * @default false
  11779. */
  11780. /**
  11781. * A `Number` that _measures_ the amount of movement a body currently has (a combination of `speed` and `angularSpeed`). It is read-only and always positive.
  11782. * It is used and updated by the `Matter.Sleeping` module during simulation to decide if a body has come to rest.
  11783. *
  11784. * @readOnly
  11785. * @property motion
  11786. * @type number
  11787. * @default 0
  11788. */
  11789. /**
  11790. * A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping by the `Matter.Sleeping` module (if sleeping is enabled by the engine).
  11791. *
  11792. * @property sleepThreshold
  11793. * @type number
  11794. * @default 60
  11795. */
  11796. /**
  11797. * A `Number` that defines the density of the body, that is its mass per unit area.
  11798. * If you pass the density via `Body.create` the `mass` property is automatically calculated for you based on the size (area) of the object.
  11799. * This is generally preferable to simply setting mass and allows for more intuitive definition of materials (e.g. rock has a higher density than wood).
  11800. *
  11801. * @property density
  11802. * @type number
  11803. * @default 0.001
  11804. */
  11805. /**
  11806. * A `Number` that defines the mass of the body, although it may be more appropriate to specify the `density` property instead.
  11807. * If you modify this value, you must also modify the `body.inverseMass` property (`1 / mass`).
  11808. *
  11809. * @property mass
  11810. * @type number
  11811. */
  11812. /**
  11813. * A `Number` that defines the inverse mass of the body (`1 / mass`).
  11814. * If you modify this value, you must also modify the `body.mass` property.
  11815. *
  11816. * @property inverseMass
  11817. * @type number
  11818. */
  11819. /**
  11820. * A `Number` that defines the moment of inertia (i.e. second moment of area) of the body.
  11821. * It is automatically calculated from the given convex hull (`vertices` array) and density in `Body.create`.
  11822. * If you modify this value, you must also modify the `body.inverseInertia` property (`1 / inertia`).
  11823. *
  11824. * @property inertia
  11825. * @type number
  11826. */
  11827. /**
  11828. * A `Number` that defines the inverse moment of inertia of the body (`1 / inertia`).
  11829. * If you modify this value, you must also modify the `body.inertia` property.
  11830. *
  11831. * @property inverseInertia
  11832. * @type number
  11833. */
  11834. /**
  11835. * A `Number` that defines the restitution (elasticity) of the body. The value is always positive and is in the range `(0, 1)`.
  11836. * A value of `0` means collisions may be perfectly inelastic and no bouncing may occur.
  11837. * A value of `0.8` means the body may bounce back with approximately 80% of its kinetic energy.
  11838. * Note that collision response is based on _pairs_ of bodies, and that `restitution` values are _combined_ with the following formula:
  11839. *
  11840. * Math.max(bodyA.restitution, bodyB.restitution)
  11841. *
  11842. * @property restitution
  11843. * @type number
  11844. * @default 0
  11845. */
  11846. /**
  11847. * A `Number` that defines the friction of the body. The value is always positive and is in the range `(0, 1)`.
  11848. * A value of `0` means that the body may slide indefinitely.
  11849. * A value of `1` means the body may come to a stop almost instantly after a force is applied.
  11850. *
  11851. * The effects of the value may be non-linear.
  11852. * High values may be unstable depending on the body.
  11853. * The engine uses a Coulomb friction model including static and kinetic friction.
  11854. * Note that collision response is based on _pairs_ of bodies, and that `friction` values are _combined_ with the following formula:
  11855. *
  11856. * Math.min(bodyA.friction, bodyB.friction)
  11857. *
  11858. * @property friction
  11859. * @type number
  11860. * @default 0.1
  11861. */
  11862. /**
  11863. * A `Number` that defines the static friction of the body (in the Coulomb friction model).
  11864. * A value of `0` means the body will never 'stick' when it is nearly stationary and only dynamic `friction` is used.
  11865. * The higher the value (e.g. `10`), the more force it will take to initially get the body moving when nearly stationary.
  11866. * This value is multiplied with the `friction` property to make it easier to change `friction` and maintain an appropriate amount of static friction.
  11867. *
  11868. * @property frictionStatic
  11869. * @type number
  11870. * @default 0.5
  11871. */
  11872. /**
  11873. * A `Number` that defines the air friction of the body (air resistance).
  11874. * A value of `0` means the body will never slow as it moves through space.
  11875. * The higher the value, the faster a body slows when moving through space.
  11876. * The effects of the value are non-linear.
  11877. *
  11878. * @property frictionAir
  11879. * @type number
  11880. * @default 0.01
  11881. */
  11882. /**
  11883. * An `Object` that specifies the collision filtering properties of this body.
  11884. *
  11885. * Collisions between two bodies will obey the following rules:
  11886. * - If the two bodies have the same non-zero value of `collisionFilter.group`,
  11887. * they will always collide if the value is positive, and they will never collide
  11888. * if the value is negative.
  11889. * - If the two bodies have different values of `collisionFilter.group` or if one
  11890. * (or both) of the bodies has a value of 0, then the category/mask rules apply as follows:
  11891. *
  11892. * Each body belongs to a collision category, given by `collisionFilter.category`. This
  11893. * value is used as a bit field and the category should have only one bit set, meaning that
  11894. * the value of this property is a power of two in the range [1, 2^31]. Thus, there are 32
  11895. * different collision categories available.
  11896. *
  11897. * Each body also defines a collision bitmask, given by `collisionFilter.mask` which specifies
  11898. * the categories it collides with (the value is the bitwise AND value of all these categories).
  11899. *
  11900. * Using the category/mask rules, two bodies `A` and `B` collide if each includes the other's
  11901. * category in its mask, i.e. `(categoryA & maskB) !== 0` and `(categoryB & maskA) !== 0`
  11902. * are both true.
  11903. *
  11904. * @property collisionFilter
  11905. * @type object
  11906. */
  11907. /**
  11908. * An Integer `Number`, that specifies the collision group this body belongs to.
  11909. * See `body.collisionFilter` for more information.
  11910. *
  11911. * @property collisionFilter.group
  11912. * @type object
  11913. * @default 0
  11914. */
  11915. /**
  11916. * A bit field that specifies the collision category this body belongs to.
  11917. * The category value should have only one bit set, for example `0x0001`.
  11918. * This means there are up to 32 unique collision categories available.
  11919. * See `body.collisionFilter` for more information.
  11920. *
  11921. * @property collisionFilter.category
  11922. * @type object
  11923. * @default 1
  11924. */
  11925. /**
  11926. * A bit mask that specifies the collision categories this body may collide with.
  11927. * See `body.collisionFilter` for more information.
  11928. *
  11929. * @property collisionFilter.mask
  11930. * @type object
  11931. * @default -1
  11932. */
  11933. /**
  11934. * A `Number` that specifies a tolerance on how far a body is allowed to 'sink' or rotate into other bodies.
  11935. * Avoid changing this value unless you understand the purpose of `slop` in physics engines.
  11936. * The default should generally suffice, although very large bodies may require larger values for stable stacking.
  11937. *
  11938. * @property slop
  11939. * @type number
  11940. * @default 0.05
  11941. */
  11942. /**
  11943. * A `Number` that allows per-body time scaling, e.g. a force-field where bodies inside are in slow-motion, while others are at full speed.
  11944. *
  11945. * @property timeScale
  11946. * @type number
  11947. * @default 1
  11948. */
  11949. /**
  11950. * An `Object` that defines the rendering properties to be consumed by the module `Matter.Render`.
  11951. *
  11952. * @property render
  11953. * @type object
  11954. */
  11955. /**
  11956. * A flag that indicates if the body should be rendered.
  11957. *
  11958. * @property render.visible
  11959. * @type boolean
  11960. * @default true
  11961. */
  11962. /**
  11963. * Sets the opacity to use when rendering.
  11964. *
  11965. * @property render.opacity
  11966. * @type number
  11967. * @default 1
  11968. */
  11969. /**
  11970. * An `Object` that defines the sprite properties to use when rendering, if any.
  11971. *
  11972. * @property render.sprite
  11973. * @type object
  11974. */
  11975. /**
  11976. * An `String` that defines the path to the image to use as the sprite texture, if any.
  11977. *
  11978. * @property render.sprite.texture
  11979. * @type string
  11980. */
  11981. /**
  11982. * A `Number` that defines the scaling in the x-axis for the sprite, if any.
  11983. *
  11984. * @property render.sprite.xScale
  11985. * @type number
  11986. * @default 1
  11987. */
  11988. /**
  11989. * A `Number` that defines the scaling in the y-axis for the sprite, if any.
  11990. *
  11991. * @property render.sprite.yScale
  11992. * @type number
  11993. * @default 1
  11994. */
  11995. /**
  11996. * A `Number` that defines the offset in the x-axis for the sprite (normalised by texture width).
  11997. *
  11998. * @property render.sprite.xOffset
  11999. * @type number
  12000. * @default 0
  12001. */
  12002. /**
  12003. * A `Number` that defines the offset in the y-axis for the sprite (normalised by texture height).
  12004. *
  12005. * @property render.sprite.yOffset
  12006. * @type number
  12007. * @default 0
  12008. */
  12009. /**
  12010. * A `Number` that defines the line width to use when rendering the body outline (if a sprite is not defined).
  12011. * A value of `0` means no outline will be rendered.
  12012. *
  12013. * @property render.lineWidth
  12014. * @type number
  12015. * @default 0
  12016. */
  12017. /**
  12018. * A `String` that defines the fill style to use when rendering the body (if a sprite is not defined).
  12019. * It is the same as when using a canvas, so it accepts CSS style property values.
  12020. *
  12021. * @property render.fillStyle
  12022. * @type string
  12023. * @default a random colour
  12024. */
  12025. /**
  12026. * A `String` that defines the stroke style to use when rendering the body outline (if a sprite is not defined).
  12027. * It is the same as when using a canvas, so it accepts CSS style property values.
  12028. *
  12029. * @property render.strokeStyle
  12030. * @type string
  12031. * @default a random colour
  12032. */
  12033. /**
  12034. * An array of unique axis vectors (edge normals) used for collision detection.
  12035. * These are automatically calculated from the given convex hull (`vertices` array) in `Body.create`.
  12036. * They are constantly updated by `Body.update` during the simulation.
  12037. *
  12038. * @property axes
  12039. * @type vector[]
  12040. */
  12041. /**
  12042. * A `Number` that _measures_ the area of the body's convex hull, calculated at creation by `Body.create`.
  12043. *
  12044. * @property area
  12045. * @type string
  12046. * @default
  12047. */
  12048. /**
  12049. * A `Bounds` object that defines the AABB region for the body.
  12050. * It is automatically calculated from the given convex hull (`vertices` array) in `Body.create` and constantly updated by `Body.update` during simulation.
  12051. *
  12052. * @property bounds
  12053. * @type bounds
  12054. */
  12055. })();
  12056. /***/ }),
  12057. /* 73 */
  12058. /***/ (function(module, exports) {
  12059. /**
  12060. * @author Richard Davey <rich@photonstorm.com>
  12061. * @copyright 2019 Photon Storm Ltd.
  12062. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12063. */
  12064. /**
  12065. * Calculate the angle of the line in radians.
  12066. *
  12067. * @function Phaser.Geom.Line.Angle
  12068. * @since 3.0.0
  12069. *
  12070. * @param {Phaser.Geom.Line} line - The line to calculate the angle of.
  12071. *
  12072. * @return {number} The angle of the line, in radians.
  12073. */
  12074. var Angle = function (line)
  12075. {
  12076. return Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
  12077. };
  12078. module.exports = Angle;
  12079. /***/ }),
  12080. /* 74 */
  12081. /***/ (function(module, exports) {
  12082. /**
  12083. * @author Richard Davey <rich@photonstorm.com>
  12084. * @copyright 2019 Photon Storm Ltd.
  12085. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12086. */
  12087. // http://www.blackpawn.com/texts/pointinpoly/
  12088. /**
  12089. * Checks if a point (as a pair of coordinates) is inside a Triangle's bounds.
  12090. *
  12091. * @function Phaser.Geom.Triangle.Contains
  12092. * @since 3.0.0
  12093. *
  12094. * @param {Phaser.Geom.Triangle} triangle - The Triangle to check.
  12095. * @param {number} x - The X coordinate of the point to check.
  12096. * @param {number} y - The Y coordinate of the point to check.
  12097. *
  12098. * @return {boolean} `true` if the point is inside the Triangle, otherwise `false`.
  12099. */
  12100. var Contains = function (triangle, x, y)
  12101. {
  12102. var v0x = triangle.x3 - triangle.x1;
  12103. var v0y = triangle.y3 - triangle.y1;
  12104. var v1x = triangle.x2 - triangle.x1;
  12105. var v1y = triangle.y2 - triangle.y1;
  12106. var v2x = x - triangle.x1;
  12107. var v2y = y - triangle.y1;
  12108. var dot00 = (v0x * v0x) + (v0y * v0y);
  12109. var dot01 = (v0x * v1x) + (v0y * v1y);
  12110. var dot02 = (v0x * v2x) + (v0y * v2y);
  12111. var dot11 = (v1x * v1x) + (v1y * v1y);
  12112. var dot12 = (v1x * v2x) + (v1y * v2y);
  12113. // Compute barycentric coordinates
  12114. var b = ((dot00 * dot11) - (dot01 * dot01));
  12115. var inv = (b === 0) ? 0 : (1 / b);
  12116. var u = ((dot11 * dot02) - (dot01 * dot12)) * inv;
  12117. var v = ((dot00 * dot12) - (dot01 * dot02)) * inv;
  12118. return (u >= 0 && v >= 0 && (u + v < 1));
  12119. };
  12120. module.exports = Contains;
  12121. /***/ }),
  12122. /* 75 */
  12123. /***/ (function(module, exports, __webpack_require__) {
  12124. /**
  12125. * @author Richard Davey <rich@photonstorm.com>
  12126. * @copyright 2019 Photon Storm Ltd.
  12127. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12128. */
  12129. /**
  12130. * @namespace Phaser.Loader.Events
  12131. */
  12132. module.exports = {
  12133. ADD: __webpack_require__(945),
  12134. COMPLETE: __webpack_require__(944),
  12135. FILE_COMPLETE: __webpack_require__(943),
  12136. FILE_KEY_COMPLETE: __webpack_require__(942),
  12137. FILE_LOAD_ERROR: __webpack_require__(941),
  12138. FILE_LOAD: __webpack_require__(940),
  12139. FILE_PROGRESS: __webpack_require__(939),
  12140. POST_PROCESS: __webpack_require__(938),
  12141. PROGRESS: __webpack_require__(937),
  12142. START: __webpack_require__(936)
  12143. };
  12144. /***/ }),
  12145. /* 76 */
  12146. /***/ (function(module, exports, __webpack_require__) {
  12147. /**
  12148. * @author Richard Davey <rich@photonstorm.com>
  12149. * @copyright 2019 Photon Storm Ltd.
  12150. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12151. */
  12152. var Class = __webpack_require__(0);
  12153. var FromPoints = __webpack_require__(180);
  12154. var Rectangle = __webpack_require__(10);
  12155. var Vector2 = __webpack_require__(3);
  12156. /**
  12157. * @classdesc
  12158. * A Base Curve class, which all other curve types extend.
  12159. *
  12160. * Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  12161. *
  12162. * @class Curve
  12163. * @memberof Phaser.Curves
  12164. * @constructor
  12165. * @since 3.0.0
  12166. *
  12167. * @param {string} type - [description]
  12168. */
  12169. var Curve = new Class({
  12170. initialize:
  12171. function Curve (type)
  12172. {
  12173. /**
  12174. * String based identifier for the type of curve.
  12175. *
  12176. * @name Phaser.Curves.Curve#type
  12177. * @type {string}
  12178. * @since 3.0.0
  12179. */
  12180. this.type = type;
  12181. /**
  12182. * The default number of divisions within the curve.
  12183. *
  12184. * @name Phaser.Curves.Curve#defaultDivisions
  12185. * @type {integer}
  12186. * @default 5
  12187. * @since 3.0.0
  12188. */
  12189. this.defaultDivisions = 5;
  12190. /**
  12191. * The quantity of arc length divisions within the curve.
  12192. *
  12193. * @name Phaser.Curves.Curve#arcLengthDivisions
  12194. * @type {integer}
  12195. * @default 100
  12196. * @since 3.0.0
  12197. */
  12198. this.arcLengthDivisions = 100;
  12199. /**
  12200. * An array of cached arc length values.
  12201. *
  12202. * @name Phaser.Curves.Curve#cacheArcLengths
  12203. * @type {number[]}
  12204. * @default []
  12205. * @since 3.0.0
  12206. */
  12207. this.cacheArcLengths = [];
  12208. /**
  12209. * Does the data of this curve need updating?
  12210. *
  12211. * @name Phaser.Curves.Curve#needsUpdate
  12212. * @type {boolean}
  12213. * @default true
  12214. * @since 3.0.0
  12215. */
  12216. this.needsUpdate = true;
  12217. /**
  12218. * [description]
  12219. *
  12220. * @name Phaser.Curves.Curve#active
  12221. * @type {boolean}
  12222. * @default true
  12223. * @since 3.0.0
  12224. */
  12225. this.active = true;
  12226. /**
  12227. * A temporary calculation Vector.
  12228. *
  12229. * @name Phaser.Curves.Curve#_tmpVec2A
  12230. * @type {Phaser.Math.Vector2}
  12231. * @private
  12232. * @since 3.0.0
  12233. */
  12234. this._tmpVec2A = new Vector2();
  12235. /**
  12236. * A temporary calculation Vector.
  12237. *
  12238. * @name Phaser.Curves.Curve#_tmpVec2B
  12239. * @type {Phaser.Math.Vector2}
  12240. * @private
  12241. * @since 3.0.0
  12242. */
  12243. this._tmpVec2B = new Vector2();
  12244. },
  12245. /**
  12246. * Draws this curve on the given Graphics object.
  12247. *
  12248. * The curve is drawn using `Graphics.strokePoints` so will be drawn at whatever the present Graphics stroke color is.
  12249. * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it.
  12250. *
  12251. * @method Phaser.Curves.Curve#draw
  12252. * @since 3.0.0
  12253. *
  12254. * @generic {Phaser.GameObjects.Graphics} G - [graphics,$return]
  12255. *
  12256. * @param {Phaser.GameObjects.Graphics} graphics - The Graphics instance onto which this curve will be drawn.
  12257. * @param {integer} [pointsTotal=32] - The resolution of the curve. The higher the value the smoother it will render, at the cost of rendering performance.
  12258. *
  12259. * @return {Phaser.GameObjects.Graphics} The Graphics object to which the curve was drawn.
  12260. */
  12261. draw: function (graphics, pointsTotal)
  12262. {
  12263. if (pointsTotal === undefined) { pointsTotal = 32; }
  12264. // So you can chain graphics calls
  12265. return graphics.strokePoints(this.getPoints(pointsTotal));
  12266. },
  12267. /**
  12268. * Returns a Rectangle where the position and dimensions match the bounds of this Curve.
  12269. *
  12270. * You can control the accuracy of the bounds. The value given is used to work out how many points
  12271. * to plot across the curve. Higher values are more accurate at the cost of calculation speed.
  12272. *
  12273. * @method Phaser.Curves.Curve#getBounds
  12274. * @since 3.0.0
  12275. *
  12276. * @param {Phaser.Geom.Rectangle} [out] - The Rectangle to store the bounds in. If falsey a new object will be created.
  12277. * @param {integer} [accuracy=16] - The accuracy of the bounds calculations.
  12278. *
  12279. * @return {Phaser.Geom.Rectangle} A Rectangle object holding the bounds of this curve. If `out` was given it will be this object.
  12280. */
  12281. getBounds: function (out, accuracy)
  12282. {
  12283. if (!out) { out = new Rectangle(); }
  12284. if (accuracy === undefined) { accuracy = 16; }
  12285. var len = this.getLength();
  12286. if (accuracy > len)
  12287. {
  12288. accuracy = len / 2;
  12289. }
  12290. // The length of the curve in pixels
  12291. // So we'll have 1 spaced point per 'accuracy' pixels
  12292. var spaced = Math.max(1, Math.round(len / accuracy));
  12293. return FromPoints(this.getSpacedPoints(spaced), out);
  12294. },
  12295. /**
  12296. * Returns an array of points, spaced out X distance pixels apart.
  12297. * The smaller the distance, the larger the array will be.
  12298. *
  12299. * @method Phaser.Curves.Curve#getDistancePoints
  12300. * @since 3.0.0
  12301. *
  12302. * @param {integer} distance - The distance, in pixels, between each point along the curve.
  12303. *
  12304. * @return {Phaser.Geom.Point[]} An Array of Point objects.
  12305. */
  12306. getDistancePoints: function (distance)
  12307. {
  12308. var len = this.getLength();
  12309. var spaced = Math.max(1, len / distance);
  12310. return this.getSpacedPoints(spaced);
  12311. },
  12312. /**
  12313. * [description]
  12314. *
  12315. * @method Phaser.Curves.Curve#getEndPoint
  12316. * @since 3.0.0
  12317. *
  12318. * @param {Phaser.Math.Vector2} [out] - Optional Vector object to store the result in.
  12319. *
  12320. * @return {Phaser.Math.Vector2} Vector2 containing the coordinates of the curves end point.
  12321. */
  12322. getEndPoint: function (out)
  12323. {
  12324. if (out === undefined) { out = new Vector2(); }
  12325. return this.getPointAt(1, out);
  12326. },
  12327. // Get total curve arc length
  12328. /**
  12329. * [description]
  12330. *
  12331. * @method Phaser.Curves.Curve#getLength
  12332. * @since 3.0.0
  12333. *
  12334. * @return {number} [description]
  12335. */
  12336. getLength: function ()
  12337. {
  12338. var lengths = this.getLengths();
  12339. return lengths[lengths.length - 1];
  12340. },
  12341. // Get list of cumulative segment lengths
  12342. /**
  12343. * [description]
  12344. *
  12345. * @method Phaser.Curves.Curve#getLengths
  12346. * @since 3.0.0
  12347. *
  12348. * @param {integer} [divisions] - [description]
  12349. *
  12350. * @return {number[]} [description]
  12351. */
  12352. getLengths: function (divisions)
  12353. {
  12354. if (divisions === undefined) { divisions = this.arcLengthDivisions; }
  12355. if ((this.cacheArcLengths.length === divisions + 1) && !this.needsUpdate)
  12356. {
  12357. return this.cacheArcLengths;
  12358. }
  12359. this.needsUpdate = false;
  12360. var cache = [];
  12361. var current;
  12362. var last = this.getPoint(0, this._tmpVec2A);
  12363. var sum = 0;
  12364. cache.push(0);
  12365. for (var p = 1; p <= divisions; p++)
  12366. {
  12367. current = this.getPoint(p / divisions, this._tmpVec2B);
  12368. sum += current.distance(last);
  12369. cache.push(sum);
  12370. last.copy(current);
  12371. }
  12372. this.cacheArcLengths = cache;
  12373. return cache; // { sums: cache, sum:sum }; Sum is in the last element.
  12374. },
  12375. // Get point at relative position in curve according to arc length
  12376. // - u [0 .. 1]
  12377. /**
  12378. * [description]
  12379. *
  12380. * @method Phaser.Curves.Curve#getPointAt
  12381. * @since 3.0.0
  12382. *
  12383. * @generic {Phaser.Math.Vector2} O - [out,$return]
  12384. *
  12385. * @param {number} u - [description]
  12386. * @param {Phaser.Math.Vector2} [out] - [description]
  12387. *
  12388. * @return {Phaser.Math.Vector2} [description]
  12389. */
  12390. getPointAt: function (u, out)
  12391. {
  12392. var t = this.getUtoTmapping(u);
  12393. return this.getPoint(t, out);
  12394. },
  12395. // Get sequence of points using getPoint( t )
  12396. /**
  12397. * [description]
  12398. *
  12399. * @method Phaser.Curves.Curve#getPoints
  12400. * @since 3.0.0
  12401. *
  12402. * @param {integer} [divisions] - [description]
  12403. *
  12404. * @return {Phaser.Math.Vector2[]} [description]
  12405. */
  12406. getPoints: function (divisions)
  12407. {
  12408. if (divisions === undefined) { divisions = this.defaultDivisions; }
  12409. var points = [];
  12410. for (var d = 0; d <= divisions; d++)
  12411. {
  12412. points.push(this.getPoint(d / divisions));
  12413. }
  12414. return points;
  12415. },
  12416. /**
  12417. * [description]
  12418. *
  12419. * @method Phaser.Curves.Curve#getRandomPoint
  12420. * @since 3.0.0
  12421. *
  12422. * @generic {Phaser.Math.Vector2} O - [out,$return]
  12423. *
  12424. * @param {Phaser.Math.Vector2} [out] - [description]
  12425. *
  12426. * @return {Phaser.Math.Vector2} [description]
  12427. */
  12428. getRandomPoint: function (out)
  12429. {
  12430. if (out === undefined) { out = new Vector2(); }
  12431. return this.getPoint(Math.random(), out);
  12432. },
  12433. // Get sequence of points using getPointAt( u )
  12434. /**
  12435. * [description]
  12436. *
  12437. * @method Phaser.Curves.Curve#getSpacedPoints
  12438. * @since 3.0.0
  12439. *
  12440. * @param {integer} [divisions] - [description]
  12441. *
  12442. * @return {Phaser.Math.Vector2[]} [description]
  12443. */
  12444. getSpacedPoints: function (divisions)
  12445. {
  12446. if (divisions === undefined) { divisions = this.defaultDivisions; }
  12447. var points = [];
  12448. for (var d = 0; d <= divisions; d++)
  12449. {
  12450. var t = this.getUtoTmapping(d / divisions, null, divisions);
  12451. points.push(this.getPoint(t));
  12452. }
  12453. return points;
  12454. },
  12455. /**
  12456. * [description]
  12457. *
  12458. * @method Phaser.Curves.Curve#getStartPoint
  12459. * @since 3.0.0
  12460. *
  12461. * @generic {Phaser.Math.Vector2} O - [out,$return]
  12462. *
  12463. * @param {Phaser.Math.Vector2} [out] - [description]
  12464. *
  12465. * @return {Phaser.Math.Vector2} [description]
  12466. */
  12467. getStartPoint: function (out)
  12468. {
  12469. if (out === undefined) { out = new Vector2(); }
  12470. return this.getPointAt(0, out);
  12471. },
  12472. // Returns a unit vector tangent at t
  12473. // In case any sub curve does not implement its tangent derivation,
  12474. // 2 points a small delta apart will be used to find its gradient
  12475. // which seems to give a reasonable approximation
  12476. /**
  12477. * [description]
  12478. *
  12479. * @method Phaser.Curves.Curve#getTangent
  12480. * @since 3.0.0
  12481. *
  12482. * @generic {Phaser.Math.Vector2} O - [out,$return]
  12483. *
  12484. * @param {number} t - [description]
  12485. * @param {Phaser.Math.Vector2} [out] - [description]
  12486. *
  12487. * @return {Phaser.Math.Vector2} Vector approximating the tangent line at the point t (delta +/- 0.0001)
  12488. */
  12489. getTangent: function (t, out)
  12490. {
  12491. if (out === undefined) { out = new Vector2(); }
  12492. var delta = 0.0001;
  12493. var t1 = t - delta;
  12494. var t2 = t + delta;
  12495. // Capping in case of danger
  12496. if (t1 < 0)
  12497. {
  12498. t1 = 0;
  12499. }
  12500. if (t2 > 1)
  12501. {
  12502. t2 = 1;
  12503. }
  12504. this.getPoint(t1, this._tmpVec2A);
  12505. this.getPoint(t2, out);
  12506. return out.subtract(this._tmpVec2A).normalize();
  12507. },
  12508. /**
  12509. * [description]
  12510. *
  12511. * @method Phaser.Curves.Curve#getTangentAt
  12512. * @since 3.0.0
  12513. *
  12514. * @generic {Phaser.Math.Vector2} O - [out,$return]
  12515. *
  12516. * @param {number} u - [description]
  12517. * @param {Phaser.Math.Vector2} [out] - [description]
  12518. *
  12519. * @return {Phaser.Math.Vector2} [description]
  12520. */
  12521. getTangentAt: function (u, out)
  12522. {
  12523. var t = this.getUtoTmapping(u);
  12524. return this.getTangent(t, out);
  12525. },
  12526. // Given a distance in pixels, get a t to find p.
  12527. /**
  12528. * [description]
  12529. *
  12530. * @method Phaser.Curves.Curve#getTFromDistance
  12531. * @since 3.0.0
  12532. *
  12533. * @param {integer} distance - [description]
  12534. * @param {integer} [divisions] - [description]
  12535. *
  12536. * @return {number} [description]
  12537. */
  12538. getTFromDistance: function (distance, divisions)
  12539. {
  12540. if (distance <= 0)
  12541. {
  12542. return 0;
  12543. }
  12544. return this.getUtoTmapping(0, distance, divisions);
  12545. },
  12546. // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant
  12547. /**
  12548. * [description]
  12549. *
  12550. * @method Phaser.Curves.Curve#getUtoTmapping
  12551. * @since 3.0.0
  12552. *
  12553. * @param {number} u - [description]
  12554. * @param {integer} distance - [description]
  12555. * @param {integer} [divisions] - [description]
  12556. *
  12557. * @return {number} [description]
  12558. */
  12559. getUtoTmapping: function (u, distance, divisions)
  12560. {
  12561. var arcLengths = this.getLengths(divisions);
  12562. var i = 0;
  12563. var il = arcLengths.length;
  12564. var targetArcLength; // The targeted u distance value to get
  12565. if (distance)
  12566. {
  12567. // Cannot overshoot the curve
  12568. targetArcLength = Math.min(distance, arcLengths[il - 1]);
  12569. }
  12570. else
  12571. {
  12572. targetArcLength = u * arcLengths[il - 1];
  12573. }
  12574. // binary search for the index with largest value smaller than target u distance
  12575. var low = 0;
  12576. var high = il - 1;
  12577. var comparison;
  12578. while (low <= high)
  12579. {
  12580. i = Math.floor(low + (high - low) / 2); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats
  12581. comparison = arcLengths[i] - targetArcLength;
  12582. if (comparison < 0)
  12583. {
  12584. low = i + 1;
  12585. }
  12586. else if (comparison > 0)
  12587. {
  12588. high = i - 1;
  12589. }
  12590. else
  12591. {
  12592. high = i;
  12593. break;
  12594. }
  12595. }
  12596. i = high;
  12597. if (arcLengths[i] === targetArcLength)
  12598. {
  12599. return i / (il - 1);
  12600. }
  12601. // we could get finer grain at lengths, or use simple interpolation between two points
  12602. var lengthBefore = arcLengths[i];
  12603. var lengthAfter = arcLengths[i + 1];
  12604. var segmentLength = lengthAfter - lengthBefore;
  12605. // determine where we are between the 'before' and 'after' points
  12606. var segmentFraction = (targetArcLength - lengthBefore) / segmentLength;
  12607. // add that fractional amount to t
  12608. return (i + segmentFraction) / (il - 1);
  12609. },
  12610. /**
  12611. * [description]
  12612. *
  12613. * @method Phaser.Curves.Curve#updateArcLengths
  12614. * @since 3.0.0
  12615. */
  12616. updateArcLengths: function ()
  12617. {
  12618. this.needsUpdate = true;
  12619. this.getLengths();
  12620. }
  12621. });
  12622. module.exports = Curve;
  12623. /***/ }),
  12624. /* 77 */
  12625. /***/ (function(module, exports, __webpack_require__) {
  12626. /**
  12627. * @author Richard Davey <rich@photonstorm.com>
  12628. * @copyright 2019 Photon Storm Ltd.
  12629. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12630. */
  12631. var Class = __webpack_require__(0);
  12632. var Contains = __webpack_require__(43);
  12633. var GetPoint = __webpack_require__(438);
  12634. var GetPoints = __webpack_require__(437);
  12635. var Random = __webpack_require__(206);
  12636. /**
  12637. * @classdesc
  12638. * A Circle object.
  12639. *
  12640. * This is a geometry object, containing numerical values and related methods to inspect and modify them.
  12641. * It is not a Game Object, in that you cannot add it to the display list, and it has no texture.
  12642. * To render a Circle you should look at the capabilities of the Graphics class.
  12643. *
  12644. * @class Circle
  12645. * @memberof Phaser.Geom
  12646. * @constructor
  12647. * @since 3.0.0
  12648. *
  12649. * @param {number} [x=0] - The x position of the center of the circle.
  12650. * @param {number} [y=0] - The y position of the center of the circle.
  12651. * @param {number} [radius=0] - The radius of the circle.
  12652. */
  12653. var Circle = new Class({
  12654. initialize:
  12655. function Circle (x, y, radius)
  12656. {
  12657. if (x === undefined) { x = 0; }
  12658. if (y === undefined) { y = 0; }
  12659. if (radius === undefined) { radius = 0; }
  12660. /**
  12661. * The x position of the center of the circle.
  12662. *
  12663. * @name Phaser.Geom.Circle#x
  12664. * @type {number}
  12665. * @default 0
  12666. * @since 3.0.0
  12667. */
  12668. this.x = x;
  12669. /**
  12670. * The y position of the center of the circle.
  12671. *
  12672. * @name Phaser.Geom.Circle#y
  12673. * @type {number}
  12674. * @default 0
  12675. * @since 3.0.0
  12676. */
  12677. this.y = y;
  12678. /**
  12679. * The internal radius of the circle.
  12680. *
  12681. * @name Phaser.Geom.Circle#_radius
  12682. * @type {number}
  12683. * @private
  12684. * @since 3.0.0
  12685. */
  12686. this._radius = radius;
  12687. /**
  12688. * The internal diameter of the circle.
  12689. *
  12690. * @name Phaser.Geom.Circle#_diameter
  12691. * @type {number}
  12692. * @private
  12693. * @since 3.0.0
  12694. */
  12695. this._diameter = radius * 2;
  12696. },
  12697. /**
  12698. * Check to see if the Circle contains the given x / y coordinates.
  12699. *
  12700. * @method Phaser.Geom.Circle#contains
  12701. * @since 3.0.0
  12702. *
  12703. * @param {number} x - The x coordinate to check within the circle.
  12704. * @param {number} y - The y coordinate to check within the circle.
  12705. *
  12706. * @return {boolean} True if the coordinates are within the circle, otherwise false.
  12707. */
  12708. contains: function (x, y)
  12709. {
  12710. return Contains(this, x, y);
  12711. },
  12712. /**
  12713. * Returns a Point object containing the coordinates of a point on the circumference of the Circle
  12714. * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point
  12715. * at 180 degrees around the circle.
  12716. *
  12717. * @method Phaser.Geom.Circle#getPoint
  12718. * @since 3.0.0
  12719. *
  12720. * @generic {Phaser.Geom.Point} O - [out,$return]
  12721. *
  12722. * @param {number} position - A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the circle.
  12723. * @param {(Phaser.Geom.Point|object)} [out] - An object to store the return values in. If not given a Point object will be created.
  12724. *
  12725. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point around the circle.
  12726. */
  12727. getPoint: function (position, point)
  12728. {
  12729. return GetPoint(this, position, point);
  12730. },
  12731. /**
  12732. * Returns an array of Point objects containing the coordinates of the points around the circumference of the Circle,
  12733. * based on the given quantity or stepRate values.
  12734. *
  12735. * @method Phaser.Geom.Circle#getPoints
  12736. * @since 3.0.0
  12737. *
  12738. * @generic {Phaser.Geom.Point[]} O - [output,$return]
  12739. *
  12740. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  12741. * @param {number} [stepRate] - Sets the quantity by getting the circumference of the circle and dividing it by the stepRate.
  12742. * @param {(array|Phaser.Geom.Point[])} [output] - An array to insert the points in to. If not provided a new array will be created.
  12743. *
  12744. * @return {(array|Phaser.Geom.Point[])} An array of Point objects pertaining to the points around the circumference of the circle.
  12745. */
  12746. getPoints: function (quantity, stepRate, output)
  12747. {
  12748. return GetPoints(this, quantity, stepRate, output);
  12749. },
  12750. /**
  12751. * Returns a uniformly distributed random point from anywhere within the Circle.
  12752. *
  12753. * @method Phaser.Geom.Circle#getRandomPoint
  12754. * @since 3.0.0
  12755. *
  12756. * @generic {Phaser.Geom.Point} O - [point,$return]
  12757. *
  12758. * @param {(Phaser.Geom.Point|object)} [point] - A Point or point-like object to set the random `x` and `y` values in.
  12759. *
  12760. * @return {(Phaser.Geom.Point|object)} A Point object with the random values set in the `x` and `y` properties.
  12761. */
  12762. getRandomPoint: function (point)
  12763. {
  12764. return Random(this, point);
  12765. },
  12766. /**
  12767. * Sets the x, y and radius of this circle.
  12768. *
  12769. * @method Phaser.Geom.Circle#setTo
  12770. * @since 3.0.0
  12771. *
  12772. * @param {number} [x=0] - The x position of the center of the circle.
  12773. * @param {number} [y=0] - The y position of the center of the circle.
  12774. * @param {number} [radius=0] - The radius of the circle.
  12775. *
  12776. * @return {Phaser.Geom.Circle} This Circle object.
  12777. */
  12778. setTo: function (x, y, radius)
  12779. {
  12780. this.x = x;
  12781. this.y = y;
  12782. this._radius = radius;
  12783. this._diameter = radius * 2;
  12784. return this;
  12785. },
  12786. /**
  12787. * Sets this Circle to be empty with a radius of zero.
  12788. * Does not change its position.
  12789. *
  12790. * @method Phaser.Geom.Circle#setEmpty
  12791. * @since 3.0.0
  12792. *
  12793. * @return {Phaser.Geom.Circle} This Circle object.
  12794. */
  12795. setEmpty: function ()
  12796. {
  12797. this._radius = 0;
  12798. this._diameter = 0;
  12799. return this;
  12800. },
  12801. /**
  12802. * Sets the position of this Circle.
  12803. *
  12804. * @method Phaser.Geom.Circle#setPosition
  12805. * @since 3.0.0
  12806. *
  12807. * @param {number} [x=0] - The x position of the center of the circle.
  12808. * @param {number} [y=0] - The y position of the center of the circle.
  12809. *
  12810. * @return {Phaser.Geom.Circle} This Circle object.
  12811. */
  12812. setPosition: function (x, y)
  12813. {
  12814. if (y === undefined) { y = x; }
  12815. this.x = x;
  12816. this.y = y;
  12817. return this;
  12818. },
  12819. /**
  12820. * Checks to see if the Circle is empty: has a radius of zero.
  12821. *
  12822. * @method Phaser.Geom.Circle#isEmpty
  12823. * @since 3.0.0
  12824. *
  12825. * @return {boolean} True if the Circle is empty, otherwise false.
  12826. */
  12827. isEmpty: function ()
  12828. {
  12829. return (this._radius <= 0);
  12830. },
  12831. /**
  12832. * The radius of the Circle.
  12833. *
  12834. * @name Phaser.Geom.Circle#radius
  12835. * @type {number}
  12836. * @since 3.0.0
  12837. */
  12838. radius: {
  12839. get: function ()
  12840. {
  12841. return this._radius;
  12842. },
  12843. set: function (value)
  12844. {
  12845. this._radius = value;
  12846. this._diameter = value * 2;
  12847. }
  12848. },
  12849. /**
  12850. * The diameter of the Circle.
  12851. *
  12852. * @name Phaser.Geom.Circle#diameter
  12853. * @type {number}
  12854. * @since 3.0.0
  12855. */
  12856. diameter: {
  12857. get: function ()
  12858. {
  12859. return this._diameter;
  12860. },
  12861. set: function (value)
  12862. {
  12863. this._diameter = value;
  12864. this._radius = value * 0.5;
  12865. }
  12866. },
  12867. /**
  12868. * The left position of the Circle.
  12869. *
  12870. * @name Phaser.Geom.Circle#left
  12871. * @type {number}
  12872. * @since 3.0.0
  12873. */
  12874. left: {
  12875. get: function ()
  12876. {
  12877. return this.x - this._radius;
  12878. },
  12879. set: function (value)
  12880. {
  12881. this.x = value + this._radius;
  12882. }
  12883. },
  12884. /**
  12885. * The right position of the Circle.
  12886. *
  12887. * @name Phaser.Geom.Circle#right
  12888. * @type {number}
  12889. * @since 3.0.0
  12890. */
  12891. right: {
  12892. get: function ()
  12893. {
  12894. return this.x + this._radius;
  12895. },
  12896. set: function (value)
  12897. {
  12898. this.x = value - this._radius;
  12899. }
  12900. },
  12901. /**
  12902. * The top position of the Circle.
  12903. *
  12904. * @name Phaser.Geom.Circle#top
  12905. * @type {number}
  12906. * @since 3.0.0
  12907. */
  12908. top: {
  12909. get: function ()
  12910. {
  12911. return this.y - this._radius;
  12912. },
  12913. set: function (value)
  12914. {
  12915. this.y = value + this._radius;
  12916. }
  12917. },
  12918. /**
  12919. * The bottom position of the Circle.
  12920. *
  12921. * @name Phaser.Geom.Circle#bottom
  12922. * @type {number}
  12923. * @since 3.0.0
  12924. */
  12925. bottom: {
  12926. get: function ()
  12927. {
  12928. return this.y + this._radius;
  12929. },
  12930. set: function (value)
  12931. {
  12932. this.y = value - this._radius;
  12933. }
  12934. }
  12935. });
  12936. module.exports = Circle;
  12937. /***/ }),
  12938. /* 78 */
  12939. /***/ (function(module, exports) {
  12940. /**
  12941. * @author Richard Davey <rich@photonstorm.com>
  12942. * @copyright 2019 Photon Storm Ltd.
  12943. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12944. */
  12945. /**
  12946. * Returns the center y coordinate from the bounds of the Game Object.
  12947. *
  12948. * @function Phaser.Display.Bounds.GetCenterY
  12949. * @since 3.0.0
  12950. *
  12951. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  12952. *
  12953. * @return {number} The center y coordinate of the bounds of the Game Object.
  12954. */
  12955. var GetCenterY = function (gameObject)
  12956. {
  12957. return gameObject.y - (gameObject.height * gameObject.originY) + (gameObject.height * 0.5);
  12958. };
  12959. module.exports = GetCenterY;
  12960. /***/ }),
  12961. /* 79 */
  12962. /***/ (function(module, exports) {
  12963. /**
  12964. * @author Richard Davey <rich@photonstorm.com>
  12965. * @copyright 2019 Photon Storm Ltd.
  12966. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12967. */
  12968. /**
  12969. * Positions the Game Object so that the center top of its bounds aligns with the given coordinate.
  12970. *
  12971. * @function Phaser.Display.Bounds.SetCenterY
  12972. * @since 3.0.0
  12973. *
  12974. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  12975. *
  12976. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  12977. * @param {number} y - The coordinate to position the Game Object bounds on.
  12978. *
  12979. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  12980. */
  12981. var SetCenterY = function (gameObject, y)
  12982. {
  12983. var offsetY = gameObject.height * gameObject.originY;
  12984. gameObject.y = (y + offsetY) - (gameObject.height * 0.5);
  12985. return gameObject;
  12986. };
  12987. module.exports = SetCenterY;
  12988. /***/ }),
  12989. /* 80 */
  12990. /***/ (function(module, exports) {
  12991. /**
  12992. * @author Richard Davey <rich@photonstorm.com>
  12993. * @copyright 2019 Photon Storm Ltd.
  12994. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12995. */
  12996. /**
  12997. * Positions the Game Object so that the center top of its bounds aligns with the given coordinate.
  12998. *
  12999. * @function Phaser.Display.Bounds.SetCenterX
  13000. * @since 3.0.0
  13001. *
  13002. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  13003. *
  13004. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  13005. * @param {number} x - The coordinate to position the Game Object bounds on.
  13006. *
  13007. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  13008. */
  13009. var SetCenterX = function (gameObject, x)
  13010. {
  13011. var offsetX = gameObject.width * gameObject.originX;
  13012. gameObject.x = (x + offsetX) - (gameObject.width * 0.5);
  13013. return gameObject;
  13014. };
  13015. module.exports = SetCenterX;
  13016. /***/ }),
  13017. /* 81 */
  13018. /***/ (function(module, exports) {
  13019. /**
  13020. * @author Richard Davey <rich@photonstorm.com>
  13021. * @copyright 2019 Photon Storm Ltd.
  13022. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  13023. */
  13024. /**
  13025. * Returns the center x coordinate from the bounds of the Game Object.
  13026. *
  13027. * @function Phaser.Display.Bounds.GetCenterX
  13028. * @since 3.0.0
  13029. *
  13030. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  13031. *
  13032. * @return {number} The center x coordinate of the bounds of the Game Object.
  13033. */
  13034. var GetCenterX = function (gameObject)
  13035. {
  13036. return gameObject.x - (gameObject.width * gameObject.originX) + (gameObject.width * 0.5);
  13037. };
  13038. module.exports = GetCenterX;
  13039. /***/ }),
  13040. /* 82 */
  13041. /***/ (function(module, exports, __webpack_require__) {
  13042. /**
  13043. * The `Matter.Vertices` module contains methods for creating and manipulating sets of vertices.
  13044. * A set of vertices is an array of `Matter.Vector` with additional indexing properties inserted by `Vertices.create`.
  13045. * A `Matter.Body` maintains a set of vertices to represent the shape of the object (its convex hull).
  13046. *
  13047. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  13048. *
  13049. * @class Vertices
  13050. */
  13051. var Vertices = {};
  13052. module.exports = Vertices;
  13053. var Vector = __webpack_require__(87);
  13054. var Common = __webpack_require__(36);
  13055. (function() {
  13056. /**
  13057. * Creates a new set of `Matter.Body` compatible vertices.
  13058. * The `points` argument accepts an array of `Matter.Vector` points orientated around the origin `(0, 0)`, for example:
  13059. *
  13060. * [{ x: 0, y: 0 }, { x: 25, y: 50 }, { x: 50, y: 0 }]
  13061. *
  13062. * The `Vertices.create` method returns a new array of vertices, which are similar to Matter.Vector objects,
  13063. * but with some additional references required for efficient collision detection routines.
  13064. *
  13065. * Vertices must be specified in clockwise order.
  13066. *
  13067. * Note that the `body` argument is not optional, a `Matter.Body` reference must be provided.
  13068. *
  13069. * @method create
  13070. * @param {vector[]} points
  13071. * @param {body} body
  13072. */
  13073. Vertices.create = function(points, body) {
  13074. var vertices = [];
  13075. for (var i = 0; i < points.length; i++) {
  13076. var point = points[i],
  13077. vertex = {
  13078. x: point.x,
  13079. y: point.y,
  13080. index: i,
  13081. body: body,
  13082. isInternal: false,
  13083. contact: null
  13084. };
  13085. vertex.contact = {
  13086. vertex: vertex,
  13087. normalImpulse: 0,
  13088. tangentImpulse: 0
  13089. };
  13090. vertices.push(vertex);
  13091. }
  13092. return vertices;
  13093. };
  13094. /**
  13095. * Parses a string containing ordered x y pairs separated by spaces (and optionally commas),
  13096. * into a `Matter.Vertices` object for the given `Matter.Body`.
  13097. * For parsing SVG paths, see `Svg.pathToVertices`.
  13098. * @method fromPath
  13099. * @param {string} path
  13100. * @param {body} body
  13101. * @return {vertices} vertices
  13102. */
  13103. Vertices.fromPath = function(path, body) {
  13104. var pathPattern = /L?\s*([\-\d\.e]+)[\s,]*([\-\d\.e]+)*/ig,
  13105. points = [];
  13106. path.replace(pathPattern, function(match, x, y) {
  13107. points.push({ x: parseFloat(x), y: parseFloat(y) });
  13108. });
  13109. return Vertices.create(points, body);
  13110. };
  13111. /**
  13112. * Returns the centre (centroid) of the set of vertices.
  13113. * @method centre
  13114. * @param {vertices} vertices
  13115. * @return {vector} The centre point
  13116. */
  13117. Vertices.centre = function(vertices) {
  13118. var area = Vertices.area(vertices, true),
  13119. centre = { x: 0, y: 0 },
  13120. cross,
  13121. temp,
  13122. j;
  13123. for (var i = 0; i < vertices.length; i++) {
  13124. j = (i + 1) % vertices.length;
  13125. cross = Vector.cross(vertices[i], vertices[j]);
  13126. temp = Vector.mult(Vector.add(vertices[i], vertices[j]), cross);
  13127. centre = Vector.add(centre, temp);
  13128. }
  13129. return Vector.div(centre, 6 * area);
  13130. };
  13131. /**
  13132. * Returns the average (mean) of the set of vertices.
  13133. * @method mean
  13134. * @param {vertices} vertices
  13135. * @return {vector} The average point
  13136. */
  13137. Vertices.mean = function(vertices) {
  13138. var average = { x: 0, y: 0 };
  13139. for (var i = 0; i < vertices.length; i++) {
  13140. average.x += vertices[i].x;
  13141. average.y += vertices[i].y;
  13142. }
  13143. return Vector.div(average, vertices.length);
  13144. };
  13145. /**
  13146. * Returns the area of the set of vertices.
  13147. * @method area
  13148. * @param {vertices} vertices
  13149. * @param {bool} signed
  13150. * @return {number} The area
  13151. */
  13152. Vertices.area = function(vertices, signed) {
  13153. var area = 0,
  13154. j = vertices.length - 1;
  13155. for (var i = 0; i < vertices.length; i++) {
  13156. area += (vertices[j].x - vertices[i].x) * (vertices[j].y + vertices[i].y);
  13157. j = i;
  13158. }
  13159. if (signed)
  13160. return area / 2;
  13161. return Math.abs(area) / 2;
  13162. };
  13163. /**
  13164. * Returns the moment of inertia (second moment of area) of the set of vertices given the total mass.
  13165. * @method inertia
  13166. * @param {vertices} vertices
  13167. * @param {number} mass
  13168. * @return {number} The polygon's moment of inertia
  13169. */
  13170. Vertices.inertia = function(vertices, mass) {
  13171. var numerator = 0,
  13172. denominator = 0,
  13173. v = vertices,
  13174. cross,
  13175. j;
  13176. // find the polygon's moment of inertia, using second moment of area
  13177. // from equations at http://www.physicsforums.com/showthread.php?t=25293
  13178. for (var n = 0; n < v.length; n++) {
  13179. j = (n + 1) % v.length;
  13180. cross = Math.abs(Vector.cross(v[j], v[n]));
  13181. numerator += cross * (Vector.dot(v[j], v[j]) + Vector.dot(v[j], v[n]) + Vector.dot(v[n], v[n]));
  13182. denominator += cross;
  13183. }
  13184. return (mass / 6) * (numerator / denominator);
  13185. };
  13186. /**
  13187. * Translates the set of vertices in-place.
  13188. * @method translate
  13189. * @param {vertices} vertices
  13190. * @param {vector} vector
  13191. * @param {number} scalar
  13192. */
  13193. Vertices.translate = function(vertices, vector, scalar) {
  13194. var i;
  13195. if (scalar) {
  13196. for (i = 0; i < vertices.length; i++) {
  13197. vertices[i].x += vector.x * scalar;
  13198. vertices[i].y += vector.y * scalar;
  13199. }
  13200. } else {
  13201. for (i = 0; i < vertices.length; i++) {
  13202. vertices[i].x += vector.x;
  13203. vertices[i].y += vector.y;
  13204. }
  13205. }
  13206. return vertices;
  13207. };
  13208. /**
  13209. * Rotates the set of vertices in-place.
  13210. * @method rotate
  13211. * @param {vertices} vertices
  13212. * @param {number} angle
  13213. * @param {vector} point
  13214. */
  13215. Vertices.rotate = function(vertices, angle, point) {
  13216. if (angle === 0)
  13217. return;
  13218. var cos = Math.cos(angle),
  13219. sin = Math.sin(angle);
  13220. for (var i = 0; i < vertices.length; i++) {
  13221. var vertice = vertices[i],
  13222. dx = vertice.x - point.x,
  13223. dy = vertice.y - point.y;
  13224. vertice.x = point.x + (dx * cos - dy * sin);
  13225. vertice.y = point.y + (dx * sin + dy * cos);
  13226. }
  13227. return vertices;
  13228. };
  13229. /**
  13230. * Returns `true` if the `point` is inside the set of `vertices`.
  13231. * @method contains
  13232. * @param {vertices} vertices
  13233. * @param {vector} point
  13234. * @return {boolean} True if the vertices contains point, otherwise false
  13235. */
  13236. Vertices.contains = function(vertices, point) {
  13237. for (var i = 0; i < vertices.length; i++) {
  13238. var vertice = vertices[i],
  13239. nextVertice = vertices[(i + 1) % vertices.length];
  13240. if ((point.x - vertice.x) * (nextVertice.y - vertice.y) + (point.y - vertice.y) * (vertice.x - nextVertice.x) > 0) {
  13241. return false;
  13242. }
  13243. }
  13244. return true;
  13245. };
  13246. /**
  13247. * Scales the vertices from a point (default is centre) in-place.
  13248. * @method scale
  13249. * @param {vertices} vertices
  13250. * @param {number} scaleX
  13251. * @param {number} scaleY
  13252. * @param {vector} point
  13253. */
  13254. Vertices.scale = function(vertices, scaleX, scaleY, point) {
  13255. if (scaleX === 1 && scaleY === 1)
  13256. return vertices;
  13257. point = point || Vertices.centre(vertices);
  13258. var vertex,
  13259. delta;
  13260. for (var i = 0; i < vertices.length; i++) {
  13261. vertex = vertices[i];
  13262. delta = Vector.sub(vertex, point);
  13263. vertices[i].x = point.x + delta.x * scaleX;
  13264. vertices[i].y = point.y + delta.y * scaleY;
  13265. }
  13266. return vertices;
  13267. };
  13268. /**
  13269. * Chamfers a set of vertices by giving them rounded corners, returns a new set of vertices.
  13270. * The radius parameter is a single number or an array to specify the radius for each vertex.
  13271. * @method chamfer
  13272. * @param {vertices} vertices
  13273. * @param {number[]} radius
  13274. * @param {number} quality
  13275. * @param {number} qualityMin
  13276. * @param {number} qualityMax
  13277. */
  13278. Vertices.chamfer = function(vertices, radius, quality, qualityMin, qualityMax) {
  13279. if (typeof radius === 'number') {
  13280. radius = [radius];
  13281. } else {
  13282. radius = radius || [8];
  13283. }
  13284. // quality defaults to -1, which is auto
  13285. quality = (typeof quality !== 'undefined') ? quality : -1;
  13286. qualityMin = qualityMin || 2;
  13287. qualityMax = qualityMax || 14;
  13288. var newVertices = [];
  13289. for (var i = 0; i < vertices.length; i++) {
  13290. var prevVertex = vertices[i - 1 >= 0 ? i - 1 : vertices.length - 1],
  13291. vertex = vertices[i],
  13292. nextVertex = vertices[(i + 1) % vertices.length],
  13293. currentRadius = radius[i < radius.length ? i : radius.length - 1];
  13294. if (currentRadius === 0) {
  13295. newVertices.push(vertex);
  13296. continue;
  13297. }
  13298. var prevNormal = Vector.normalise({
  13299. x: vertex.y - prevVertex.y,
  13300. y: prevVertex.x - vertex.x
  13301. });
  13302. var nextNormal = Vector.normalise({
  13303. x: nextVertex.y - vertex.y,
  13304. y: vertex.x - nextVertex.x
  13305. });
  13306. var diagonalRadius = Math.sqrt(2 * Math.pow(currentRadius, 2)),
  13307. radiusVector = Vector.mult(Common.clone(prevNormal), currentRadius),
  13308. midNormal = Vector.normalise(Vector.mult(Vector.add(prevNormal, nextNormal), 0.5)),
  13309. scaledVertex = Vector.sub(vertex, Vector.mult(midNormal, diagonalRadius));
  13310. var precision = quality;
  13311. if (quality === -1) {
  13312. // automatically decide precision
  13313. precision = Math.pow(currentRadius, 0.32) * 1.75;
  13314. }
  13315. precision = Common.clamp(precision, qualityMin, qualityMax);
  13316. // use an even value for precision, more likely to reduce axes by using symmetry
  13317. if (precision % 2 === 1)
  13318. precision += 1;
  13319. var alpha = Math.acos(Vector.dot(prevNormal, nextNormal)),
  13320. theta = alpha / precision;
  13321. for (var j = 0; j < precision; j++) {
  13322. newVertices.push(Vector.add(Vector.rotate(radiusVector, theta * j), scaledVertex));
  13323. }
  13324. }
  13325. return newVertices;
  13326. };
  13327. /**
  13328. * Sorts the input vertices into clockwise order in place.
  13329. * @method clockwiseSort
  13330. * @param {vertices} vertices
  13331. * @return {vertices} vertices
  13332. */
  13333. Vertices.clockwiseSort = function(vertices) {
  13334. var centre = Vertices.mean(vertices);
  13335. vertices.sort(function(vertexA, vertexB) {
  13336. return Vector.angle(centre, vertexA) - Vector.angle(centre, vertexB);
  13337. });
  13338. return vertices;
  13339. };
  13340. /**
  13341. * Returns true if the vertices form a convex shape (vertices must be in clockwise order).
  13342. * @method isConvex
  13343. * @param {vertices} vertices
  13344. * @return {bool} `true` if the `vertices` are convex, `false` if not (or `null` if not computable).
  13345. */
  13346. Vertices.isConvex = function(vertices) {
  13347. // http://paulbourke.net/geometry/polygonmesh/
  13348. // Copyright (c) Paul Bourke (use permitted)
  13349. var flag = 0,
  13350. n = vertices.length,
  13351. i,
  13352. j,
  13353. k,
  13354. z;
  13355. if (n < 3)
  13356. return null;
  13357. for (i = 0; i < n; i++) {
  13358. j = (i + 1) % n;
  13359. k = (i + 2) % n;
  13360. z = (vertices[j].x - vertices[i].x) * (vertices[k].y - vertices[j].y);
  13361. z -= (vertices[j].y - vertices[i].y) * (vertices[k].x - vertices[j].x);
  13362. if (z < 0) {
  13363. flag |= 1;
  13364. } else if (z > 0) {
  13365. flag |= 2;
  13366. }
  13367. if (flag === 3) {
  13368. return false;
  13369. }
  13370. }
  13371. if (flag !== 0){
  13372. return true;
  13373. } else {
  13374. return null;
  13375. }
  13376. };
  13377. /**
  13378. * Returns the convex hull of the input vertices as a new array of points.
  13379. * @method hull
  13380. * @param {vertices} vertices
  13381. * @return [vertex] vertices
  13382. */
  13383. Vertices.hull = function(vertices) {
  13384. // http://geomalgorithms.com/a10-_hull-1.html
  13385. var upper = [],
  13386. lower = [],
  13387. vertex,
  13388. i;
  13389. // sort vertices on x-axis (y-axis for ties)
  13390. vertices = vertices.slice(0);
  13391. vertices.sort(function(vertexA, vertexB) {
  13392. var dx = vertexA.x - vertexB.x;
  13393. return dx !== 0 ? dx : vertexA.y - vertexB.y;
  13394. });
  13395. // build lower hull
  13396. for (i = 0; i < vertices.length; i += 1) {
  13397. vertex = vertices[i];
  13398. while (lower.length >= 2
  13399. && Vector.cross3(lower[lower.length - 2], lower[lower.length - 1], vertex) <= 0) {
  13400. lower.pop();
  13401. }
  13402. lower.push(vertex);
  13403. }
  13404. // build upper hull
  13405. for (i = vertices.length - 1; i >= 0; i -= 1) {
  13406. vertex = vertices[i];
  13407. while (upper.length >= 2
  13408. && Vector.cross3(upper[upper.length - 2], upper[upper.length - 1], vertex) <= 0) {
  13409. upper.pop();
  13410. }
  13411. upper.push(vertex);
  13412. }
  13413. // concatenation of the lower and upper hulls gives the convex hull
  13414. // omit last points because they are repeated at the beginning of the other list
  13415. upper.pop();
  13416. lower.pop();
  13417. return upper.concat(lower);
  13418. };
  13419. })();
  13420. /***/ }),
  13421. /* 83 */
  13422. /***/ (function(module, exports, __webpack_require__) {
  13423. /**
  13424. * @author Richard Davey <rich@photonstorm.com>
  13425. * @copyright 2019 Photon Storm Ltd.
  13426. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  13427. */
  13428. var Class = __webpack_require__(0);
  13429. var GetFastValue = __webpack_require__(2);
  13430. /**
  13431. * @typedef {object} MapDataConfig
  13432. * @property {string} [name] - The key in the Phaser cache that corresponds to the loaded tilemap data.
  13433. * @property {number} [width=0] - The width of the entire tilemap.
  13434. * @property {number} [height=0] - The height of the entire tilemap.
  13435. * @property {number} [tileWidth=0] - The width of the tiles.
  13436. * @property {number} [tileHeight=0] - The height of the tiles.
  13437. * @property {number} [widthInPixels] - The width in pixels of the entire tilemap.
  13438. * @property {number} [heightInPixels] - The height in pixels of the entire tilemap.
  13439. * @property {integer} [format] - The format of the Tilemap, as defined in Tiled.
  13440. * @property {string} [orientation] - The orientation of the map data (i.e. orthogonal, isometric, hexagonal), default 'orthogonal'.
  13441. * @property {string} [renderOrder] - Determines the draw order of tilemap. Default is right-down.
  13442. * @property {number} [version] - The version of Tiled the map uses.
  13443. * @property {number} [properties] - Map specific properties (can be specified in Tiled).
  13444. * @property {Phaser.Tilemaps.LayerData[]} [layers] - The layers of the tilemap.
  13445. * @property {array} [images] - An array with all the layers configured to the MapData.
  13446. * @property {object} [objects] - An array of Tiled Image Layers.
  13447. * @property {object} [collision] - An object of Tiled Object Layers.
  13448. * @property {Phaser.Tilemaps.Tileset[]} [tilesets] - The tilesets the map uses.
  13449. * @property {array} [imageCollections] - The collection of images the map uses(specified in Tiled).
  13450. * @property {array} [tiles] - [description]
  13451. */
  13452. /**
  13453. * @classdesc
  13454. * A class for representing data about a map. Maps are parsed from CSV, Tiled, etc. into this
  13455. * format. A Tilemap object get a copy of this data and then unpacks the needed properties into
  13456. * itself.
  13457. *
  13458. * @class MapData
  13459. * @memberof Phaser.Tilemaps
  13460. * @constructor
  13461. * @since 3.0.0
  13462. *
  13463. * @param {MapDataConfig} [config] - [description]
  13464. */
  13465. var MapData = new Class({
  13466. initialize:
  13467. function MapData (config)
  13468. {
  13469. if (config === undefined) { config = {}; }
  13470. /**
  13471. * The key in the Phaser cache that corresponds to the loaded tilemap data.
  13472. *
  13473. * @name Phaser.Tilemaps.MapData#name
  13474. * @type {string}
  13475. * @since 3.0.0
  13476. */
  13477. this.name = GetFastValue(config, 'name', 'map');
  13478. /**
  13479. * The width of the entire tilemap.
  13480. *
  13481. * @name Phaser.Tilemaps.MapData#width
  13482. * @type {number}
  13483. * @since 3.0.0
  13484. */
  13485. this.width = GetFastValue(config, 'width', 0);
  13486. /**
  13487. * The height of the entire tilemap.
  13488. *
  13489. * @name Phaser.Tilemaps.MapData#height
  13490. * @type {number}
  13491. * @since 3.0.0
  13492. */
  13493. this.height = GetFastValue(config, 'height', 0);
  13494. /**
  13495. * The width of the tiles.
  13496. *
  13497. * @name Phaser.Tilemaps.MapData#tileWidth
  13498. * @type {number}
  13499. * @since 3.0.0
  13500. */
  13501. this.tileWidth = GetFastValue(config, 'tileWidth', 0);
  13502. /**
  13503. * The height of the tiles.
  13504. *
  13505. * @name Phaser.Tilemaps.MapData#tileHeight
  13506. * @type {number}
  13507. * @since 3.0.0
  13508. */
  13509. this.tileHeight = GetFastValue(config, 'tileHeight', 0);
  13510. /**
  13511. * The width in pixels of the entire tilemap.
  13512. *
  13513. * @name Phaser.Tilemaps.MapData#widthInPixels
  13514. * @type {number}
  13515. * @since 3.0.0
  13516. */
  13517. this.widthInPixels = GetFastValue(config, 'widthInPixels', this.width * this.tileWidth);
  13518. /**
  13519. * The height in pixels of the entire tilemap.
  13520. *
  13521. * @name Phaser.Tilemaps.MapData#heightInPixels
  13522. * @type {number}
  13523. * @since 3.0.0
  13524. */
  13525. this.heightInPixels = GetFastValue(config, 'heightInPixels', this.height * this.tileHeight);
  13526. /**
  13527. * [description]
  13528. *
  13529. * @name Phaser.Tilemaps.MapData#format
  13530. * @type {integer}
  13531. * @since 3.0.0
  13532. */
  13533. this.format = GetFastValue(config, 'format', null);
  13534. /**
  13535. * The orientation of the map data (i.e. orthogonal, isometric, hexagonal), default 'orthogonal'.
  13536. *
  13537. * @name Phaser.Tilemaps.MapData#orientation
  13538. * @type {string}
  13539. * @since 3.0.0
  13540. */
  13541. this.orientation = GetFastValue(config, 'orientation', 'orthogonal');
  13542. /**
  13543. * Determines the draw order of tilemap. Default is right-down
  13544. *
  13545. * 0, or 'right-down'
  13546. * 1, or 'left-down'
  13547. * 2, or 'right-up'
  13548. * 3, or 'left-up'
  13549. *
  13550. * @name Phaser.Tilemaps.MapData#renderOrder
  13551. * @type {string}
  13552. * @since 3.12.0
  13553. */
  13554. this.renderOrder = GetFastValue(config, 'renderOrder', 'right-down');
  13555. /**
  13556. * The version of the map data (as specified in Tiled).
  13557. *
  13558. * @name Phaser.Tilemaps.MapData#version
  13559. * @type {string}
  13560. * @since 3.0.0
  13561. */
  13562. this.version = GetFastValue(config, 'version', '1');
  13563. /**
  13564. * Map specific properties (can be specified in Tiled)
  13565. *
  13566. * @name Phaser.Tilemaps.MapData#properties
  13567. * @type {object}
  13568. * @since 3.0.0
  13569. */
  13570. this.properties = GetFastValue(config, 'properties', {});
  13571. /**
  13572. * An array with all the layers configured to the MapData.
  13573. *
  13574. * @name Phaser.Tilemaps.MapData#layers
  13575. * @type {(Phaser.Tilemaps.LayerData[]|Phaser.Tilemaps.ObjectLayer)}
  13576. * @since 3.0.0
  13577. */
  13578. this.layers = GetFastValue(config, 'layers', []);
  13579. /**
  13580. * An array of Tiled Image Layers.
  13581. *
  13582. * @name Phaser.Tilemaps.MapData#images
  13583. * @type {array}
  13584. * @since 3.0.0
  13585. */
  13586. this.images = GetFastValue(config, 'images', []);
  13587. /**
  13588. * An object of Tiled Object Layers.
  13589. *
  13590. * @name Phaser.Tilemaps.MapData#objects
  13591. * @type {object}
  13592. * @since 3.0.0
  13593. */
  13594. this.objects = GetFastValue(config, 'objects', {});
  13595. /**
  13596. * An object of collision data. Must be created as physics object or will return undefined.
  13597. *
  13598. * @name Phaser.Tilemaps.MapData#collision
  13599. * @type {object}
  13600. * @since 3.0.0
  13601. */
  13602. this.collision = GetFastValue(config, 'collision', {});
  13603. /**
  13604. * An array of Tilesets.
  13605. *
  13606. * @name Phaser.Tilemaps.MapData#tilesets
  13607. * @type {Phaser.Tilemaps.Tileset[]}
  13608. * @since 3.0.0
  13609. */
  13610. this.tilesets = GetFastValue(config, 'tilesets', []);
  13611. /**
  13612. * The collection of images the map uses(specified in Tiled)
  13613. *
  13614. * @name Phaser.Tilemaps.MapData#imageCollections
  13615. * @type {array}
  13616. * @since 3.0.0
  13617. */
  13618. this.imageCollections = GetFastValue(config, 'imageCollections', []);
  13619. /**
  13620. * [description]
  13621. *
  13622. * @name Phaser.Tilemaps.MapData#tiles
  13623. * @type {array}
  13624. * @since 3.0.0
  13625. */
  13626. this.tiles = GetFastValue(config, 'tiles', []);
  13627. }
  13628. });
  13629. module.exports = MapData;
  13630. /***/ }),
  13631. /* 84 */
  13632. /***/ (function(module, exports, __webpack_require__) {
  13633. /**
  13634. * @author Richard Davey <rich@photonstorm.com>
  13635. * @copyright 2019 Photon Storm Ltd.
  13636. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  13637. */
  13638. var Class = __webpack_require__(0);
  13639. var GetFastValue = __webpack_require__(2);
  13640. /**
  13641. * @classdesc
  13642. * A class for representing data about about a layer in a map. Maps are parsed from CSV, Tiled,
  13643. * etc. into this format. Tilemap, StaticTilemapLayer and DynamicTilemapLayer have a reference
  13644. * to this data and use it to look up and perform operations on tiles.
  13645. *
  13646. * @class LayerData
  13647. * @memberof Phaser.Tilemaps
  13648. * @constructor
  13649. * @since 3.0.0
  13650. *
  13651. * @param {object} [config] - [description]
  13652. */
  13653. var LayerData = new Class({
  13654. initialize:
  13655. function LayerData (config)
  13656. {
  13657. if (config === undefined) { config = {}; }
  13658. /**
  13659. * The name of the layer, if specified in Tiled.
  13660. *
  13661. * @name Phaser.Tilemaps.LayerData#name
  13662. * @type {string}
  13663. * @since 3.0.0
  13664. */
  13665. this.name = GetFastValue(config, 'name', 'layer');
  13666. /**
  13667. * The x offset of where to draw from the top left
  13668. *
  13669. * @name Phaser.Tilemaps.LayerData#x
  13670. * @type {number}
  13671. * @since 3.0.0
  13672. */
  13673. this.x = GetFastValue(config, 'x', 0);
  13674. /**
  13675. * The y offset of where to draw from the top left
  13676. *
  13677. * @name Phaser.Tilemaps.LayerData#y
  13678. * @type {number}
  13679. * @since 3.0.0
  13680. */
  13681. this.y = GetFastValue(config, 'y', 0);
  13682. /**
  13683. * The width in tile of the layer.
  13684. *
  13685. * @name Phaser.Tilemaps.LayerData#width
  13686. * @type {number}
  13687. * @since 3.0.0
  13688. */
  13689. this.width = GetFastValue(config, 'width', 0);
  13690. /**
  13691. * The height in tiles of the layer.
  13692. *
  13693. * @name Phaser.Tilemaps.LayerData#height
  13694. * @type {number}
  13695. * @since 3.0.0
  13696. */
  13697. this.height = GetFastValue(config, 'height', 0);
  13698. /**
  13699. * The pixel width of the tiles.
  13700. *
  13701. * @name Phaser.Tilemaps.LayerData#tileWidth
  13702. * @type {number}
  13703. * @since 3.0.0
  13704. */
  13705. this.tileWidth = GetFastValue(config, 'tileWidth', 0);
  13706. /**
  13707. * The pixel height of the tiles.
  13708. *
  13709. * @name Phaser.Tilemaps.LayerData#tileHeight
  13710. * @type {number}
  13711. * @since 3.0.0
  13712. */
  13713. this.tileHeight = GetFastValue(config, 'tileHeight', 0);
  13714. /**
  13715. * [description]
  13716. *
  13717. * @name Phaser.Tilemaps.LayerData#baseTileWidth
  13718. * @type {number}
  13719. * @since 3.0.0
  13720. */
  13721. this.baseTileWidth = GetFastValue(config, 'baseTileWidth', this.tileWidth);
  13722. /**
  13723. * [description]
  13724. *
  13725. * @name Phaser.Tilemaps.LayerData#baseTileHeight
  13726. * @type {number}
  13727. * @since 3.0.0
  13728. */
  13729. this.baseTileHeight = GetFastValue(config, 'baseTileHeight', this.tileHeight);
  13730. /**
  13731. * The width in pixels of the entire layer.
  13732. *
  13733. * @name Phaser.Tilemaps.LayerData#widthInPixels
  13734. * @type {number}
  13735. * @since 3.0.0
  13736. */
  13737. this.widthInPixels = GetFastValue(config, 'widthInPixels', this.width * this.baseTileWidth);
  13738. /**
  13739. * The height in pixels of the entire layer.
  13740. *
  13741. * @name Phaser.Tilemaps.LayerData#heightInPixels
  13742. * @type {number}
  13743. * @since 3.0.0
  13744. */
  13745. this.heightInPixels = GetFastValue(config, 'heightInPixels', this.height * this.baseTileHeight);
  13746. /**
  13747. * [description]
  13748. *
  13749. * @name Phaser.Tilemaps.LayerData#alpha
  13750. * @type {number}
  13751. * @since 3.0.0
  13752. */
  13753. this.alpha = GetFastValue(config, 'alpha', 1);
  13754. /**
  13755. * [description]
  13756. *
  13757. * @name Phaser.Tilemaps.LayerData#visible
  13758. * @type {boolean}
  13759. * @since 3.0.0
  13760. */
  13761. this.visible = GetFastValue(config, 'visible', true);
  13762. /**
  13763. * Layer specific properties (can be specified in Tiled)
  13764. *
  13765. * @name Phaser.Tilemaps.LayerData#properties
  13766. * @type {object}
  13767. * @since 3.0.0
  13768. */
  13769. this.properties = GetFastValue(config, 'properties', {});
  13770. /**
  13771. * [description]
  13772. *
  13773. * @name Phaser.Tilemaps.LayerData#indexes
  13774. * @type {array}
  13775. * @since 3.0.0
  13776. */
  13777. this.indexes = GetFastValue(config, 'indexes', []);
  13778. /**
  13779. * [description]
  13780. *
  13781. * @name Phaser.Tilemaps.LayerData#collideIndexes
  13782. * @type {array}
  13783. * @since 3.0.0
  13784. */
  13785. this.collideIndexes = GetFastValue(config, 'collideIndexes', []);
  13786. /**
  13787. * [description]
  13788. *
  13789. * @name Phaser.Tilemaps.LayerData#callbacks
  13790. * @type {array}
  13791. * @since 3.0.0
  13792. */
  13793. this.callbacks = GetFastValue(config, 'callbacks', []);
  13794. /**
  13795. * [description]
  13796. *
  13797. * @name Phaser.Tilemaps.LayerData#bodies
  13798. * @type {array}
  13799. * @since 3.0.0
  13800. */
  13801. this.bodies = GetFastValue(config, 'bodies', []);
  13802. /**
  13803. * An array of the tile indexes
  13804. *
  13805. * @name Phaser.Tilemaps.LayerData#data
  13806. * @type {(number[])}
  13807. * @since 3.0.0
  13808. */
  13809. this.data = GetFastValue(config, 'data', []);
  13810. /**
  13811. * [description]
  13812. *
  13813. * @name Phaser.Tilemaps.LayerData#tilemapLayer
  13814. * @type {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)}
  13815. * @since 3.0.0
  13816. */
  13817. this.tilemapLayer = GetFastValue(config, 'tilemapLayer', null);
  13818. }
  13819. });
  13820. module.exports = LayerData;
  13821. /***/ }),
  13822. /* 85 */
  13823. /***/ (function(module, exports) {
  13824. /**
  13825. * @author Richard Davey <rich@photonstorm.com>
  13826. * @copyright 2019 Photon Storm Ltd.
  13827. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  13828. */
  13829. /**
  13830. * Checks if the given tile coordinates are within the bounds of the layer.
  13831. *
  13832. * @function Phaser.Tilemaps.Components.IsInLayerBounds
  13833. * @private
  13834. * @since 3.0.0
  13835. *
  13836. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  13837. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  13838. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  13839. *
  13840. * @return {boolean} `true` if the tile coordinates are within the bounds of the layer, otherwise `false`.
  13841. */
  13842. var IsInLayerBounds = function (tileX, tileY, layer)
  13843. {
  13844. return (tileX >= 0 && tileX < layer.width && tileY >= 0 && tileY < layer.height);
  13845. };
  13846. module.exports = IsInLayerBounds;
  13847. /***/ }),
  13848. /* 86 */
  13849. /***/ (function(module, exports) {
  13850. /**
  13851. * The `Matter.Bounds` module contains methods for creating and manipulating axis-aligned bounding boxes (AABB).
  13852. *
  13853. * @class Bounds
  13854. */
  13855. var Bounds = {};
  13856. module.exports = Bounds;
  13857. (function() {
  13858. /**
  13859. * Creates a new axis-aligned bounding box (AABB) for the given vertices.
  13860. * @method create
  13861. * @param {vertices} vertices
  13862. * @return {bounds} A new bounds object
  13863. */
  13864. Bounds.create = function(vertices) {
  13865. var bounds = {
  13866. min: { x: 0, y: 0 },
  13867. max: { x: 0, y: 0 }
  13868. };
  13869. if (vertices)
  13870. Bounds.update(bounds, vertices);
  13871. return bounds;
  13872. };
  13873. /**
  13874. * Updates bounds using the given vertices and extends the bounds given a velocity.
  13875. * @method update
  13876. * @param {bounds} bounds
  13877. * @param {vertices} vertices
  13878. * @param {vector} velocity
  13879. */
  13880. Bounds.update = function(bounds, vertices, velocity) {
  13881. bounds.min.x = Infinity;
  13882. bounds.max.x = -Infinity;
  13883. bounds.min.y = Infinity;
  13884. bounds.max.y = -Infinity;
  13885. for (var i = 0; i < vertices.length; i++) {
  13886. var vertex = vertices[i];
  13887. if (vertex.x > bounds.max.x) bounds.max.x = vertex.x;
  13888. if (vertex.x < bounds.min.x) bounds.min.x = vertex.x;
  13889. if (vertex.y > bounds.max.y) bounds.max.y = vertex.y;
  13890. if (vertex.y < bounds.min.y) bounds.min.y = vertex.y;
  13891. }
  13892. if (velocity) {
  13893. if (velocity.x > 0) {
  13894. bounds.max.x += velocity.x;
  13895. } else {
  13896. bounds.min.x += velocity.x;
  13897. }
  13898. if (velocity.y > 0) {
  13899. bounds.max.y += velocity.y;
  13900. } else {
  13901. bounds.min.y += velocity.y;
  13902. }
  13903. }
  13904. };
  13905. /**
  13906. * Returns true if the bounds contains the given point.
  13907. * @method contains
  13908. * @param {bounds} bounds
  13909. * @param {vector} point
  13910. * @return {boolean} True if the bounds contain the point, otherwise false
  13911. */
  13912. Bounds.contains = function(bounds, point) {
  13913. return point.x >= bounds.min.x && point.x <= bounds.max.x
  13914. && point.y >= bounds.min.y && point.y <= bounds.max.y;
  13915. };
  13916. /**
  13917. * Returns true if the two bounds intersect.
  13918. * @method overlaps
  13919. * @param {bounds} boundsA
  13920. * @param {bounds} boundsB
  13921. * @return {boolean} True if the bounds overlap, otherwise false
  13922. */
  13923. Bounds.overlaps = function(boundsA, boundsB) {
  13924. return (boundsA.min.x <= boundsB.max.x && boundsA.max.x >= boundsB.min.x
  13925. && boundsA.max.y >= boundsB.min.y && boundsA.min.y <= boundsB.max.y);
  13926. };
  13927. /**
  13928. * Translates the bounds by the given vector.
  13929. * @method translate
  13930. * @param {bounds} bounds
  13931. * @param {vector} vector
  13932. */
  13933. Bounds.translate = function(bounds, vector) {
  13934. bounds.min.x += vector.x;
  13935. bounds.max.x += vector.x;
  13936. bounds.min.y += vector.y;
  13937. bounds.max.y += vector.y;
  13938. };
  13939. /**
  13940. * Shifts the bounds to the given position.
  13941. * @method shift
  13942. * @param {bounds} bounds
  13943. * @param {vector} position
  13944. */
  13945. Bounds.shift = function(bounds, position) {
  13946. var deltaX = bounds.max.x - bounds.min.x,
  13947. deltaY = bounds.max.y - bounds.min.y;
  13948. bounds.min.x = position.x;
  13949. bounds.max.x = position.x + deltaX;
  13950. bounds.min.y = position.y;
  13951. bounds.max.y = position.y + deltaY;
  13952. };
  13953. })();
  13954. /***/ }),
  13955. /* 87 */
  13956. /***/ (function(module, exports) {
  13957. /**
  13958. * The `Matter.Vector` module contains methods for creating and manipulating vectors.
  13959. * Vectors are the basis of all the geometry related operations in the engine.
  13960. * A `Matter.Vector` object is of the form `{ x: 0, y: 0 }`.
  13961. *
  13962. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  13963. *
  13964. * @class Vector
  13965. */
  13966. // TODO: consider params for reusing vector objects
  13967. var Vector = {};
  13968. module.exports = Vector;
  13969. (function() {
  13970. /**
  13971. * Creates a new vector.
  13972. * @method create
  13973. * @param {number} x
  13974. * @param {number} y
  13975. * @return {vector} A new vector
  13976. */
  13977. Vector.create = function(x, y) {
  13978. return { x: x || 0, y: y || 0 };
  13979. };
  13980. /**
  13981. * Returns a new vector with `x` and `y` copied from the given `vector`.
  13982. * @method clone
  13983. * @param {vector} vector
  13984. * @return {vector} A new cloned vector
  13985. */
  13986. Vector.clone = function(vector) {
  13987. return { x: vector.x, y: vector.y };
  13988. };
  13989. /**
  13990. * Returns the magnitude (length) of a vector.
  13991. * @method magnitude
  13992. * @param {vector} vector
  13993. * @return {number} The magnitude of the vector
  13994. */
  13995. Vector.magnitude = function(vector) {
  13996. return Math.sqrt((vector.x * vector.x) + (vector.y * vector.y));
  13997. };
  13998. /**
  13999. * Returns the magnitude (length) of a vector (therefore saving a `sqrt` operation).
  14000. * @method magnitudeSquared
  14001. * @param {vector} vector
  14002. * @return {number} The squared magnitude of the vector
  14003. */
  14004. Vector.magnitudeSquared = function(vector) {
  14005. return (vector.x * vector.x) + (vector.y * vector.y);
  14006. };
  14007. /**
  14008. * Rotates the vector about (0, 0) by specified angle.
  14009. * @method rotate
  14010. * @param {vector} vector
  14011. * @param {number} angle
  14012. * @param {vector} [output]
  14013. * @return {vector} The vector rotated about (0, 0)
  14014. */
  14015. Vector.rotate = function(vector, angle, output) {
  14016. var cos = Math.cos(angle), sin = Math.sin(angle);
  14017. if (!output) output = {};
  14018. var x = vector.x * cos - vector.y * sin;
  14019. output.y = vector.x * sin + vector.y * cos;
  14020. output.x = x;
  14021. return output;
  14022. };
  14023. /**
  14024. * Rotates the vector about a specified point by specified angle.
  14025. * @method rotateAbout
  14026. * @param {vector} vector
  14027. * @param {number} angle
  14028. * @param {vector} point
  14029. * @param {vector} [output]
  14030. * @return {vector} A new vector rotated about the point
  14031. */
  14032. Vector.rotateAbout = function(vector, angle, point, output) {
  14033. var cos = Math.cos(angle), sin = Math.sin(angle);
  14034. if (!output) output = {};
  14035. var x = point.x + ((vector.x - point.x) * cos - (vector.y - point.y) * sin);
  14036. output.y = point.y + ((vector.x - point.x) * sin + (vector.y - point.y) * cos);
  14037. output.x = x;
  14038. return output;
  14039. };
  14040. /**
  14041. * Normalises a vector (such that its magnitude is `1`).
  14042. * @method normalise
  14043. * @param {vector} vector
  14044. * @return {vector} A new vector normalised
  14045. */
  14046. Vector.normalise = function(vector) {
  14047. var magnitude = Vector.magnitude(vector);
  14048. if (magnitude === 0)
  14049. return { x: 0, y: 0 };
  14050. return { x: vector.x / magnitude, y: vector.y / magnitude };
  14051. };
  14052. /**
  14053. * Returns the dot-product of two vectors.
  14054. * @method dot
  14055. * @param {vector} vectorA
  14056. * @param {vector} vectorB
  14057. * @return {number} The dot product of the two vectors
  14058. */
  14059. Vector.dot = function(vectorA, vectorB) {
  14060. return (vectorA.x * vectorB.x) + (vectorA.y * vectorB.y);
  14061. };
  14062. /**
  14063. * Returns the cross-product of two vectors.
  14064. * @method cross
  14065. * @param {vector} vectorA
  14066. * @param {vector} vectorB
  14067. * @return {number} The cross product of the two vectors
  14068. */
  14069. Vector.cross = function(vectorA, vectorB) {
  14070. return (vectorA.x * vectorB.y) - (vectorA.y * vectorB.x);
  14071. };
  14072. /**
  14073. * Returns the cross-product of three vectors.
  14074. * @method cross3
  14075. * @param {vector} vectorA
  14076. * @param {vector} vectorB
  14077. * @param {vector} vectorC
  14078. * @return {number} The cross product of the three vectors
  14079. */
  14080. Vector.cross3 = function(vectorA, vectorB, vectorC) {
  14081. return (vectorB.x - vectorA.x) * (vectorC.y - vectorA.y) - (vectorB.y - vectorA.y) * (vectorC.x - vectorA.x);
  14082. };
  14083. /**
  14084. * Adds the two vectors.
  14085. * @method add
  14086. * @param {vector} vectorA
  14087. * @param {vector} vectorB
  14088. * @param {vector} [output]
  14089. * @return {vector} A new vector of vectorA and vectorB added
  14090. */
  14091. Vector.add = function(vectorA, vectorB, output) {
  14092. if (!output) output = {};
  14093. output.x = vectorA.x + vectorB.x;
  14094. output.y = vectorA.y + vectorB.y;
  14095. return output;
  14096. };
  14097. /**
  14098. * Subtracts the two vectors.
  14099. * @method sub
  14100. * @param {vector} vectorA
  14101. * @param {vector} vectorB
  14102. * @param {vector} [output]
  14103. * @return {vector} A new vector of vectorA and vectorB subtracted
  14104. */
  14105. Vector.sub = function(vectorA, vectorB, output) {
  14106. if (!output) output = {};
  14107. output.x = vectorA.x - vectorB.x;
  14108. output.y = vectorA.y - vectorB.y;
  14109. return output;
  14110. };
  14111. /**
  14112. * Multiplies a vector and a scalar.
  14113. * @method mult
  14114. * @param {vector} vector
  14115. * @param {number} scalar
  14116. * @return {vector} A new vector multiplied by scalar
  14117. */
  14118. Vector.mult = function(vector, scalar) {
  14119. return { x: vector.x * scalar, y: vector.y * scalar };
  14120. };
  14121. /**
  14122. * Divides a vector and a scalar.
  14123. * @method div
  14124. * @param {vector} vector
  14125. * @param {number} scalar
  14126. * @return {vector} A new vector divided by scalar
  14127. */
  14128. Vector.div = function(vector, scalar) {
  14129. return { x: vector.x / scalar, y: vector.y / scalar };
  14130. };
  14131. /**
  14132. * Returns the perpendicular vector. Set `negate` to true for the perpendicular in the opposite direction.
  14133. * @method perp
  14134. * @param {vector} vector
  14135. * @param {bool} [negate=false]
  14136. * @return {vector} The perpendicular vector
  14137. */
  14138. Vector.perp = function(vector, negate) {
  14139. negate = negate === true ? -1 : 1;
  14140. return { x: negate * -vector.y, y: negate * vector.x };
  14141. };
  14142. /**
  14143. * Negates both components of a vector such that it points in the opposite direction.
  14144. * @method neg
  14145. * @param {vector} vector
  14146. * @return {vector} The negated vector
  14147. */
  14148. Vector.neg = function(vector) {
  14149. return { x: -vector.x, y: -vector.y };
  14150. };
  14151. /**
  14152. * Returns the angle between the vector `vectorB - vectorA` and the x-axis in radians.
  14153. * @method angle
  14154. * @param {vector} vectorA
  14155. * @param {vector} vectorB
  14156. * @return {number} The angle in radians
  14157. */
  14158. Vector.angle = function(vectorA, vectorB) {
  14159. return Math.atan2(vectorB.y - vectorA.y, vectorB.x - vectorA.x);
  14160. };
  14161. /**
  14162. * Temporary vector pool (not thread-safe).
  14163. * @property _temp
  14164. * @type {vector[]}
  14165. * @private
  14166. */
  14167. Vector._temp = [
  14168. Vector.create(), Vector.create(),
  14169. Vector.create(), Vector.create(),
  14170. Vector.create(), Vector.create()
  14171. ];
  14172. })();
  14173. /***/ }),
  14174. /* 88 */
  14175. /***/ (function(module, exports, __webpack_require__) {
  14176. /**
  14177. * @author Richard Davey <rich@photonstorm.com>
  14178. * @copyright 2019 Photon Storm Ltd.
  14179. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  14180. */
  14181. var Utils = __webpack_require__(9);
  14182. /**
  14183. * Renders a filled path for the given Shape.
  14184. *
  14185. * @method Phaser.GameObjects.Shape#FillPathWebGL
  14186. * @since 3.13.0
  14187. * @private
  14188. *
  14189. * @param {Phaser.Renderer.WebGL.WebGLPipeline} pipeline - The WebGL Pipeline used to render this Shape.
  14190. * @param {Phaser.GameObjects.Components.TransformMatrix} calcMatrix - The transform matrix used to get the position values.
  14191. * @param {Phaser.GameObjects.Shape} src - The Game Object shape being rendered in this call.
  14192. * @param {number} alpha - The base alpha value.
  14193. * @param {number} dx - The source displayOriginX.
  14194. * @param {number} dy - The source displayOriginY.
  14195. */
  14196. var FillPathWebGL = function (pipeline, calcMatrix, src, alpha, dx, dy)
  14197. {
  14198. var fillTintColor = Utils.getTintAppendFloatAlphaAndSwap(src.fillColor, src.fillAlpha * alpha);
  14199. var path = src.pathData;
  14200. var pathIndexes = src.pathIndexes;
  14201. for (var i = 0; i < pathIndexes.length; i += 3)
  14202. {
  14203. var p0 = pathIndexes[i] * 2;
  14204. var p1 = pathIndexes[i + 1] * 2;
  14205. var p2 = pathIndexes[i + 2] * 2;
  14206. var x0 = path[p0 + 0] - dx;
  14207. var y0 = path[p0 + 1] - dy;
  14208. var x1 = path[p1 + 0] - dx;
  14209. var y1 = path[p1 + 1] - dy;
  14210. var x2 = path[p2 + 0] - dx;
  14211. var y2 = path[p2 + 1] - dy;
  14212. var tx0 = calcMatrix.getX(x0, y0);
  14213. var ty0 = calcMatrix.getY(x0, y0);
  14214. var tx1 = calcMatrix.getX(x1, y1);
  14215. var ty1 = calcMatrix.getY(x1, y1);
  14216. var tx2 = calcMatrix.getX(x2, y2);
  14217. var ty2 = calcMatrix.getY(x2, y2);
  14218. pipeline.setTexture2D();
  14219. pipeline.batchTri(tx0, ty0, tx1, ty1, tx2, ty2, 0, 0, 1, 1, fillTintColor, fillTintColor, fillTintColor, pipeline.tintEffect);
  14220. }
  14221. };
  14222. module.exports = FillPathWebGL;
  14223. /***/ }),
  14224. /* 89 */
  14225. /***/ (function(module, exports) {
  14226. /**
  14227. * @author Richard Davey <rich@photonstorm.com>
  14228. * @copyright 2019 Photon Storm Ltd.
  14229. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  14230. */
  14231. var TWEEN_CONST = {
  14232. /**
  14233. * TweenData state.
  14234. *
  14235. * @name Phaser.Tweens.CREATED
  14236. * @type {integer}
  14237. * @since 3.0.0
  14238. */
  14239. CREATED: 0,
  14240. /**
  14241. * TweenData state.
  14242. *
  14243. * @name Phaser.Tweens.INIT
  14244. * @type {integer}
  14245. * @since 3.0.0
  14246. */
  14247. INIT: 1,
  14248. /**
  14249. * TweenData state.
  14250. *
  14251. * @name Phaser.Tweens.DELAY
  14252. * @type {integer}
  14253. * @since 3.0.0
  14254. */
  14255. DELAY: 2,
  14256. /**
  14257. * TweenData state.
  14258. *
  14259. * @name Phaser.Tweens.OFFSET_DELAY
  14260. * @type {integer}
  14261. * @since 3.0.0
  14262. */
  14263. OFFSET_DELAY: 3,
  14264. /**
  14265. * TweenData state.
  14266. *
  14267. * @name Phaser.Tweens.PENDING_RENDER
  14268. * @type {integer}
  14269. * @since 3.0.0
  14270. */
  14271. PENDING_RENDER: 4,
  14272. /**
  14273. * TweenData state.
  14274. *
  14275. * @name Phaser.Tweens.PLAYING_FORWARD
  14276. * @type {integer}
  14277. * @since 3.0.0
  14278. */
  14279. PLAYING_FORWARD: 5,
  14280. /**
  14281. * TweenData state.
  14282. *
  14283. * @name Phaser.Tweens.PLAYING_BACKWARD
  14284. * @type {integer}
  14285. * @since 3.0.0
  14286. */
  14287. PLAYING_BACKWARD: 6,
  14288. /**
  14289. * TweenData state.
  14290. *
  14291. * @name Phaser.Tweens.HOLD_DELAY
  14292. * @type {integer}
  14293. * @since 3.0.0
  14294. */
  14295. HOLD_DELAY: 7,
  14296. /**
  14297. * TweenData state.
  14298. *
  14299. * @name Phaser.Tweens.REPEAT_DELAY
  14300. * @type {integer}
  14301. * @since 3.0.0
  14302. */
  14303. REPEAT_DELAY: 8,
  14304. /**
  14305. * TweenData state.
  14306. *
  14307. * @name Phaser.Tweens.COMPLETE
  14308. * @type {integer}
  14309. * @since 3.0.0
  14310. */
  14311. COMPLETE: 9,
  14312. // Tween specific (starts from 20 to cleanly allow extra TweenData consts in the future)
  14313. /**
  14314. * Tween state.
  14315. *
  14316. * @name Phaser.Tweens.PENDING_ADD
  14317. * @type {integer}
  14318. * @since 3.0.0
  14319. */
  14320. PENDING_ADD: 20,
  14321. /**
  14322. * Tween state.
  14323. *
  14324. * @name Phaser.Tweens.PAUSED
  14325. * @type {integer}
  14326. * @since 3.0.0
  14327. */
  14328. PAUSED: 21,
  14329. /**
  14330. * Tween state.
  14331. *
  14332. * @name Phaser.Tweens.LOOP_DELAY
  14333. * @type {integer}
  14334. * @since 3.0.0
  14335. */
  14336. LOOP_DELAY: 22,
  14337. /**
  14338. * Tween state.
  14339. *
  14340. * @name Phaser.Tweens.ACTIVE
  14341. * @type {integer}
  14342. * @since 3.0.0
  14343. */
  14344. ACTIVE: 23,
  14345. /**
  14346. * Tween state.
  14347. *
  14348. * @name Phaser.Tweens.COMPLETE_DELAY
  14349. * @type {integer}
  14350. * @since 3.0.0
  14351. */
  14352. COMPLETE_DELAY: 24,
  14353. /**
  14354. * Tween state.
  14355. *
  14356. * @name Phaser.Tweens.PENDING_REMOVE
  14357. * @type {integer}
  14358. * @since 3.0.0
  14359. */
  14360. PENDING_REMOVE: 25,
  14361. /**
  14362. * Tween state.
  14363. *
  14364. * @name Phaser.Tweens.REMOVED
  14365. * @type {integer}
  14366. * @since 3.0.0
  14367. */
  14368. REMOVED: 26
  14369. };
  14370. module.exports = TWEEN_CONST;
  14371. /***/ }),
  14372. /* 90 */
  14373. /***/ (function(module, exports) {
  14374. /**
  14375. * @author Richard Davey <rich@photonstorm.com>
  14376. * @copyright 2019 Photon Storm Ltd.
  14377. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  14378. */
  14379. /**
  14380. * Retrieves the value of the given key from an object.
  14381. *
  14382. * @function Phaser.Tweens.Builders.GetBoolean
  14383. * @since 3.0.0
  14384. *
  14385. * @param {object} source - The object to retrieve the value from.
  14386. * @param {string} key - The key to look for in the `source` object.
  14387. * @param {*} defaultValue - The default value to return if the `key` doesn't exist or if no `source` object is provided.
  14388. *
  14389. * @return {*} The retrieved value.
  14390. */
  14391. var GetBoolean = function (source, key, defaultValue)
  14392. {
  14393. if (!source)
  14394. {
  14395. return defaultValue;
  14396. }
  14397. else if (source.hasOwnProperty(key))
  14398. {
  14399. return source[key];
  14400. }
  14401. else
  14402. {
  14403. return defaultValue;
  14404. }
  14405. };
  14406. module.exports = GetBoolean;
  14407. /***/ }),
  14408. /* 91 */
  14409. /***/ (function(module, exports) {
  14410. /**
  14411. * @author Richard Davey <rich@photonstorm.com>
  14412. * @copyright 2019 Photon Storm Ltd.
  14413. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  14414. */
  14415. /**
  14416. * Determine whether the source object has a property with the specified key.
  14417. *
  14418. * @function Phaser.Utils.Objects.HasValue
  14419. * @since 3.0.0
  14420. *
  14421. * @param {object} source - The source object to be checked.
  14422. * @param {string} key - The property to check for within the object
  14423. *
  14424. * @return {boolean} `true` if the provided `key` exists on the `source` object, otherwise `false`.
  14425. */
  14426. var HasValue = function (source, key)
  14427. {
  14428. return (source.hasOwnProperty(key));
  14429. };
  14430. module.exports = HasValue;
  14431. /***/ }),
  14432. /* 92 */
  14433. /***/ (function(module, exports, __webpack_require__) {
  14434. /**
  14435. * @author Richard Davey <rich@photonstorm.com>
  14436. * @copyright 2019 Photon Storm Ltd.
  14437. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  14438. */
  14439. var EaseMap = __webpack_require__(188);
  14440. /**
  14441. * [description]
  14442. *
  14443. * @function Phaser.Tweens.Builders.GetEaseFunction
  14444. * @since 3.0.0
  14445. *
  14446. * @param {(string|function)} ease - [description]
  14447. * @param {array} easeParams - [description]
  14448. *
  14449. * @return {function} [description]
  14450. */
  14451. var GetEaseFunction = function (ease, easeParams)
  14452. {
  14453. if (typeof ease === 'string' && EaseMap.hasOwnProperty(ease))
  14454. {
  14455. if (easeParams)
  14456. {
  14457. var cloneParams = easeParams.slice(0);
  14458. cloneParams.unshift(0);
  14459. return function (v)
  14460. {
  14461. cloneParams[0] = v;
  14462. return EaseMap[ease].apply(this, cloneParams);
  14463. };
  14464. }
  14465. else
  14466. {
  14467. // String based look-up
  14468. return EaseMap[ease];
  14469. }
  14470. }
  14471. else if (typeof ease === 'function')
  14472. {
  14473. // Custom function
  14474. return ease;
  14475. }
  14476. else if (Array.isArray(ease) && ease.length === 4)
  14477. {
  14478. // Bezier function (TODO)
  14479. }
  14480. return EaseMap.Power0;
  14481. };
  14482. module.exports = GetEaseFunction;
  14483. /***/ }),
  14484. /* 93 */
  14485. /***/ (function(module, exports, __webpack_require__) {
  14486. /**
  14487. * @author Richard Davey <rich@photonstorm.com>
  14488. * @copyright 2019 Photon Storm Ltd.
  14489. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  14490. */
  14491. var Class = __webpack_require__(0);
  14492. var Components = __webpack_require__(13);
  14493. var GameObject = __webpack_require__(18);
  14494. var ImageRender = __webpack_require__(849);
  14495. /**
  14496. * @classdesc
  14497. * An Image Game Object.
  14498. *
  14499. * An Image is a light-weight Game Object useful for the display of static images in your game,
  14500. * such as logos, backgrounds, scenery or other non-animated elements. Images can have input
  14501. * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an
  14502. * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component.
  14503. *
  14504. * @class Image
  14505. * @extends Phaser.GameObjects.GameObject
  14506. * @memberof Phaser.GameObjects
  14507. * @constructor
  14508. * @since 3.0.0
  14509. *
  14510. * @extends Phaser.GameObjects.Components.Alpha
  14511. * @extends Phaser.GameObjects.Components.BlendMode
  14512. * @extends Phaser.GameObjects.Components.Depth
  14513. * @extends Phaser.GameObjects.Components.Flip
  14514. * @extends Phaser.GameObjects.Components.GetBounds
  14515. * @extends Phaser.GameObjects.Components.Mask
  14516. * @extends Phaser.GameObjects.Components.Origin
  14517. * @extends Phaser.GameObjects.Components.Pipeline
  14518. * @extends Phaser.GameObjects.Components.ScaleMode
  14519. * @extends Phaser.GameObjects.Components.ScrollFactor
  14520. * @extends Phaser.GameObjects.Components.Size
  14521. * @extends Phaser.GameObjects.Components.TextureCrop
  14522. * @extends Phaser.GameObjects.Components.Tint
  14523. * @extends Phaser.GameObjects.Components.Transform
  14524. * @extends Phaser.GameObjects.Components.Visible
  14525. *
  14526. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  14527. * @param {number} x - The horizontal position of this Game Object in the world.
  14528. * @param {number} y - The vertical position of this Game Object in the world.
  14529. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  14530. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  14531. */
  14532. var Image = new Class({
  14533. Extends: GameObject,
  14534. Mixins: [
  14535. Components.Alpha,
  14536. Components.BlendMode,
  14537. Components.Depth,
  14538. Components.Flip,
  14539. Components.GetBounds,
  14540. Components.Mask,
  14541. Components.Origin,
  14542. Components.Pipeline,
  14543. Components.ScaleMode,
  14544. Components.ScrollFactor,
  14545. Components.Size,
  14546. Components.TextureCrop,
  14547. Components.Tint,
  14548. Components.Transform,
  14549. Components.Visible,
  14550. ImageRender
  14551. ],
  14552. initialize:
  14553. function Image (scene, x, y, texture, frame)
  14554. {
  14555. GameObject.call(this, scene, 'Image');
  14556. /**
  14557. * The internal crop data object, as used by `setCrop` and passed to the `Frame.setCropUVs` method.
  14558. *
  14559. * @name Phaser.GameObjects.Image#_crop
  14560. * @type {object}
  14561. * @private
  14562. * @since 3.11.0
  14563. */
  14564. this._crop = this.resetCropObject();
  14565. this.setTexture(texture, frame);
  14566. this.setPosition(x, y);
  14567. this.setSizeToFrame();
  14568. this.setOriginFromFrame();
  14569. this.initPipeline();
  14570. }
  14571. });
  14572. module.exports = Image;
  14573. /***/ }),
  14574. /* 94 */
  14575. /***/ (function(module, exports, __webpack_require__) {
  14576. /**
  14577. * @author Richard Davey <rich@photonstorm.com>
  14578. * @copyright 2019 Photon Storm Ltd.
  14579. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  14580. */
  14581. var Actions = __webpack_require__(450);
  14582. var Class = __webpack_require__(0);
  14583. var Events = __webpack_require__(133);
  14584. var GetFastValue = __webpack_require__(2);
  14585. var GetValue = __webpack_require__(4);
  14586. var IsPlainObject = __webpack_require__(8);
  14587. var Range = __webpack_require__(316);
  14588. var Set = __webpack_require__(102);
  14589. var Sprite = __webpack_require__(67);
  14590. /**
  14591. * @callback GroupCallback
  14592. *
  14593. * @param {Phaser.GameObjects.GameObject} item - A group member
  14594. */
  14595. /**
  14596. * @callback GroupMultipleCreateCallback
  14597. *
  14598. * @param {Phaser.GameObjects.GameObject[]} items - The newly created group members
  14599. */
  14600. /**
  14601. * @typedef {object} GroupConfig
  14602. *
  14603. * @property {?GroupClassTypeConstructor} [classType=Sprite] - Sets {@link Phaser.GameObjects.Group#classType}.
  14604. * @property {?boolean} [active=true] - Sets {@link Phaser.GameObjects.Group#active}.
  14605. * @property {?number} [maxSize=-1] - Sets {@link Phaser.GameObjects.Group#maxSize}.
  14606. * @property {?string} [defaultKey=null] - Sets {@link Phaser.GameObjects.Group#defaultKey}.
  14607. * @property {?(string|integer)} [defaultFrame=null] - Sets {@link Phaser.GameObjects.Group#defaultFrame}.
  14608. * @property {?boolean} [runChildUpdate=false] - Sets {@link Phaser.GameObjects.Group#runChildUpdate}.
  14609. * @property {?GroupCallback} [createCallback=null] - Sets {@link Phaser.GameObjects.Group#createCallback}.
  14610. * @property {?GroupCallback} [removeCallback=null] - Sets {@link Phaser.GameObjects.Group#removeCallback}.
  14611. * @property {?GroupMultipleCreateCallback} [createMultipleCallback=null] - Sets {@link Phaser.GameObjects.Group#createMultipleCallback}.
  14612. */
  14613. /**
  14614. * @typedef {object} GroupCreateConfig
  14615. *
  14616. * The total number of objects created will be
  14617. *
  14618. * key.length * frame.length * frameQuantity * (yoyo ? 2 : 1) * (1 + repeat)
  14619. *
  14620. * In the simplest case, 1 + `repeat` objects will be created.
  14621. *
  14622. * If `max` is positive, then the total created will not exceed `max`.
  14623. *
  14624. * `key` is required. {@link Phaser.GameObjects.Group#defaultKey} is not used.
  14625. *
  14626. * @property {?GroupClassTypeConstructor} [classType] - The class of each new Game Object.
  14627. * @property {string} [key] - The texture key of each new Game Object.
  14628. * @property {?(string|integer)} [frame=null] - The texture frame of each new Game Object.
  14629. * @property {?boolean} [visible=true] - The visible state of each new Game Object.
  14630. * @property {?boolean} [active=true] - The active state of each new Game Object.
  14631. * @property {?number} [repeat=0] - The number of times each `key` × `frame` combination will be *repeated* (after the first combination).
  14632. * @property {?boolean} [randomKey=false] - Select a `key` at random.
  14633. * @property {?boolean} [randomFrame=false] - Select a `frame` at random.
  14634. * @property {?boolean} [yoyo=false] - Select keys and frames by moving forward then backward through `key` and `frame`.
  14635. * @property {?number} [frameQuantity=1] - The number of times each `frame` should be combined with one `key`.
  14636. * @property {?number} [max=0] - The maximum number of new Game Objects to create. 0 is no maximum.
  14637. * @property {?object} [setXY]
  14638. * @property {?number} [setXY.x=0] - The horizontal position of each new Game Object.
  14639. * @property {?number} [setXY.y=0] - The vertical position of each new Game Object.
  14640. * @property {?number} [setXY.stepX=0] - Increment each Game Object's horizontal position from the previous by this amount, starting from `setXY.x`.
  14641. * @property {?number} [setXY.stepY=0] - Increment each Game Object's vertical position from the previous by this amount, starting from `setXY.y`.
  14642. * @property {?object} [setRotation]
  14643. * @property {?number} [setRotation.value=0] - Rotation of each new Game Object.
  14644. * @property {?number} [setRotation.step=0] - Increment each Game Object's rotation from the previous by this amount, starting at `setRotation.value`.
  14645. * @property {?object} [setScale]
  14646. * @property {?number} [setScale.x=0] - The horizontal scale of each new Game Object.
  14647. * @property {?number} [setScale.y=0] - The vertical scale of each new Game Object.
  14648. * @property {?number} [setScale.stepX=0] - Increment each Game Object's horizontal scale from the previous by this amount, starting from `setScale.x`.
  14649. * @property {?number} [setScale.stepY=0] - Increment each Game object's vertical scale from the previous by this amount, starting from `setScale.y`.
  14650. * @property {?object} [setAlpha]
  14651. * @property {?number} [setAlpha.value=0] - The alpha value of each new Game Object.
  14652. * @property {?number} [setAlpha.step=0] - Increment each Game Object's alpha from the previous by this amount, starting from `setAlpha.value`.
  14653. * @property {?*} [hitArea] - A geometric shape that defines the hit area for the Game Object.
  14654. * @property {?HitAreaCallback} [hitAreaCallback] - A callback to be invoked when the Game Object is interacted with.
  14655. * @property {?(false|GridAlignConfig)} [gridAlign=false] - Align the new Game Objects in a grid using these settings.
  14656. *
  14657. * @see Phaser.Actions.GridAlign
  14658. * @see Phaser.Actions.SetAlpha
  14659. * @see Phaser.Actions.SetHitArea
  14660. * @see Phaser.Actions.SetRotation
  14661. * @see Phaser.Actions.SetScale
  14662. * @see Phaser.Actions.SetXY
  14663. * @see Phaser.GameObjects.Group#createFromConfig
  14664. * @see Phaser.Utils.Array.Range
  14665. */
  14666. /**
  14667. * A constructor function (class) that can be assigned to `classType`.
  14668. * @callback GroupClassTypeConstructor
  14669. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  14670. * @param {number} x - The horizontal position of this Game Object in the world.
  14671. * @param {number} y - The vertical position of this Game Object in the world.
  14672. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  14673. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  14674. *
  14675. * @see Phaser.GameObjects.Group#classType
  14676. */
  14677. /**
  14678. * @classdesc A Group is a way for you to create, manipulate, or recycle similar Game Objects.
  14679. *
  14680. * Group membership is non-exclusive. A Game Object can belong to several groups, one group, or none.
  14681. *
  14682. * Groups themselves aren't displayable, and can't be positioned, rotated, scaled, or hidden.
  14683. *
  14684. * @class Group
  14685. * @memberof Phaser.GameObjects
  14686. * @constructor
  14687. * @since 3.0.0
  14688. * @param {Phaser.Scene} scene - The scene this group belongs to.
  14689. * @param {(Phaser.GameObjects.GameObject[]|GroupConfig|GroupCreateConfig)} [children] - Game Objects to add to this group; or the `config` argument.
  14690. * @param {GroupConfig|GroupCreateConfig} [config] - Settings for this group. If `key` is set, Phaser.GameObjects.Group#createMultiple is also called with these settings.
  14691. *
  14692. * @see Phaser.Physics.Arcade.Group
  14693. * @see Phaser.Physics.Arcade.StaticGroup
  14694. */
  14695. var Group = new Class({
  14696. initialize:
  14697. function Group (scene, children, config)
  14698. {
  14699. // They can pass in any of the following as the first argument:
  14700. // 1) A single child
  14701. // 2) An array of children
  14702. // 3) A config object
  14703. // 4) An array of config objects
  14704. // Or they can pass in a child, or array of children AND a config object
  14705. if (config)
  14706. {
  14707. // config has been set, are the children an array?
  14708. if (children && !Array.isArray(children))
  14709. {
  14710. children = [ children ];
  14711. }
  14712. }
  14713. else if (Array.isArray(children))
  14714. {
  14715. // No config, so let's check the children argument
  14716. if (IsPlainObject(children[0]))
  14717. {
  14718. // It's an array of plain config objects
  14719. config = children;
  14720. children = null;
  14721. }
  14722. }
  14723. else if (IsPlainObject(children))
  14724. {
  14725. // Children isn't an array. Is it a config object though?
  14726. config = children;
  14727. children = null;
  14728. }
  14729. /**
  14730. * This scene this group belongs to.
  14731. *
  14732. * @name Phaser.GameObjects.Group#scene
  14733. * @type {Phaser.Scene}
  14734. * @since 3.0.0
  14735. */
  14736. this.scene = scene;
  14737. /**
  14738. * Members of this group.
  14739. *
  14740. * @name Phaser.GameObjects.Group#children
  14741. * @type {Phaser.Structs.Set.<Phaser.GameObjects.GameObject>}
  14742. * @since 3.0.0
  14743. */
  14744. this.children = new Set(children);
  14745. /**
  14746. * A flag identifying this object as a group.
  14747. *
  14748. * @name Phaser.GameObjects.Group#isParent
  14749. * @type {boolean}
  14750. * @default true
  14751. * @since 3.0.0
  14752. */
  14753. this.isParent = true;
  14754. /**
  14755. * The class to create new group members from.
  14756. *
  14757. * @name Phaser.GameObjects.Group#classType
  14758. * @type {GroupClassTypeConstructor}
  14759. * @since 3.0.0
  14760. * @default Phaser.GameObjects.Sprite
  14761. */
  14762. this.classType = GetFastValue(config, 'classType', Sprite);
  14763. /**
  14764. * Whether this group runs its {@link Phaser.GameObjects.Group#preUpdate} method
  14765. * (which may update any members).
  14766. *
  14767. * @name Phaser.GameObjects.Group#active
  14768. * @type {boolean}
  14769. * @since 3.0.0
  14770. */
  14771. this.active = GetFastValue(config, 'active', true);
  14772. /**
  14773. * The maximum size of this group, if used as a pool. -1 is no limit.
  14774. *
  14775. * @name Phaser.GameObjects.Group#maxSize
  14776. * @type {integer}
  14777. * @since 3.0.0
  14778. * @default -1
  14779. */
  14780. this.maxSize = GetFastValue(config, 'maxSize', -1);
  14781. /**
  14782. * A default texture key to use when creating new group members.
  14783. *
  14784. * This is used in {@link Phaser.GameObjects.Group#create}
  14785. * but not in {@link Phaser.GameObjects.Group#createMultiple}.
  14786. *
  14787. * @name Phaser.GameObjects.Group#defaultKey
  14788. * @type {string}
  14789. * @since 3.0.0
  14790. */
  14791. this.defaultKey = GetFastValue(config, 'defaultKey', null);
  14792. /**
  14793. * A default texture frame to use when creating new group members.
  14794. *
  14795. * @name Phaser.GameObjects.Group#defaultFrame
  14796. * @type {(string|integer)}
  14797. * @since 3.0.0
  14798. */
  14799. this.defaultFrame = GetFastValue(config, 'defaultFrame', null);
  14800. /**
  14801. * Whether to call the update method of any members.
  14802. *
  14803. * @name Phaser.GameObjects.Group#runChildUpdate
  14804. * @type {boolean}
  14805. * @default false
  14806. * @since 3.0.0
  14807. * @see Phaser.GameObjects.Group#preUpdate
  14808. */
  14809. this.runChildUpdate = GetFastValue(config, 'runChildUpdate', false);
  14810. /**
  14811. * A function to be called when adding or creating group members.
  14812. *
  14813. * @name Phaser.GameObjects.Group#createCallback
  14814. * @type {?GroupCallback}
  14815. * @since 3.0.0
  14816. */
  14817. this.createCallback = GetFastValue(config, 'createCallback', null);
  14818. /**
  14819. * A function to be called when removing group members.
  14820. *
  14821. * @name Phaser.GameObjects.Group#removeCallback
  14822. * @type {?GroupCallback}
  14823. * @since 3.0.0
  14824. */
  14825. this.removeCallback = GetFastValue(config, 'removeCallback', null);
  14826. /**
  14827. * A function to be called when creating several group members at once.
  14828. *
  14829. * @name Phaser.GameObjects.Group#createMultipleCallback
  14830. * @type {?GroupMultipleCreateCallback}
  14831. * @since 3.0.0
  14832. */
  14833. this.createMultipleCallback = GetFastValue(config, 'createMultipleCallback', null);
  14834. if (config)
  14835. {
  14836. this.createMultiple(config);
  14837. }
  14838. },
  14839. /**
  14840. * Creates a new Game Object and adds it to this group, unless the group {@link Phaser.GameObjects.Group#isFull is full}.
  14841. *
  14842. * Calls {@link Phaser.GameObjects.Group#createCallback}.
  14843. *
  14844. * @method Phaser.GameObjects.Group#create
  14845. * @since 3.0.0
  14846. *
  14847. * @param {number} [x=0] - The horizontal position of the new Game Object in the world.
  14848. * @param {number} [y=0] - The vertical position of the new Game Object in the world.
  14849. * @param {string} [key=defaultKey] - The texture key of the new Game Object.
  14850. * @param {(string|integer)} [frame=defaultFrame] - The texture frame of the new Game Object.
  14851. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of the new Game Object.
  14852. * @param {boolean} [active=true] - The {@link Phaser.GameObjects.GameObject#active} state of the new Game Object.
  14853. *
  14854. * @return {any} The new Game Object (usually a Sprite, etc.).
  14855. */
  14856. create: function (x, y, key, frame, visible, active)
  14857. {
  14858. if (x === undefined) { x = 0; }
  14859. if (y === undefined) { y = 0; }
  14860. if (key === undefined) { key = this.defaultKey; }
  14861. if (frame === undefined) { frame = this.defaultFrame; }
  14862. if (visible === undefined) { visible = true; }
  14863. if (active === undefined) { active = true; }
  14864. // Pool?
  14865. if (this.isFull())
  14866. {
  14867. return null;
  14868. }
  14869. var child = new this.classType(this.scene, x, y, key, frame);
  14870. this.scene.sys.displayList.add(child);
  14871. if (child.preUpdate)
  14872. {
  14873. this.scene.sys.updateList.add(child);
  14874. }
  14875. child.visible = visible;
  14876. child.setActive(active);
  14877. this.add(child);
  14878. return child;
  14879. },
  14880. /**
  14881. * Creates several Game Objects and adds them to this group.
  14882. *
  14883. * If the group becomes {@link Phaser.GameObjects.Group#isFull}, no further Game Objects are created.
  14884. *
  14885. * Calls {@link Phaser.GameObjects.Group#createMultipleCallback} and {@link Phaser.GameObjects.Group#createCallback}.
  14886. *
  14887. * @method Phaser.GameObjects.Group#createMultiple
  14888. * @since 3.0.0
  14889. *
  14890. * @param {GroupCreateConfig|GroupCreateConfig[]} config - Creation settings. This can be a single configuration object or an array of such objects, which will be applied in turn.
  14891. *
  14892. * @return {any[]} The newly created Game Objects.
  14893. */
  14894. createMultiple: function (config)
  14895. {
  14896. if (this.isFull())
  14897. {
  14898. return [];
  14899. }
  14900. if (!Array.isArray(config))
  14901. {
  14902. config = [ config ];
  14903. }
  14904. var output = [];
  14905. if (config[0].key)
  14906. {
  14907. for (var i = 0; i < config.length; i++)
  14908. {
  14909. var entries = this.createFromConfig(config[i]);
  14910. output = output.concat(entries);
  14911. }
  14912. }
  14913. return output;
  14914. },
  14915. /**
  14916. * A helper for {@link Phaser.GameObjects.Group#createMultiple}.
  14917. *
  14918. * @method Phaser.GameObjects.Group#createFromConfig
  14919. * @since 3.0.0
  14920. *
  14921. * @param {GroupCreateConfig} options - Creation settings.
  14922. *
  14923. * @return {any[]} The newly created Game Objects.
  14924. */
  14925. createFromConfig: function (options)
  14926. {
  14927. if (this.isFull())
  14928. {
  14929. return [];
  14930. }
  14931. this.classType = GetFastValue(options, 'classType', this.classType);
  14932. var key = GetFastValue(options, 'key', undefined);
  14933. var frame = GetFastValue(options, 'frame', null);
  14934. var visible = GetFastValue(options, 'visible', true);
  14935. var active = GetFastValue(options, 'active', true);
  14936. var entries = [];
  14937. // Can't do anything without at least a key
  14938. if (key === undefined)
  14939. {
  14940. return entries;
  14941. }
  14942. else
  14943. {
  14944. if (!Array.isArray(key))
  14945. {
  14946. key = [ key ];
  14947. }
  14948. if (!Array.isArray(frame))
  14949. {
  14950. frame = [ frame ];
  14951. }
  14952. }
  14953. // Build an array of key frame pairs to loop through
  14954. var repeat = GetFastValue(options, 'repeat', 0);
  14955. var randomKey = GetFastValue(options, 'randomKey', false);
  14956. var randomFrame = GetFastValue(options, 'randomFrame', false);
  14957. var yoyo = GetFastValue(options, 'yoyo', false);
  14958. var quantity = GetFastValue(options, 'frameQuantity', 1);
  14959. var max = GetFastValue(options, 'max', 0);
  14960. // If a grid is set we use that to override the quantity?
  14961. var range = Range(key, frame, {
  14962. max: max,
  14963. qty: quantity,
  14964. random: randomKey,
  14965. randomB: randomFrame,
  14966. repeat: repeat,
  14967. yoyo: yoyo
  14968. });
  14969. for (var c = 0; c < range.length; c++)
  14970. {
  14971. var created = this.create(0, 0, range[c].a, range[c].b, visible, active);
  14972. if (!created)
  14973. {
  14974. break;
  14975. }
  14976. entries.push(created);
  14977. }
  14978. // Post-creation options (applied only to those items created in this call):
  14979. var x = GetValue(options, 'setXY.x', 0);
  14980. var y = GetValue(options, 'setXY.y', 0);
  14981. var stepX = GetValue(options, 'setXY.stepX', 0);
  14982. var stepY = GetValue(options, 'setXY.stepY', 0);
  14983. Actions.SetXY(entries, x, y, stepX, stepY);
  14984. var rotation = GetValue(options, 'setRotation.value', 0);
  14985. var stepRotation = GetValue(options, 'setRotation.step', 0);
  14986. Actions.SetRotation(entries, rotation, stepRotation);
  14987. var scaleX = GetValue(options, 'setScale.x', 1);
  14988. var scaleY = GetValue(options, 'setScale.y', scaleX);
  14989. var stepScaleX = GetValue(options, 'setScale.stepX', 0);
  14990. var stepScaleY = GetValue(options, 'setScale.stepY', 0);
  14991. Actions.SetScale(entries, scaleX, scaleY, stepScaleX, stepScaleY);
  14992. var alpha = GetValue(options, 'setAlpha.value', 1);
  14993. var stepAlpha = GetValue(options, 'setAlpha.step', 0);
  14994. Actions.SetAlpha(entries, alpha, stepAlpha);
  14995. var hitArea = GetFastValue(options, 'hitArea', null);
  14996. var hitAreaCallback = GetFastValue(options, 'hitAreaCallback', null);
  14997. if (hitArea)
  14998. {
  14999. Actions.SetHitArea(entries, hitArea, hitAreaCallback);
  15000. }
  15001. var grid = GetFastValue(options, 'gridAlign', false);
  15002. if (grid)
  15003. {
  15004. Actions.GridAlign(entries, grid);
  15005. }
  15006. if (this.createMultipleCallback)
  15007. {
  15008. this.createMultipleCallback.call(this, entries);
  15009. }
  15010. return entries;
  15011. },
  15012. /**
  15013. * Updates any group members, if {@link Phaser.GameObjects.Group#runChildUpdate} is enabled.
  15014. *
  15015. * @method Phaser.GameObjects.Group#preUpdate
  15016. * @since 3.0.0
  15017. *
  15018. * @param {number} time - The current timestamp.
  15019. * @param {number} delta - The delta time elapsed since the last frame.
  15020. */
  15021. preUpdate: function (time, delta)
  15022. {
  15023. if (!this.runChildUpdate || this.children.size === 0)
  15024. {
  15025. return;
  15026. }
  15027. // Because a Group child may mess with the length of the Group during its update
  15028. var temp = this.children.entries.slice();
  15029. for (var i = 0; i < temp.length; i++)
  15030. {
  15031. var item = temp[i];
  15032. if (item.active)
  15033. {
  15034. item.update(time, delta);
  15035. }
  15036. }
  15037. },
  15038. /**
  15039. * Adds a Game Object to this group.
  15040. *
  15041. * Calls {@link Phaser.GameObjects.Group#createCallback}.
  15042. *
  15043. * @method Phaser.GameObjects.Group#add
  15044. * @since 3.0.0
  15045. *
  15046. * @param {Phaser.GameObjects.GameObject} child - The Game Object to add.
  15047. * @param {boolean} [addToScene=false] - Also add the Game Object to the scene.
  15048. *
  15049. * @return {Phaser.GameObjects.Group} This Group object.
  15050. */
  15051. add: function (child, addToScene)
  15052. {
  15053. if (addToScene === undefined) { addToScene = false; }
  15054. if (this.isFull())
  15055. {
  15056. return this;
  15057. }
  15058. this.children.set(child);
  15059. if (this.createCallback)
  15060. {
  15061. this.createCallback.call(this, child);
  15062. }
  15063. if (addToScene)
  15064. {
  15065. this.scene.sys.displayList.add(child);
  15066. if (child.preUpdate)
  15067. {
  15068. this.scene.sys.updateList.add(child);
  15069. }
  15070. }
  15071. child.on(Events.DESTROY, this.remove, this);
  15072. return this;
  15073. },
  15074. /**
  15075. * Adds several Game Objects to this group.
  15076. *
  15077. * Calls {@link Phaser.GameObjects.Group#createCallback}.
  15078. *
  15079. * @method Phaser.GameObjects.Group#addMultiple
  15080. * @since 3.0.0
  15081. *
  15082. * @param {Phaser.GameObjects.GameObject[]} children - The Game Objects to add.
  15083. * @param {boolean} [addToScene=false] - Also add the Game Objects to the scene.
  15084. *
  15085. * @return {Phaser.GameObjects.Group} This group.
  15086. */
  15087. addMultiple: function (children, addToScene)
  15088. {
  15089. if (addToScene === undefined) { addToScene = false; }
  15090. if (Array.isArray(children))
  15091. {
  15092. for (var i = 0; i < children.length; i++)
  15093. {
  15094. this.add(children[i], addToScene);
  15095. }
  15096. }
  15097. return this;
  15098. },
  15099. /**
  15100. * Removes a member of this Group and optionally removes it from the Scene and / or destroys it.
  15101. *
  15102. * Calls {@link Phaser.GameObjects.Group#removeCallback}.
  15103. *
  15104. * @method Phaser.GameObjects.Group#remove
  15105. * @since 3.0.0
  15106. *
  15107. * @param {Phaser.GameObjects.GameObject} child - The Game Object to remove.
  15108. * @param {boolean} [removeFromScene=false] - Optionally remove the Group member from the Scene it belongs to.
  15109. * @param {boolean} [destroyChild=false] - Optionally call destroy on the removed Group member.
  15110. *
  15111. * @return {Phaser.GameObjects.Group} This Group object.
  15112. */
  15113. remove: function (child, removeFromScene, destroyChild)
  15114. {
  15115. if (removeFromScene === undefined) { removeFromScene = false; }
  15116. if (destroyChild === undefined) { destroyChild = false; }
  15117. if (!this.children.contains(child))
  15118. {
  15119. return this;
  15120. }
  15121. this.children.delete(child);
  15122. if (this.removeCallback)
  15123. {
  15124. this.removeCallback.call(this, child);
  15125. }
  15126. child.off(Events.DESTROY, this.remove, this);
  15127. if (destroyChild)
  15128. {
  15129. child.destroy();
  15130. }
  15131. else if (removeFromScene)
  15132. {
  15133. child.scene.sys.displayList.remove(child);
  15134. if (child.preUpdate)
  15135. {
  15136. child.scene.sys.updateList.remove(child);
  15137. }
  15138. }
  15139. return this;
  15140. },
  15141. /**
  15142. * Removes all members of this Group and optionally removes them from the Scene and / or destroys them.
  15143. *
  15144. * Does not call {@link Phaser.GameObjects.Group#removeCallback}.
  15145. *
  15146. * @method Phaser.GameObjects.Group#clear
  15147. * @since 3.0.0
  15148. *
  15149. * @param {boolean} [removeFromScene=false] - Optionally remove each Group member from the Scene.
  15150. * @param {boolean} [destroyChild=false] - Optionally call destroy on the removed Group members.
  15151. *
  15152. * @return {Phaser.GameObjects.Group} This group.
  15153. */
  15154. clear: function (removeFromScene, destroyChild)
  15155. {
  15156. if (removeFromScene === undefined) { removeFromScene = false; }
  15157. if (destroyChild === undefined) { destroyChild = false; }
  15158. var children = this.children;
  15159. for (var i = 0; i < children.size; i++)
  15160. {
  15161. var gameObject = children.entries[i];
  15162. gameObject.off(Events.DESTROY, this.remove, this);
  15163. if (destroyChild)
  15164. {
  15165. gameObject.destroy();
  15166. }
  15167. else if (removeFromScene)
  15168. {
  15169. gameObject.scene.sys.displayList.remove(gameObject);
  15170. if (gameObject.preUpdate)
  15171. {
  15172. gameObject.scene.sys.updateList.remove(gameObject);
  15173. }
  15174. }
  15175. }
  15176. this.children.clear();
  15177. return this;
  15178. },
  15179. /**
  15180. * Tests if a Game Object is a member of this group.
  15181. *
  15182. * @method Phaser.GameObjects.Group#contains
  15183. * @since 3.0.0
  15184. *
  15185. * @param {Phaser.GameObjects.GameObject} child - A Game Object.
  15186. *
  15187. * @return {boolean} True if the Game Object is a member of this group.
  15188. */
  15189. contains: function (child)
  15190. {
  15191. return this.children.contains(child);
  15192. },
  15193. /**
  15194. * All members of the group.
  15195. *
  15196. * @method Phaser.GameObjects.Group#getChildren
  15197. * @since 3.0.0
  15198. *
  15199. * @return {Phaser.GameObjects.GameObject[]} The group members.
  15200. */
  15201. getChildren: function ()
  15202. {
  15203. return this.children.entries;
  15204. },
  15205. /**
  15206. * The number of members of the group.
  15207. *
  15208. * @method Phaser.GameObjects.Group#getLength
  15209. * @since 3.0.0
  15210. *
  15211. * @return {integer}
  15212. */
  15213. getLength: function ()
  15214. {
  15215. return this.children.size;
  15216. },
  15217. /**
  15218. * Scans the Group, from top to bottom, for the first member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  15219. * assigns `x` and `y`, and returns the member.
  15220. *
  15221. * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`.
  15222. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  15223. *
  15224. * @method Phaser.GameObjects.Group#getFirst
  15225. * @since 3.0.0
  15226. *
  15227. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  15228. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  15229. * @param {number} [x] - The horizontal position of the Game Object in the world.
  15230. * @param {number} [y] - The vertical position of the Game Object in the world.
  15231. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  15232. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  15233. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  15234. *
  15235. * @return {?any} The first matching group member, or a newly created member, or null.
  15236. */
  15237. getFirst: function (state, createIfNull, x, y, key, frame, visible)
  15238. {
  15239. return this.getHandler(true, 1, state, createIfNull, x, y, key, frame, visible);
  15240. },
  15241. /**
  15242. * Scans the Group, from top to bottom, for the nth member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  15243. * assigns `x` and `y`, and returns the member.
  15244. *
  15245. * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`.
  15246. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  15247. *
  15248. * @method Phaser.GameObjects.Group#getFirstNth
  15249. * @since 3.6.0
  15250. *
  15251. * @param {integer} nth - The nth matching Group member to search for.
  15252. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  15253. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  15254. * @param {number} [x] - The horizontal position of the Game Object in the world.
  15255. * @param {number} [y] - The vertical position of the Game Object in the world.
  15256. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  15257. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  15258. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  15259. *
  15260. * @return {?any} The first matching group member, or a newly created member, or null.
  15261. */
  15262. getFirstNth: function (nth, state, createIfNull, x, y, key, frame, visible)
  15263. {
  15264. return this.getHandler(true, nth, state, createIfNull, x, y, key, frame, visible);
  15265. },
  15266. /**
  15267. * Scans the Group for the last member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  15268. * assigns `x` and `y`, and returns the member.
  15269. *
  15270. * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`.
  15271. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  15272. *
  15273. * @method Phaser.GameObjects.Group#getLast
  15274. * @since 3.6.0
  15275. *
  15276. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  15277. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  15278. * @param {number} [x] - The horizontal position of the Game Object in the world.
  15279. * @param {number} [y] - The vertical position of the Game Object in the world.
  15280. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  15281. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  15282. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  15283. *
  15284. * @return {?any} The first matching group member, or a newly created member, or null.
  15285. */
  15286. getLast: function (state, createIfNull, x, y, key, frame, visible)
  15287. {
  15288. return this.getHandler(false, 1, state, createIfNull, x, y, key, frame, visible);
  15289. },
  15290. /**
  15291. * Scans the Group for the last nth member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  15292. * assigns `x` and `y`, and returns the member.
  15293. *
  15294. * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`.
  15295. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  15296. *
  15297. * @method Phaser.GameObjects.Group#getLastNth
  15298. * @since 3.6.0
  15299. *
  15300. * @param {integer} nth - The nth matching Group member to search for.
  15301. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  15302. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  15303. * @param {number} [x] - The horizontal position of the Game Object in the world.
  15304. * @param {number} [y] - The vertical position of the Game Object in the world.
  15305. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  15306. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  15307. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  15308. *
  15309. * @return {?any} The first matching group member, or a newly created member, or null.
  15310. */
  15311. getLastNth: function (nth, state, createIfNull, x, y, key, frame, visible)
  15312. {
  15313. return this.getHandler(false, nth, state, createIfNull, x, y, key, frame, visible);
  15314. },
  15315. /**
  15316. * Scans the group for the last member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  15317. * assigns `x` and `y`, and returns the member.
  15318. *
  15319. * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`.
  15320. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  15321. *
  15322. * @method Phaser.GameObjects.Group#getHandler
  15323. * @private
  15324. * @since 3.6.0
  15325. *
  15326. * @param {boolean} forwards - Search front to back or back to front?
  15327. * @param {integer} nth - Stop matching after nth successful matches.
  15328. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  15329. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  15330. * @param {number} [x] - The horizontal position of the Game Object in the world.
  15331. * @param {number} [y] - The vertical position of the Game Object in the world.
  15332. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  15333. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  15334. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  15335. *
  15336. * @return {?any} The first matching group member, or a newly created member, or null.
  15337. */
  15338. getHandler: function (forwards, nth, state, createIfNull, x, y, key, frame, visible)
  15339. {
  15340. if (state === undefined) { state = false; }
  15341. if (createIfNull === undefined) { createIfNull = false; }
  15342. var gameObject;
  15343. var i;
  15344. var total = 0;
  15345. var children = this.children.entries;
  15346. if (forwards)
  15347. {
  15348. for (i = 0; i < children.length; i++)
  15349. {
  15350. gameObject = children[i];
  15351. if (gameObject.active === state)
  15352. {
  15353. total++;
  15354. if (total === nth)
  15355. {
  15356. break;
  15357. }
  15358. }
  15359. else
  15360. {
  15361. gameObject = null;
  15362. }
  15363. }
  15364. }
  15365. else
  15366. {
  15367. for (i = children.length - 1; i >= 0; i--)
  15368. {
  15369. gameObject = children[i];
  15370. if (gameObject.active === state)
  15371. {
  15372. total++;
  15373. if (total === nth)
  15374. {
  15375. break;
  15376. }
  15377. }
  15378. else
  15379. {
  15380. gameObject = null;
  15381. }
  15382. }
  15383. }
  15384. if (gameObject)
  15385. {
  15386. if (typeof(x) === 'number')
  15387. {
  15388. gameObject.x = x;
  15389. }
  15390. if (typeof(y) === 'number')
  15391. {
  15392. gameObject.y = y;
  15393. }
  15394. return gameObject;
  15395. }
  15396. // Got this far? We need to create or bail
  15397. if (createIfNull)
  15398. {
  15399. return this.create(x, y, key, frame, visible);
  15400. }
  15401. else
  15402. {
  15403. return null;
  15404. }
  15405. },
  15406. /**
  15407. * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `false`,
  15408. * assigns `x` and `y`, and returns the member.
  15409. *
  15410. * If no inactive member is found and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`.
  15411. * The new Game Object will have its active state set to `true`.
  15412. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  15413. *
  15414. * @method Phaser.GameObjects.Group#get
  15415. * @since 3.0.0
  15416. *
  15417. * @param {number} [x] - The horizontal position of the Game Object in the world.
  15418. * @param {number} [y] - The vertical position of the Game Object in the world.
  15419. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  15420. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  15421. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  15422. *
  15423. * @return {?any} The first inactive group member, or a newly created member, or null.
  15424. */
  15425. get: function (x, y, key, frame, visible)
  15426. {
  15427. return this.getFirst(false, true, x, y, key, frame, visible);
  15428. },
  15429. /**
  15430. * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `true`,
  15431. * assigns `x` and `y`, and returns the member.
  15432. *
  15433. * If no active member is found and `createIfNull` is `true` and the group isn't full then it will create a new one using `x`, `y`, `key`, `frame`, and `visible`.
  15434. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  15435. *
  15436. * @method Phaser.GameObjects.Group#getFirstAlive
  15437. * @since 3.0.0
  15438. *
  15439. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  15440. * @param {number} [x] - The horizontal position of the Game Object in the world.
  15441. * @param {number} [y] - The vertical position of the Game Object in the world.
  15442. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  15443. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  15444. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  15445. *
  15446. * @return {any} The first active group member, or a newly created member, or null.
  15447. */
  15448. getFirstAlive: function (createIfNull, x, y, key, frame, visible)
  15449. {
  15450. return this.getFirst(true, createIfNull, x, y, key, frame, visible);
  15451. },
  15452. /**
  15453. * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `false`,
  15454. * assigns `x` and `y`, and returns the member.
  15455. *
  15456. * If no inactive member is found and `createIfNull` is `true` and the group isn't full then it will create a new one using `x`, `y`, `key`, `frame`, and `visible`.
  15457. * The new Game Object will have an active state set to `true`.
  15458. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  15459. *
  15460. * @method Phaser.GameObjects.Group#getFirstDead
  15461. * @since 3.0.0
  15462. *
  15463. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  15464. * @param {number} [x] - The horizontal position of the Game Object in the world.
  15465. * @param {number} [y] - The vertical position of the Game Object in the world.
  15466. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  15467. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  15468. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  15469. *
  15470. * @return {any} The first inactive group member, or a newly created member, or null.
  15471. */
  15472. getFirstDead: function (createIfNull, x, y, key, frame, visible)
  15473. {
  15474. return this.getFirst(false, createIfNull, x, y, key, frame, visible);
  15475. },
  15476. /**
  15477. * {@link Phaser.GameObjects.Components.Animation#play Plays} an animation for all members of this group.
  15478. *
  15479. * @method Phaser.GameObjects.Group#playAnimation
  15480. * @since 3.0.0
  15481. *
  15482. * @param {string} key - The string-based key of the animation to play.
  15483. * @param {string} [startFrame=0] - Optionally start the animation playing from this frame index.
  15484. *
  15485. * @return {Phaser.GameObjects.Group} This Group object.
  15486. */
  15487. playAnimation: function (key, startFrame)
  15488. {
  15489. Actions.PlayAnimation(this.children.entries, key, startFrame);
  15490. return this;
  15491. },
  15492. /**
  15493. * Whether this group's size at its {@link Phaser.GameObjects.Group#maxSize maximum}.
  15494. *
  15495. * @method Phaser.GameObjects.Group#isFull
  15496. * @since 3.0.0
  15497. *
  15498. * @return {boolean} True if the number of members equals {@link Phaser.GameObjects.Group#maxSize}.
  15499. */
  15500. isFull: function ()
  15501. {
  15502. if (this.maxSize === -1)
  15503. {
  15504. return false;
  15505. }
  15506. else
  15507. {
  15508. return (this.children.size >= this.maxSize);
  15509. }
  15510. },
  15511. /**
  15512. * Counts the number of active (or inactive) group members.
  15513. *
  15514. * @method Phaser.GameObjects.Group#countActive
  15515. * @since 3.0.0
  15516. *
  15517. * @param {boolean} [value=true] - Count active (true) or inactive (false) group members.
  15518. *
  15519. * @return {integer} The number of group members with an active state matching the `active` argument.
  15520. */
  15521. countActive: function (value)
  15522. {
  15523. if (value === undefined) { value = true; }
  15524. var total = 0;
  15525. for (var i = 0; i < this.children.size; i++)
  15526. {
  15527. if (this.children.entries[i].active === value)
  15528. {
  15529. total++;
  15530. }
  15531. }
  15532. return total;
  15533. },
  15534. /**
  15535. * Counts the number of in-use (active) group members.
  15536. *
  15537. * @method Phaser.GameObjects.Group#getTotalUsed
  15538. * @since 3.0.0
  15539. *
  15540. * @return {integer} The number of group members with an active state of true.
  15541. */
  15542. getTotalUsed: function ()
  15543. {
  15544. return this.countActive();
  15545. },
  15546. /**
  15547. * The difference of {@link Phaser.GameObjects.Group#maxSize} and the number of active group members.
  15548. *
  15549. * This represents the number of group members that could be created or reactivated before reaching the size limit.
  15550. *
  15551. * @method Phaser.GameObjects.Group#getTotalFree
  15552. * @since 3.0.0
  15553. *
  15554. * @return {integer} maxSize minus the number of active group numbers; or a large number (if maxSize is -1).
  15555. */
  15556. getTotalFree: function ()
  15557. {
  15558. var used = this.getTotalUsed();
  15559. var capacity = (this.maxSize === -1) ? 999999999999 : this.maxSize;
  15560. return (capacity - used);
  15561. },
  15562. /**
  15563. * Sets the depth of each group member.
  15564. *
  15565. * @method Phaser.GameObjects.Group#setDepth
  15566. * @since 3.0.0
  15567. *
  15568. * @param {number} value - The amount to set the property to.
  15569. * @param {number} step - This is added to the `value` amount, multiplied by the iteration counter.
  15570. *
  15571. * @return {Phaser.GameObjects.Group} This Group object.
  15572. */
  15573. setDepth: function (value, step)
  15574. {
  15575. Actions.SetDepth(this.children.entries, value, step);
  15576. return this;
  15577. },
  15578. /**
  15579. * Deactivates a member of this group.
  15580. *
  15581. * @method Phaser.GameObjects.Group#kill
  15582. * @since 3.0.0
  15583. *
  15584. * @param {Phaser.GameObjects.GameObject} gameObject - A member of this group.
  15585. */
  15586. kill: function (gameObject)
  15587. {
  15588. if (this.children.contains(gameObject))
  15589. {
  15590. gameObject.setActive(false);
  15591. }
  15592. },
  15593. /**
  15594. * Deactivates and hides a member of this group.
  15595. *
  15596. * @method Phaser.GameObjects.Group#killAndHide
  15597. * @since 3.0.0
  15598. *
  15599. * @param {Phaser.GameObjects.GameObject} gameObject - A member of this group.
  15600. */
  15601. killAndHide: function (gameObject)
  15602. {
  15603. if (this.children.contains(gameObject))
  15604. {
  15605. gameObject.setActive(false);
  15606. gameObject.setVisible(false);
  15607. }
  15608. },
  15609. /**
  15610. * Toggles (flips) the visible state of each member of this group.
  15611. *
  15612. * @method Phaser.GameObjects.Group#toggleVisible
  15613. * @since 3.0.0
  15614. *
  15615. * @return {Phaser.GameObjects.Group} This Group object.
  15616. */
  15617. toggleVisible: function ()
  15618. {
  15619. Actions.ToggleVisible(this.children.entries);
  15620. return this;
  15621. },
  15622. /**
  15623. * Empties this group and removes it from the Scene.
  15624. *
  15625. * Does not call {@link Phaser.GameObjects.Group#removeCallback}.
  15626. *
  15627. * @method Phaser.GameObjects.Group#destroy
  15628. * @since 3.0.0
  15629. *
  15630. * @param {boolean} [destroyChildren=false] - Also {@link Phaser.GameObjects.GameObject#destroy} each group member.
  15631. */
  15632. destroy: function (destroyChildren)
  15633. {
  15634. if (destroyChildren === undefined) { destroyChildren = false; }
  15635. // This Game Object had already been destroyed
  15636. if (!this.scene || this.ignoreDestroy)
  15637. {
  15638. return;
  15639. }
  15640. if (destroyChildren)
  15641. {
  15642. var children = this.children;
  15643. for (var i = 0; i < children.size; i++)
  15644. {
  15645. var gameObject = children.entries[i];
  15646. // Remove the event hook first or it'll go all recursive hell on us
  15647. gameObject.off(Events.DESTROY, this.remove, this);
  15648. gameObject.destroy();
  15649. }
  15650. }
  15651. this.children.clear();
  15652. this.scene = undefined;
  15653. this.children = undefined;
  15654. }
  15655. });
  15656. module.exports = Group;
  15657. /***/ }),
  15658. /* 95 */
  15659. /***/ (function(module, exports) {
  15660. /**
  15661. * @author Richard Davey <rich@photonstorm.com>
  15662. * @copyright 2019 Photon Storm Ltd.
  15663. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  15664. */
  15665. /**
  15666. * Check to see if the Ellipse contains the given x / y coordinates.
  15667. *
  15668. * @function Phaser.Geom.Ellipse.Contains
  15669. * @since 3.0.0
  15670. *
  15671. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to check.
  15672. * @param {number} x - The x coordinate to check within the ellipse.
  15673. * @param {number} y - The y coordinate to check within the ellipse.
  15674. *
  15675. * @return {boolean} True if the coordinates are within the ellipse, otherwise false.
  15676. */
  15677. var Contains = function (ellipse, x, y)
  15678. {
  15679. if (ellipse.width <= 0 || ellipse.height <= 0)
  15680. {
  15681. return false;
  15682. }
  15683. // Normalize the coords to an ellipse with center 0,0 and a radius of 0.5
  15684. var normx = ((x - ellipse.x) / ellipse.width);
  15685. var normy = ((y - ellipse.y) / ellipse.height);
  15686. normx *= normx;
  15687. normy *= normy;
  15688. return (normx + normy < 0.25);
  15689. };
  15690. module.exports = Contains;
  15691. /***/ }),
  15692. /* 96 */
  15693. /***/ (function(module, exports, __webpack_require__) {
  15694. /**
  15695. * @author Richard Davey <rich@photonstorm.com>
  15696. * @copyright 2019 Photon Storm Ltd.
  15697. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  15698. */
  15699. var Class = __webpack_require__(0);
  15700. var Contains = __webpack_require__(95);
  15701. var GetPoint = __webpack_require__(311);
  15702. var GetPoints = __webpack_require__(310);
  15703. var Random = __webpack_require__(199);
  15704. /**
  15705. * @classdesc
  15706. * An Ellipse object.
  15707. *
  15708. * This is a geometry object, containing numerical values and related methods to inspect and modify them.
  15709. * It is not a Game Object, in that you cannot add it to the display list, and it has no texture.
  15710. * To render an Ellipse you should look at the capabilities of the Graphics class.
  15711. *
  15712. * @class Ellipse
  15713. * @memberof Phaser.Geom
  15714. * @constructor
  15715. * @since 3.0.0
  15716. *
  15717. * @param {number} [x=0] - The x position of the center of the ellipse.
  15718. * @param {number} [y=0] - The y position of the center of the ellipse.
  15719. * @param {number} [width=0] - The width of the ellipse.
  15720. * @param {number} [height=0] - The height of the ellipse.
  15721. */
  15722. var Ellipse = new Class({
  15723. initialize:
  15724. function Ellipse (x, y, width, height)
  15725. {
  15726. if (x === undefined) { x = 0; }
  15727. if (y === undefined) { y = 0; }
  15728. if (width === undefined) { width = 0; }
  15729. if (height === undefined) { height = 0; }
  15730. /**
  15731. * The x position of the center of the ellipse.
  15732. *
  15733. * @name Phaser.Geom.Ellipse#x
  15734. * @type {number}
  15735. * @default 0
  15736. * @since 3.0.0
  15737. */
  15738. this.x = x;
  15739. /**
  15740. * The y position of the center of the ellipse.
  15741. *
  15742. * @name Phaser.Geom.Ellipse#y
  15743. * @type {number}
  15744. * @default 0
  15745. * @since 3.0.0
  15746. */
  15747. this.y = y;
  15748. /**
  15749. * The width of the ellipse.
  15750. *
  15751. * @name Phaser.Geom.Ellipse#width
  15752. * @type {number}
  15753. * @default 0
  15754. * @since 3.0.0
  15755. */
  15756. this.width = width;
  15757. /**
  15758. * The height of the ellipse.
  15759. *
  15760. * @name Phaser.Geom.Ellipse#height
  15761. * @type {number}
  15762. * @default 0
  15763. * @since 3.0.0
  15764. */
  15765. this.height = height;
  15766. },
  15767. /**
  15768. * Check to see if the Ellipse contains the given x / y coordinates.
  15769. *
  15770. * @method Phaser.Geom.Ellipse#contains
  15771. * @since 3.0.0
  15772. *
  15773. * @param {number} x - The x coordinate to check within the ellipse.
  15774. * @param {number} y - The y coordinate to check within the ellipse.
  15775. *
  15776. * @return {boolean} True if the coordinates are within the ellipse, otherwise false.
  15777. */
  15778. contains: function (x, y)
  15779. {
  15780. return Contains(this, x, y);
  15781. },
  15782. /**
  15783. * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse
  15784. * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point
  15785. * at 180 degrees around the circle.
  15786. *
  15787. * @method Phaser.Geom.Ellipse#getPoint
  15788. * @since 3.0.0
  15789. *
  15790. * @generic {Phaser.Geom.Point} O - [out,$return]
  15791. *
  15792. * @param {number} position - A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the ellipse.
  15793. * @param {(Phaser.Geom.Point|object)} [out] - An object to store the return values in. If not given a Point object will be created.
  15794. *
  15795. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point around the ellipse.
  15796. */
  15797. getPoint: function (position, point)
  15798. {
  15799. return GetPoint(this, position, point);
  15800. },
  15801. /**
  15802. * Returns an array of Point objects containing the coordinates of the points around the circumference of the Ellipse,
  15803. * based on the given quantity or stepRate values.
  15804. *
  15805. * @method Phaser.Geom.Ellipse#getPoints
  15806. * @since 3.0.0
  15807. *
  15808. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  15809. * @param {number} [stepRate] - Sets the quantity by getting the circumference of the ellipse and dividing it by the stepRate.
  15810. * @param {array} [output] - An array to insert the points in to. If not provided a new array will be created.
  15811. *
  15812. * @return {Phaser.Geom.Point[]} An array of Point objects pertaining to the points around the circumference of the ellipse.
  15813. */
  15814. getPoints: function (quantity, stepRate, output)
  15815. {
  15816. return GetPoints(this, quantity, stepRate, output);
  15817. },
  15818. /**
  15819. * Returns a uniformly distributed random point from anywhere within the given Ellipse.
  15820. *
  15821. * @method Phaser.Geom.Ellipse#getRandomPoint
  15822. * @since 3.0.0
  15823. *
  15824. * @generic {Phaser.Geom.Point} O - [point,$return]
  15825. *
  15826. * @param {(Phaser.Geom.Point|object)} [point] - A Point or point-like object to set the random `x` and `y` values in.
  15827. *
  15828. * @return {(Phaser.Geom.Point|object)} A Point object with the random values set in the `x` and `y` properties.
  15829. */
  15830. getRandomPoint: function (point)
  15831. {
  15832. return Random(this, point);
  15833. },
  15834. /**
  15835. * Sets the x, y, width and height of this ellipse.
  15836. *
  15837. * @method Phaser.Geom.Ellipse#setTo
  15838. * @since 3.0.0
  15839. *
  15840. * @param {number} x - The x position of the center of the ellipse.
  15841. * @param {number} y - The y position of the center of the ellipse.
  15842. * @param {number} width - The width of the ellipse.
  15843. * @param {number} height - The height of the ellipse.
  15844. *
  15845. * @return {Phaser.Geom.Ellipse} This Ellipse object.
  15846. */
  15847. setTo: function (x, y, width, height)
  15848. {
  15849. this.x = x;
  15850. this.y = y;
  15851. this.width = width;
  15852. this.height = height;
  15853. return this;
  15854. },
  15855. /**
  15856. * Sets this Ellipse to be empty with a width and height of zero.
  15857. * Does not change its position.
  15858. *
  15859. * @method Phaser.Geom.Ellipse#setEmpty
  15860. * @since 3.0.0
  15861. *
  15862. * @return {Phaser.Geom.Ellipse} This Ellipse object.
  15863. */
  15864. setEmpty: function ()
  15865. {
  15866. this.width = 0;
  15867. this.height = 0;
  15868. return this;
  15869. },
  15870. /**
  15871. * Sets the position of this Ellipse.
  15872. *
  15873. * @method Phaser.Geom.Ellipse#setPosition
  15874. * @since 3.0.0
  15875. *
  15876. * @param {number} x - The x position of the center of the ellipse.
  15877. * @param {number} y - The y position of the center of the ellipse.
  15878. *
  15879. * @return {Phaser.Geom.Ellipse} This Ellipse object.
  15880. */
  15881. setPosition: function (x, y)
  15882. {
  15883. if (y === undefined) { y = x; }
  15884. this.x = x;
  15885. this.y = y;
  15886. return this;
  15887. },
  15888. /**
  15889. * Sets the size of this Ellipse.
  15890. * Does not change its position.
  15891. *
  15892. * @method Phaser.Geom.Ellipse#setSize
  15893. * @since 3.0.0
  15894. *
  15895. * @param {number} width - The width of the ellipse.
  15896. * @param {number} [height=width] - The height of the ellipse.
  15897. *
  15898. * @return {Phaser.Geom.Ellipse} This Ellipse object.
  15899. */
  15900. setSize: function (width, height)
  15901. {
  15902. if (height === undefined) { height = width; }
  15903. this.width = width;
  15904. this.height = height;
  15905. return this;
  15906. },
  15907. /**
  15908. * Checks to see if the Ellipse is empty: has a width or height equal to zero.
  15909. *
  15910. * @method Phaser.Geom.Ellipse#isEmpty
  15911. * @since 3.0.0
  15912. *
  15913. * @return {boolean} True if the Ellipse is empty, otherwise false.
  15914. */
  15915. isEmpty: function ()
  15916. {
  15917. return (this.width <= 0 || this.height <= 0);
  15918. },
  15919. /**
  15920. * Returns the minor radius of the ellipse. Also known as the Semi Minor Axis.
  15921. *
  15922. * @method Phaser.Geom.Ellipse#getMinorRadius
  15923. * @since 3.0.0
  15924. *
  15925. * @return {number} The minor radius.
  15926. */
  15927. getMinorRadius: function ()
  15928. {
  15929. return Math.min(this.width, this.height) / 2;
  15930. },
  15931. /**
  15932. * Returns the major radius of the ellipse. Also known as the Semi Major Axis.
  15933. *
  15934. * @method Phaser.Geom.Ellipse#getMajorRadius
  15935. * @since 3.0.0
  15936. *
  15937. * @return {number} The major radius.
  15938. */
  15939. getMajorRadius: function ()
  15940. {
  15941. return Math.max(this.width, this.height) / 2;
  15942. },
  15943. /**
  15944. * The left position of the Ellipse.
  15945. *
  15946. * @name Phaser.Geom.Ellipse#left
  15947. * @type {number}
  15948. * @since 3.0.0
  15949. */
  15950. left: {
  15951. get: function ()
  15952. {
  15953. return this.x - (this.width / 2);
  15954. },
  15955. set: function (value)
  15956. {
  15957. this.x = value + (this.width / 2);
  15958. }
  15959. },
  15960. /**
  15961. * The right position of the Ellipse.
  15962. *
  15963. * @name Phaser.Geom.Ellipse#right
  15964. * @type {number}
  15965. * @since 3.0.0
  15966. */
  15967. right: {
  15968. get: function ()
  15969. {
  15970. return this.x + (this.width / 2);
  15971. },
  15972. set: function (value)
  15973. {
  15974. this.x = value - (this.width / 2);
  15975. }
  15976. },
  15977. /**
  15978. * The top position of the Ellipse.
  15979. *
  15980. * @name Phaser.Geom.Ellipse#top
  15981. * @type {number}
  15982. * @since 3.0.0
  15983. */
  15984. top: {
  15985. get: function ()
  15986. {
  15987. return this.y - (this.height / 2);
  15988. },
  15989. set: function (value)
  15990. {
  15991. this.y = value + (this.height / 2);
  15992. }
  15993. },
  15994. /**
  15995. * The bottom position of the Ellipse.
  15996. *
  15997. * @name Phaser.Geom.Ellipse#bottom
  15998. * @type {number}
  15999. * @since 3.0.0
  16000. */
  16001. bottom: {
  16002. get: function ()
  16003. {
  16004. return this.y + (this.height / 2);
  16005. },
  16006. set: function (value)
  16007. {
  16008. this.y = value - (this.height / 2);
  16009. }
  16010. }
  16011. });
  16012. module.exports = Ellipse;
  16013. /***/ }),
  16014. /* 97 */
  16015. /***/ (function(module, exports) {
  16016. /**
  16017. * @author Richard Davey <rich@photonstorm.com>
  16018. * @copyright 2019 Photon Storm Ltd.
  16019. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16020. */
  16021. /**
  16022. * Removes a single item from an array and returns it without creating gc, like the native splice does.
  16023. * Based on code by Mike Reinstein.
  16024. *
  16025. * @function Phaser.Utils.Array.SpliceOne
  16026. * @since 3.0.0
  16027. *
  16028. * @param {array} array - The array to splice from.
  16029. * @param {integer} index - The index of the item which should be spliced.
  16030. *
  16031. * @return {*} The item which was spliced (removed).
  16032. */
  16033. var SpliceOne = function (array, index)
  16034. {
  16035. if (index >= array.length)
  16036. {
  16037. return;
  16038. }
  16039. var len = array.length - 1;
  16040. var item = array[index];
  16041. for (var i = index; i < len; i++)
  16042. {
  16043. array[i] = array[i + 1];
  16044. }
  16045. array.length = len;
  16046. return item;
  16047. };
  16048. module.exports = SpliceOne;
  16049. /***/ }),
  16050. /* 98 */
  16051. /***/ (function(module, exports) {
  16052. /**
  16053. * @author Richard Davey <rich@photonstorm.com>
  16054. * @copyright 2019 Photon Storm Ltd.
  16055. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16056. */
  16057. /**
  16058. * Snap a value to nearest grid slice, using floor.
  16059. *
  16060. * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `10`.
  16061. * As will `14` snap to `10`... but `16` will snap to `15`.
  16062. *
  16063. * @function Phaser.Math.Snap.Floor
  16064. * @since 3.0.0
  16065. *
  16066. * @param {number} value - The value to snap.
  16067. * @param {number} gap - The interval gap of the grid.
  16068. * @param {number} [start=0] - Optional starting offset for gap.
  16069. * @param {boolean} [divide=false] - If `true` it will divide the snapped value by the gap before returning.
  16070. *
  16071. * @return {number} The snapped value.
  16072. */
  16073. var SnapFloor = function (value, gap, start, divide)
  16074. {
  16075. if (start === undefined) { start = 0; }
  16076. if (gap === 0)
  16077. {
  16078. return value;
  16079. }
  16080. value -= start;
  16081. value = gap * Math.floor(value / gap);
  16082. return (divide) ? (start + value) / gap : start + value;
  16083. };
  16084. module.exports = SnapFloor;
  16085. /***/ }),
  16086. /* 99 */
  16087. /***/ (function(module, exports, __webpack_require__) {
  16088. /* WEBPACK VAR INJECTION */(function(process) {/**
  16089. * @author Richard Davey <rich@photonstorm.com>
  16090. * @copyright 2019 Photon Storm Ltd.
  16091. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16092. */
  16093. /**
  16094. * Determines the operating system of the device running this Phaser Game instance.
  16095. * These values are read-only and populated during the boot sequence of the game.
  16096. * They are then referenced by internal game systems and are available for you to access
  16097. * via `this.sys.game.device.os` from within any Scene.
  16098. *
  16099. * @typedef {object} Phaser.Device.OS
  16100. * @since 3.0.0
  16101. *
  16102. * @property {boolean} android - Is running on android?
  16103. * @property {boolean} chromeOS - Is running on chromeOS?
  16104. * @property {boolean} cocoonJS - Is the game running under CocoonJS?
  16105. * @property {boolean} cocoonJSApp - Is this game running with CocoonJS.App?
  16106. * @property {boolean} cordova - Is the game running under Apache Cordova?
  16107. * @property {boolean} crosswalk - Is the game running under the Intel Crosswalk XDK?
  16108. * @property {boolean} desktop - Is running on a desktop?
  16109. * @property {boolean} ejecta - Is the game running under Ejecta?
  16110. * @property {boolean} electron - Is the game running under GitHub Electron?
  16111. * @property {boolean} iOS - Is running on iOS?
  16112. * @property {boolean} iPad - Is running on iPad?
  16113. * @property {boolean} iPhone - Is running on iPhone?
  16114. * @property {boolean} kindle - Is running on an Amazon Kindle?
  16115. * @property {boolean} linux - Is running on linux?
  16116. * @property {boolean} macOS - Is running on macOS?
  16117. * @property {boolean} node - Is the game running under Node.js?
  16118. * @property {boolean} nodeWebkit - Is the game running under Node-Webkit?
  16119. * @property {boolean} webApp - Set to true if running as a WebApp, i.e. within a WebView
  16120. * @property {boolean} windows - Is running on windows?
  16121. * @property {boolean} windowsPhone - Is running on a Windows Phone?
  16122. * @property {number} iOSVersion - If running in iOS this will contain the major version number.
  16123. * @property {number} pixelRatio - PixelRatio of the host device?
  16124. */
  16125. var OS = {
  16126. android: false,
  16127. chromeOS: false,
  16128. cocoonJS: false,
  16129. cocoonJSApp: false,
  16130. cordova: false,
  16131. crosswalk: false,
  16132. desktop: false,
  16133. ejecta: false,
  16134. electron: false,
  16135. iOS: false,
  16136. iOSVersion: 0,
  16137. iPad: false,
  16138. iPhone: false,
  16139. kindle: false,
  16140. linux: false,
  16141. macOS: false,
  16142. node: false,
  16143. nodeWebkit: false,
  16144. pixelRatio: 1,
  16145. webApp: false,
  16146. windows: false,
  16147. windowsPhone: false
  16148. };
  16149. function init ()
  16150. {
  16151. var ua = navigator.userAgent;
  16152. if (/Windows/.test(ua))
  16153. {
  16154. OS.windows = true;
  16155. }
  16156. else if (/Mac OS/.test(ua) && !(/like Mac OS/.test(ua)))
  16157. {
  16158. OS.macOS = true;
  16159. }
  16160. else if (/Android/.test(ua))
  16161. {
  16162. OS.android = true;
  16163. }
  16164. else if (/Linux/.test(ua))
  16165. {
  16166. OS.linux = true;
  16167. }
  16168. else if (/iP[ao]d|iPhone/i.test(ua))
  16169. {
  16170. OS.iOS = true;
  16171. (navigator.appVersion).match(/OS (\d+)/);
  16172. OS.iOSVersion = parseInt(RegExp.$1, 10);
  16173. OS.iPhone = ua.toLowerCase().indexOf('iphone') !== -1;
  16174. OS.iPad = ua.toLowerCase().indexOf('ipad') !== -1;
  16175. }
  16176. else if (/Kindle/.test(ua) || (/\bKF[A-Z][A-Z]+/).test(ua) || (/Silk.*Mobile Safari/).test(ua))
  16177. {
  16178. OS.kindle = true;
  16179. // This will NOT detect early generations of Kindle Fire, I think there is no reliable way...
  16180. // E.g. "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true"
  16181. }
  16182. else if (/CrOS/.test(ua))
  16183. {
  16184. OS.chromeOS = true;
  16185. }
  16186. if (/Windows Phone/i.test(ua) || (/IEMobile/i).test(ua))
  16187. {
  16188. OS.android = false;
  16189. OS.iOS = false;
  16190. OS.macOS = false;
  16191. OS.windows = true;
  16192. OS.windowsPhone = true;
  16193. }
  16194. var silk = (/Silk/).test(ua);
  16195. if (OS.windows || OS.macOS || (OS.linux && !silk) || OS.chromeOS)
  16196. {
  16197. OS.desktop = true;
  16198. }
  16199. // Windows Phone / Table reset
  16200. if (OS.windowsPhone || ((/Windows NT/i.test(ua)) && (/Touch/i.test(ua))))
  16201. {
  16202. OS.desktop = false;
  16203. }
  16204. // WebApp mode in iOS
  16205. if (navigator.standalone)
  16206. {
  16207. OS.webApp = true;
  16208. }
  16209. if (window.cordova !== undefined)
  16210. {
  16211. OS.cordova = true;
  16212. }
  16213. if (typeof process !== 'undefined' && process.versions && process.versions.node)
  16214. {
  16215. OS.node = true;
  16216. }
  16217. if (OS.node && typeof process.versions === 'object')
  16218. {
  16219. OS.nodeWebkit = !!process.versions['node-webkit'];
  16220. OS.electron = !!process.versions.electron;
  16221. }
  16222. if (navigator.isCocoonJS)
  16223. {
  16224. OS.cocoonJS = true;
  16225. try
  16226. {
  16227. OS.cocoonJSApp = (typeof CocoonJS !== 'undefined');
  16228. }
  16229. catch (error)
  16230. {
  16231. OS.cocoonJSApp = false;
  16232. }
  16233. }
  16234. if (window.ejecta !== undefined)
  16235. {
  16236. OS.ejecta = true;
  16237. }
  16238. if ((/Crosswalk/).test(ua))
  16239. {
  16240. OS.crosswalk = true;
  16241. }
  16242. OS.pixelRatio = window['devicePixelRatio'] || 1;
  16243. return OS;
  16244. }
  16245. module.exports = init();
  16246. /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1096)))
  16247. /***/ }),
  16248. /* 100 */
  16249. /***/ (function(module, exports, __webpack_require__) {
  16250. /**
  16251. * @author Richard Davey <rich@photonstorm.com>
  16252. * @copyright 2019 Photon Storm Ltd.
  16253. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16254. */
  16255. var Clamp = __webpack_require__(23);
  16256. /**
  16257. * Return a value based on the range between `min` and `max` and the percentage given.
  16258. *
  16259. * @function Phaser.Math.FromPercent
  16260. * @since 3.0.0
  16261. *
  16262. * @param {number} percent - A value between 0 and 1 representing the percentage.
  16263. * @param {number} min - The minimum value.
  16264. * @param {number} [max] - The maximum value.
  16265. *
  16266. * @return {number} The value that is `percent` percent between `min` and `max`.
  16267. */
  16268. var FromPercent = function (percent, min, max)
  16269. {
  16270. percent = Clamp(percent, 0, 1);
  16271. return (max - min) * percent;
  16272. };
  16273. module.exports = FromPercent;
  16274. /***/ }),
  16275. /* 101 */
  16276. /***/ (function(module, exports) {
  16277. /**
  16278. * @author Richard Davey <rich@photonstorm.com>
  16279. * @copyright 2019 Photon Storm Ltd.
  16280. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16281. */
  16282. /**
  16283. * Phaser Scale Modes.
  16284. *
  16285. * @name Phaser.ScaleModes
  16286. * @enum {integer}
  16287. * @memberof Phaser
  16288. * @readonly
  16289. * @since 3.0.0
  16290. */
  16291. module.exports = {
  16292. /**
  16293. * Default Scale Mode (Linear).
  16294. *
  16295. * @name Phaser.ScaleModes.DEFAULT
  16296. */
  16297. DEFAULT: 0,
  16298. /**
  16299. * Linear Scale Mode.
  16300. *
  16301. * @name Phaser.ScaleModes.LINEAR
  16302. */
  16303. LINEAR: 0,
  16304. /**
  16305. * Nearest Scale Mode.
  16306. *
  16307. * @name Phaser.ScaleModes.NEAREST
  16308. */
  16309. NEAREST: 1
  16310. };
  16311. /***/ }),
  16312. /* 102 */
  16313. /***/ (function(module, exports, __webpack_require__) {
  16314. /**
  16315. * @author Richard Davey <rich@photonstorm.com>
  16316. * @copyright 2019 Photon Storm Ltd.
  16317. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16318. */
  16319. var Class = __webpack_require__(0);
  16320. /**
  16321. * @callback EachSetCallback<E>
  16322. *
  16323. * @param {E} entry - The Set entry.
  16324. * @param {number} index - The index of the entry within the Set.
  16325. *
  16326. * @return {?boolean} The callback result.
  16327. */
  16328. /**
  16329. * @classdesc
  16330. * A Set is a collection of unique elements.
  16331. *
  16332. * @class Set
  16333. * @memberof Phaser.Structs
  16334. * @constructor
  16335. * @since 3.0.0
  16336. *
  16337. * @generic T
  16338. * @genericUse {T[]} - [elements]
  16339. *
  16340. * @param {Array.<*>} [elements] - An optional array of elements to insert into this Set.
  16341. */
  16342. var Set = new Class({
  16343. initialize:
  16344. function Set (elements)
  16345. {
  16346. /**
  16347. * The entries of this Set. Stored internally as an array.
  16348. *
  16349. * @genericUse {T[]} - [$type]
  16350. *
  16351. * @name Phaser.Structs.Set#entries
  16352. * @type {Array.<*>}
  16353. * @default []
  16354. * @since 3.0.0
  16355. */
  16356. this.entries = [];
  16357. if (Array.isArray(elements))
  16358. {
  16359. for (var i = 0; i < elements.length; i++)
  16360. {
  16361. this.set(elements[i]);
  16362. }
  16363. }
  16364. },
  16365. /**
  16366. * Inserts the provided value into this Set. If the value is already contained in this Set this method will have no effect.
  16367. *
  16368. * @method Phaser.Structs.Set#set
  16369. * @since 3.0.0
  16370. *
  16371. * @genericUse {T} - [value]
  16372. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  16373. *
  16374. * @param {*} value - The value to insert into this Set.
  16375. *
  16376. * @return {Phaser.Structs.Set} This Set object.
  16377. */
  16378. set: function (value)
  16379. {
  16380. if (this.entries.indexOf(value) === -1)
  16381. {
  16382. this.entries.push(value);
  16383. }
  16384. return this;
  16385. },
  16386. /**
  16387. * Get an element of this Set which has a property of the specified name, if that property is equal to the specified value.
  16388. * If no elements of this Set satisfy the condition then this method will return `null`.
  16389. *
  16390. * @method Phaser.Structs.Set#get
  16391. * @since 3.0.0
  16392. *
  16393. * @genericUse {T} - [value,$return]
  16394. *
  16395. * @param {string} property - The property name to check on the elements of this Set.
  16396. * @param {*} value - The value to check for.
  16397. *
  16398. * @return {*} The first element of this Set that meets the required condition, or `null` if this Set contains no elements that meet the condition.
  16399. */
  16400. get: function (property, value)
  16401. {
  16402. for (var i = 0; i < this.entries.length; i++)
  16403. {
  16404. var entry = this.entries[i];
  16405. if (entry[property] === value)
  16406. {
  16407. return entry;
  16408. }
  16409. }
  16410. },
  16411. /**
  16412. * Returns an array containing all the values in this Set.
  16413. *
  16414. * @method Phaser.Structs.Set#getArray
  16415. * @since 3.0.0
  16416. *
  16417. * @genericUse {T[]} - [$return]
  16418. *
  16419. * @return {Array.<*>} An array containing all the values in this Set.
  16420. */
  16421. getArray: function ()
  16422. {
  16423. return this.entries.slice(0);
  16424. },
  16425. /**
  16426. * Removes the given value from this Set if this Set contains that value.
  16427. *
  16428. * @method Phaser.Structs.Set#delete
  16429. * @since 3.0.0
  16430. *
  16431. * @genericUse {T} - [value]
  16432. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  16433. *
  16434. * @param {*} value - The value to remove from the Set.
  16435. *
  16436. * @return {Phaser.Structs.Set} This Set object.
  16437. */
  16438. delete: function (value)
  16439. {
  16440. var index = this.entries.indexOf(value);
  16441. if (index > -1)
  16442. {
  16443. this.entries.splice(index, 1);
  16444. }
  16445. return this;
  16446. },
  16447. /**
  16448. * Dumps the contents of this Set to the console via `console.group`.
  16449. *
  16450. * @method Phaser.Structs.Set#dump
  16451. * @since 3.0.0
  16452. */
  16453. dump: function ()
  16454. {
  16455. // eslint-disable-next-line no-console
  16456. console.group('Set');
  16457. for (var i = 0; i < this.entries.length; i++)
  16458. {
  16459. var entry = this.entries[i];
  16460. console.log(entry);
  16461. }
  16462. // eslint-disable-next-line no-console
  16463. console.groupEnd();
  16464. },
  16465. /**
  16466. * Passes each value in this Set to the given callback.
  16467. * Use this function when you know this Set will be modified during the iteration, otherwise use `iterate`.
  16468. *
  16469. * @method Phaser.Structs.Set#each
  16470. * @since 3.0.0
  16471. *
  16472. * @genericUse {EachSetCallback.<T>} - [callback]
  16473. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  16474. *
  16475. * @param {EachSetCallback} callback - The callback to be invoked and passed each value this Set contains.
  16476. * @param {*} [callbackScope] - The scope of the callback.
  16477. *
  16478. * @return {Phaser.Structs.Set} This Set object.
  16479. */
  16480. each: function (callback, callbackScope)
  16481. {
  16482. var i;
  16483. var temp = this.entries.slice();
  16484. var len = temp.length;
  16485. if (callbackScope)
  16486. {
  16487. for (i = 0; i < len; i++)
  16488. {
  16489. if (callback.call(callbackScope, temp[i], i) === false)
  16490. {
  16491. break;
  16492. }
  16493. }
  16494. }
  16495. else
  16496. {
  16497. for (i = 0; i < len; i++)
  16498. {
  16499. if (callback(temp[i], i) === false)
  16500. {
  16501. break;
  16502. }
  16503. }
  16504. }
  16505. return this;
  16506. },
  16507. /**
  16508. * Passes each value in this Set to the given callback.
  16509. * For when you absolutely know this Set won't be modified during the iteration.
  16510. *
  16511. * @method Phaser.Structs.Set#iterate
  16512. * @since 3.0.0
  16513. *
  16514. * @genericUse {EachSetCallback.<T>} - [callback]
  16515. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  16516. *
  16517. * @param {EachSetCallback} callback - The callback to be invoked and passed each value this Set contains.
  16518. * @param {*} [callbackScope] - The scope of the callback.
  16519. *
  16520. * @return {Phaser.Structs.Set} This Set object.
  16521. */
  16522. iterate: function (callback, callbackScope)
  16523. {
  16524. var i;
  16525. var len = this.entries.length;
  16526. if (callbackScope)
  16527. {
  16528. for (i = 0; i < len; i++)
  16529. {
  16530. if (callback.call(callbackScope, this.entries[i], i) === false)
  16531. {
  16532. break;
  16533. }
  16534. }
  16535. }
  16536. else
  16537. {
  16538. for (i = 0; i < len; i++)
  16539. {
  16540. if (callback(this.entries[i], i) === false)
  16541. {
  16542. break;
  16543. }
  16544. }
  16545. }
  16546. return this;
  16547. },
  16548. /**
  16549. * Goes through each entry in this Set and invokes the given function on them, passing in the arguments.
  16550. *
  16551. * @method Phaser.Structs.Set#iterateLocal
  16552. * @since 3.0.0
  16553. *
  16554. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  16555. *
  16556. * @param {string} callbackKey - The key of the function to be invoked on each Set entry.
  16557. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  16558. *
  16559. * @return {Phaser.Structs.Set} This Set object.
  16560. */
  16561. iterateLocal: function (callbackKey)
  16562. {
  16563. var i;
  16564. var args = [];
  16565. for (i = 1; i < arguments.length; i++)
  16566. {
  16567. args.push(arguments[i]);
  16568. }
  16569. var len = this.entries.length;
  16570. for (i = 0; i < len; i++)
  16571. {
  16572. var entry = this.entries[i];
  16573. entry[callbackKey].apply(entry, args);
  16574. }
  16575. return this;
  16576. },
  16577. /**
  16578. * Clears this Set so that it no longer contains any values.
  16579. *
  16580. * @method Phaser.Structs.Set#clear
  16581. * @since 3.0.0
  16582. *
  16583. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  16584. *
  16585. * @return {Phaser.Structs.Set} This Set object.
  16586. */
  16587. clear: function ()
  16588. {
  16589. this.entries.length = 0;
  16590. return this;
  16591. },
  16592. /**
  16593. * Returns `true` if this Set contains the given value, otherwise returns `false`.
  16594. *
  16595. * @method Phaser.Structs.Set#contains
  16596. * @since 3.0.0
  16597. *
  16598. * @genericUse {T} - [value]
  16599. *
  16600. * @param {*} value - The value to check for in this Set.
  16601. *
  16602. * @return {boolean} `true` if the given value was found in this Set, otherwise `false`.
  16603. */
  16604. contains: function (value)
  16605. {
  16606. return (this.entries.indexOf(value) > -1);
  16607. },
  16608. /**
  16609. * Returns a new Set containing all values that are either in this Set or in the Set provided as an argument.
  16610. *
  16611. * @method Phaser.Structs.Set#union
  16612. * @since 3.0.0
  16613. *
  16614. * @genericUse {Phaser.Structs.Set.<T>} - [set,$return]
  16615. *
  16616. * @param {Phaser.Structs.Set} set - The Set to perform the union with.
  16617. *
  16618. * @return {Phaser.Structs.Set} A new Set containing all the values in this Set and the Set provided as an argument.
  16619. */
  16620. union: function (set)
  16621. {
  16622. var newSet = new Set();
  16623. set.entries.forEach(function (value)
  16624. {
  16625. newSet.set(value);
  16626. });
  16627. this.entries.forEach(function (value)
  16628. {
  16629. newSet.set(value);
  16630. });
  16631. return newSet;
  16632. },
  16633. /**
  16634. * Returns a new Set that contains only the values which are in this Set and that are also in the given Set.
  16635. *
  16636. * @method Phaser.Structs.Set#intersect
  16637. * @since 3.0.0
  16638. *
  16639. * @genericUse {Phaser.Structs.Set.<T>} - [set,$return]
  16640. *
  16641. * @param {Phaser.Structs.Set} set - The Set to intersect this set with.
  16642. *
  16643. * @return {Phaser.Structs.Set} The result of the intersection, as a new Set.
  16644. */
  16645. intersect: function (set)
  16646. {
  16647. var newSet = new Set();
  16648. this.entries.forEach(function (value)
  16649. {
  16650. if (set.contains(value))
  16651. {
  16652. newSet.set(value);
  16653. }
  16654. });
  16655. return newSet;
  16656. },
  16657. /**
  16658. * Returns a new Set containing all the values in this Set which are *not* also in the given Set.
  16659. *
  16660. * @method Phaser.Structs.Set#difference
  16661. * @since 3.0.0
  16662. *
  16663. * @genericUse {Phaser.Structs.Set.<T>} - [set,$return]
  16664. *
  16665. * @param {Phaser.Structs.Set} set - The Set to perform the difference with.
  16666. *
  16667. * @return {Phaser.Structs.Set} A new Set containing all the values in this Set that are not also in the Set provided as an argument to this method.
  16668. */
  16669. difference: function (set)
  16670. {
  16671. var newSet = new Set();
  16672. this.entries.forEach(function (value)
  16673. {
  16674. if (!set.contains(value))
  16675. {
  16676. newSet.set(value);
  16677. }
  16678. });
  16679. return newSet;
  16680. },
  16681. /**
  16682. * The size of this Set. This is the number of entries within it.
  16683. * Changing the size will truncate the Set if the given value is smaller than the current size.
  16684. * Increasing the size larger than the current size has no effect.
  16685. *
  16686. * @name Phaser.Structs.Set#size
  16687. * @type {integer}
  16688. * @since 3.0.0
  16689. */
  16690. size: {
  16691. get: function ()
  16692. {
  16693. return this.entries.length;
  16694. },
  16695. set: function (value)
  16696. {
  16697. if (value < this.entries.length)
  16698. {
  16699. return this.entries.length = value;
  16700. }
  16701. else
  16702. {
  16703. return this.entries.length;
  16704. }
  16705. }
  16706. }
  16707. });
  16708. module.exports = Set;
  16709. /***/ }),
  16710. /* 103 */
  16711. /***/ (function(module, exports, __webpack_require__) {
  16712. /**
  16713. * @author Richard Davey <rich@photonstorm.com>
  16714. * @copyright 2019 Photon Storm Ltd.
  16715. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16716. */
  16717. var Clone = __webpack_require__(70);
  16718. /**
  16719. * Creates a new Object using all values from obj1 and obj2.
  16720. * If a value exists in both obj1 and obj2, the value in obj1 is used.
  16721. *
  16722. * @function Phaser.Utils.Objects.Merge
  16723. * @since 3.0.0
  16724. *
  16725. * @param {object} obj1 - The first object.
  16726. * @param {object} obj2 - The second object.
  16727. *
  16728. * @return {object} A new object containing the union of obj1's and obj2's properties.
  16729. */
  16730. var Merge = function (obj1, obj2)
  16731. {
  16732. var clone = Clone(obj1);
  16733. for (var key in obj2)
  16734. {
  16735. if (!clone.hasOwnProperty(key))
  16736. {
  16737. clone[key] = obj2[key];
  16738. }
  16739. }
  16740. return clone;
  16741. };
  16742. module.exports = Merge;
  16743. /***/ }),
  16744. /* 104 */
  16745. /***/ (function(module, exports, __webpack_require__) {
  16746. /**
  16747. * @author Richard Davey <rich@photonstorm.com>
  16748. * @copyright 2019 Photon Storm Ltd.
  16749. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16750. */
  16751. var Defaults = __webpack_require__(141);
  16752. var GetAdvancedValue = __webpack_require__(12);
  16753. var GetBoolean = __webpack_require__(90);
  16754. var GetEaseFunction = __webpack_require__(92);
  16755. var GetNewValue = __webpack_require__(105);
  16756. var GetProps = __webpack_require__(221);
  16757. var GetTargets = __webpack_require__(143);
  16758. var GetValue = __webpack_require__(4);
  16759. var GetValueOp = __webpack_require__(142);
  16760. var Tween = __webpack_require__(140);
  16761. var TweenData = __webpack_require__(139);
  16762. /**
  16763. * [description]
  16764. *
  16765. * @function Phaser.Tweens.Builders.TweenBuilder
  16766. * @since 3.0.0
  16767. *
  16768. * @param {(Phaser.Tweens.TweenManager|Phaser.Tweens.Timeline)} parent - [description]
  16769. * @param {object} config - [description]
  16770. * @param {Phaser.Tweens.TweenConfigDefaults} defaults - Tween configuration defaults.
  16771. `
  16772. * @property {(object|object[])} targets - The object, or an array of objects, to run the tween on.
  16773. * @property {number} [delay=0] - The number of milliseconds to delay before the tween will start.
  16774. * @property {number} [duration=1000] - The duration of the tween in milliseconds.
  16775. * @property {string} [ease='Power0'] - The easing equation to use for the tween.
  16776. * @property {array} [easeParams] - Optional easing parameters.
  16777. * @property {number} [hold=0] - The number of milliseconds to hold the tween for before yoyo'ing.
  16778. * @property {number} [repeat=0] - The number of times to repeat the tween.
  16779. * @property {number} [repeatDelay=0] - The number of milliseconds to pause before a tween will repeat.
  16780. * @property {boolean} [yoyo=false] - Should the tween complete, then reverse the values incrementally to get back to the starting tween values? The reverse tweening will also take `duration` milliseconds to complete.
  16781. * @property {boolean} [flipX=false] - Horizontally flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipX` property.
  16782. * @property {boolean} [flipY=false] - Vertically flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipY` property.
  16783. `
  16784. {
  16785. targets: null,
  16786. delay: 0,
  16787. duration: 1000,
  16788. ease: 'Power0',
  16789. easeParams: null,
  16790. hold: 0,
  16791. repeat: 0,
  16792. repeatDelay: 0,
  16793. yoyo: false,
  16794. flipX: false,
  16795. flipY: false
  16796. };
  16797. *
  16798. * @return {Phaser.Tweens.Tween} [description]
  16799. */
  16800. var TweenBuilder = function (parent, config, defaults)
  16801. {
  16802. if (defaults === undefined)
  16803. {
  16804. defaults = Defaults;
  16805. }
  16806. // Create arrays of the Targets and the Properties
  16807. var targets = (defaults.targets) ? defaults.targets : GetTargets(config);
  16808. // var props = (defaults.props) ? defaults.props : GetProps(config);
  16809. var props = GetProps(config);
  16810. // Default Tween values
  16811. var delay = GetNewValue(config, 'delay', defaults.delay);
  16812. var duration = GetNewValue(config, 'duration', defaults.duration);
  16813. var easeParams = GetValue(config, 'easeParams', defaults.easeParams);
  16814. var ease = GetEaseFunction(GetValue(config, 'ease', defaults.ease), easeParams);
  16815. var hold = GetNewValue(config, 'hold', defaults.hold);
  16816. var repeat = GetNewValue(config, 'repeat', defaults.repeat);
  16817. var repeatDelay = GetNewValue(config, 'repeatDelay', defaults.repeatDelay);
  16818. var yoyo = GetBoolean(config, 'yoyo', defaults.yoyo);
  16819. var flipX = GetBoolean(config, 'flipX', defaults.flipX);
  16820. var flipY = GetBoolean(config, 'flipY', defaults.flipY);
  16821. var data = [];
  16822. // Loop through every property defined in the Tween, i.e.: props { x, y, alpha }
  16823. for (var p = 0; p < props.length; p++)
  16824. {
  16825. var key = props[p].key;
  16826. var value = props[p].value;
  16827. // Create 1 TweenData per target, per property
  16828. for (var t = 0; t < targets.length; t++)
  16829. {
  16830. var ops = GetValueOp(key, value);
  16831. var tweenData = TweenData(
  16832. targets[t],
  16833. key,
  16834. ops.getEnd,
  16835. ops.getStart,
  16836. GetEaseFunction(GetValue(value, 'ease', ease), easeParams),
  16837. GetNewValue(value, 'delay', delay),
  16838. GetNewValue(value, 'duration', duration),
  16839. GetBoolean(value, 'yoyo', yoyo),
  16840. GetNewValue(value, 'hold', hold),
  16841. GetNewValue(value, 'repeat', repeat),
  16842. GetNewValue(value, 'repeatDelay', repeatDelay),
  16843. GetBoolean(value, 'flipX', flipX),
  16844. GetBoolean(value, 'flipY', flipY)
  16845. );
  16846. data.push(tweenData);
  16847. }
  16848. }
  16849. var tween = new Tween(parent, data, targets);
  16850. tween.offset = GetAdvancedValue(config, 'offset', null);
  16851. tween.completeDelay = GetAdvancedValue(config, 'completeDelay', 0);
  16852. tween.loop = Math.round(GetAdvancedValue(config, 'loop', 0));
  16853. tween.loopDelay = Math.round(GetAdvancedValue(config, 'loopDelay', 0));
  16854. tween.paused = GetBoolean(config, 'paused', false);
  16855. tween.useFrames = GetBoolean(config, 'useFrames', false);
  16856. // Set the Callbacks
  16857. var scope = GetValue(config, 'callbackScope', tween);
  16858. // Callback parameters: 0 = a reference to the Tween itself, 1 = the target/s of the Tween, ... your own params
  16859. var tweenArray = [ tween, null ];
  16860. var callbacks = Tween.TYPES;
  16861. for (var i = 0; i < callbacks.length; i++)
  16862. {
  16863. var type = callbacks[i];
  16864. var callback = GetValue(config, type, false);
  16865. if (callback)
  16866. {
  16867. var callbackScope = GetValue(config, type + 'Scope', scope);
  16868. var callbackParams = GetValue(config, type + 'Params', []);
  16869. // The null is reset to be the Tween target
  16870. tween.setCallback(type, callback, tweenArray.concat(callbackParams), callbackScope);
  16871. }
  16872. }
  16873. return tween;
  16874. };
  16875. module.exports = TweenBuilder;
  16876. /***/ }),
  16877. /* 105 */
  16878. /***/ (function(module, exports) {
  16879. /**
  16880. * @author Richard Davey <rich@photonstorm.com>
  16881. * @copyright 2019 Photon Storm Ltd.
  16882. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16883. */
  16884. /**
  16885. * [description]
  16886. *
  16887. * @function Phaser.Tweens.Builders.GetNewValue
  16888. * @since 3.0.0
  16889. *
  16890. * @param {object} source - [description]
  16891. * @param {string} key - [description]
  16892. * @param {*} defaultValue - [description]
  16893. *
  16894. * @return {function} [description]
  16895. */
  16896. var GetNewValue = function (source, key, defaultValue)
  16897. {
  16898. var valueCallback;
  16899. if (source.hasOwnProperty(key))
  16900. {
  16901. var t = typeof(source[key]);
  16902. if (t === 'function')
  16903. {
  16904. valueCallback = function (index, totalTargets, target)
  16905. {
  16906. return source[key](index, totalTargets, target);
  16907. };
  16908. }
  16909. else
  16910. {
  16911. valueCallback = function ()
  16912. {
  16913. return source[key];
  16914. };
  16915. }
  16916. }
  16917. else if (typeof defaultValue === 'function')
  16918. {
  16919. valueCallback = defaultValue;
  16920. }
  16921. else
  16922. {
  16923. valueCallback = function ()
  16924. {
  16925. return defaultValue;
  16926. };
  16927. }
  16928. return valueCallback;
  16929. };
  16930. module.exports = GetNewValue;
  16931. /***/ }),
  16932. /* 106 */
  16933. /***/ (function(module, exports, __webpack_require__) {
  16934. /**
  16935. * @author Richard Davey <rich@photonstorm.com>
  16936. * @copyright 2019 Photon Storm Ltd.
  16937. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16938. */
  16939. var Class = __webpack_require__(0);
  16940. /**
  16941. * @classdesc
  16942. * A Tileset is a combination of an image containing the tiles and a container for data about
  16943. * each tile.
  16944. *
  16945. * @class Tileset
  16946. * @memberof Phaser.Tilemaps
  16947. * @constructor
  16948. * @since 3.0.0
  16949. *
  16950. * @param {string} name - The name of the tileset in the map data.
  16951. * @param {integer} firstgid - The first tile index this tileset contains.
  16952. * @param {integer} [tileWidth=32] - Width of each tile (in pixels).
  16953. * @param {integer} [tileHeight=32] - Height of each tile (in pixels).
  16954. * @param {integer} [tileMargin=0] - The margin around all tiles in the sheet (in pixels).
  16955. * @param {integer} [tileSpacing=0] - The spacing between each tile in the sheet (in pixels).
  16956. * @param {object} [tileProperties={}] - Custom properties defined per tile in the Tileset.
  16957. * These typically are custom properties created in Tiled when editing a tileset.
  16958. * @param {object} [tileData={}] - Data stored per tile. These typically are created in Tiled
  16959. * when editing a tileset, e.g. from Tiled's tile collision editor or terrain editor.
  16960. */
  16961. var Tileset = new Class({
  16962. initialize:
  16963. function Tileset (name, firstgid, tileWidth, tileHeight, tileMargin, tileSpacing, tileProperties, tileData)
  16964. {
  16965. if (tileWidth === undefined || tileWidth <= 0) { tileWidth = 32; }
  16966. if (tileHeight === undefined || tileHeight <= 0) { tileHeight = 32; }
  16967. if (tileMargin === undefined) { tileMargin = 0; }
  16968. if (tileSpacing === undefined) { tileSpacing = 0; }
  16969. if (tileProperties === undefined) { tileProperties = {}; }
  16970. if (tileData === undefined) { tileData = {}; }
  16971. /**
  16972. * The name of the Tileset.
  16973. *
  16974. * @name Phaser.Tilemaps.Tileset#name
  16975. * @type {string}
  16976. * @since 3.0.0
  16977. */
  16978. this.name = name;
  16979. /**
  16980. * The starting index of the first tile index this Tileset contains.
  16981. *
  16982. * @name Phaser.Tilemaps.Tileset#firstgid
  16983. * @type {integer}
  16984. * @since 3.0.0
  16985. */
  16986. this.firstgid = firstgid;
  16987. /**
  16988. * The width of each tile (in pixels). Use setTileSize to change.
  16989. *
  16990. * @name Phaser.Tilemaps.Tileset#tileWidth
  16991. * @type {integer}
  16992. * @readonly
  16993. * @since 3.0.0
  16994. */
  16995. this.tileWidth = tileWidth;
  16996. /**
  16997. * The height of each tile (in pixels). Use setTileSize to change.
  16998. *
  16999. * @name Phaser.Tilemaps.Tileset#tileHeight
  17000. * @type {integer}
  17001. * @readonly
  17002. * @since 3.0.0
  17003. */
  17004. this.tileHeight = tileHeight;
  17005. /**
  17006. * The margin around the tiles in the sheet (in pixels). Use `setSpacing` to change.
  17007. *
  17008. * @name Phaser.Tilemaps.Tileset#tileMargin
  17009. * @type {integer}
  17010. * @readonly
  17011. * @since 3.0.0
  17012. */
  17013. this.tileMargin = tileMargin;
  17014. /**
  17015. * The spacing between each the tile in the sheet (in pixels). Use `setSpacing` to change.
  17016. *
  17017. * @name Phaser.Tilemaps.Tileset#tileSpacing
  17018. * @type {integer}
  17019. * @readonly
  17020. * @since 3.0.0
  17021. */
  17022. this.tileSpacing = tileSpacing;
  17023. /**
  17024. * Tileset-specific properties per tile that are typically defined in the Tiled editor in the
  17025. * Tileset editor.
  17026. *
  17027. * @name Phaser.Tilemaps.Tileset#tileProperties
  17028. * @type {object}
  17029. * @since 3.0.0
  17030. */
  17031. this.tileProperties = tileProperties;
  17032. /**
  17033. * Tileset-specific data per tile that are typically defined in the Tiled editor, e.g. within
  17034. * the Tileset collision editor. This is where collision objects and terrain are stored.
  17035. *
  17036. * @name Phaser.Tilemaps.Tileset#tileData
  17037. * @type {object}
  17038. * @since 3.0.0
  17039. */
  17040. this.tileData = tileData;
  17041. /**
  17042. * The cached image that contains the individual tiles. Use setImage to set.
  17043. *
  17044. * @name Phaser.Tilemaps.Tileset#image
  17045. * @type {?Phaser.Textures.Texture}
  17046. * @readonly
  17047. * @since 3.0.0
  17048. */
  17049. this.image = null;
  17050. /**
  17051. * The gl texture used by the WebGL renderer.
  17052. *
  17053. * @name Phaser.Tilemaps.Tileset#glTexture
  17054. * @type {?WebGLTexture}
  17055. * @readonly
  17056. * @since 3.11.0
  17057. */
  17058. this.glTexture = null;
  17059. /**
  17060. * The number of tile rows in the the tileset.
  17061. *
  17062. * @name Phaser.Tilemaps.Tileset#rows
  17063. * @type {integer}
  17064. * @readonly
  17065. * @since 3.0.0
  17066. */
  17067. this.rows = 0;
  17068. /**
  17069. * The number of tile columns in the tileset.
  17070. *
  17071. * @name Phaser.Tilemaps.Tileset#columns
  17072. * @type {integer}
  17073. * @readonly
  17074. * @since 3.0.0
  17075. */
  17076. this.columns = 0;
  17077. /**
  17078. * The total number of tiles in the tileset.
  17079. *
  17080. * @name Phaser.Tilemaps.Tileset#total
  17081. * @type {integer}
  17082. * @readonly
  17083. * @since 3.0.0
  17084. */
  17085. this.total = 0;
  17086. /**
  17087. * The look-up table to specific tile image texture coordinates (UV in pixels). Each element
  17088. * contains the coordinates for a tile in an object of the form {x, y}.
  17089. *
  17090. * @name Phaser.Tilemaps.Tileset#texCoordinates
  17091. * @type {object[]}
  17092. * @readonly
  17093. * @since 3.0.0
  17094. */
  17095. this.texCoordinates = [];
  17096. },
  17097. /**
  17098. * Get a tiles properties that are stored in the Tileset. Returns null if tile index is not
  17099. * contained in this Tileset. This is typically defined in Tiled under the Tileset editor.
  17100. *
  17101. * @method Phaser.Tilemaps.Tileset#getTileProperties
  17102. * @since 3.0.0
  17103. *
  17104. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  17105. *
  17106. * @return {?(object|undefined)}
  17107. */
  17108. getTileProperties: function (tileIndex)
  17109. {
  17110. if (!this.containsTileIndex(tileIndex)) { return null; }
  17111. return this.tileProperties[tileIndex - this.firstgid];
  17112. },
  17113. /**
  17114. * Get a tile's data that is stored in the Tileset. Returns null if tile index is not contained
  17115. * in this Tileset. This is typically defined in Tiled and will contain both Tileset collision
  17116. * info and terrain mapping.
  17117. *
  17118. * @method Phaser.Tilemaps.Tileset#getTileData
  17119. * @since 3.0.0
  17120. *
  17121. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  17122. *
  17123. * @return {?object|undefined}
  17124. */
  17125. getTileData: function (tileIndex)
  17126. {
  17127. if (!this.containsTileIndex(tileIndex)) { return null; }
  17128. return this.tileData[tileIndex - this.firstgid];
  17129. },
  17130. /**
  17131. * Get a tile's collision group that is stored in the Tileset. Returns null if tile index is not
  17132. * contained in this Tileset. This is typically defined within Tiled's tileset collision editor.
  17133. *
  17134. * @method Phaser.Tilemaps.Tileset#getTileCollisionGroup
  17135. * @since 3.0.0
  17136. *
  17137. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  17138. *
  17139. * @return {?object}
  17140. */
  17141. getTileCollisionGroup: function (tileIndex)
  17142. {
  17143. var data = this.getTileData(tileIndex);
  17144. return (data && data.objectgroup) ? data.objectgroup : null;
  17145. },
  17146. /**
  17147. * Returns true if and only if this Tileset contains the given tile index.
  17148. *
  17149. * @method Phaser.Tilemaps.Tileset#containsTileIndex
  17150. * @since 3.0.0
  17151. *
  17152. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  17153. *
  17154. * @return {boolean}
  17155. */
  17156. containsTileIndex: function (tileIndex)
  17157. {
  17158. return (
  17159. tileIndex >= this.firstgid &&
  17160. tileIndex < (this.firstgid + this.total)
  17161. );
  17162. },
  17163. /**
  17164. * Returns the texture coordinates (UV in pixels) in the Tileset image for the given tile index.
  17165. * Returns null if tile index is not contained in this Tileset.
  17166. *
  17167. * @method Phaser.Tilemaps.Tileset#getTileTextureCoordinates
  17168. * @since 3.0.0
  17169. *
  17170. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  17171. *
  17172. * @return {?object} Object in the form { x, y } representing the top-left UV coordinate
  17173. * within the Tileset image.
  17174. */
  17175. getTileTextureCoordinates: function (tileIndex)
  17176. {
  17177. if (!this.containsTileIndex(tileIndex)) { return null; }
  17178. return this.texCoordinates[tileIndex - this.firstgid];
  17179. },
  17180. /**
  17181. * Sets the image associated with this Tileset and updates the tile data (rows, columns, etc.).
  17182. *
  17183. * @method Phaser.Tilemaps.Tileset#setImage
  17184. * @since 3.0.0
  17185. *
  17186. * @param {Phaser.Textures.Texture} texture - The image that contains the tiles.
  17187. *
  17188. * @return {Phaser.Tilemaps.Tileset} This Tileset object.
  17189. */
  17190. setImage: function (texture)
  17191. {
  17192. this.image = texture;
  17193. this.glTexture = texture.get().source.glTexture;
  17194. this.updateTileData(this.image.source[0].width, this.image.source[0].height);
  17195. return this;
  17196. },
  17197. /**
  17198. * Sets the tile width & height and updates the tile data (rows, columns, etc.).
  17199. *
  17200. * @method Phaser.Tilemaps.Tileset#setTileSize
  17201. * @since 3.0.0
  17202. *
  17203. * @param {integer} [tileWidth] - The width of a tile in pixels.
  17204. * @param {integer} [tileHeight] - The height of a tile in pixels.
  17205. *
  17206. * @return {Phaser.Tilemaps.Tileset} This Tileset object.
  17207. */
  17208. setTileSize: function (tileWidth, tileHeight)
  17209. {
  17210. if (tileWidth !== undefined) { this.tileWidth = tileWidth; }
  17211. if (tileHeight !== undefined) { this.tileHeight = tileHeight; }
  17212. if (this.image)
  17213. {
  17214. this.updateTileData(this.image.source[0].width, this.image.source[0].height);
  17215. }
  17216. return this;
  17217. },
  17218. /**
  17219. * Sets the tile margin & spacing and updates the tile data (rows, columns, etc.).
  17220. *
  17221. * @method Phaser.Tilemaps.Tileset#setSpacing
  17222. * @since 3.0.0
  17223. *
  17224. * @param {integer} [margin] - The margin around the tiles in the sheet (in pixels).
  17225. * @param {integer} [spacing] - The spacing between the tiles in the sheet (in pixels).
  17226. *
  17227. * @return {Phaser.Tilemaps.Tileset} This Tileset object.
  17228. */
  17229. setSpacing: function (margin, spacing)
  17230. {
  17231. if (margin !== undefined) { this.tileMargin = margin; }
  17232. if (spacing !== undefined) { this.tileSpacing = spacing; }
  17233. if (this.image)
  17234. {
  17235. this.updateTileData(this.image.source[0].width, this.image.source[0].height);
  17236. }
  17237. return this;
  17238. },
  17239. /**
  17240. * Updates tile texture coordinates and tileset data.
  17241. *
  17242. * @method Phaser.Tilemaps.Tileset#updateTileData
  17243. * @since 3.0.0
  17244. *
  17245. * @param {integer} imageWidth - The (expected) width of the image to slice.
  17246. * @param {integer} imageHeight - The (expected) height of the image to slice.
  17247. *
  17248. * @return {Phaser.Tilemaps.Tileset} This Tileset object.
  17249. */
  17250. updateTileData: function (imageWidth, imageHeight)
  17251. {
  17252. var rowCount = (imageHeight - this.tileMargin * 2 + this.tileSpacing) / (this.tileHeight + this.tileSpacing);
  17253. var colCount = (imageWidth - this.tileMargin * 2 + this.tileSpacing) / (this.tileWidth + this.tileSpacing);
  17254. if (rowCount % 1 !== 0 || colCount % 1 !== 0)
  17255. {
  17256. console.warn('Image tile area not tile size multiple in: ' + this.name);
  17257. }
  17258. // In Tiled a tileset image that is not an even multiple of the tile dimensions is truncated
  17259. // - hence the floor when calculating the rows/columns.
  17260. rowCount = Math.floor(rowCount);
  17261. colCount = Math.floor(colCount);
  17262. this.rows = rowCount;
  17263. this.columns = colCount;
  17264. // In Tiled, "empty" spaces in a tileset count as tiles and hence count towards the gid
  17265. this.total = rowCount * colCount;
  17266. this.texCoordinates.length = 0;
  17267. var tx = this.tileMargin;
  17268. var ty = this.tileMargin;
  17269. for (var y = 0; y < this.rows; y++)
  17270. {
  17271. for (var x = 0; x < this.columns; x++)
  17272. {
  17273. this.texCoordinates.push({ x: tx, y: ty });
  17274. tx += this.tileWidth + this.tileSpacing;
  17275. }
  17276. tx = this.tileMargin;
  17277. ty += this.tileHeight + this.tileSpacing;
  17278. }
  17279. return this;
  17280. }
  17281. });
  17282. module.exports = Tileset;
  17283. /***/ }),
  17284. /* 107 */
  17285. /***/ (function(module, exports) {
  17286. /**
  17287. * @author Richard Davey <rich@photonstorm.com>
  17288. * @copyright 2019 Photon Storm Ltd.
  17289. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17290. */
  17291. /**
  17292. * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the
  17293. * layer's position, scale and scroll.
  17294. *
  17295. * @function Phaser.Tilemaps.Components.TileToWorldY
  17296. * @private
  17297. * @since 3.0.0
  17298. *
  17299. * @param {integer} tileY - The x coordinate, in tiles, not pixels.
  17300. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  17301. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  17302. *
  17303. * @return {number}
  17304. */
  17305. var TileToWorldY = function (tileY, camera, layer)
  17306. {
  17307. var tileHeight = layer.baseTileHeight;
  17308. var tilemapLayer = layer.tilemapLayer;
  17309. var layerWorldY = 0;
  17310. if (tilemapLayer)
  17311. {
  17312. if (camera === undefined) { camera = tilemapLayer.scene.cameras.main; }
  17313. layerWorldY = (tilemapLayer.y + camera.scrollY * (1 - tilemapLayer.scrollFactorY));
  17314. tileHeight *= tilemapLayer.scaleY;
  17315. }
  17316. return layerWorldY + tileY * tileHeight;
  17317. };
  17318. module.exports = TileToWorldY;
  17319. /***/ }),
  17320. /* 108 */
  17321. /***/ (function(module, exports) {
  17322. /**
  17323. * @author Richard Davey <rich@photonstorm.com>
  17324. * @copyright 2019 Photon Storm Ltd.
  17325. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17326. */
  17327. /**
  17328. * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the
  17329. * layer's position, scale and scroll.
  17330. *
  17331. * @function Phaser.Tilemaps.Components.TileToWorldX
  17332. * @private
  17333. * @since 3.0.0
  17334. *
  17335. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  17336. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  17337. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  17338. *
  17339. * @return {number}
  17340. */
  17341. var TileToWorldX = function (tileX, camera, layer)
  17342. {
  17343. var tileWidth = layer.baseTileWidth;
  17344. var tilemapLayer = layer.tilemapLayer;
  17345. var layerWorldX = 0;
  17346. if (tilemapLayer)
  17347. {
  17348. if (camera === undefined) { camera = tilemapLayer.scene.cameras.main; }
  17349. layerWorldX = tilemapLayer.x + camera.scrollX * (1 - tilemapLayer.scrollFactorX);
  17350. tileWidth *= tilemapLayer.scaleX;
  17351. }
  17352. return layerWorldX + tileX * tileWidth;
  17353. };
  17354. module.exports = TileToWorldX;
  17355. /***/ }),
  17356. /* 109 */
  17357. /***/ (function(module, exports, __webpack_require__) {
  17358. /**
  17359. * @author Richard Davey <rich@photonstorm.com>
  17360. * @copyright 2019 Photon Storm Ltd.
  17361. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17362. */
  17363. var IsInLayerBounds = __webpack_require__(85);
  17364. /**
  17365. * Gets a tile at the given tile coordinates from the given layer.
  17366. *
  17367. * @function Phaser.Tilemaps.Components.GetTileAt
  17368. * @private
  17369. * @since 3.0.0
  17370. *
  17371. * @param {integer} tileX - X position to get the tile from (given in tile units, not pixels).
  17372. * @param {integer} tileY - Y position to get the tile from (given in tile units, not pixels).
  17373. * @param {boolean} [nonNull=false] - If true getTile won't return null for empty tiles, but a Tile object with an index of -1.
  17374. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  17375. *
  17376. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates
  17377. * were invalid.
  17378. */
  17379. var GetTileAt = function (tileX, tileY, nonNull, layer)
  17380. {
  17381. if (nonNull === undefined) { nonNull = false; }
  17382. if (IsInLayerBounds(tileX, tileY, layer))
  17383. {
  17384. var tile = layer.data[tileY][tileX] || null;
  17385. if (tile === null)
  17386. {
  17387. return null;
  17388. }
  17389. else if (tile.index === -1)
  17390. {
  17391. return nonNull ? tile : null;
  17392. }
  17393. else
  17394. {
  17395. return tile;
  17396. }
  17397. }
  17398. else
  17399. {
  17400. return null;
  17401. }
  17402. };
  17403. module.exports = GetTileAt;
  17404. /***/ }),
  17405. /* 110 */
  17406. /***/ (function(module, exports, __webpack_require__) {
  17407. /**
  17408. * @author Richard Davey <rich@photonstorm.com>
  17409. * @copyright 2019 Photon Storm Ltd.
  17410. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17411. */
  17412. /**
  17413. * @namespace Phaser.Tilemaps.Components
  17414. */
  17415. module.exports = {
  17416. CalculateFacesAt: __webpack_require__(148),
  17417. CalculateFacesWithin: __webpack_require__(37),
  17418. Copy: __webpack_require__(528),
  17419. CreateFromTiles: __webpack_require__(527),
  17420. CullTiles: __webpack_require__(526),
  17421. Fill: __webpack_require__(525),
  17422. FilterTiles: __webpack_require__(524),
  17423. FindByIndex: __webpack_require__(523),
  17424. FindTile: __webpack_require__(522),
  17425. ForEachTile: __webpack_require__(521),
  17426. GetTileAt: __webpack_require__(109),
  17427. GetTileAtWorldXY: __webpack_require__(520),
  17428. GetTilesWithin: __webpack_require__(21),
  17429. GetTilesWithinShape: __webpack_require__(519),
  17430. GetTilesWithinWorldXY: __webpack_require__(518),
  17431. HasTileAt: __webpack_require__(235),
  17432. HasTileAtWorldXY: __webpack_require__(517),
  17433. IsInLayerBounds: __webpack_require__(85),
  17434. PutTileAt: __webpack_require__(147),
  17435. PutTileAtWorldXY: __webpack_require__(516),
  17436. PutTilesAt: __webpack_require__(515),
  17437. Randomize: __webpack_require__(514),
  17438. RemoveTileAt: __webpack_require__(234),
  17439. RemoveTileAtWorldXY: __webpack_require__(513),
  17440. RenderDebug: __webpack_require__(512),
  17441. ReplaceByIndex: __webpack_require__(236),
  17442. SetCollision: __webpack_require__(511),
  17443. SetCollisionBetween: __webpack_require__(510),
  17444. SetCollisionByExclusion: __webpack_require__(509),
  17445. SetCollisionByProperty: __webpack_require__(508),
  17446. SetCollisionFromCollisionGroup: __webpack_require__(507),
  17447. SetTileIndexCallback: __webpack_require__(506),
  17448. SetTileLocationCallback: __webpack_require__(505),
  17449. Shuffle: __webpack_require__(504),
  17450. SwapByIndex: __webpack_require__(503),
  17451. TileToWorldX: __webpack_require__(108),
  17452. TileToWorldXY: __webpack_require__(502),
  17453. TileToWorldY: __webpack_require__(107),
  17454. WeightedRandomize: __webpack_require__(501),
  17455. WorldToTileX: __webpack_require__(54),
  17456. WorldToTileXY: __webpack_require__(500),
  17457. WorldToTileY: __webpack_require__(53)
  17458. };
  17459. /***/ }),
  17460. /* 111 */
  17461. /***/ (function(module, exports, __webpack_require__) {
  17462. /**
  17463. * @author Richard Davey <rich@photonstorm.com>
  17464. * @copyright 2019 Photon Storm Ltd.
  17465. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17466. */
  17467. var Class = __webpack_require__(0);
  17468. var Components = __webpack_require__(253);
  17469. var Sprite = __webpack_require__(67);
  17470. /**
  17471. * @classdesc
  17472. * An Arcade Physics Sprite is a Sprite with an Arcade Physics body and related components.
  17473. * The body can be dynamic or static.
  17474. *
  17475. * The main difference between an Arcade Sprite and an Arcade Image is that you cannot animate an Arcade Image.
  17476. * If you do not require animation then you can safely use Arcade Images instead of Arcade Sprites.
  17477. *
  17478. * @class Sprite
  17479. * @extends Phaser.GameObjects.Sprite
  17480. * @memberof Phaser.Physics.Arcade
  17481. * @constructor
  17482. * @since 3.0.0
  17483. *
  17484. * @extends Phaser.Physics.Arcade.Components.Acceleration
  17485. * @extends Phaser.Physics.Arcade.Components.Angular
  17486. * @extends Phaser.Physics.Arcade.Components.Bounce
  17487. * @extends Phaser.Physics.Arcade.Components.Debug
  17488. * @extends Phaser.Physics.Arcade.Components.Drag
  17489. * @extends Phaser.Physics.Arcade.Components.Enable
  17490. * @extends Phaser.Physics.Arcade.Components.Friction
  17491. * @extends Phaser.Physics.Arcade.Components.Gravity
  17492. * @extends Phaser.Physics.Arcade.Components.Immovable
  17493. * @extends Phaser.Physics.Arcade.Components.Mass
  17494. * @extends Phaser.Physics.Arcade.Components.Size
  17495. * @extends Phaser.Physics.Arcade.Components.Velocity
  17496. * @extends Phaser.GameObjects.Components.Alpha
  17497. * @extends Phaser.GameObjects.Components.BlendMode
  17498. * @extends Phaser.GameObjects.Components.Depth
  17499. * @extends Phaser.GameObjects.Components.Flip
  17500. * @extends Phaser.GameObjects.Components.GetBounds
  17501. * @extends Phaser.GameObjects.Components.Origin
  17502. * @extends Phaser.GameObjects.Components.Pipeline
  17503. * @extends Phaser.GameObjects.Components.ScaleMode
  17504. * @extends Phaser.GameObjects.Components.ScrollFactor
  17505. * @extends Phaser.GameObjects.Components.Size
  17506. * @extends Phaser.GameObjects.Components.Texture
  17507. * @extends Phaser.GameObjects.Components.Tint
  17508. * @extends Phaser.GameObjects.Components.Transform
  17509. * @extends Phaser.GameObjects.Components.Visible
  17510. *
  17511. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  17512. * @param {number} x - The horizontal position of this Game Object in the world.
  17513. * @param {number} y - The vertical position of this Game Object in the world.
  17514. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  17515. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  17516. */
  17517. var ArcadeSprite = new Class({
  17518. Extends: Sprite,
  17519. Mixins: [
  17520. Components.Acceleration,
  17521. Components.Angular,
  17522. Components.Bounce,
  17523. Components.Debug,
  17524. Components.Drag,
  17525. Components.Enable,
  17526. Components.Friction,
  17527. Components.Gravity,
  17528. Components.Immovable,
  17529. Components.Mass,
  17530. Components.Size,
  17531. Components.Velocity
  17532. ],
  17533. initialize:
  17534. function ArcadeSprite (scene, x, y, texture, frame)
  17535. {
  17536. Sprite.call(this, scene, x, y, texture, frame);
  17537. /**
  17538. * This Game Object's Physics Body.
  17539. *
  17540. * @name Phaser.Physics.Arcade.Sprite#body
  17541. * @type {?(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)}
  17542. * @default null
  17543. * @since 3.0.0
  17544. */
  17545. this.body = null;
  17546. }
  17547. });
  17548. module.exports = ArcadeSprite;
  17549. /***/ }),
  17550. /* 112 */
  17551. /***/ (function(module, exports) {
  17552. /**
  17553. * @author Richard Davey <rich@photonstorm.com>
  17554. * @copyright 2019 Photon Storm Ltd.
  17555. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17556. */
  17557. /**
  17558. * @typedef {object} XHRSettingsObject
  17559. *
  17560. * @property {XMLHttpRequestResponseType} responseType - The response type of the XHR request, i.e. `blob`, `text`, etc.
  17561. * @property {boolean} [async=true] - Should the XHR request use async or not?
  17562. * @property {string} [user=''] - Optional username for the XHR request.
  17563. * @property {string} [password=''] - Optional password for the XHR request.
  17564. * @property {integer} [timeout=0] - Optional XHR timeout value.
  17565. * @property {(string|undefined)} [header] - This value is used to populate the XHR `setRequestHeader` and is undefined by default.
  17566. * @property {(string|undefined)} [headerValue] - This value is used to populate the XHR `setRequestHeader` and is undefined by default.
  17567. * @property {(string|undefined)} [requestedWith] - This value is used to populate the XHR `setRequestHeader` and is undefined by default.
  17568. * @property {(string|undefined)} [overrideMimeType] - Provide a custom mime-type to use instead of the default.
  17569. */
  17570. /**
  17571. * Creates an XHRSettings Object with default values.
  17572. *
  17573. * @function Phaser.Loader.XHRSettings
  17574. * @since 3.0.0
  17575. *
  17576. * @param {XMLHttpRequestResponseType} [responseType=''] - The responseType, such as 'text'.
  17577. * @param {boolean} [async=true] - Should the XHR request use async or not?
  17578. * @param {string} [user=''] - Optional username for the XHR request.
  17579. * @param {string} [password=''] - Optional password for the XHR request.
  17580. * @param {integer} [timeout=0] - Optional XHR timeout value.
  17581. *
  17582. * @return {XHRSettingsObject} The XHRSettings object as used by the Loader.
  17583. */
  17584. var XHRSettings = function (responseType, async, user, password, timeout)
  17585. {
  17586. if (responseType === undefined) { responseType = ''; }
  17587. if (async === undefined) { async = true; }
  17588. if (user === undefined) { user = ''; }
  17589. if (password === undefined) { password = ''; }
  17590. if (timeout === undefined) { timeout = 0; }
  17591. // Before sending a request, set the xhr.responseType to "text",
  17592. // "arraybuffer", "blob", or "document", depending on your data needs.
  17593. // Note, setting xhr.responseType = '' (or omitting) will default the response to "text".
  17594. return {
  17595. // Ignored by the Loader, only used by File.
  17596. responseType: responseType,
  17597. async: async,
  17598. // credentials
  17599. user: user,
  17600. password: password,
  17601. // timeout in ms (0 = no timeout)
  17602. timeout: timeout,
  17603. // setRequestHeader
  17604. header: undefined,
  17605. headerValue: undefined,
  17606. requestedWith: false,
  17607. // overrideMimeType
  17608. overrideMimeType: undefined
  17609. };
  17610. };
  17611. module.exports = XHRSettings;
  17612. /***/ }),
  17613. /* 113 */
  17614. /***/ (function(module, exports, __webpack_require__) {
  17615. /**
  17616. * @author Richard Davey <rich@photonstorm.com>
  17617. * @copyright 2019 Photon Storm Ltd.
  17618. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17619. */
  17620. /**
  17621. * @namespace Phaser.Input.Keyboard.Events
  17622. */
  17623. module.exports = {
  17624. ANY_KEY_DOWN: __webpack_require__(619),
  17625. ANY_KEY_UP: __webpack_require__(618),
  17626. COMBO_MATCH: __webpack_require__(617),
  17627. DOWN: __webpack_require__(616),
  17628. KEY_DOWN: __webpack_require__(615),
  17629. KEY_UP: __webpack_require__(614),
  17630. UP: __webpack_require__(613)
  17631. };
  17632. /***/ }),
  17633. /* 114 */
  17634. /***/ (function(module, exports, __webpack_require__) {
  17635. /**
  17636. * @author Richard Davey <rich@photonstorm.com>
  17637. * @copyright 2019 Photon Storm Ltd.
  17638. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17639. */
  17640. var GetValue = __webpack_require__(4);
  17641. // Contains the plugins that Phaser uses globally and locally.
  17642. // These are the source objects, not instantiated.
  17643. var inputPlugins = {};
  17644. /**
  17645. * @typedef {object} InputPluginContainer
  17646. *
  17647. * @property {string} key - The unique name of this plugin in the input plugin cache.
  17648. * @property {function} plugin - The plugin to be stored. Should be the source object, not instantiated.
  17649. * @property {string} [mapping] - If this plugin is to be injected into the Input Plugin, this is the property key map used.
  17650. */
  17651. /**
  17652. * @namespace Phaser.Input.InputPluginCache
  17653. */
  17654. var InputPluginCache = {};
  17655. /**
  17656. * Static method called directly by the Core internal Plugins.
  17657. * Key is a reference used to get the plugin from the plugins object (i.e. InputPlugin)
  17658. * Plugin is the object to instantiate to create the plugin
  17659. * Mapping is what the plugin is injected into the Scene.Systems as (i.e. input)
  17660. *
  17661. * @name Phaser.Input.InputPluginCache.register
  17662. * @type {function}
  17663. * @static
  17664. * @since 3.10.0
  17665. *
  17666. * @param {string} key - A reference used to get this plugin from the plugin cache.
  17667. * @param {function} plugin - The plugin to be stored. Should be the core object, not instantiated.
  17668. * @param {string} mapping - If this plugin is to be injected into the Input Plugin, this is the property key used.
  17669. * @param {string} settingsKey - The key in the Scene Settings to check to see if this plugin should install or not.
  17670. * @param {string} configKey - The key in the Game Config to check to see if this plugin should install or not.
  17671. */
  17672. InputPluginCache.register = function (key, plugin, mapping, settingsKey, configKey)
  17673. {
  17674. inputPlugins[key] = { plugin: plugin, mapping: mapping, settingsKey: settingsKey, configKey: configKey };
  17675. };
  17676. /**
  17677. * Returns the input plugin object from the cache based on the given key.
  17678. *
  17679. * @name Phaser.Input.InputPluginCache.getCore
  17680. * @type {function}
  17681. * @static
  17682. * @since 3.10.0
  17683. *
  17684. * @param {string} key - The key of the input plugin to get.
  17685. *
  17686. * @return {InputPluginContainer} The input plugin object.
  17687. */
  17688. InputPluginCache.getPlugin = function (key)
  17689. {
  17690. return inputPlugins[key];
  17691. };
  17692. /**
  17693. * Installs all of the registered Input Plugins into the given target.
  17694. *
  17695. * @name Phaser.Input.InputPluginCache.install
  17696. * @type {function}
  17697. * @static
  17698. * @since 3.10.0
  17699. *
  17700. * @param {Phaser.Input.InputPlugin} target - The target InputPlugin to install the plugins into.
  17701. */
  17702. InputPluginCache.install = function (target)
  17703. {
  17704. var sys = target.scene.sys;
  17705. var settings = sys.settings.input;
  17706. var config = sys.game.config;
  17707. for (var key in inputPlugins)
  17708. {
  17709. var source = inputPlugins[key].plugin;
  17710. var mapping = inputPlugins[key].mapping;
  17711. var settingsKey = inputPlugins[key].settingsKey;
  17712. var configKey = inputPlugins[key].configKey;
  17713. if (GetValue(settings, settingsKey, config[configKey]))
  17714. {
  17715. target[mapping] = new source(target);
  17716. }
  17717. }
  17718. };
  17719. /**
  17720. * Removes an input plugin based on the given key.
  17721. *
  17722. * @name Phaser.Input.InputPluginCache.remove
  17723. * @type {function}
  17724. * @static
  17725. * @since 3.10.0
  17726. *
  17727. * @param {string} key - The key of the input plugin to remove.
  17728. */
  17729. InputPluginCache.remove = function (key)
  17730. {
  17731. if (inputPlugins.hasOwnProperty(key))
  17732. {
  17733. delete inputPlugins[key];
  17734. }
  17735. };
  17736. module.exports = InputPluginCache;
  17737. /***/ }),
  17738. /* 115 */
  17739. /***/ (function(module, exports, __webpack_require__) {
  17740. /**
  17741. * @author Richard Davey <rich@photonstorm.com>
  17742. * @copyright 2019 Photon Storm Ltd.
  17743. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17744. */
  17745. var Point = __webpack_require__(6);
  17746. // This is based off an explanation and expanded math presented by Paul Bourke:
  17747. // See http:'local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/
  17748. /**
  17749. * Checks if two Lines intersect. If the Lines are identical, they will be treated as parallel and thus non-intersecting.
  17750. *
  17751. * @function Phaser.Geom.Intersects.LineToLine
  17752. * @since 3.0.0
  17753. *
  17754. * @param {Phaser.Geom.Line} line1 - The first Line to check.
  17755. * @param {Phaser.Geom.Line} line2 - The second Line to check.
  17756. * @param {Phaser.Geom.Point} [out] - A Point in which to optionally store the point of intersection.
  17757. *
  17758. * @return {boolean} `true` if the two Lines intersect, and the `out` object will be populated, if given. Otherwise, `false`.
  17759. */
  17760. var LineToLine = function (line1, line2, out)
  17761. {
  17762. if (out === undefined) { out = new Point(); }
  17763. var x1 = line1.x1;
  17764. var y1 = line1.y1;
  17765. var x2 = line1.x2;
  17766. var y2 = line1.y2;
  17767. var x3 = line2.x1;
  17768. var y3 = line2.y1;
  17769. var x4 = line2.x2;
  17770. var y4 = line2.y2;
  17771. var numA = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);
  17772. var numB = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3);
  17773. var deNom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
  17774. // Make sure there is not a division by zero - this also indicates that the lines are parallel.
  17775. // If numA and numB were both equal to zero the lines would be on top of each other (coincidental).
  17776. // This check is not done because it is not necessary for this implementation (the parallel check accounts for this).
  17777. if (deNom === 0)
  17778. {
  17779. return false;
  17780. }
  17781. // Calculate the intermediate fractional point that the lines potentially intersect.
  17782. var uA = numA / deNom;
  17783. var uB = numB / deNom;
  17784. // The fractional point will be between 0 and 1 inclusive if the lines intersect.
  17785. // If the fractional calculation is larger than 1 or smaller than 0 the lines would need to be longer to intersect.
  17786. if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1)
  17787. {
  17788. out.x = x1 + (uA * (x2 - x1));
  17789. out.y = y1 + (uA * (y2 - y1));
  17790. return true;
  17791. }
  17792. return false;
  17793. };
  17794. module.exports = LineToLine;
  17795. /***/ }),
  17796. /* 116 */
  17797. /***/ (function(module, exports, __webpack_require__) {
  17798. /**
  17799. * @author Richard Davey <rich@photonstorm.com>
  17800. * @copyright 2019 Photon Storm Ltd.
  17801. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17802. */
  17803. var Class = __webpack_require__(0);
  17804. var Components = __webpack_require__(13);
  17805. var GameObject = __webpack_require__(18);
  17806. var MeshRender = __webpack_require__(753);
  17807. var NOOP = __webpack_require__(1);
  17808. /**
  17809. * @classdesc
  17810. * A Mesh Game Object.
  17811. *
  17812. * @class Mesh
  17813. * @extends Phaser.GameObjects.GameObject
  17814. * @memberof Phaser.GameObjects
  17815. * @constructor
  17816. * @webglOnly
  17817. * @since 3.0.0
  17818. *
  17819. * @extends Phaser.GameObjects.Components.BlendMode
  17820. * @extends Phaser.GameObjects.Components.Depth
  17821. * @extends Phaser.GameObjects.Components.GetBounds
  17822. * @extends Phaser.GameObjects.Components.Mask
  17823. * @extends Phaser.GameObjects.Components.Pipeline
  17824. * @extends Phaser.GameObjects.Components.ScaleMode
  17825. * @extends Phaser.GameObjects.Components.Size
  17826. * @extends Phaser.GameObjects.Components.Texture
  17827. * @extends Phaser.GameObjects.Components.Transform
  17828. * @extends Phaser.GameObjects.Components.Visible
  17829. * @extends Phaser.GameObjects.Components.ScrollFactor
  17830. *
  17831. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  17832. * @param {number} x - The horizontal position of this Game Object in the world.
  17833. * @param {number} y - The vertical position of this Game Object in the world.
  17834. * @param {number[]} vertices - An array containing the vertices data for this Mesh.
  17835. * @param {number[]} uv - An array containing the uv data for this Mesh.
  17836. * @param {number[]} colors - An array containing the color data for this Mesh.
  17837. * @param {number[]} alphas - An array containing the alpha data for this Mesh.
  17838. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  17839. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  17840. */
  17841. var Mesh = new Class({
  17842. Extends: GameObject,
  17843. Mixins: [
  17844. Components.BlendMode,
  17845. Components.Depth,
  17846. Components.GetBounds,
  17847. Components.Mask,
  17848. Components.Pipeline,
  17849. Components.ScaleMode,
  17850. Components.Size,
  17851. Components.Texture,
  17852. Components.Transform,
  17853. Components.Visible,
  17854. Components.ScrollFactor,
  17855. MeshRender
  17856. ],
  17857. initialize:
  17858. function Mesh (scene, x, y, vertices, uv, colors, alphas, texture, frame)
  17859. {
  17860. GameObject.call(this, scene, 'Mesh');
  17861. if (vertices.length !== uv.length)
  17862. {
  17863. throw new Error('Mesh Vertex count must match UV count');
  17864. }
  17865. var verticesUB = (vertices.length / 2) | 0;
  17866. if (colors.length > 0 && colors.length < verticesUB)
  17867. {
  17868. throw new Error('Mesh Color count must match Vertex count');
  17869. }
  17870. if (alphas.length > 0 && alphas.length < verticesUB)
  17871. {
  17872. throw new Error('Mesh Alpha count must match Vertex count');
  17873. }
  17874. var i;
  17875. if (colors.length === 0)
  17876. {
  17877. for (i = 0; i < verticesUB; ++i)
  17878. {
  17879. colors[i] = 0xFFFFFF;
  17880. }
  17881. }
  17882. if (alphas.length === 0)
  17883. {
  17884. for (i = 0; i < verticesUB; ++i)
  17885. {
  17886. alphas[i] = 1.0;
  17887. }
  17888. }
  17889. /**
  17890. * An array containing the vertices data for this Mesh.
  17891. *
  17892. * @name Phaser.GameObjects.Mesh#vertices
  17893. * @type {Float32Array}
  17894. * @since 3.0.0
  17895. */
  17896. this.vertices = new Float32Array(vertices);
  17897. /**
  17898. * An array containing the uv data for this Mesh.
  17899. *
  17900. * @name Phaser.GameObjects.Mesh#uv
  17901. * @type {Float32Array}
  17902. * @since 3.0.0
  17903. */
  17904. this.uv = new Float32Array(uv);
  17905. /**
  17906. * An array containing the color data for this Mesh.
  17907. *
  17908. * @name Phaser.GameObjects.Mesh#colors
  17909. * @type {Uint32Array}
  17910. * @since 3.0.0
  17911. */
  17912. this.colors = new Uint32Array(colors);
  17913. /**
  17914. * An array containing the alpha data for this Mesh.
  17915. *
  17916. * @name Phaser.GameObjects.Mesh#alphas
  17917. * @type {Float32Array}
  17918. * @since 3.0.0
  17919. */
  17920. this.alphas = new Float32Array(alphas);
  17921. /**
  17922. * Fill or additive mode used when blending the color values?
  17923. *
  17924. * @name Phaser.GameObjects.Mesh#tintFill
  17925. * @type {boolean}
  17926. * @default false
  17927. * @since 3.11.0
  17928. */
  17929. this.tintFill = false;
  17930. this.setTexture(texture, frame);
  17931. this.setPosition(x, y);
  17932. this.setSizeToFrame();
  17933. this.initPipeline();
  17934. },
  17935. /**
  17936. * This method is left intentionally empty and does not do anything.
  17937. * It is retained to allow a Mesh or Quad to be added to a Container.
  17938. *
  17939. * @method Phaser.GameObjects.Mesh#setAlpha
  17940. * @since 3.17.0
  17941. */
  17942. setAlpha: NOOP
  17943. });
  17944. module.exports = Mesh;
  17945. /***/ }),
  17946. /* 117 */
  17947. /***/ (function(module, exports, __webpack_require__) {
  17948. /**
  17949. * @author Richard Davey <rich@photonstorm.com>
  17950. * @copyright 2019 Photon Storm Ltd.
  17951. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17952. */
  17953. var Class = __webpack_require__(0);
  17954. var Components = __webpack_require__(13);
  17955. var GameObject = __webpack_require__(18);
  17956. var GetBitmapTextSize = __webpack_require__(872);
  17957. var ParseFromAtlas = __webpack_require__(871);
  17958. var Render = __webpack_require__(870);
  17959. /**
  17960. * The font data for an individual character of a Bitmap Font.
  17961. *
  17962. * Describes the character's position, size, offset and kerning.
  17963. *
  17964. * @typedef {object} BitmapFontCharacterData
  17965. *
  17966. * @property {number} x - The x position of the character.
  17967. * @property {number} y - The y position of the character.
  17968. * @property {number} width - The width of the character.
  17969. * @property {number} height - The height of the character.
  17970. * @property {number} centerX - The center x position of the character.
  17971. * @property {number} centerY - The center y position of the character.
  17972. * @property {number} xOffset - The x offset of the character.
  17973. * @property {number} yOffset - The y offset of the character.
  17974. * @property {object} data - Extra data for the character.
  17975. * @property {Object.<number>} kerning - Kerning values, keyed by character code.
  17976. */
  17977. /**
  17978. * Bitmap Font data that can be used by a BitmapText Game Object.
  17979. *
  17980. * @typedef {object} BitmapFontData
  17981. *
  17982. * @property {string} font - The name of the font.
  17983. * @property {number} size - The size of the font.
  17984. * @property {number} lineHeight - The line height of the font.
  17985. * @property {boolean} retroFont - Whether this font is a retro font (monospace).
  17986. * @property {Object.<number, BitmapFontCharacterData>} chars - The character data of the font, keyed by character code. Each character datum includes a position, size, offset and more.
  17987. */
  17988. /**
  17989. * @typedef {object} JSONBitmapText
  17990. * @extends {JSONGameObject}
  17991. *
  17992. * @property {string} font - The name of the font.
  17993. * @property {string} text - The text that this Bitmap Text displays.
  17994. * @property {number} fontSize - The size of the font.
  17995. * @property {number} letterSpacing - Adds / Removes spacing between characters.
  17996. * @property {integer} align - The alignment of the text in a multi-line BitmapText object.
  17997. */
  17998. /**
  17999. * @classdesc
  18000. * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure.
  18001. *
  18002. * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to
  18003. * match the font structure.
  18004. *
  18005. * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability
  18006. * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by
  18007. * processing the font texture in an image editor, applying fills and any other effects required.
  18008. *
  18009. * To create multi-line text insert \r, \n or \r\n escape codes into the text string.
  18010. *
  18011. * To create a BitmapText data files you need a 3rd party app such as:
  18012. *
  18013. * BMFont (Windows, free): {@link http://www.angelcode.com/products/bmfont/|http://www.angelcode.com/products/bmfont/}
  18014. * Glyph Designer (OS X, commercial): {@link http://www.71squared.com/en/glyphdesigner|http://www.71squared.com/en/glyphdesigner}
  18015. * Littera (Web-based, free): {@link http://kvazars.com/littera/|http://kvazars.com/littera/}
  18016. *
  18017. * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of
  18018. * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: {@link http://codebeautify.org/xmltojson|http://codebeautify.org/xmltojson}
  18019. *
  18020. * @class BitmapText
  18021. * @extends Phaser.GameObjects.GameObject
  18022. * @memberof Phaser.GameObjects
  18023. * @constructor
  18024. * @since 3.0.0
  18025. *
  18026. * @extends Phaser.GameObjects.Components.Alpha
  18027. * @extends Phaser.GameObjects.Components.BlendMode
  18028. * @extends Phaser.GameObjects.Components.Depth
  18029. * @extends Phaser.GameObjects.Components.Mask
  18030. * @extends Phaser.GameObjects.Components.Origin
  18031. * @extends Phaser.GameObjects.Components.Pipeline
  18032. * @extends Phaser.GameObjects.Components.ScaleMode
  18033. * @extends Phaser.GameObjects.Components.ScrollFactor
  18034. * @extends Phaser.GameObjects.Components.Texture
  18035. * @extends Phaser.GameObjects.Components.Tint
  18036. * @extends Phaser.GameObjects.Components.Transform
  18037. * @extends Phaser.GameObjects.Components.Visible
  18038. *
  18039. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. It can only belong to one Scene at any given time.
  18040. * @param {number} x - The x coordinate of this Game Object in world space.
  18041. * @param {number} y - The y coordinate of this Game Object in world space.
  18042. * @param {string} font - The key of the font to use from the Bitmap Font cache.
  18043. * @param {(string|string[])} [text] - The string, or array of strings, to be set as the content of this Bitmap Text.
  18044. * @param {number} [size] - The font size of this Bitmap Text.
  18045. * @param {integer} [align=0] - The alignment of the text in a multi-line BitmapText object.
  18046. */
  18047. var BitmapText = new Class({
  18048. Extends: GameObject,
  18049. Mixins: [
  18050. Components.Alpha,
  18051. Components.BlendMode,
  18052. Components.Depth,
  18053. Components.Mask,
  18054. Components.Origin,
  18055. Components.Pipeline,
  18056. Components.ScaleMode,
  18057. Components.ScrollFactor,
  18058. Components.Texture,
  18059. Components.Tint,
  18060. Components.Transform,
  18061. Components.Visible,
  18062. Render
  18063. ],
  18064. initialize:
  18065. function BitmapText (scene, x, y, font, text, size, align)
  18066. {
  18067. if (text === undefined) { text = ''; }
  18068. if (align === undefined) { align = 0; }
  18069. GameObject.call(this, scene, 'BitmapText');
  18070. /**
  18071. * The key of the Bitmap Font used by this Bitmap Text.
  18072. * To change the font after creation please use `setFont`.
  18073. *
  18074. * @name Phaser.GameObjects.BitmapText#font
  18075. * @type {string}
  18076. * @readonly
  18077. * @since 3.0.0
  18078. */
  18079. this.font = font;
  18080. var entry = this.scene.sys.cache.bitmapFont.get(font);
  18081. /**
  18082. * The data of the Bitmap Font used by this Bitmap Text.
  18083. *
  18084. * @name Phaser.GameObjects.BitmapText#fontData
  18085. * @type {BitmapFontData}
  18086. * @readonly
  18087. * @since 3.0.0
  18088. */
  18089. this.fontData = entry.data;
  18090. /**
  18091. * The text that this Bitmap Text object displays.
  18092. *
  18093. * @name Phaser.GameObjects.BitmapText#_text
  18094. * @type {string}
  18095. * @private
  18096. * @since 3.0.0
  18097. */
  18098. this._text = '';
  18099. /**
  18100. * The font size of this Bitmap Text.
  18101. *
  18102. * @name Phaser.GameObjects.BitmapText#_fontSize
  18103. * @type {number}
  18104. * @private
  18105. * @since 3.0.0
  18106. */
  18107. this._fontSize = size || this.fontData.size;
  18108. /**
  18109. * Adds / Removes spacing between characters.
  18110. *
  18111. * Can be a negative or positive number.
  18112. *
  18113. * @name Phaser.GameObjects.BitmapText#_letterSpacing
  18114. * @type {number}
  18115. * @private
  18116. * @since 3.4.0
  18117. */
  18118. this._letterSpacing = 0;
  18119. /**
  18120. * Controls the alignment of each line of text in this BitmapText object.
  18121. * Only has any effect when this BitmapText contains multiple lines of text, split with carriage-returns.
  18122. * Has no effect with single-lines of text.
  18123. *
  18124. * See the methods `setLeftAlign`, `setCenterAlign` and `setRightAlign`.
  18125. *
  18126. * 0 = Left aligned (default)
  18127. * 1 = Middle aligned
  18128. * 2 = Right aligned
  18129. *
  18130. * The alignment position is based on the longest line of text.
  18131. *
  18132. * @name Phaser.GameObjects.BitmapText#_align
  18133. * @type {integer}
  18134. * @private
  18135. * @since 3.11.0
  18136. */
  18137. this._align = align;
  18138. /**
  18139. * An object that describes the size of this Bitmap Text.
  18140. *
  18141. * @name Phaser.GameObjects.BitmapText#_bounds
  18142. * @type {BitmapTextSize}
  18143. * @private
  18144. * @since 3.0.0
  18145. */
  18146. this._bounds = GetBitmapTextSize(this, false, this._bounds);
  18147. /**
  18148. * An internal dirty flag for bounds calculation.
  18149. *
  18150. * @name Phaser.GameObjects.BitmapText#_dirty
  18151. * @type {boolean}
  18152. * @private
  18153. * @since 3.11.0
  18154. */
  18155. this._dirty = false;
  18156. this.setTexture(entry.texture, entry.frame);
  18157. this.setPosition(x, y);
  18158. this.setOrigin(0, 0);
  18159. this.initPipeline();
  18160. this.setText(text);
  18161. },
  18162. /**
  18163. * Set the lines of text in this BitmapText to be left-aligned.
  18164. * This only has any effect if this BitmapText contains more than one line of text.
  18165. *
  18166. * @method Phaser.GameObjects.BitmapText#setLeftAlign
  18167. * @since 3.11.0
  18168. *
  18169. * @return {this} This BitmapText Object.
  18170. */
  18171. setLeftAlign: function ()
  18172. {
  18173. this._align = BitmapText.ALIGN_LEFT;
  18174. this._dirty = true;
  18175. return this;
  18176. },
  18177. /**
  18178. * Set the lines of text in this BitmapText to be center-aligned.
  18179. * This only has any effect if this BitmapText contains more than one line of text.
  18180. *
  18181. * @method Phaser.GameObjects.BitmapText#setCenterAlign
  18182. * @since 3.11.0
  18183. *
  18184. * @return {this} This BitmapText Object.
  18185. */
  18186. setCenterAlign: function ()
  18187. {
  18188. this._align = BitmapText.ALIGN_CENTER;
  18189. this._dirty = true;
  18190. return this;
  18191. },
  18192. /**
  18193. * Set the lines of text in this BitmapText to be right-aligned.
  18194. * This only has any effect if this BitmapText contains more than one line of text.
  18195. *
  18196. * @method Phaser.GameObjects.BitmapText#setRightAlign
  18197. * @since 3.11.0
  18198. *
  18199. * @return {this} This BitmapText Object.
  18200. */
  18201. setRightAlign: function ()
  18202. {
  18203. this._align = BitmapText.ALIGN_RIGHT;
  18204. this._dirty = true;
  18205. return this;
  18206. },
  18207. /**
  18208. * Set the font size of this Bitmap Text.
  18209. *
  18210. * @method Phaser.GameObjects.BitmapText#setFontSize
  18211. * @since 3.0.0
  18212. *
  18213. * @param {number} size - The font size to set.
  18214. *
  18215. * @return {this} This BitmapText Object.
  18216. */
  18217. setFontSize: function (size)
  18218. {
  18219. this._fontSize = size;
  18220. this._dirty = true;
  18221. return this;
  18222. },
  18223. /**
  18224. * Sets the letter spacing between each character of this Bitmap Text.
  18225. * Can be a positive value to increase the space, or negative to reduce it.
  18226. * Spacing is applied after the kerning values have been set.
  18227. *
  18228. * @method Phaser.GameObjects.BitmapText#setLetterSpacing
  18229. * @since 3.4.0
  18230. *
  18231. * @param {number} [spacing=0] - The amount of horizontal space to add between each character.
  18232. *
  18233. * @return {this} This BitmapText Object.
  18234. */
  18235. setLetterSpacing: function (spacing)
  18236. {
  18237. if (spacing === undefined) { spacing = 0; }
  18238. this._letterSpacing = spacing;
  18239. this._dirty = true;
  18240. return this;
  18241. },
  18242. /**
  18243. * Set the textual content of this BitmapText.
  18244. *
  18245. * An array of strings will be converted into multi-line text. Use the align methods to change multi-line alignment.
  18246. *
  18247. * @method Phaser.GameObjects.BitmapText#setText
  18248. * @since 3.0.0
  18249. *
  18250. * @param {(string|string[])} value - The string, or array of strings, to be set as the content of this BitmapText.
  18251. *
  18252. * @return {this} This BitmapText Object.
  18253. */
  18254. setText: function (value)
  18255. {
  18256. if (!value && value !== 0)
  18257. {
  18258. value = '';
  18259. }
  18260. if (Array.isArray(value))
  18261. {
  18262. value = value.join('\n');
  18263. }
  18264. if (value !== this.text)
  18265. {
  18266. this._text = value.toString();
  18267. this._dirty = true;
  18268. this.updateDisplayOrigin();
  18269. }
  18270. return this;
  18271. },
  18272. /**
  18273. * Calculate the bounds of this Bitmap Text.
  18274. *
  18275. * An object is returned that contains the position, width and height of the Bitmap Text in local and global
  18276. * contexts.
  18277. *
  18278. * Local size is based on just the font size and a [0, 0] position.
  18279. *
  18280. * Global size takes into account the Game Object's scale, world position and display origin.
  18281. *
  18282. * Also in the object is data regarding the length of each line, should this be a multi-line BitmapText.
  18283. *
  18284. * @method Phaser.GameObjects.BitmapText#getTextBounds
  18285. * @since 3.0.0
  18286. *
  18287. * @param {boolean} [round] - Whether to round the results to the nearest integer.
  18288. *
  18289. * @return {BitmapTextSize} An object that describes the size of this Bitmap Text.
  18290. */
  18291. getTextBounds: function (round)
  18292. {
  18293. // local = The BitmapText based on fontSize and 0x0 coords
  18294. // global = The BitmapText, taking into account scale and world position
  18295. // lines = The BitmapText line data
  18296. if (this._dirty)
  18297. {
  18298. GetBitmapTextSize(this, round, this._bounds);
  18299. }
  18300. return this._bounds;
  18301. },
  18302. /**
  18303. * Changes the font this BitmapText is using to render.
  18304. *
  18305. * The new texture is loaded and applied to the BitmapText. The existing test, size and alignment are preserved,
  18306. * unless overridden via the arguments.
  18307. *
  18308. * @method Phaser.GameObjects.BitmapText#setFont
  18309. * @since 3.11.0
  18310. *
  18311. * @param {string} font - The key of the font to use from the Bitmap Font cache.
  18312. * @param {number} [size] - The font size of this Bitmap Text. If not specified the current size will be used.
  18313. * @param {integer} [align=0] - The alignment of the text in a multi-line BitmapText object. If not specified the current alignment will be used.
  18314. *
  18315. * @return {this} This BitmapText Object.
  18316. */
  18317. setFont: function (key, size, align)
  18318. {
  18319. if (size === undefined) { size = this._fontSize; }
  18320. if (align === undefined) { align = this._align; }
  18321. if (key !== this.font)
  18322. {
  18323. var entry = this.scene.sys.cache.bitmapFont.get(key);
  18324. if (entry)
  18325. {
  18326. this.font = key;
  18327. this.fontData = entry.data;
  18328. this._fontSize = size;
  18329. this._align = align;
  18330. this.setTexture(entry.texture, entry.frame);
  18331. GetBitmapTextSize(this, false, this._bounds);
  18332. }
  18333. }
  18334. return this;
  18335. },
  18336. /**
  18337. * Controls the alignment of each line of text in this BitmapText object.
  18338. *
  18339. * Only has any effect when this BitmapText contains multiple lines of text, split with carriage-returns.
  18340. * Has no effect with single-lines of text.
  18341. *
  18342. * See the methods `setLeftAlign`, `setCenterAlign` and `setRightAlign`.
  18343. *
  18344. * 0 = Left aligned (default)
  18345. * 1 = Middle aligned
  18346. * 2 = Right aligned
  18347. *
  18348. * The alignment position is based on the longest line of text.
  18349. *
  18350. * @name Phaser.GameObjects.BitmapText#align
  18351. * @type {integer}
  18352. * @since 3.11.0
  18353. */
  18354. align: {
  18355. set: function (value)
  18356. {
  18357. this._align = value;
  18358. this._dirty = true;
  18359. },
  18360. get: function ()
  18361. {
  18362. return this._align;
  18363. }
  18364. },
  18365. /**
  18366. * The text that this Bitmap Text object displays.
  18367. *
  18368. * You can also use the method `setText` if you want a chainable way to change the text content.
  18369. *
  18370. * @name Phaser.GameObjects.BitmapText#text
  18371. * @type {string}
  18372. * @since 3.0.0
  18373. */
  18374. text: {
  18375. set: function (value)
  18376. {
  18377. this.setText(value);
  18378. },
  18379. get: function ()
  18380. {
  18381. return this._text;
  18382. }
  18383. },
  18384. /**
  18385. * The font size of this Bitmap Text.
  18386. *
  18387. * You can also use the method `setFontSize` if you want a chainable way to change the font size.
  18388. *
  18389. * @name Phaser.GameObjects.BitmapText#fontSize
  18390. * @type {number}
  18391. * @since 3.0.0
  18392. */
  18393. fontSize: {
  18394. set: function (value)
  18395. {
  18396. this._fontSize = value;
  18397. this._dirty = true;
  18398. },
  18399. get: function ()
  18400. {
  18401. return this._fontSize;
  18402. }
  18403. },
  18404. /**
  18405. * Adds / Removes spacing between characters.
  18406. *
  18407. * Can be a negative or positive number.
  18408. *
  18409. * You can also use the method `setLetterSpacing` if you want a chainable way to change the letter spacing.
  18410. *
  18411. * @name Phaser.GameObjects.BitmapText#letterSpacing
  18412. * @type {number}
  18413. * @since 3.0.0
  18414. */
  18415. letterSpacing: {
  18416. set: function (value)
  18417. {
  18418. this._letterSpacing = value;
  18419. this._dirty = true;
  18420. },
  18421. get: function ()
  18422. {
  18423. return this._letterSpacing;
  18424. }
  18425. },
  18426. /**
  18427. * The width of this Bitmap Text.
  18428. *
  18429. * @name Phaser.GameObjects.BitmapText#width
  18430. * @type {number}
  18431. * @readonly
  18432. * @since 3.0.0
  18433. */
  18434. width: {
  18435. get: function ()
  18436. {
  18437. this.getTextBounds(false);
  18438. return this._bounds.global.width;
  18439. }
  18440. },
  18441. /**
  18442. * The height of this bitmap text.
  18443. *
  18444. * @name Phaser.GameObjects.BitmapText#height
  18445. * @type {number}
  18446. * @readonly
  18447. * @since 3.0.0
  18448. */
  18449. height: {
  18450. get: function ()
  18451. {
  18452. this.getTextBounds(false);
  18453. return this._bounds.global.height;
  18454. }
  18455. },
  18456. /**
  18457. * Build a JSON representation of this Bitmap Text.
  18458. *
  18459. * @method Phaser.GameObjects.BitmapText#toJSON
  18460. * @since 3.0.0
  18461. *
  18462. * @return {JSONBitmapText} A JSON representation of this Bitmap Text.
  18463. */
  18464. toJSON: function ()
  18465. {
  18466. var out = Components.ToJSON(this);
  18467. // Extra data is added here
  18468. var data = {
  18469. font: this.font,
  18470. text: this.text,
  18471. fontSize: this.fontSize,
  18472. letterSpacing: this.letterSpacing,
  18473. align: this.align
  18474. };
  18475. out.data = data;
  18476. return out;
  18477. }
  18478. });
  18479. /**
  18480. * Left align the text characters in a multi-line BitmapText object.
  18481. *
  18482. * @name Phaser.GameObjects.BitmapText.ALIGN_LEFT
  18483. * @type {integer}
  18484. * @since 3.11.0
  18485. */
  18486. BitmapText.ALIGN_LEFT = 0;
  18487. /**
  18488. * Center align the text characters in a multi-line BitmapText object.
  18489. *
  18490. * @name Phaser.GameObjects.BitmapText.ALIGN_CENTER
  18491. * @type {integer}
  18492. * @since 3.11.0
  18493. */
  18494. BitmapText.ALIGN_CENTER = 1;
  18495. /**
  18496. * Right align the text characters in a multi-line BitmapText object.
  18497. *
  18498. * @name Phaser.GameObjects.BitmapText.ALIGN_RIGHT
  18499. * @type {integer}
  18500. * @since 3.11.0
  18501. */
  18502. BitmapText.ALIGN_RIGHT = 2;
  18503. /**
  18504. * Parse an XML Bitmap Font from an Atlas.
  18505. *
  18506. * Adds the parsed Bitmap Font data to the cache with the `fontName` key.
  18507. *
  18508. * @name Phaser.GameObjects.BitmapText.ParseFromAtlas
  18509. * @since 3.0.0
  18510. *
  18511. * @param {Phaser.Scene} scene - The Scene to parse the Bitmap Font for.
  18512. * @param {string} fontName - The key of the font to add to the Bitmap Font cache.
  18513. * @param {string} textureKey - The key of the BitmapFont's texture.
  18514. * @param {string} frameKey - The key of the BitmapFont texture's frame.
  18515. * @param {string} xmlKey - The key of the XML data of the font to parse.
  18516. * @param {integer} [xSpacing] - The x-axis spacing to add between each letter.
  18517. * @param {integer} [ySpacing] - The y-axis spacing to add to the line height.
  18518. *
  18519. * @return {boolean} Whether the parsing was successful or not.
  18520. */
  18521. BitmapText.ParseFromAtlas = ParseFromAtlas;
  18522. module.exports = BitmapText;
  18523. /***/ }),
  18524. /* 118 */
  18525. /***/ (function(module, exports, __webpack_require__) {
  18526. /**
  18527. * @author Richard Davey <rich@photonstorm.com>
  18528. * @copyright 2019 Photon Storm Ltd.
  18529. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  18530. */
  18531. //! stable.js 0.1.6, https://github.com/Two-Screen/stable
  18532. //! © 2017 Angry Bytes and contributors. MIT licensed.
  18533. /**
  18534. * @namespace Phaser.Utils.Array.StableSortFunctions
  18535. */
  18536. (function() {
  18537. /**
  18538. * A stable array sort, because `Array#sort()` is not guaranteed stable.
  18539. * This is an implementation of merge sort, without recursion.
  18540. *
  18541. * @function Phaser.Utils.Array.StableSort
  18542. * @since 3.0.0
  18543. *
  18544. * @param {array} arr - The input array to be sorted.
  18545. * @param {function} comp - The comparison handler.
  18546. *
  18547. * @return {array} The sorted result.
  18548. */
  18549. var stable = function(arr, comp) {
  18550. return exec(arr.slice(), comp);
  18551. };
  18552. /**
  18553. * Sort the input array and simply copy it back if the result isn't in the original array, which happens on an odd number of passes.
  18554. *
  18555. * @function Phaser.Utils.Array.StableSortFunctions.inplace
  18556. * @memberof Phaser.Utils.Array.StableSortFunctions
  18557. * @since 3.0.0
  18558. *
  18559. * @param {array} arr - The input array.
  18560. * @param {function} comp - The comparison handler.
  18561. *
  18562. * @return {array} The sorted array.
  18563. */
  18564. stable.inplace = function(arr, comp) {
  18565. var result = exec(arr, comp);
  18566. // This simply copies back if the result isn't in the original array,
  18567. // which happens on an odd number of passes.
  18568. if (result !== arr) {
  18569. pass(result, null, arr.length, arr);
  18570. }
  18571. return arr;
  18572. };
  18573. // Execute the sort using the input array and a second buffer as work space.
  18574. // Returns one of those two, containing the final result.
  18575. function exec(arr, comp) {
  18576. if (typeof(comp) !== 'function') {
  18577. comp = function(a, b) {
  18578. return String(a).localeCompare(b);
  18579. };
  18580. }
  18581. // Short-circuit when there's nothing to sort.
  18582. var len = arr.length;
  18583. if (len <= 1) {
  18584. return arr;
  18585. }
  18586. // Rather than dividing input, simply iterate chunks of 1, 2, 4, 8, etc.
  18587. // Chunks are the size of the left or right hand in merge sort.
  18588. // Stop when the left-hand covers all of the array.
  18589. var buffer = new Array(len);
  18590. for (var chk = 1; chk < len; chk *= 2) {
  18591. pass(arr, comp, chk, buffer);
  18592. var tmp = arr;
  18593. arr = buffer;
  18594. buffer = tmp;
  18595. }
  18596. return arr;
  18597. }
  18598. // Run a single pass with the given chunk size.
  18599. var pass = function(arr, comp, chk, result) {
  18600. var len = arr.length;
  18601. var i = 0;
  18602. // Step size / double chunk size.
  18603. var dbl = chk * 2;
  18604. // Bounds of the left and right chunks.
  18605. var l, r, e;
  18606. // Iterators over the left and right chunk.
  18607. var li, ri;
  18608. // Iterate over pairs of chunks.
  18609. for (l = 0; l < len; l += dbl) {
  18610. r = l + chk;
  18611. e = r + chk;
  18612. if (r > len) r = len;
  18613. if (e > len) e = len;
  18614. // Iterate both chunks in parallel.
  18615. li = l;
  18616. ri = r;
  18617. while (true) {
  18618. // Compare the chunks.
  18619. if (li < r && ri < e) {
  18620. // This works for a regular `sort()` compatible comparator,
  18621. // but also for a simple comparator like: `a > b`
  18622. if (comp(arr[li], arr[ri]) <= 0) {
  18623. result[i++] = arr[li++];
  18624. }
  18625. else {
  18626. result[i++] = arr[ri++];
  18627. }
  18628. }
  18629. // Nothing to compare, just flush what's left.
  18630. else if (li < r) {
  18631. result[i++] = arr[li++];
  18632. }
  18633. else if (ri < e) {
  18634. result[i++] = arr[ri++];
  18635. }
  18636. // Both iterators are at the chunk ends.
  18637. else {
  18638. break;
  18639. }
  18640. }
  18641. }
  18642. };
  18643. // Export using CommonJS or to the window.
  18644. if (true) {
  18645. module.exports = stable;
  18646. }
  18647. else {}
  18648. })();
  18649. /***/ }),
  18650. /* 119 */
  18651. /***/ (function(module, exports, __webpack_require__) {
  18652. /**
  18653. * @author Richard Davey <rich@photonstorm.com>
  18654. * @copyright 2019 Photon Storm Ltd.
  18655. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  18656. */
  18657. var CheckMatrix = __webpack_require__(173);
  18658. var TransposeMatrix = __webpack_require__(318);
  18659. /**
  18660. * Rotates the array matrix based on the given rotation value.
  18661. *
  18662. * The value can be given in degrees: 90, -90, 270, -270 or 180,
  18663. * or a string command: `rotateLeft`, `rotateRight` or `rotate180`.
  18664. *
  18665. * Based on the routine from {@link http://jsfiddle.net/MrPolywhirl/NH42z/}.
  18666. *
  18667. * @function Phaser.Utils.Array.Matrix.RotateMatrix
  18668. * @since 3.0.0
  18669. *
  18670. * @param {array} matrix - The array to rotate.
  18671. * @param {(number|string)} [direction=90] - The amount to rotate the matrix by.
  18672. *
  18673. * @return {array} The rotated matrix array. The source matrix should be discard for the returned matrix.
  18674. */
  18675. var RotateMatrix = function (matrix, direction)
  18676. {
  18677. if (direction === undefined) { direction = 90; }
  18678. if (!CheckMatrix(matrix))
  18679. {
  18680. return null;
  18681. }
  18682. if (typeof direction !== 'string')
  18683. {
  18684. direction = ((direction % 360) + 360) % 360;
  18685. }
  18686. if (direction === 90 || direction === -270 || direction === 'rotateLeft')
  18687. {
  18688. matrix = TransposeMatrix(matrix);
  18689. matrix.reverse();
  18690. }
  18691. else if (direction === -90 || direction === 270 || direction === 'rotateRight')
  18692. {
  18693. matrix.reverse();
  18694. matrix = TransposeMatrix(matrix);
  18695. }
  18696. else if (Math.abs(direction) === 180 || direction === 'rotate180')
  18697. {
  18698. for (var i = 0; i < matrix.length; i++)
  18699. {
  18700. matrix[i].reverse();
  18701. }
  18702. matrix.reverse();
  18703. }
  18704. return matrix;
  18705. };
  18706. module.exports = RotateMatrix;
  18707. /***/ }),
  18708. /* 120 */
  18709. /***/ (function(module, exports, __webpack_require__) {
  18710. /**
  18711. * @author Richard Davey <rich@photonstorm.com>
  18712. * @copyright 2019 Photon Storm Ltd.
  18713. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  18714. */
  18715. var ArrayUtils = __webpack_require__(174);
  18716. var Class = __webpack_require__(0);
  18717. var NOOP = __webpack_require__(1);
  18718. var StableSort = __webpack_require__(118);
  18719. /**
  18720. * @callback EachListCallback<I>
  18721. *
  18722. * @param {I} item - The item which is currently being processed.
  18723. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  18724. */
  18725. /**
  18726. * @classdesc
  18727. * List is a generic implementation of an ordered list which contains utility methods for retrieving, manipulating, and iterating items.
  18728. *
  18729. * @class List
  18730. * @memberof Phaser.Structs
  18731. * @constructor
  18732. * @since 3.0.0
  18733. *
  18734. * @generic T
  18735. *
  18736. * @param {*} parent - The parent of this list.
  18737. */
  18738. var List = new Class({
  18739. initialize:
  18740. function List (parent)
  18741. {
  18742. /**
  18743. * The parent of this list.
  18744. *
  18745. * @name Phaser.Structs.List#parent
  18746. * @type {*}
  18747. * @since 3.0.0
  18748. */
  18749. this.parent = parent;
  18750. /**
  18751. * The objects that belong to this collection.
  18752. *
  18753. * @genericUse {T[]} - [$type]
  18754. *
  18755. * @name Phaser.Structs.List#list
  18756. * @type {Array.<*>}
  18757. * @default []
  18758. * @since 3.0.0
  18759. */
  18760. this.list = [];
  18761. /**
  18762. * The index of the current element.
  18763. *
  18764. * This is used internally when iterating through the list with the {@link #first}, {@link #last}, {@link #get}, and {@link #previous} properties.
  18765. *
  18766. * @name Phaser.Structs.List#position
  18767. * @type {integer}
  18768. * @default 0
  18769. * @since 3.0.0
  18770. */
  18771. this.position = 0;
  18772. /**
  18773. * A callback that is invoked every time a child is added to this list.
  18774. *
  18775. * @name Phaser.Structs.List#addCallback
  18776. * @type {function}
  18777. * @since 3.4.0
  18778. */
  18779. this.addCallback = NOOP;
  18780. /**
  18781. * A callback that is invoked every time a child is removed from this list.
  18782. *
  18783. * @name Phaser.Structs.List#removeCallback
  18784. * @type {function}
  18785. * @since 3.4.0
  18786. */
  18787. this.removeCallback = NOOP;
  18788. /**
  18789. * The property key to sort by.
  18790. *
  18791. * @name Phaser.Structs.List#_sortKey
  18792. * @type {string}
  18793. * @since 3.4.0
  18794. */
  18795. this._sortKey = '';
  18796. },
  18797. /**
  18798. * Adds the given item to the end of the list. Each item must be unique.
  18799. *
  18800. * @method Phaser.Structs.List#add
  18801. * @since 3.0.0
  18802. *
  18803. * @genericUse {T} - [child,$return]
  18804. *
  18805. * @param {*|Array.<*>} child - The item, or array of items, to add to the list.
  18806. * @param {boolean} [skipCallback=false] - Skip calling the List.addCallback if this child is added successfully.
  18807. *
  18808. * @return {*} The list's underlying array.
  18809. */
  18810. add: function (child, skipCallback)
  18811. {
  18812. if (skipCallback)
  18813. {
  18814. return ArrayUtils.Add(this.list, child);
  18815. }
  18816. else
  18817. {
  18818. return ArrayUtils.Add(this.list, child, 0, this.addCallback, this);
  18819. }
  18820. },
  18821. /**
  18822. * Adds an item to list, starting at a specified index. Each item must be unique within the list.
  18823. *
  18824. * @method Phaser.Structs.List#addAt
  18825. * @since 3.0.0
  18826. *
  18827. * @genericUse {T} - [child,$return]
  18828. *
  18829. * @param {*} child - The item, or array of items, to add to the list.
  18830. * @param {integer} [index=0] - The index in the list at which the element(s) will be inserted.
  18831. * @param {boolean} [skipCallback=false] - Skip calling the List.addCallback if this child is added successfully.
  18832. *
  18833. * @return {*} The List's underlying array.
  18834. */
  18835. addAt: function (child, index, skipCallback)
  18836. {
  18837. if (skipCallback)
  18838. {
  18839. return ArrayUtils.AddAt(this.list, child, index);
  18840. }
  18841. else
  18842. {
  18843. return ArrayUtils.AddAt(this.list, child, index, 0, this.addCallback, this);
  18844. }
  18845. },
  18846. /**
  18847. * Retrieves the item at a given position inside the List.
  18848. *
  18849. * @method Phaser.Structs.List#getAt
  18850. * @since 3.0.0
  18851. *
  18852. * @genericUse {T} - [$return]
  18853. *
  18854. * @param {integer} index - The index of the item.
  18855. *
  18856. * @return {*} The retrieved item, or `undefined` if it's outside the List's bounds.
  18857. */
  18858. getAt: function (index)
  18859. {
  18860. return this.list[index];
  18861. },
  18862. /**
  18863. * Locates an item within the List and returns its index.
  18864. *
  18865. * @method Phaser.Structs.List#getIndex
  18866. * @since 3.0.0
  18867. *
  18868. * @genericUse {T} - [child]
  18869. *
  18870. * @param {*} child - The item to locate.
  18871. *
  18872. * @return {integer} The index of the item within the List, or -1 if it's not in the List.
  18873. */
  18874. getIndex: function (child)
  18875. {
  18876. // Return -1 if given child isn't a child of this display list
  18877. return this.list.indexOf(child);
  18878. },
  18879. /**
  18880. * Sort the contents of this List so the items are in order based on the given property.
  18881. * For example, `sort('alpha')` would sort the List contents based on the value of their `alpha` property.
  18882. *
  18883. * @method Phaser.Structs.List#sort
  18884. * @since 3.0.0
  18885. *
  18886. * @genericUse {T[]} - [children,$return]
  18887. *
  18888. * @param {string} property - The property to lexically sort by.
  18889. * @param {function} [handler] - Provide your own custom handler function. Will receive 2 children which it should compare and return a boolean.
  18890. *
  18891. * @return {Phaser.Structs.List} This List object.
  18892. */
  18893. sort: function (property, handler)
  18894. {
  18895. if (!property)
  18896. {
  18897. return this;
  18898. }
  18899. if (handler === undefined)
  18900. {
  18901. handler = function (childA, childB)
  18902. {
  18903. return childA[property] - childB[property];
  18904. };
  18905. }
  18906. StableSort.inplace(this.list, handler);
  18907. return this;
  18908. },
  18909. /**
  18910. * Searches for the first instance of a child with its `name`
  18911. * property matching the given argument. Should more than one child have
  18912. * the same name only the first is returned.
  18913. *
  18914. * @method Phaser.Structs.List#getByName
  18915. * @since 3.0.0
  18916. *
  18917. * @genericUse {T | null} - [$return]
  18918. *
  18919. * @param {string} name - The name to search for.
  18920. *
  18921. * @return {?*} The first child with a matching name, or null if none were found.
  18922. */
  18923. getByName: function (name)
  18924. {
  18925. return ArrayUtils.GetFirst(this.list, 'name', name);
  18926. },
  18927. /**
  18928. * Returns a random child from the group.
  18929. *
  18930. * @method Phaser.Structs.List#getRandom
  18931. * @since 3.0.0
  18932. *
  18933. * @genericUse {T | null} - [$return]
  18934. *
  18935. * @param {integer} [startIndex=0] - Offset from the front of the group (lowest child).
  18936. * @param {integer} [length=(to top)] - Restriction on the number of values you want to randomly select from.
  18937. *
  18938. * @return {?*} A random child of this Group.
  18939. */
  18940. getRandom: function (startIndex, length)
  18941. {
  18942. return ArrayUtils.GetRandom(this.list, startIndex, length);
  18943. },
  18944. /**
  18945. * Returns the first element in a given part of the List which matches a specific criterion.
  18946. *
  18947. * @method Phaser.Structs.List#getFirst
  18948. * @since 3.0.0
  18949. *
  18950. * @genericUse {T | null} - [$return]
  18951. *
  18952. * @param {string} property - The name of the property to test or a falsey value to have no criterion.
  18953. * @param {*} value - The value to test the `property` against, or `undefined` to allow any value and only check for existence.
  18954. * @param {number} [startIndex=0] - The position in the List to start the search at.
  18955. * @param {number} [endIndex] - The position in the List to optionally stop the search at. It won't be checked.
  18956. *
  18957. * @return {?*} The first item which matches the given criterion, or `null` if no such item exists.
  18958. */
  18959. getFirst: function (property, value, startIndex, endIndex)
  18960. {
  18961. return ArrayUtils.GetFirst(this.list, property, value, startIndex, endIndex);
  18962. },
  18963. /**
  18964. * Returns all children in this List.
  18965. *
  18966. * You can optionally specify a matching criteria using the `property` and `value` arguments.
  18967. *
  18968. * For example: `getAll('parent')` would return only children that have a property called `parent`.
  18969. *
  18970. * You can also specify a value to compare the property to:
  18971. *
  18972. * `getAll('visible', true)` would return only children that have their visible property set to `true`.
  18973. *
  18974. * Optionally you can specify a start and end index. For example if this List had 100 children,
  18975. * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only
  18976. * the first 50 children in the List.
  18977. *
  18978. * @method Phaser.Structs.List#getAll
  18979. * @since 3.0.0
  18980. *
  18981. * @genericUse {T} - [value]
  18982. * @genericUse {T[]} - [$return]
  18983. *
  18984. * @param {string} [property] - An optional property to test against the value argument.
  18985. * @param {*} [value] - If property is set then Child.property must strictly equal this value to be included in the results.
  18986. * @param {integer} [startIndex] - The first child index to start the search from.
  18987. * @param {integer} [endIndex] - The last child index to search up until.
  18988. *
  18989. * @return {Array.<*>} All items of the List which match the given criterion, if any.
  18990. */
  18991. getAll: function (property, value, startIndex, endIndex)
  18992. {
  18993. return ArrayUtils.GetAll(this.list, property, value, startIndex, endIndex);
  18994. },
  18995. /**
  18996. * Returns the total number of items in the List which have a property matching the given value.
  18997. *
  18998. * @method Phaser.Structs.List#count
  18999. * @since 3.0.0
  19000. *
  19001. * @genericUse {T} - [value]
  19002. *
  19003. * @param {string} property - The property to test on each item.
  19004. * @param {*} value - The value to test the property against.
  19005. *
  19006. * @return {integer} The total number of matching elements.
  19007. */
  19008. count: function (property, value)
  19009. {
  19010. return ArrayUtils.CountAllMatching(this.list, property, value);
  19011. },
  19012. /**
  19013. * Swaps the positions of two items in the list.
  19014. *
  19015. * @method Phaser.Structs.List#swap
  19016. * @since 3.0.0
  19017. *
  19018. * @genericUse {T} - [child1,child2]
  19019. *
  19020. * @param {*} child1 - The first item to swap.
  19021. * @param {*} child2 - The second item to swap.
  19022. */
  19023. swap: function (child1, child2)
  19024. {
  19025. ArrayUtils.Swap(this.list, child1, child2);
  19026. },
  19027. /**
  19028. * Moves an item in the List to a new position.
  19029. *
  19030. * @method Phaser.Structs.List#moveTo
  19031. * @since 3.0.0
  19032. *
  19033. * @genericUse {T} - [child,$return]
  19034. *
  19035. * @param {*} child - The item to move.
  19036. * @param {integer} index - Moves an item in the List to a new position.
  19037. *
  19038. * @return {*} The item that was moved.
  19039. */
  19040. moveTo: function (child, index)
  19041. {
  19042. return ArrayUtils.MoveTo(this.list, child, index);
  19043. },
  19044. /**
  19045. * Removes one or many items from the List.
  19046. *
  19047. * @method Phaser.Structs.List#remove
  19048. * @since 3.0.0
  19049. *
  19050. * @genericUse {T} - [child,$return]
  19051. *
  19052. * @param {*} child - The item, or array of items, to remove.
  19053. * @param {boolean} [skipCallback=false] - Skip calling the List.removeCallback.
  19054. *
  19055. * @return {*} The item, or array of items, which were successfully removed from the List.
  19056. */
  19057. remove: function (child, skipCallback)
  19058. {
  19059. if (skipCallback)
  19060. {
  19061. return ArrayUtils.Remove(this.list, child);
  19062. }
  19063. else
  19064. {
  19065. return ArrayUtils.Remove(this.list, child, this.removeCallback, this);
  19066. }
  19067. },
  19068. /**
  19069. * Removes the item at the given position in the List.
  19070. *
  19071. * @method Phaser.Structs.List#removeAt
  19072. * @since 3.0.0
  19073. *
  19074. * @genericUse {T} - [$return]
  19075. *
  19076. * @param {integer} index - The position to remove the item from.
  19077. * @param {boolean} [skipCallback=false] - Skip calling the List.removeCallback.
  19078. *
  19079. * @return {*} The item that was removed.
  19080. */
  19081. removeAt: function (index, skipCallback)
  19082. {
  19083. if (skipCallback)
  19084. {
  19085. return ArrayUtils.RemoveAt(this.list, index);
  19086. }
  19087. else
  19088. {
  19089. return ArrayUtils.RemoveAt(this.list, index, this.removeCallback, this);
  19090. }
  19091. },
  19092. /**
  19093. * Removes the items within the given range in the List.
  19094. *
  19095. * @method Phaser.Structs.List#removeBetween
  19096. * @since 3.0.0
  19097. *
  19098. * @genericUse {T[]} - [$return]
  19099. *
  19100. * @param {integer} [startIndex=0] - The index to start removing from.
  19101. * @param {integer} [endIndex] - The position to stop removing at. The item at this position won't be removed.
  19102. * @param {boolean} [skipCallback=false] - Skip calling the List.removeCallback.
  19103. *
  19104. * @return {Array.<*>} An array of the items which were removed.
  19105. */
  19106. removeBetween: function (startIndex, endIndex, skipCallback)
  19107. {
  19108. if (skipCallback)
  19109. {
  19110. return ArrayUtils.RemoveBetween(this.list, startIndex, endIndex);
  19111. }
  19112. else
  19113. {
  19114. return ArrayUtils.RemoveBetween(this.list, startIndex, endIndex, this.removeCallback, this);
  19115. }
  19116. },
  19117. /**
  19118. * Removes all the items.
  19119. *
  19120. * @method Phaser.Structs.List#removeAll
  19121. * @since 3.0.0
  19122. *
  19123. * @genericUse {Phaser.Structs.List.<T>} - [$return]
  19124. *
  19125. * @param {boolean} [skipCallback=false] - Skip calling the List.removeCallback.
  19126. *
  19127. * @return {Phaser.Structs.List} This List object.
  19128. */
  19129. removeAll: function (skipCallback)
  19130. {
  19131. var i = this.list.length;
  19132. while (i--)
  19133. {
  19134. this.remove(this.list[i], skipCallback);
  19135. }
  19136. return this;
  19137. },
  19138. /**
  19139. * Brings the given child to the top of this List.
  19140. *
  19141. * @method Phaser.Structs.List#bringToTop
  19142. * @since 3.0.0
  19143. *
  19144. * @genericUse {T} - [child,$return]
  19145. *
  19146. * @param {*} child - The item to bring to the top of the List.
  19147. *
  19148. * @return {*} The item which was moved.
  19149. */
  19150. bringToTop: function (child)
  19151. {
  19152. return ArrayUtils.BringToTop(this.list, child);
  19153. },
  19154. /**
  19155. * Sends the given child to the bottom of this List.
  19156. *
  19157. * @method Phaser.Structs.List#sendToBack
  19158. * @since 3.0.0
  19159. *
  19160. * @genericUse {T} - [child,$return]
  19161. *
  19162. * @param {*} child - The item to send to the back of the list.
  19163. *
  19164. * @return {*} The item which was moved.
  19165. */
  19166. sendToBack: function (child)
  19167. {
  19168. return ArrayUtils.SendToBack(this.list, child);
  19169. },
  19170. /**
  19171. * Moves the given child up one place in this group unless it's already at the top.
  19172. *
  19173. * @method Phaser.Structs.List#moveUp
  19174. * @since 3.0.0
  19175. *
  19176. * @genericUse {T} - [child,$return]
  19177. *
  19178. * @param {*} child - The item to move up.
  19179. *
  19180. * @return {*} The item which was moved.
  19181. */
  19182. moveUp: function (child)
  19183. {
  19184. ArrayUtils.MoveUp(this.list, child);
  19185. return child;
  19186. },
  19187. /**
  19188. * Moves the given child down one place in this group unless it's already at the bottom.
  19189. *
  19190. * @method Phaser.Structs.List#moveDown
  19191. * @since 3.0.0
  19192. *
  19193. * @genericUse {T} - [child,$return]
  19194. *
  19195. * @param {*} child - The item to move down.
  19196. *
  19197. * @return {*} The item which was moved.
  19198. */
  19199. moveDown: function (child)
  19200. {
  19201. ArrayUtils.MoveDown(this.list, child);
  19202. return child;
  19203. },
  19204. /**
  19205. * Reverses the order of all children in this List.
  19206. *
  19207. * @method Phaser.Structs.List#reverse
  19208. * @since 3.0.0
  19209. *
  19210. * @genericUse {Phaser.Structs.List.<T>} - [$return]
  19211. *
  19212. * @return {Phaser.Structs.List} This List object.
  19213. */
  19214. reverse: function ()
  19215. {
  19216. this.list.reverse();
  19217. return this;
  19218. },
  19219. /**
  19220. * Shuffles the items in the list.
  19221. *
  19222. * @method Phaser.Structs.List#shuffle
  19223. * @since 3.0.0
  19224. *
  19225. * @genericUse {Phaser.Structs.List.<T>} - [$return]
  19226. *
  19227. * @return {Phaser.Structs.List} This List object.
  19228. */
  19229. shuffle: function ()
  19230. {
  19231. ArrayUtils.Shuffle(this.list);
  19232. return this;
  19233. },
  19234. /**
  19235. * Replaces a child of this List with the given newChild. The newChild cannot be a member of this List.
  19236. *
  19237. * @method Phaser.Structs.List#replace
  19238. * @since 3.0.0
  19239. *
  19240. * @genericUse {T} - [oldChild,newChild,$return]
  19241. *
  19242. * @param {*} oldChild - The child in this List that will be replaced.
  19243. * @param {*} newChild - The child to be inserted into this List.
  19244. *
  19245. * @return {*} Returns the oldChild that was replaced within this group.
  19246. */
  19247. replace: function (oldChild, newChild)
  19248. {
  19249. return ArrayUtils.Replace(this.list, oldChild, newChild);
  19250. },
  19251. /**
  19252. * Checks if an item exists within the List.
  19253. *
  19254. * @method Phaser.Structs.List#exists
  19255. * @since 3.0.0
  19256. *
  19257. * @genericUse {T} - [child]
  19258. *
  19259. * @param {*} child - The item to check for the existence of.
  19260. *
  19261. * @return {boolean} `true` if the item is found in the list, otherwise `false`.
  19262. */
  19263. exists: function (child)
  19264. {
  19265. return (this.list.indexOf(child) > -1);
  19266. },
  19267. /**
  19268. * Sets the property `key` to the given value on all members of this List.
  19269. *
  19270. * @method Phaser.Structs.List#setAll
  19271. * @since 3.0.0
  19272. *
  19273. * @genericUse {T} - [value]
  19274. *
  19275. * @param {string} property - The name of the property to set.
  19276. * @param {*} value - The value to set the property to.
  19277. * @param {integer} [startIndex] - The first child index to start the search from.
  19278. * @param {integer} [endIndex] - The last child index to search up until.
  19279. */
  19280. setAll: function (property, value, startIndex, endIndex)
  19281. {
  19282. ArrayUtils.SetAll(this.list, property, value, startIndex, endIndex);
  19283. return this;
  19284. },
  19285. /**
  19286. * Passes all children to the given callback.
  19287. *
  19288. * @method Phaser.Structs.List#each
  19289. * @since 3.0.0
  19290. *
  19291. * @genericUse {EachListCallback.<T>} - [callback]
  19292. *
  19293. * @param {EachListCallback} callback - The function to call.
  19294. * @param {*} [context] - Value to use as `this` when executing callback.
  19295. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  19296. */
  19297. each: function (callback, context)
  19298. {
  19299. var args = [ null ];
  19300. for (var i = 2; i < arguments.length; i++)
  19301. {
  19302. args.push(arguments[i]);
  19303. }
  19304. for (i = 0; i < this.list.length; i++)
  19305. {
  19306. args[0] = this.list[i];
  19307. callback.apply(context, args);
  19308. }
  19309. },
  19310. /**
  19311. * Clears the List and recreates its internal array.
  19312. *
  19313. * @method Phaser.Structs.List#shutdown
  19314. * @since 3.0.0
  19315. */
  19316. shutdown: function ()
  19317. {
  19318. this.removeAll();
  19319. this.list = [];
  19320. },
  19321. /**
  19322. * Destroys this List.
  19323. *
  19324. * @method Phaser.Structs.List#destroy
  19325. * @since 3.0.0
  19326. */
  19327. destroy: function ()
  19328. {
  19329. this.removeAll();
  19330. this.parent = null;
  19331. this.addCallback = null;
  19332. this.removeCallback = null;
  19333. },
  19334. /**
  19335. * The number of items inside the List.
  19336. *
  19337. * @name Phaser.Structs.List#length
  19338. * @type {integer}
  19339. * @readonly
  19340. * @since 3.0.0
  19341. */
  19342. length: {
  19343. get: function ()
  19344. {
  19345. return this.list.length;
  19346. }
  19347. },
  19348. /**
  19349. * The first item in the List or `null` for an empty List.
  19350. *
  19351. * @name Phaser.Structs.List#first
  19352. * @genericUse {T} - [$type]
  19353. * @type {*}
  19354. * @readonly
  19355. * @since 3.0.0
  19356. */
  19357. first: {
  19358. get: function ()
  19359. {
  19360. this.position = 0;
  19361. if (this.list.length > 0)
  19362. {
  19363. return this.list[0];
  19364. }
  19365. else
  19366. {
  19367. return null;
  19368. }
  19369. }
  19370. },
  19371. /**
  19372. * The last item in the List, or `null` for an empty List.
  19373. *
  19374. * @name Phaser.Structs.List#last
  19375. * @genericUse {T} - [$type]
  19376. * @type {*}
  19377. * @readonly
  19378. * @since 3.0.0
  19379. */
  19380. last: {
  19381. get: function ()
  19382. {
  19383. if (this.list.length > 0)
  19384. {
  19385. this.position = this.list.length - 1;
  19386. return this.list[this.position];
  19387. }
  19388. else
  19389. {
  19390. return null;
  19391. }
  19392. }
  19393. },
  19394. /**
  19395. * The next item in the List, or `null` if the entire List has been traversed.
  19396. *
  19397. * This property can be read successively after reading {@link #first} or manually setting the {@link #position} to iterate the List.
  19398. *
  19399. * @name Phaser.Structs.List#next
  19400. * @genericUse {T} - [$type]
  19401. * @type {*}
  19402. * @readonly
  19403. * @since 3.0.0
  19404. */
  19405. next: {
  19406. get: function ()
  19407. {
  19408. if (this.position < this.list.length)
  19409. {
  19410. this.position++;
  19411. return this.list[this.position];
  19412. }
  19413. else
  19414. {
  19415. return null;
  19416. }
  19417. }
  19418. },
  19419. /**
  19420. * The previous item in the List, or `null` if the entire List has been traversed.
  19421. *
  19422. * This property can be read successively after reading {@link #last} or manually setting the {@link #position} to iterate the List backwards.
  19423. *
  19424. * @name Phaser.Structs.List#previous
  19425. * @genericUse {T} - [$type]
  19426. * @type {*}
  19427. * @readonly
  19428. * @since 3.0.0
  19429. */
  19430. previous: {
  19431. get: function ()
  19432. {
  19433. if (this.position > 0)
  19434. {
  19435. this.position--;
  19436. return this.list[this.position];
  19437. }
  19438. else
  19439. {
  19440. return null;
  19441. }
  19442. }
  19443. }
  19444. });
  19445. module.exports = List;
  19446. /***/ }),
  19447. /* 121 */
  19448. /***/ (function(module, exports, __webpack_require__) {
  19449. /**
  19450. * @author Richard Davey <rich@photonstorm.com>
  19451. * @copyright 2019 Photon Storm Ltd.
  19452. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  19453. */
  19454. var Class = __webpack_require__(0);
  19455. var Clamp = __webpack_require__(23);
  19456. var Extend = __webpack_require__(19);
  19457. /**
  19458. * @classdesc
  19459. * A Frame is a section of a Texture.
  19460. *
  19461. * @class Frame
  19462. * @memberof Phaser.Textures
  19463. * @constructor
  19464. * @since 3.0.0
  19465. *
  19466. * @param {Phaser.Textures.Texture} texture - The Texture this Frame is a part of.
  19467. * @param {(integer|string)} name - The name of this Frame. The name is unique within the Texture.
  19468. * @param {integer} sourceIndex - The index of the TextureSource that this Frame is a part of.
  19469. * @param {number} x - The x coordinate of the top-left of this Frame.
  19470. * @param {number} y - The y coordinate of the top-left of this Frame.
  19471. * @param {number} width - The width of this Frame.
  19472. * @param {number} height - The height of this Frame.
  19473. */
  19474. var Frame = new Class({
  19475. initialize:
  19476. function Frame (texture, name, sourceIndex, x, y, width, height)
  19477. {
  19478. /**
  19479. * The Texture this Frame is a part of.
  19480. *
  19481. * @name Phaser.Textures.Frame#texture
  19482. * @type {Phaser.Textures.Texture}
  19483. * @since 3.0.0
  19484. */
  19485. this.texture = texture;
  19486. /**
  19487. * The name of this Frame.
  19488. * The name is unique within the Texture.
  19489. *
  19490. * @name Phaser.Textures.Frame#name
  19491. * @type {string}
  19492. * @since 3.0.0
  19493. */
  19494. this.name = name;
  19495. /**
  19496. * The TextureSource this Frame is part of.
  19497. *
  19498. * @name Phaser.Textures.Frame#source
  19499. * @type {Phaser.Textures.TextureSource}
  19500. * @since 3.0.0
  19501. */
  19502. this.source = texture.source[sourceIndex];
  19503. /**
  19504. * The index of the TextureSource in the Texture sources array.
  19505. *
  19506. * @name Phaser.Textures.Frame#sourceIndex
  19507. * @type {integer}
  19508. * @since 3.0.0
  19509. */
  19510. this.sourceIndex = sourceIndex;
  19511. /**
  19512. * A reference to the Texture Source WebGL Texture that this Frame is using.
  19513. *
  19514. * @name Phaser.Textures.Frame#glTexture
  19515. * @type {?WebGLTexture}
  19516. * @default null
  19517. * @since 3.11.0
  19518. */
  19519. this.glTexture = this.source.glTexture;
  19520. /**
  19521. * X position within the source image to cut from.
  19522. *
  19523. * @name Phaser.Textures.Frame#cutX
  19524. * @type {integer}
  19525. * @since 3.0.0
  19526. */
  19527. this.cutX;
  19528. /**
  19529. * Y position within the source image to cut from.
  19530. *
  19531. * @name Phaser.Textures.Frame#cutY
  19532. * @type {integer}
  19533. * @since 3.0.0
  19534. */
  19535. this.cutY;
  19536. /**
  19537. * The width of the area in the source image to cut.
  19538. *
  19539. * @name Phaser.Textures.Frame#cutWidth
  19540. * @type {integer}
  19541. * @since 3.0.0
  19542. */
  19543. this.cutWidth;
  19544. /**
  19545. * The height of the area in the source image to cut.
  19546. *
  19547. * @name Phaser.Textures.Frame#cutHeight
  19548. * @type {integer}
  19549. * @since 3.0.0
  19550. */
  19551. this.cutHeight;
  19552. /**
  19553. * The X rendering offset of this Frame, taking trim into account.
  19554. *
  19555. * @name Phaser.Textures.Frame#x
  19556. * @type {integer}
  19557. * @default 0
  19558. * @since 3.0.0
  19559. */
  19560. this.x = 0;
  19561. /**
  19562. * The Y rendering offset of this Frame, taking trim into account.
  19563. *
  19564. * @name Phaser.Textures.Frame#y
  19565. * @type {integer}
  19566. * @default 0
  19567. * @since 3.0.0
  19568. */
  19569. this.y = 0;
  19570. /**
  19571. * The rendering width of this Frame, taking trim into account.
  19572. *
  19573. * @name Phaser.Textures.Frame#width
  19574. * @type {integer}
  19575. * @since 3.0.0
  19576. */
  19577. this.width;
  19578. /**
  19579. * The rendering height of this Frame, taking trim into account.
  19580. *
  19581. * @name Phaser.Textures.Frame#height
  19582. * @type {integer}
  19583. * @since 3.0.0
  19584. */
  19585. this.height;
  19586. /**
  19587. * Half the width, floored.
  19588. * Precalculated for the renderer.
  19589. *
  19590. * @name Phaser.Textures.Frame#halfWidth
  19591. * @type {integer}
  19592. * @since 3.0.0
  19593. */
  19594. this.halfWidth;
  19595. /**
  19596. * Half the height, floored.
  19597. * Precalculated for the renderer.
  19598. *
  19599. * @name Phaser.Textures.Frame#halfHeight
  19600. * @type {integer}
  19601. * @since 3.0.0
  19602. */
  19603. this.halfHeight;
  19604. /**
  19605. * The x center of this frame, floored.
  19606. *
  19607. * @name Phaser.Textures.Frame#centerX
  19608. * @type {integer}
  19609. * @since 3.0.0
  19610. */
  19611. this.centerX;
  19612. /**
  19613. * The y center of this frame, floored.
  19614. *
  19615. * @name Phaser.Textures.Frame#centerY
  19616. * @type {integer}
  19617. * @since 3.0.0
  19618. */
  19619. this.centerY;
  19620. /**
  19621. * The horizontal pivot point of this Frame.
  19622. *
  19623. * @name Phaser.Textures.Frame#pivotX
  19624. * @type {number}
  19625. * @default 0
  19626. * @since 3.0.0
  19627. */
  19628. this.pivotX = 0;
  19629. /**
  19630. * The vertical pivot point of this Frame.
  19631. *
  19632. * @name Phaser.Textures.Frame#pivotY
  19633. * @type {number}
  19634. * @default 0
  19635. * @since 3.0.0
  19636. */
  19637. this.pivotY = 0;
  19638. /**
  19639. * Does this Frame have a custom pivot point?
  19640. *
  19641. * @name Phaser.Textures.Frame#customPivot
  19642. * @type {boolean}
  19643. * @default false
  19644. * @since 3.0.0
  19645. */
  19646. this.customPivot = false;
  19647. /**
  19648. * **CURRENTLY UNSUPPORTED**
  19649. *
  19650. * Is this frame is rotated or not in the Texture?
  19651. * Rotation allows you to use rotated frames in texture atlas packing.
  19652. * It has nothing to do with Sprite rotation.
  19653. *
  19654. * @name Phaser.Textures.Frame#rotated
  19655. * @type {boolean}
  19656. * @default false
  19657. * @since 3.0.0
  19658. */
  19659. this.rotated = false;
  19660. /**
  19661. * Over-rides the Renderer setting.
  19662. * -1 = use Renderer Setting
  19663. * 0 = No rounding
  19664. * 1 = Round
  19665. *
  19666. * @name Phaser.Textures.Frame#autoRound
  19667. * @type {integer}
  19668. * @default -1
  19669. * @since 3.0.0
  19670. */
  19671. this.autoRound = -1;
  19672. /**
  19673. * Any Frame specific custom data can be stored here.
  19674. *
  19675. * @name Phaser.Textures.Frame#customData
  19676. * @type {object}
  19677. * @since 3.0.0
  19678. */
  19679. this.customData = {};
  19680. /**
  19681. * WebGL UV u0 value.
  19682. *
  19683. * @name Phaser.Textures.Frame#u0
  19684. * @type {number}
  19685. * @default 0
  19686. * @since 3.11.0
  19687. */
  19688. this.u0 = 0;
  19689. /**
  19690. * WebGL UV v0 value.
  19691. *
  19692. * @name Phaser.Textures.Frame#v0
  19693. * @type {number}
  19694. * @default 0
  19695. * @since 3.11.0
  19696. */
  19697. this.v0 = 0;
  19698. /**
  19699. * WebGL UV u1 value.
  19700. *
  19701. * @name Phaser.Textures.Frame#u1
  19702. * @type {number}
  19703. * @default 0
  19704. * @since 3.11.0
  19705. */
  19706. this.u1 = 0;
  19707. /**
  19708. * WebGL UV v1 value.
  19709. *
  19710. * @name Phaser.Textures.Frame#v1
  19711. * @type {number}
  19712. * @default 0
  19713. * @since 3.11.0
  19714. */
  19715. this.v1 = 0;
  19716. /**
  19717. * The un-modified source frame, trim and UV data.
  19718. *
  19719. * @name Phaser.Textures.Frame#data
  19720. * @type {object}
  19721. * @private
  19722. * @since 3.0.0
  19723. */
  19724. this.data = {
  19725. cut: {
  19726. x: 0,
  19727. y: 0,
  19728. w: 0,
  19729. h: 0,
  19730. r: 0,
  19731. b: 0
  19732. },
  19733. trim: false,
  19734. sourceSize: {
  19735. w: 0,
  19736. h: 0
  19737. },
  19738. spriteSourceSize: {
  19739. x: 0,
  19740. y: 0,
  19741. w: 0,
  19742. h: 0,
  19743. r: 0,
  19744. b: 0
  19745. },
  19746. radius: 0,
  19747. drawImage: {
  19748. x: 0,
  19749. y: 0,
  19750. width: 0,
  19751. height: 0
  19752. }
  19753. };
  19754. this.setSize(width, height, x, y);
  19755. },
  19756. /**
  19757. * Sets the width, height, x and y of this Frame.
  19758. *
  19759. * This is called automatically by the constructor
  19760. * and should rarely be changed on-the-fly.
  19761. *
  19762. * @method Phaser.Textures.Frame#setSize
  19763. * @since 3.7.0
  19764. *
  19765. * @param {integer} width - The width of the frame before being trimmed.
  19766. * @param {integer} height - The height of the frame before being trimmed.
  19767. * @param {integer} [x=0] - The x coordinate of the top-left of this Frame.
  19768. * @param {integer} [y=0] - The y coordinate of the top-left of this Frame.
  19769. *
  19770. * @return {Phaser.Textures.Frame} This Frame object.
  19771. */
  19772. setSize: function (width, height, x, y)
  19773. {
  19774. if (x === undefined) { x = 0; }
  19775. if (y === undefined) { y = 0; }
  19776. this.cutX = x;
  19777. this.cutY = y;
  19778. this.cutWidth = width;
  19779. this.cutHeight = height;
  19780. this.width = width;
  19781. this.height = height;
  19782. this.halfWidth = Math.floor(width * 0.5);
  19783. this.halfHeight = Math.floor(height * 0.5);
  19784. this.centerX = Math.floor(width / 2);
  19785. this.centerY = Math.floor(height / 2);
  19786. var data = this.data;
  19787. var cut = data.cut;
  19788. cut.x = x;
  19789. cut.y = y;
  19790. cut.w = width;
  19791. cut.h = height;
  19792. cut.r = x + width;
  19793. cut.b = y + height;
  19794. data.sourceSize.w = width;
  19795. data.sourceSize.h = height;
  19796. data.spriteSourceSize.w = width;
  19797. data.spriteSourceSize.h = height;
  19798. data.radius = 0.5 * Math.sqrt(width * width + height * height);
  19799. var drawImage = data.drawImage;
  19800. drawImage.x = x;
  19801. drawImage.y = y;
  19802. drawImage.width = width;
  19803. drawImage.height = height;
  19804. return this.updateUVs();
  19805. },
  19806. /**
  19807. * If the frame was trimmed when added to the Texture Atlas, this records the trim and source data.
  19808. *
  19809. * @method Phaser.Textures.Frame#setTrim
  19810. * @since 3.0.0
  19811. *
  19812. * @param {number} actualWidth - The width of the frame before being trimmed.
  19813. * @param {number} actualHeight - The height of the frame before being trimmed.
  19814. * @param {number} destX - The destination X position of the trimmed frame for display.
  19815. * @param {number} destY - The destination Y position of the trimmed frame for display.
  19816. * @param {number} destWidth - The destination width of the trimmed frame for display.
  19817. * @param {number} destHeight - The destination height of the trimmed frame for display.
  19818. *
  19819. * @return {Phaser.Textures.Frame} This Frame object.
  19820. */
  19821. setTrim: function (actualWidth, actualHeight, destX, destY, destWidth, destHeight)
  19822. {
  19823. var data = this.data;
  19824. var ss = data.spriteSourceSize;
  19825. // Store actual values
  19826. data.trim = true;
  19827. data.sourceSize.w = actualWidth;
  19828. data.sourceSize.h = actualHeight;
  19829. ss.x = destX;
  19830. ss.y = destY;
  19831. ss.w = destWidth;
  19832. ss.h = destHeight;
  19833. ss.r = destX + destWidth;
  19834. ss.b = destY + destHeight;
  19835. // Adjust properties
  19836. this.x = destX;
  19837. this.y = destY;
  19838. this.width = destWidth;
  19839. this.height = destHeight;
  19840. this.halfWidth = destWidth * 0.5;
  19841. this.halfHeight = destHeight * 0.5;
  19842. this.centerX = Math.floor(destWidth / 2);
  19843. this.centerY = Math.floor(destHeight / 2);
  19844. return this.updateUVs();
  19845. },
  19846. /**
  19847. * Takes a crop data object and, based on the rectangular region given, calculates the
  19848. * required UV coordinates in order to crop this Frame for WebGL and Canvas rendering.
  19849. *
  19850. * This is called directly by the Game Object Texture Components `setCrop` method.
  19851. * Please use that method to crop a Game Object.
  19852. *
  19853. * @method Phaser.Textures.Frame#setCropUVs
  19854. * @since 3.11.0
  19855. *
  19856. * @param {object} crop - The crop data object. This is the `GameObject._crop` property.
  19857. * @param {number} x - The x coordinate to start the crop from. Cannot be negative or exceed the Frame width.
  19858. * @param {number} y - The y coordinate to start the crop from. Cannot be negative or exceed the Frame height.
  19859. * @param {number} width - The width of the crop rectangle. Cannot exceed the Frame width.
  19860. * @param {number} height - The height of the crop rectangle. Cannot exceed the Frame height.
  19861. * @param {boolean} flipX - Does the parent Game Object have flipX set?
  19862. * @param {boolean} flipY - Does the parent Game Object have flipY set?
  19863. *
  19864. * @return {object} The updated crop data object.
  19865. */
  19866. setCropUVs: function (crop, x, y, width, height, flipX, flipY)
  19867. {
  19868. // Clamp the input values
  19869. var cx = this.cutX;
  19870. var cy = this.cutY;
  19871. var cw = this.cutWidth;
  19872. var ch = this.cutHeight;
  19873. var rw = this.realWidth;
  19874. var rh = this.realHeight;
  19875. x = Clamp(x, 0, rw);
  19876. y = Clamp(y, 0, rh);
  19877. width = Clamp(width, 0, rw - x);
  19878. height = Clamp(height, 0, rh - y);
  19879. var ox = cx + x;
  19880. var oy = cy + y;
  19881. var ow = width;
  19882. var oh = height;
  19883. var data = this.data;
  19884. if (data.trim)
  19885. {
  19886. var ss = data.spriteSourceSize;
  19887. // Need to check for intersection between the cut area and the crop area
  19888. // If there is none, we set UV to be empty, otherwise set it to be the intersection area
  19889. width = Clamp(width, 0, cw - x);
  19890. height = Clamp(height, 0, ch - y);
  19891. var cropRight = x + width;
  19892. var cropBottom = y + height;
  19893. var intersects = !(ss.r < x || ss.b < y || ss.x > cropRight || ss.y > cropBottom);
  19894. if (intersects)
  19895. {
  19896. var ix = Math.max(ss.x, x);
  19897. var iy = Math.max(ss.y, y);
  19898. var iw = Math.min(ss.r, cropRight) - ix;
  19899. var ih = Math.min(ss.b, cropBottom) - iy;
  19900. ow = iw;
  19901. oh = ih;
  19902. if (flipX)
  19903. {
  19904. ox = cx + (cw - (ix - ss.x) - iw);
  19905. }
  19906. else
  19907. {
  19908. ox = cx + (ix - ss.x);
  19909. }
  19910. if (flipY)
  19911. {
  19912. oy = cy + (ch - (iy - ss.y) - ih);
  19913. }
  19914. else
  19915. {
  19916. oy = cy + (iy - ss.y);
  19917. }
  19918. x = ix;
  19919. y = iy;
  19920. width = iw;
  19921. height = ih;
  19922. }
  19923. else
  19924. {
  19925. ox = 0;
  19926. oy = 0;
  19927. ow = 0;
  19928. oh = 0;
  19929. }
  19930. }
  19931. else
  19932. {
  19933. if (flipX)
  19934. {
  19935. ox = cx + (cw - x - width);
  19936. }
  19937. if (flipY)
  19938. {
  19939. oy = cy + (ch - y - height);
  19940. }
  19941. }
  19942. var tw = this.source.width;
  19943. var th = this.source.height;
  19944. // Map the given coordinates into UV space, clamping to the 0-1 range.
  19945. crop.u0 = Math.max(0, ox / tw);
  19946. crop.v0 = Math.max(0, oy / th);
  19947. crop.u1 = Math.min(1, (ox + ow) / tw);
  19948. crop.v1 = Math.min(1, (oy + oh) / th);
  19949. crop.x = x;
  19950. crop.y = y;
  19951. crop.cx = ox;
  19952. crop.cy = oy;
  19953. crop.cw = ow;
  19954. crop.ch = oh;
  19955. crop.width = width;
  19956. crop.height = height;
  19957. crop.flipX = flipX;
  19958. crop.flipY = flipY;
  19959. return crop;
  19960. },
  19961. /**
  19962. * Takes a crop data object and recalculates the UVs based on the dimensions inside the crop object.
  19963. * Called automatically by `setFrame`.
  19964. *
  19965. * @method Phaser.Textures.Frame#updateCropUVs
  19966. * @since 3.11.0
  19967. *
  19968. * @param {object} crop - The crop data object. This is the `GameObject._crop` property.
  19969. * @param {boolean} flipX - Does the parent Game Object have flipX set?
  19970. * @param {boolean} flipY - Does the parent Game Object have flipY set?
  19971. *
  19972. * @return {object} The updated crop data object.
  19973. */
  19974. updateCropUVs: function (crop, flipX, flipY)
  19975. {
  19976. return this.setCropUVs(crop, crop.x, crop.y, crop.width, crop.height, flipX, flipY);
  19977. },
  19978. /**
  19979. * Updates the internal WebGL UV cache and the drawImage cache.
  19980. *
  19981. * @method Phaser.Textures.Frame#updateUVs
  19982. * @since 3.0.0
  19983. *
  19984. * @return {Phaser.Textures.Frame} This Frame object.
  19985. */
  19986. updateUVs: function ()
  19987. {
  19988. var cx = this.cutX;
  19989. var cy = this.cutY;
  19990. var cw = this.cutWidth;
  19991. var ch = this.cutHeight;
  19992. // Canvas data
  19993. var cd = this.data.drawImage;
  19994. cd.width = cw;
  19995. cd.height = ch;
  19996. // WebGL data
  19997. var tw = this.source.width;
  19998. var th = this.source.height;
  19999. this.u0 = cx / tw;
  20000. this.v0 = cy / th;
  20001. this.u1 = (cx + cw) / tw;
  20002. this.v1 = (cy + ch) / th;
  20003. return this;
  20004. },
  20005. /**
  20006. * Updates the internal WebGL UV cache.
  20007. *
  20008. * @method Phaser.Textures.Frame#updateUVsInverted
  20009. * @since 3.0.0
  20010. *
  20011. * @return {Phaser.Textures.Frame} This Frame object.
  20012. */
  20013. updateUVsInverted: function ()
  20014. {
  20015. var tw = this.source.width;
  20016. var th = this.source.height;
  20017. this.u0 = (this.cutX + this.cutHeight) / tw;
  20018. this.v0 = this.cutY / th;
  20019. this.u1 = this.cutX / tw;
  20020. this.v1 = (this.cutY + this.cutWidth) / th;
  20021. return this;
  20022. },
  20023. /**
  20024. * Clones this Frame into a new Frame object.
  20025. *
  20026. * @method Phaser.Textures.Frame#clone
  20027. * @since 3.0.0
  20028. *
  20029. * @return {Phaser.Textures.Frame} A clone of this Frame.
  20030. */
  20031. clone: function ()
  20032. {
  20033. var clone = new Frame(this.texture, this.name, this.sourceIndex);
  20034. clone.cutX = this.cutX;
  20035. clone.cutY = this.cutY;
  20036. clone.cutWidth = this.cutWidth;
  20037. clone.cutHeight = this.cutHeight;
  20038. clone.x = this.x;
  20039. clone.y = this.y;
  20040. clone.width = this.width;
  20041. clone.height = this.height;
  20042. clone.halfWidth = this.halfWidth;
  20043. clone.halfHeight = this.halfHeight;
  20044. clone.centerX = this.centerX;
  20045. clone.centerY = this.centerY;
  20046. clone.rotated = this.rotated;
  20047. clone.data = Extend(true, clone.data, this.data);
  20048. clone.updateUVs();
  20049. return clone;
  20050. },
  20051. /**
  20052. * Destroys this Frames references.
  20053. *
  20054. * @method Phaser.Textures.Frame#destroy
  20055. * @since 3.0.0
  20056. */
  20057. destroy: function ()
  20058. {
  20059. this.texture = null;
  20060. this.source = null;
  20061. },
  20062. /**
  20063. * The width of the Frame in its un-trimmed, un-padded state, as prepared in the art package,
  20064. * before being packed.
  20065. *
  20066. * @name Phaser.Textures.Frame#realWidth
  20067. * @type {number}
  20068. * @readonly
  20069. * @since 3.0.0
  20070. */
  20071. realWidth: {
  20072. get: function ()
  20073. {
  20074. return this.data.sourceSize.w;
  20075. }
  20076. },
  20077. /**
  20078. * The height of the Frame in its un-trimmed, un-padded state, as prepared in the art package,
  20079. * before being packed.
  20080. *
  20081. * @name Phaser.Textures.Frame#realHeight
  20082. * @type {number}
  20083. * @readonly
  20084. * @since 3.0.0
  20085. */
  20086. realHeight: {
  20087. get: function ()
  20088. {
  20089. return this.data.sourceSize.h;
  20090. }
  20091. },
  20092. /**
  20093. * The radius of the Frame (derived from sqrt(w * w + h * h) / 2)
  20094. *
  20095. * @name Phaser.Textures.Frame#radius
  20096. * @type {number}
  20097. * @readonly
  20098. * @since 3.0.0
  20099. */
  20100. radius: {
  20101. get: function ()
  20102. {
  20103. return this.data.radius;
  20104. }
  20105. },
  20106. /**
  20107. * Is the Frame trimmed or not?
  20108. *
  20109. * @name Phaser.Textures.Frame#trimmed
  20110. * @type {boolean}
  20111. * @readonly
  20112. * @since 3.0.0
  20113. */
  20114. trimmed: {
  20115. get: function ()
  20116. {
  20117. return this.data.trim;
  20118. }
  20119. },
  20120. /**
  20121. * The Canvas drawImage data object.
  20122. *
  20123. * @name Phaser.Textures.Frame#canvasData
  20124. * @type {object}
  20125. * @readonly
  20126. * @since 3.0.0
  20127. */
  20128. canvasData: {
  20129. get: function ()
  20130. {
  20131. return this.data.drawImage;
  20132. }
  20133. }
  20134. });
  20135. module.exports = Frame;
  20136. /***/ }),
  20137. /* 122 */
  20138. /***/ (function(module, exports, __webpack_require__) {
  20139. /**
  20140. * @author Richard Davey <rich@photonstorm.com>
  20141. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  20142. * @copyright 2019 Photon Storm Ltd.
  20143. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  20144. */
  20145. var Class = __webpack_require__(0);
  20146. var EventEmitter = __webpack_require__(11);
  20147. var Events = __webpack_require__(69);
  20148. var Extend = __webpack_require__(19);
  20149. var NOOP = __webpack_require__(1);
  20150. /**
  20151. * @classdesc
  20152. * Class containing all the shared state and behavior of a sound object, independent of the implementation.
  20153. *
  20154. * @class BaseSound
  20155. * @extends Phaser.Events.EventEmitter
  20156. * @memberof Phaser.Sound
  20157. * @constructor
  20158. * @since 3.0.0
  20159. *
  20160. * @param {Phaser.Sound.BaseSoundManager} manager - Reference to the current sound manager instance.
  20161. * @param {string} key - Asset key for the sound.
  20162. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  20163. */
  20164. var BaseSound = new Class({
  20165. Extends: EventEmitter,
  20166. initialize:
  20167. function BaseSound (manager, key, config)
  20168. {
  20169. EventEmitter.call(this);
  20170. /**
  20171. * Local reference to the sound manager.
  20172. *
  20173. * @name Phaser.Sound.BaseSound#manager
  20174. * @type {Phaser.Sound.BaseSoundManager}
  20175. * @private
  20176. * @since 3.0.0
  20177. */
  20178. this.manager = manager;
  20179. /**
  20180. * Asset key for the sound.
  20181. *
  20182. * @name Phaser.Sound.BaseSound#key
  20183. * @type {string}
  20184. * @readonly
  20185. * @since 3.0.0
  20186. */
  20187. this.key = key;
  20188. /**
  20189. * Flag indicating if sound is currently playing.
  20190. *
  20191. * @name Phaser.Sound.BaseSound#isPlaying
  20192. * @type {boolean}
  20193. * @default false
  20194. * @readonly
  20195. * @since 3.0.0
  20196. */
  20197. this.isPlaying = false;
  20198. /**
  20199. * Flag indicating if sound is currently paused.
  20200. *
  20201. * @name Phaser.Sound.BaseSound#isPaused
  20202. * @type {boolean}
  20203. * @default false
  20204. * @readonly
  20205. * @since 3.0.0
  20206. */
  20207. this.isPaused = false;
  20208. /**
  20209. * A property that holds the value of sound's actual playback rate,
  20210. * after its rate and detune values has been combined with global
  20211. * rate and detune values.
  20212. *
  20213. * @name Phaser.Sound.BaseSound#totalRate
  20214. * @type {number}
  20215. * @default 1
  20216. * @readonly
  20217. * @since 3.0.0
  20218. */
  20219. this.totalRate = 1;
  20220. /**
  20221. * A value representing the duration, in seconds.
  20222. * It could be total sound duration or a marker duration.
  20223. *
  20224. * @name Phaser.Sound.BaseSound#duration
  20225. * @type {number}
  20226. * @readonly
  20227. * @since 3.0.0
  20228. */
  20229. this.duration = this.duration || 0;
  20230. /**
  20231. * The total duration of the sound in seconds.
  20232. *
  20233. * @name Phaser.Sound.BaseSound#totalDuration
  20234. * @type {number}
  20235. * @readonly
  20236. * @since 3.0.0
  20237. */
  20238. this.totalDuration = this.totalDuration || 0;
  20239. /**
  20240. * A config object used to store default sound settings' values.
  20241. * Default values will be set by properties' setters.
  20242. *
  20243. * @name Phaser.Sound.BaseSound#config
  20244. * @type {SoundConfig}
  20245. * @private
  20246. * @since 3.0.0
  20247. */
  20248. this.config = {
  20249. mute: false,
  20250. volume: 1,
  20251. rate: 1,
  20252. detune: 0,
  20253. seek: 0,
  20254. loop: false,
  20255. delay: 0
  20256. };
  20257. /**
  20258. * Reference to the currently used config.
  20259. * It could be default config or marker config.
  20260. *
  20261. * @name Phaser.Sound.BaseSound#currentConfig
  20262. * @type {SoundConfig}
  20263. * @private
  20264. * @since 3.0.0
  20265. */
  20266. this.currentConfig = this.config;
  20267. this.config = Extend(this.config, config);
  20268. /**
  20269. * Object containing markers definitions.
  20270. *
  20271. * @name Phaser.Sound.BaseSound#markers
  20272. * @type {Object.<string, SoundMarker>}
  20273. * @default {}
  20274. * @readonly
  20275. * @since 3.0.0
  20276. */
  20277. this.markers = {};
  20278. /**
  20279. * Currently playing marker.
  20280. * 'null' if whole sound is playing.
  20281. *
  20282. * @name Phaser.Sound.BaseSound#currentMarker
  20283. * @type {SoundMarker}
  20284. * @default null
  20285. * @readonly
  20286. * @since 3.0.0
  20287. */
  20288. this.currentMarker = null;
  20289. /**
  20290. * Flag indicating if destroy method was called on this sound.
  20291. *
  20292. * @name Phaser.Sound.BaseSound#pendingRemove
  20293. * @type {boolean}
  20294. * @private
  20295. * @default false
  20296. * @since 3.0.0
  20297. */
  20298. this.pendingRemove = false;
  20299. },
  20300. /**
  20301. * Adds a marker into the current sound. A marker is represented by name, start time, duration, and optionally config object.
  20302. * This allows you to bundle multiple sounds together into a single audio file and use markers to jump between them for playback.
  20303. *
  20304. * @method Phaser.Sound.BaseSound#addMarker
  20305. * @since 3.0.0
  20306. *
  20307. * @param {SoundMarker} marker - Marker object.
  20308. *
  20309. * @return {boolean} Whether the marker was added successfully.
  20310. */
  20311. addMarker: function (marker)
  20312. {
  20313. if (!marker || !marker.name || typeof marker.name !== 'string')
  20314. {
  20315. return false;
  20316. }
  20317. if (this.markers[marker.name])
  20318. {
  20319. // eslint-disable-next-line no-console
  20320. console.error('addMarker ' + marker.name + ' already exists in Sound');
  20321. return false;
  20322. }
  20323. marker = Extend(true, {
  20324. name: '',
  20325. start: 0,
  20326. duration: this.totalDuration - (marker.start || 0),
  20327. config: {
  20328. mute: false,
  20329. volume: 1,
  20330. rate: 1,
  20331. detune: 0,
  20332. seek: 0,
  20333. loop: false,
  20334. delay: 0
  20335. }
  20336. }, marker);
  20337. this.markers[marker.name] = marker;
  20338. return true;
  20339. },
  20340. /**
  20341. * Updates previously added marker.
  20342. *
  20343. * @method Phaser.Sound.BaseSound#updateMarker
  20344. * @since 3.0.0
  20345. *
  20346. * @param {SoundMarker} marker - Marker object with updated values.
  20347. *
  20348. * @return {boolean} Whether the marker was updated successfully.
  20349. */
  20350. updateMarker: function (marker)
  20351. {
  20352. if (!marker || !marker.name || typeof marker.name !== 'string')
  20353. {
  20354. return false;
  20355. }
  20356. if (!this.markers[marker.name])
  20357. {
  20358. // eslint-disable-next-line no-console
  20359. console.warn('Audio Marker: ' + marker.name + ' missing in Sound: ' + this.key);
  20360. return false;
  20361. }
  20362. this.markers[marker.name] = Extend(true, this.markers[marker.name], marker);
  20363. return true;
  20364. },
  20365. /**
  20366. * Removes a marker from the sound.
  20367. *
  20368. * @method Phaser.Sound.BaseSound#removeMarker
  20369. * @since 3.0.0
  20370. *
  20371. * @param {string} markerName - The name of the marker to remove.
  20372. *
  20373. * @return {?SoundMarker} Removed marker object or 'null' if there was no marker with provided name.
  20374. */
  20375. removeMarker: function (markerName)
  20376. {
  20377. var marker = this.markers[markerName];
  20378. if (!marker)
  20379. {
  20380. return null;
  20381. }
  20382. this.markers[markerName] = null;
  20383. return marker;
  20384. },
  20385. /**
  20386. * Play this sound, or a marked section of it.
  20387. * It always plays the sound from the start. If you want to start playback from a specific time
  20388. * you can set 'seek' setting of the config object, provided to this call, to that value.
  20389. *
  20390. * @method Phaser.Sound.BaseSound#play
  20391. * @since 3.0.0
  20392. *
  20393. * @param {string} [markerName=''] - If you want to play a marker then provide the marker name here, otherwise omit it to play the full sound.
  20394. * @param {SoundConfig} [config] - Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound.
  20395. *
  20396. * @return {boolean} Whether the sound started playing successfully.
  20397. */
  20398. play: function (markerName, config)
  20399. {
  20400. if (markerName === undefined) { markerName = ''; }
  20401. if (typeof markerName === 'object')
  20402. {
  20403. config = markerName;
  20404. markerName = '';
  20405. }
  20406. if (typeof markerName !== 'string')
  20407. {
  20408. return false;
  20409. }
  20410. if (!markerName)
  20411. {
  20412. this.currentMarker = null;
  20413. this.currentConfig = this.config;
  20414. this.duration = this.totalDuration;
  20415. }
  20416. else
  20417. {
  20418. if (!this.markers[markerName])
  20419. {
  20420. // eslint-disable-next-line no-console
  20421. console.warn('Marker: ' + markerName + ' missing in Sound: ' + this.key);
  20422. return false;
  20423. }
  20424. this.currentMarker = this.markers[markerName];
  20425. this.currentConfig = this.currentMarker.config;
  20426. this.duration = this.currentMarker.duration;
  20427. }
  20428. this.resetConfig();
  20429. this.currentConfig = Extend(this.currentConfig, config);
  20430. this.isPlaying = true;
  20431. this.isPaused = false;
  20432. return true;
  20433. },
  20434. /**
  20435. * Pauses the sound.
  20436. *
  20437. * @method Phaser.Sound.BaseSound#pause
  20438. * @since 3.0.0
  20439. *
  20440. * @return {boolean} Whether the sound was paused successfully.
  20441. */
  20442. pause: function ()
  20443. {
  20444. if (this.isPaused || !this.isPlaying)
  20445. {
  20446. return false;
  20447. }
  20448. this.isPlaying = false;
  20449. this.isPaused = true;
  20450. return true;
  20451. },
  20452. /**
  20453. * Resumes the sound.
  20454. *
  20455. * @method Phaser.Sound.BaseSound#resume
  20456. * @since 3.0.0
  20457. *
  20458. * @return {boolean} Whether the sound was resumed successfully.
  20459. */
  20460. resume: function ()
  20461. {
  20462. if (!this.isPaused || this.isPlaying)
  20463. {
  20464. return false;
  20465. }
  20466. this.isPlaying = true;
  20467. this.isPaused = false;
  20468. return true;
  20469. },
  20470. /**
  20471. * Stop playing this sound.
  20472. *
  20473. * @method Phaser.Sound.BaseSound#stop
  20474. * @since 3.0.0
  20475. *
  20476. * @return {boolean} Whether the sound was stopped successfully.
  20477. */
  20478. stop: function ()
  20479. {
  20480. if (!this.isPaused && !this.isPlaying)
  20481. {
  20482. return false;
  20483. }
  20484. this.isPlaying = false;
  20485. this.isPaused = false;
  20486. this.resetConfig();
  20487. return true;
  20488. },
  20489. /**
  20490. * Method used internally for applying config values to some of the sound properties.
  20491. *
  20492. * @method Phaser.Sound.BaseSound#applyConfig
  20493. * @protected
  20494. * @since 3.0.0
  20495. */
  20496. applyConfig: function ()
  20497. {
  20498. this.mute = this.currentConfig.mute;
  20499. this.volume = this.currentConfig.volume;
  20500. this.rate = this.currentConfig.rate;
  20501. this.detune = this.currentConfig.detune;
  20502. this.loop = this.currentConfig.loop;
  20503. },
  20504. /**
  20505. * Method used internally for resetting values of some of the config properties.
  20506. *
  20507. * @method Phaser.Sound.BaseSound#resetConfig
  20508. * @protected
  20509. * @since 3.0.0
  20510. */
  20511. resetConfig: function ()
  20512. {
  20513. this.currentConfig.seek = 0;
  20514. this.currentConfig.delay = 0;
  20515. },
  20516. /**
  20517. * Update method called automatically by sound manager on every game step.
  20518. *
  20519. * @method Phaser.Sound.BaseSound#update
  20520. * @override
  20521. * @protected
  20522. * @since 3.0.0
  20523. *
  20524. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  20525. * @param {number} delta - The delta time elapsed since the last frame.
  20526. */
  20527. update: NOOP,
  20528. /**
  20529. * Method used internally to calculate total playback rate of the sound.
  20530. *
  20531. * @method Phaser.Sound.BaseSound#calculateRate
  20532. * @protected
  20533. * @since 3.0.0
  20534. */
  20535. calculateRate: function ()
  20536. {
  20537. var cent = 1.0005777895065548; // Math.pow(2, 1/1200);
  20538. var totalDetune = this.currentConfig.detune + this.manager.detune;
  20539. var detuneRate = Math.pow(cent, totalDetune);
  20540. this.totalRate = this.currentConfig.rate * this.manager.rate * detuneRate;
  20541. },
  20542. /**
  20543. * Destroys this sound and all associated events and marks it for removal from the sound manager.
  20544. *
  20545. * @method Phaser.Sound.BaseSound#destroy
  20546. * @fires Phaser.Sound.Events#DESTROY
  20547. * @since 3.0.0
  20548. */
  20549. destroy: function ()
  20550. {
  20551. if (this.pendingRemove)
  20552. {
  20553. return;
  20554. }
  20555. this.emit(Events.DESTROY, this);
  20556. this.pendingRemove = true;
  20557. this.manager = null;
  20558. this.key = '';
  20559. this.removeAllListeners();
  20560. this.isPlaying = false;
  20561. this.isPaused = false;
  20562. this.config = null;
  20563. this.currentConfig = null;
  20564. this.markers = null;
  20565. this.currentMarker = null;
  20566. }
  20567. });
  20568. module.exports = BaseSound;
  20569. /***/ }),
  20570. /* 123 */
  20571. /***/ (function(module, exports, __webpack_require__) {
  20572. /**
  20573. * @author Richard Davey <rich@photonstorm.com>
  20574. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  20575. * @copyright 2019 Photon Storm Ltd.
  20576. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  20577. */
  20578. var Class = __webpack_require__(0);
  20579. var Clone = __webpack_require__(70);
  20580. var EventEmitter = __webpack_require__(11);
  20581. var Events = __webpack_require__(69);
  20582. var GameEvents = __webpack_require__(26);
  20583. var NOOP = __webpack_require__(1);
  20584. /**
  20585. * @callback EachActiveSoundCallback
  20586. *
  20587. * @param {Phaser.Sound.BaseSoundManager} manager - The SoundManager
  20588. * @param {Phaser.Sound.BaseSound} sound - The current active Sound
  20589. * @param {number} index - The index of the current active Sound
  20590. * @param {Phaser.Sound.BaseSound[]} sounds - All sounds
  20591. */
  20592. /**
  20593. * Audio sprite sound type.
  20594. *
  20595. * @typedef {object} AudioSpriteSound
  20596. *
  20597. * @property {object} spritemap - Local reference to 'spritemap' object form json file generated by audiosprite tool.
  20598. */
  20599. /**
  20600. * @classdesc
  20601. * The sound manager is responsible for playing back audio via Web Audio API or HTML Audio tag as fallback.
  20602. * The audio file type and the encoding of those files are extremely important.
  20603. *
  20604. * Not all browsers can play all audio formats.
  20605. *
  20606. * There is a good guide to what's supported [here](https://developer.mozilla.org/en-US/Apps/Fundamentals/Audio_and_video_delivery/Cross-browser_audio_basics#Audio_Codec_Support).
  20607. *
  20608. * @class BaseSoundManager
  20609. * @extends Phaser.Events.EventEmitter
  20610. * @memberof Phaser.Sound
  20611. * @constructor
  20612. * @since 3.0.0
  20613. *
  20614. * @param {Phaser.Game} game - Reference to the current game instance.
  20615. */
  20616. var BaseSoundManager = new Class({
  20617. Extends: EventEmitter,
  20618. initialize:
  20619. function BaseSoundManager (game)
  20620. {
  20621. EventEmitter.call(this);
  20622. /**
  20623. * Local reference to game.
  20624. *
  20625. * @name Phaser.Sound.BaseSoundManager#game
  20626. * @type {Phaser.Game}
  20627. * @readonly
  20628. * @since 3.0.0
  20629. */
  20630. this.game = game;
  20631. /**
  20632. * Local reference to the JSON Cache, as used by Audio Sprites.
  20633. *
  20634. * @name Phaser.Sound.BaseSoundManager#jsonCache
  20635. * @type {Phaser.Cache.BaseCache}
  20636. * @readonly
  20637. * @since 3.7.0
  20638. */
  20639. this.jsonCache = game.cache.json;
  20640. /**
  20641. * An array containing all added sounds.
  20642. *
  20643. * @name Phaser.Sound.BaseSoundManager#sounds
  20644. * @type {Phaser.Sound.BaseSound[]}
  20645. * @default []
  20646. * @private
  20647. * @since 3.0.0
  20648. */
  20649. this.sounds = [];
  20650. /**
  20651. * Global mute setting.
  20652. *
  20653. * @name Phaser.Sound.BaseSoundManager#mute
  20654. * @type {boolean}
  20655. * @default false
  20656. * @since 3.0.0
  20657. */
  20658. this.mute = false;
  20659. /**
  20660. * Global volume setting.
  20661. *
  20662. * @name Phaser.Sound.BaseSoundManager#volume
  20663. * @type {number}
  20664. * @default 1
  20665. * @since 3.0.0
  20666. */
  20667. this.volume = 1;
  20668. /**
  20669. * Flag indicating if sounds should be paused when game looses focus,
  20670. * for instance when user switches to another tab/program/app.
  20671. *
  20672. * @name Phaser.Sound.BaseSoundManager#pauseOnBlur
  20673. * @type {boolean}
  20674. * @default true
  20675. * @since 3.0.0
  20676. */
  20677. this.pauseOnBlur = true;
  20678. /**
  20679. * Property that actually holds the value of global playback rate.
  20680. *
  20681. * @name Phaser.Sound.BaseSoundManager#_rate
  20682. * @type {number}
  20683. * @private
  20684. * @default 1
  20685. * @since 3.0.0
  20686. */
  20687. this._rate = 1;
  20688. /**
  20689. * Property that actually holds the value of global detune.
  20690. *
  20691. * @name Phaser.Sound.BaseSoundManager#_detune
  20692. * @type {number}
  20693. * @private
  20694. * @default 0
  20695. * @since 3.0.0
  20696. */
  20697. this._detune = 0;
  20698. /**
  20699. * Mobile devices require sounds to be triggered from an explicit user action,
  20700. * such as a tap, before any sound can be loaded/played on a web page.
  20701. * Set to true if the audio system is currently locked awaiting user interaction.
  20702. *
  20703. * @name Phaser.Sound.BaseSoundManager#locked
  20704. * @type {boolean}
  20705. * @readonly
  20706. * @since 3.0.0
  20707. */
  20708. this.locked = this.locked || false;
  20709. /**
  20710. * Flag used internally for handling when the audio system
  20711. * has been unlocked, if there ever was a need for it.
  20712. *
  20713. * @name Phaser.Sound.BaseSoundManager#unlocked
  20714. * @type {boolean}
  20715. * @default false
  20716. * @private
  20717. * @since 3.0.0
  20718. */
  20719. this.unlocked = false;
  20720. game.events.on(GameEvents.BLUR, function ()
  20721. {
  20722. if (this.pauseOnBlur)
  20723. {
  20724. this.onBlur();
  20725. }
  20726. }, this);
  20727. game.events.on(GameEvents.FOCUS, function ()
  20728. {
  20729. if (this.pauseOnBlur)
  20730. {
  20731. this.onFocus();
  20732. }
  20733. }, this);
  20734. game.events.on(GameEvents.PRE_STEP, this.update, this);
  20735. game.events.once(GameEvents.DESTROY, this.destroy, this);
  20736. },
  20737. /**
  20738. * Adds a new sound into the sound manager.
  20739. *
  20740. * @method Phaser.Sound.BaseSoundManager#add
  20741. * @override
  20742. * @since 3.0.0
  20743. *
  20744. * @param {string} key - Asset key for the sound.
  20745. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  20746. *
  20747. * @return {Phaser.Sound.BaseSound} The new sound instance.
  20748. */
  20749. add: NOOP,
  20750. /**
  20751. * Adds a new audio sprite sound into the sound manager.
  20752. * Audio Sprites are a combination of audio files and a JSON configuration.
  20753. * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite
  20754. *
  20755. * @method Phaser.Sound.BaseSoundManager#addAudioSprite
  20756. * @since 3.0.0
  20757. *
  20758. * @param {string} key - Asset key for the sound.
  20759. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  20760. *
  20761. * @return {AudioSpriteSound} The new audio sprite sound instance.
  20762. */
  20763. addAudioSprite: function (key, config)
  20764. {
  20765. if (config === undefined) { config = {}; }
  20766. var sound = this.add(key, config);
  20767. sound.spritemap = this.jsonCache.get(key).spritemap;
  20768. for (var markerName in sound.spritemap)
  20769. {
  20770. if (!sound.spritemap.hasOwnProperty(markerName))
  20771. {
  20772. continue;
  20773. }
  20774. var markerConfig = Clone(config);
  20775. var marker = sound.spritemap[markerName];
  20776. markerConfig.loop = (marker.hasOwnProperty('loop')) ? marker.loop : false;
  20777. sound.addMarker({
  20778. name: markerName,
  20779. start: marker.start,
  20780. duration: marker.end - marker.start,
  20781. config: markerConfig
  20782. });
  20783. }
  20784. return sound;
  20785. },
  20786. /**
  20787. * Enables playing sound on the fly without the need to keep a reference to it.
  20788. * Sound will auto destroy once its playback ends.
  20789. *
  20790. * @method Phaser.Sound.BaseSoundManager#play
  20791. * @listens Phaser.Sound.Events#COMPLETE
  20792. * @since 3.0.0
  20793. *
  20794. * @param {string} key - Asset key for the sound.
  20795. * @param {(SoundConfig|SoundMarker)} [extra] - An optional additional object containing settings to be applied to the sound. It could be either config or marker object.
  20796. *
  20797. * @return {boolean} Whether the sound started playing successfully.
  20798. */
  20799. play: function (key, extra)
  20800. {
  20801. var sound = this.add(key);
  20802. sound.once(Events.COMPLETE, sound.destroy, sound);
  20803. if (extra)
  20804. {
  20805. if (extra.name)
  20806. {
  20807. sound.addMarker(extra);
  20808. return sound.play(extra.name);
  20809. }
  20810. else
  20811. {
  20812. return sound.play(extra);
  20813. }
  20814. }
  20815. else
  20816. {
  20817. return sound.play();
  20818. }
  20819. },
  20820. /**
  20821. * Enables playing audio sprite sound on the fly without the need to keep a reference to it.
  20822. * Sound will auto destroy once its playback ends.
  20823. *
  20824. * @method Phaser.Sound.BaseSoundManager#playAudioSprite
  20825. * @listens Phaser.Sound.Events#COMPLETE
  20826. * @since 3.0.0
  20827. *
  20828. * @param {string} key - Asset key for the sound.
  20829. * @param {string} spriteName - The name of the sound sprite to play.
  20830. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  20831. *
  20832. * @return {boolean} Whether the audio sprite sound started playing successfully.
  20833. */
  20834. playAudioSprite: function (key, spriteName, config)
  20835. {
  20836. var sound = this.addAudioSprite(key);
  20837. sound.once(Events.COMPLETE, sound.destroy, sound);
  20838. return sound.play(spriteName, config);
  20839. },
  20840. /**
  20841. * Removes a sound from the sound manager.
  20842. * The removed sound is destroyed before removal.
  20843. *
  20844. * @method Phaser.Sound.BaseSoundManager#remove
  20845. * @since 3.0.0
  20846. *
  20847. * @param {Phaser.Sound.BaseSound} sound - The sound object to remove.
  20848. *
  20849. * @return {boolean} True if the sound was removed successfully, otherwise false.
  20850. */
  20851. remove: function (sound)
  20852. {
  20853. var index = this.sounds.indexOf(sound);
  20854. if (index !== -1)
  20855. {
  20856. sound.destroy();
  20857. this.sounds.splice(index, 1);
  20858. return true;
  20859. }
  20860. return false;
  20861. },
  20862. /**
  20863. * Removes all sounds from the sound manager that have an asset key matching the given value.
  20864. * The removed sounds are destroyed before removal.
  20865. *
  20866. * @method Phaser.Sound.BaseSoundManager#removeByKey
  20867. * @since 3.0.0
  20868. *
  20869. * @param {string} key - The key to match when removing sound objects.
  20870. *
  20871. * @return {number} The number of matching sound objects that were removed.
  20872. */
  20873. removeByKey: function (key)
  20874. {
  20875. var removed = 0;
  20876. for (var i = this.sounds.length - 1; i >= 0; i--)
  20877. {
  20878. var sound = this.sounds[i];
  20879. if (sound.key === key)
  20880. {
  20881. sound.destroy();
  20882. this.sounds.splice(i, 1);
  20883. removed++;
  20884. }
  20885. }
  20886. return removed;
  20887. },
  20888. /**
  20889. * Pauses all the sounds in the game.
  20890. *
  20891. * @method Phaser.Sound.BaseSoundManager#pauseAll
  20892. * @fires Phaser.Sound.Events#PAUSE_ALL
  20893. * @since 3.0.0
  20894. */
  20895. pauseAll: function ()
  20896. {
  20897. this.forEachActiveSound(function (sound)
  20898. {
  20899. sound.pause();
  20900. });
  20901. this.emit(Events.PAUSE_ALL, this);
  20902. },
  20903. /**
  20904. * Resumes all the sounds in the game.
  20905. *
  20906. * @method Phaser.Sound.BaseSoundManager#resumeAll
  20907. * @fires Phaser.Sound.Events#RESUME_ALL
  20908. * @since 3.0.0
  20909. */
  20910. resumeAll: function ()
  20911. {
  20912. this.forEachActiveSound(function (sound)
  20913. {
  20914. sound.resume();
  20915. });
  20916. this.emit(Events.RESUME_ALL, this);
  20917. },
  20918. /**
  20919. * Stops all the sounds in the game.
  20920. *
  20921. * @method Phaser.Sound.BaseSoundManager#stopAll
  20922. * @fires Phaser.Sound.Events#STOP_ALL
  20923. * @since 3.0.0
  20924. */
  20925. stopAll: function ()
  20926. {
  20927. this.forEachActiveSound(function (sound)
  20928. {
  20929. sound.stop();
  20930. });
  20931. this.emit(Events.STOP_ALL, this);
  20932. },
  20933. /**
  20934. * Method used internally for unlocking audio playback on devices that
  20935. * require user interaction before any sound can be played on a web page.
  20936. *
  20937. * Read more about how this issue is handled here in [this article](https://medium.com/@pgoloskokovic/unlocking-web-audio-the-smarter-way-8858218c0e09).
  20938. *
  20939. * @method Phaser.Sound.BaseSoundManager#unlock
  20940. * @override
  20941. * @protected
  20942. * @since 3.0.0
  20943. */
  20944. unlock: NOOP,
  20945. /**
  20946. * Method used internally for pausing sound manager if
  20947. * Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true.
  20948. *
  20949. * @method Phaser.Sound.BaseSoundManager#onBlur
  20950. * @override
  20951. * @protected
  20952. * @since 3.0.0
  20953. */
  20954. onBlur: NOOP,
  20955. /**
  20956. * Method used internally for resuming sound manager if
  20957. * Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true.
  20958. *
  20959. * @method Phaser.Sound.BaseSoundManager#onFocus
  20960. * @override
  20961. * @protected
  20962. * @since 3.0.0
  20963. */
  20964. onFocus: NOOP,
  20965. /**
  20966. * Update method called on every game step.
  20967. * Removes destroyed sounds and updates every active sound in the game.
  20968. *
  20969. * @method Phaser.Sound.BaseSoundManager#update
  20970. * @protected
  20971. * @fires Phaser.Sound.Events#UNLOCKED
  20972. * @since 3.0.0
  20973. *
  20974. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  20975. * @param {number} delta - The delta time elapsed since the last frame.
  20976. */
  20977. update: function (time, delta)
  20978. {
  20979. if (this.unlocked)
  20980. {
  20981. this.unlocked = false;
  20982. this.locked = false;
  20983. this.emit(Events.UNLOCKED, this);
  20984. }
  20985. for (var i = this.sounds.length - 1; i >= 0; i--)
  20986. {
  20987. if (this.sounds[i].pendingRemove)
  20988. {
  20989. this.sounds.splice(i, 1);
  20990. }
  20991. }
  20992. this.sounds.forEach(function (sound)
  20993. {
  20994. sound.update(time, delta);
  20995. });
  20996. },
  20997. /**
  20998. * Destroys all the sounds in the game and all associated events.
  20999. *
  21000. * @method Phaser.Sound.BaseSoundManager#destroy
  21001. * @since 3.0.0
  21002. */
  21003. destroy: function ()
  21004. {
  21005. this.removeAllListeners();
  21006. this.forEachActiveSound(function (sound)
  21007. {
  21008. sound.destroy();
  21009. });
  21010. this.sounds.length = 0;
  21011. this.sounds = null;
  21012. this.game = null;
  21013. },
  21014. /**
  21015. * Method used internally for iterating only over active sounds and skipping sounds that are marked for removal.
  21016. *
  21017. * @method Phaser.Sound.BaseSoundManager#forEachActiveSound
  21018. * @private
  21019. * @since 3.0.0
  21020. *
  21021. * @param {EachActiveSoundCallback} callback - Callback function. (manager: Phaser.Sound.BaseSoundManager, sound: Phaser.Sound.BaseSound, index: number, sounds: Phaser.Manager.BaseSound[]) => void
  21022. * @param {*} [scope] - Callback context.
  21023. */
  21024. forEachActiveSound: function (callback, scope)
  21025. {
  21026. var _this = this;
  21027. this.sounds.forEach(function (sound, index)
  21028. {
  21029. if (!sound.pendingRemove)
  21030. {
  21031. callback.call(scope || _this, sound, index, _this.sounds);
  21032. }
  21033. });
  21034. },
  21035. /**
  21036. * Sets the global playback rate at which all the sounds will be played.
  21037. *
  21038. * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  21039. * and 2.0 doubles the audios playback speed.
  21040. *
  21041. * @method Phaser.Sound.BaseSoundManager#setRate
  21042. * @fires Phaser.Sound.Events#GLOBAL_RATE
  21043. * @since 3.3.0
  21044. *
  21045. * @param {number} value - Global playback rate at which all the sounds will be played.
  21046. *
  21047. * @return {Phaser.Sound.BaseSoundManager} This Sound Manager.
  21048. */
  21049. setRate: function (value)
  21050. {
  21051. this.rate = value;
  21052. return this;
  21053. },
  21054. /**
  21055. * Global playback rate at which all the sounds will be played.
  21056. * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  21057. * and 2.0 doubles the audio's playback speed.
  21058. *
  21059. * @name Phaser.Sound.BaseSoundManager#rate
  21060. * @type {number}
  21061. * @default 1
  21062. * @since 3.0.0
  21063. */
  21064. rate: {
  21065. get: function ()
  21066. {
  21067. return this._rate;
  21068. },
  21069. set: function (value)
  21070. {
  21071. this._rate = value;
  21072. this.forEachActiveSound(function (sound)
  21073. {
  21074. sound.calculateRate();
  21075. });
  21076. this.emit(Events.GLOBAL_RATE, this, value);
  21077. }
  21078. },
  21079. /**
  21080. * Sets the global detuning of all sounds in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  21081. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  21082. *
  21083. * @method Phaser.Sound.BaseSoundManager#setDetune
  21084. * @fires Phaser.Sound.Events#GLOBAL_DETUNE
  21085. * @since 3.3.0
  21086. *
  21087. * @param {number} value - The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  21088. *
  21089. * @return {Phaser.Sound.BaseSoundManager} This Sound Manager.
  21090. */
  21091. setDetune: function (value)
  21092. {
  21093. this.detune = value;
  21094. return this;
  21095. },
  21096. /**
  21097. * Global detuning of all sounds in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  21098. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  21099. *
  21100. * @name Phaser.Sound.BaseSoundManager#detune
  21101. * @type {number}
  21102. * @default 0
  21103. * @since 3.0.0
  21104. */
  21105. detune: {
  21106. get: function ()
  21107. {
  21108. return this._detune;
  21109. },
  21110. set: function (value)
  21111. {
  21112. this._detune = value;
  21113. this.forEachActiveSound(function (sound)
  21114. {
  21115. sound.calculateRate();
  21116. });
  21117. this.emit(Events.GLOBAL_DETUNE, this, value);
  21118. }
  21119. }
  21120. });
  21121. module.exports = BaseSoundManager;
  21122. /***/ }),
  21123. /* 124 */
  21124. /***/ (function(module, exports) {
  21125. /**
  21126. * @author Richard Davey <rich@photonstorm.com>
  21127. * @copyright 2019 Photon Storm Ltd.
  21128. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21129. */
  21130. /**
  21131. * Scene consts.
  21132. *
  21133. * @ignore
  21134. */
  21135. var CONST = {
  21136. /**
  21137. * Scene state.
  21138. *
  21139. * @name Phaser.Scenes.PENDING
  21140. * @readonly
  21141. * @type {integer}
  21142. * @since 3.0.0
  21143. */
  21144. PENDING: 0,
  21145. /**
  21146. * Scene state.
  21147. *
  21148. * @name Phaser.Scenes.INIT
  21149. * @readonly
  21150. * @type {integer}
  21151. * @since 3.0.0
  21152. */
  21153. INIT: 1,
  21154. /**
  21155. * Scene state.
  21156. *
  21157. * @name Phaser.Scenes.START
  21158. * @readonly
  21159. * @type {integer}
  21160. * @since 3.0.0
  21161. */
  21162. START: 2,
  21163. /**
  21164. * Scene state.
  21165. *
  21166. * @name Phaser.Scenes.LOADING
  21167. * @readonly
  21168. * @type {integer}
  21169. * @since 3.0.0
  21170. */
  21171. LOADING: 3,
  21172. /**
  21173. * Scene state.
  21174. *
  21175. * @name Phaser.Scenes.CREATING
  21176. * @readonly
  21177. * @type {integer}
  21178. * @since 3.0.0
  21179. */
  21180. CREATING: 4,
  21181. /**
  21182. * Scene state.
  21183. *
  21184. * @name Phaser.Scenes.RUNNING
  21185. * @readonly
  21186. * @type {integer}
  21187. * @since 3.0.0
  21188. */
  21189. RUNNING: 5,
  21190. /**
  21191. * Scene state.
  21192. *
  21193. * @name Phaser.Scenes.PAUSED
  21194. * @readonly
  21195. * @type {integer}
  21196. * @since 3.0.0
  21197. */
  21198. PAUSED: 6,
  21199. /**
  21200. * Scene state.
  21201. *
  21202. * @name Phaser.Scenes.SLEEPING
  21203. * @readonly
  21204. * @type {integer}
  21205. * @since 3.0.0
  21206. */
  21207. SLEEPING: 7,
  21208. /**
  21209. * Scene state.
  21210. *
  21211. * @name Phaser.Scenes.SHUTDOWN
  21212. * @readonly
  21213. * @type {integer}
  21214. * @since 3.0.0
  21215. */
  21216. SHUTDOWN: 8,
  21217. /**
  21218. * Scene state.
  21219. *
  21220. * @name Phaser.Scenes.DESTROYED
  21221. * @readonly
  21222. * @type {integer}
  21223. * @since 3.0.0
  21224. */
  21225. DESTROYED: 9
  21226. };
  21227. module.exports = CONST;
  21228. /***/ }),
  21229. /* 125 */
  21230. /***/ (function(module, exports) {
  21231. /**
  21232. * @author Richard Davey <rich@photonstorm.com>
  21233. * @copyright 2019 Photon Storm Ltd.
  21234. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21235. */
  21236. /**
  21237. * Keyboard Codes.
  21238. *
  21239. * @name Phaser.Input.Keyboard.KeyCodes
  21240. * @enum {integer}
  21241. * @memberof Phaser.Input.Keyboard
  21242. * @readonly
  21243. * @since 3.0.0
  21244. */
  21245. var KeyCodes = {
  21246. /**
  21247. * @name Phaser.Input.Keyboard.KeyCodes.BACKSPACE
  21248. */
  21249. BACKSPACE: 8,
  21250. /**
  21251. * @name Phaser.Input.Keyboard.KeyCodes.TAB
  21252. */
  21253. TAB: 9,
  21254. /**
  21255. * @name Phaser.Input.Keyboard.KeyCodes.ENTER
  21256. */
  21257. ENTER: 13,
  21258. /**
  21259. * @name Phaser.Input.Keyboard.KeyCodes.SHIFT
  21260. */
  21261. SHIFT: 16,
  21262. /**
  21263. * @name Phaser.Input.Keyboard.KeyCodes.CTRL
  21264. */
  21265. CTRL: 17,
  21266. /**
  21267. * @name Phaser.Input.Keyboard.KeyCodes.ALT
  21268. */
  21269. ALT: 18,
  21270. /**
  21271. * @name Phaser.Input.Keyboard.KeyCodes.PAUSE
  21272. */
  21273. PAUSE: 19,
  21274. /**
  21275. * @name Phaser.Input.Keyboard.KeyCodes.CAPS_LOCK
  21276. */
  21277. CAPS_LOCK: 20,
  21278. /**
  21279. * @name Phaser.Input.Keyboard.KeyCodes.ESC
  21280. */
  21281. ESC: 27,
  21282. /**
  21283. * @name Phaser.Input.Keyboard.KeyCodes.SPACE
  21284. */
  21285. SPACE: 32,
  21286. /**
  21287. * @name Phaser.Input.Keyboard.KeyCodes.PAGE_UP
  21288. */
  21289. PAGE_UP: 33,
  21290. /**
  21291. * @name Phaser.Input.Keyboard.KeyCodes.PAGE_DOWN
  21292. */
  21293. PAGE_DOWN: 34,
  21294. /**
  21295. * @name Phaser.Input.Keyboard.KeyCodes.END
  21296. */
  21297. END: 35,
  21298. /**
  21299. * @name Phaser.Input.Keyboard.KeyCodes.HOME
  21300. */
  21301. HOME: 36,
  21302. /**
  21303. * @name Phaser.Input.Keyboard.KeyCodes.LEFT
  21304. */
  21305. LEFT: 37,
  21306. /**
  21307. * @name Phaser.Input.Keyboard.KeyCodes.UP
  21308. */
  21309. UP: 38,
  21310. /**
  21311. * @name Phaser.Input.Keyboard.KeyCodes.RIGHT
  21312. */
  21313. RIGHT: 39,
  21314. /**
  21315. * @name Phaser.Input.Keyboard.KeyCodes.DOWN
  21316. */
  21317. DOWN: 40,
  21318. /**
  21319. * @name Phaser.Input.Keyboard.KeyCodes.PRINT_SCREEN
  21320. */
  21321. PRINT_SCREEN: 42,
  21322. /**
  21323. * @name Phaser.Input.Keyboard.KeyCodes.INSERT
  21324. */
  21325. INSERT: 45,
  21326. /**
  21327. * @name Phaser.Input.Keyboard.KeyCodes.DELETE
  21328. */
  21329. DELETE: 46,
  21330. /**
  21331. * @name Phaser.Input.Keyboard.KeyCodes.ZERO
  21332. */
  21333. ZERO: 48,
  21334. /**
  21335. * @name Phaser.Input.Keyboard.KeyCodes.ONE
  21336. */
  21337. ONE: 49,
  21338. /**
  21339. * @name Phaser.Input.Keyboard.KeyCodes.TWO
  21340. */
  21341. TWO: 50,
  21342. /**
  21343. * @name Phaser.Input.Keyboard.KeyCodes.THREE
  21344. */
  21345. THREE: 51,
  21346. /**
  21347. * @name Phaser.Input.Keyboard.KeyCodes.FOUR
  21348. */
  21349. FOUR: 52,
  21350. /**
  21351. * @name Phaser.Input.Keyboard.KeyCodes.FIVE
  21352. */
  21353. FIVE: 53,
  21354. /**
  21355. * @name Phaser.Input.Keyboard.KeyCodes.SIX
  21356. */
  21357. SIX: 54,
  21358. /**
  21359. * @name Phaser.Input.Keyboard.KeyCodes.SEVEN
  21360. */
  21361. SEVEN: 55,
  21362. /**
  21363. * @name Phaser.Input.Keyboard.KeyCodes.EIGHT
  21364. */
  21365. EIGHT: 56,
  21366. /**
  21367. * @name Phaser.Input.Keyboard.KeyCodes.NINE
  21368. */
  21369. NINE: 57,
  21370. /**
  21371. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_ZERO
  21372. */
  21373. NUMPAD_ZERO: 96,
  21374. /**
  21375. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_ONE
  21376. */
  21377. NUMPAD_ONE: 97,
  21378. /**
  21379. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_TWO
  21380. */
  21381. NUMPAD_TWO: 98,
  21382. /**
  21383. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_THREE
  21384. */
  21385. NUMPAD_THREE: 99,
  21386. /**
  21387. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_FOUR
  21388. */
  21389. NUMPAD_FOUR: 100,
  21390. /**
  21391. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_FIVE
  21392. */
  21393. NUMPAD_FIVE: 101,
  21394. /**
  21395. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_SIX
  21396. */
  21397. NUMPAD_SIX: 102,
  21398. /**
  21399. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_SEVEN
  21400. */
  21401. NUMPAD_SEVEN: 103,
  21402. /**
  21403. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_EIGHT
  21404. */
  21405. NUMPAD_EIGHT: 104,
  21406. /**
  21407. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_NINE
  21408. */
  21409. NUMPAD_NINE: 105,
  21410. /**
  21411. * @name Phaser.Input.Keyboard.KeyCodes.A
  21412. */
  21413. A: 65,
  21414. /**
  21415. * @name Phaser.Input.Keyboard.KeyCodes.B
  21416. */
  21417. B: 66,
  21418. /**
  21419. * @name Phaser.Input.Keyboard.KeyCodes.C
  21420. */
  21421. C: 67,
  21422. /**
  21423. * @name Phaser.Input.Keyboard.KeyCodes.D
  21424. */
  21425. D: 68,
  21426. /**
  21427. * @name Phaser.Input.Keyboard.KeyCodes.E
  21428. */
  21429. E: 69,
  21430. /**
  21431. * @name Phaser.Input.Keyboard.KeyCodes.F
  21432. */
  21433. F: 70,
  21434. /**
  21435. * @name Phaser.Input.Keyboard.KeyCodes.G
  21436. */
  21437. G: 71,
  21438. /**
  21439. * @name Phaser.Input.Keyboard.KeyCodes.H
  21440. */
  21441. H: 72,
  21442. /**
  21443. * @name Phaser.Input.Keyboard.KeyCodes.I
  21444. */
  21445. I: 73,
  21446. /**
  21447. * @name Phaser.Input.Keyboard.KeyCodes.J
  21448. */
  21449. J: 74,
  21450. /**
  21451. * @name Phaser.Input.Keyboard.KeyCodes.K
  21452. */
  21453. K: 75,
  21454. /**
  21455. * @name Phaser.Input.Keyboard.KeyCodes.L
  21456. */
  21457. L: 76,
  21458. /**
  21459. * @name Phaser.Input.Keyboard.KeyCodes.M
  21460. */
  21461. M: 77,
  21462. /**
  21463. * @name Phaser.Input.Keyboard.KeyCodes.N
  21464. */
  21465. N: 78,
  21466. /**
  21467. * @name Phaser.Input.Keyboard.KeyCodes.O
  21468. */
  21469. O: 79,
  21470. /**
  21471. * @name Phaser.Input.Keyboard.KeyCodes.P
  21472. */
  21473. P: 80,
  21474. /**
  21475. * @name Phaser.Input.Keyboard.KeyCodes.Q
  21476. */
  21477. Q: 81,
  21478. /**
  21479. * @name Phaser.Input.Keyboard.KeyCodes.R
  21480. */
  21481. R: 82,
  21482. /**
  21483. * @name Phaser.Input.Keyboard.KeyCodes.S
  21484. */
  21485. S: 83,
  21486. /**
  21487. * @name Phaser.Input.Keyboard.KeyCodes.T
  21488. */
  21489. T: 84,
  21490. /**
  21491. * @name Phaser.Input.Keyboard.KeyCodes.U
  21492. */
  21493. U: 85,
  21494. /**
  21495. * @name Phaser.Input.Keyboard.KeyCodes.V
  21496. */
  21497. V: 86,
  21498. /**
  21499. * @name Phaser.Input.Keyboard.KeyCodes.W
  21500. */
  21501. W: 87,
  21502. /**
  21503. * @name Phaser.Input.Keyboard.KeyCodes.X
  21504. */
  21505. X: 88,
  21506. /**
  21507. * @name Phaser.Input.Keyboard.KeyCodes.Y
  21508. */
  21509. Y: 89,
  21510. /**
  21511. * @name Phaser.Input.Keyboard.KeyCodes.Z
  21512. */
  21513. Z: 90,
  21514. /**
  21515. * @name Phaser.Input.Keyboard.KeyCodes.F1
  21516. */
  21517. F1: 112,
  21518. /**
  21519. * @name Phaser.Input.Keyboard.KeyCodes.F2
  21520. */
  21521. F2: 113,
  21522. /**
  21523. * @name Phaser.Input.Keyboard.KeyCodes.F3
  21524. */
  21525. F3: 114,
  21526. /**
  21527. * @name Phaser.Input.Keyboard.KeyCodes.F4
  21528. */
  21529. F4: 115,
  21530. /**
  21531. * @name Phaser.Input.Keyboard.KeyCodes.F5
  21532. */
  21533. F5: 116,
  21534. /**
  21535. * @name Phaser.Input.Keyboard.KeyCodes.F6
  21536. */
  21537. F6: 117,
  21538. /**
  21539. * @name Phaser.Input.Keyboard.KeyCodes.F7
  21540. */
  21541. F7: 118,
  21542. /**
  21543. * @name Phaser.Input.Keyboard.KeyCodes.F8
  21544. */
  21545. F8: 119,
  21546. /**
  21547. * @name Phaser.Input.Keyboard.KeyCodes.F9
  21548. */
  21549. F9: 120,
  21550. /**
  21551. * @name Phaser.Input.Keyboard.KeyCodes.F10
  21552. */
  21553. F10: 121,
  21554. /**
  21555. * @name Phaser.Input.Keyboard.KeyCodes.F11
  21556. */
  21557. F11: 122,
  21558. /**
  21559. * @name Phaser.Input.Keyboard.KeyCodes.F12
  21560. */
  21561. F12: 123,
  21562. /**
  21563. * @name Phaser.Input.Keyboard.KeyCodes.SEMICOLON
  21564. */
  21565. SEMICOLON: 186,
  21566. /**
  21567. * @name Phaser.Input.Keyboard.KeyCodes.PLUS
  21568. */
  21569. PLUS: 187,
  21570. /**
  21571. * @name Phaser.Input.Keyboard.KeyCodes.COMMA
  21572. */
  21573. COMMA: 188,
  21574. /**
  21575. * @name Phaser.Input.Keyboard.KeyCodes.MINUS
  21576. */
  21577. MINUS: 189,
  21578. /**
  21579. * @name Phaser.Input.Keyboard.KeyCodes.PERIOD
  21580. */
  21581. PERIOD: 190,
  21582. /**
  21583. * @name Phaser.Input.Keyboard.KeyCodes.FORWARD_SLASH
  21584. */
  21585. FORWARD_SLASH: 191,
  21586. /**
  21587. * @name Phaser.Input.Keyboard.KeyCodes.BACK_SLASH
  21588. */
  21589. BACK_SLASH: 220,
  21590. /**
  21591. * @name Phaser.Input.Keyboard.KeyCodes.QUOTES
  21592. */
  21593. QUOTES: 222,
  21594. /**
  21595. * @name Phaser.Input.Keyboard.KeyCodes.BACKTICK
  21596. */
  21597. BACKTICK: 192,
  21598. /**
  21599. * @name Phaser.Input.Keyboard.KeyCodes.OPEN_BRACKET
  21600. */
  21601. OPEN_BRACKET: 219,
  21602. /**
  21603. * @name Phaser.Input.Keyboard.KeyCodes.CLOSED_BRACKET
  21604. */
  21605. CLOSED_BRACKET: 221,
  21606. /**
  21607. * @name Phaser.Input.Keyboard.KeyCodes.SEMICOLON_FIREFOX
  21608. */
  21609. SEMICOLON_FIREFOX: 59,
  21610. /**
  21611. * @name Phaser.Input.Keyboard.KeyCodes.COLON
  21612. */
  21613. COLON: 58,
  21614. /**
  21615. * @name Phaser.Input.Keyboard.KeyCodes.COMMA_FIREFOX_WINDOWS
  21616. */
  21617. COMMA_FIREFOX_WINDOWS: 60,
  21618. /**
  21619. * @name Phaser.Input.Keyboard.KeyCodes.COMMA_FIREFOX
  21620. */
  21621. COMMA_FIREFOX: 62,
  21622. /**
  21623. * @name Phaser.Input.Keyboard.KeyCodes.BRACKET_RIGHT_FIREFOX
  21624. */
  21625. BRACKET_RIGHT_FIREFOX: 174,
  21626. /**
  21627. * @name Phaser.Input.Keyboard.KeyCodes.BRACKET_LEFT_FIREFOX
  21628. */
  21629. BRACKET_LEFT_FIREFOX: 175
  21630. };
  21631. module.exports = KeyCodes;
  21632. /***/ }),
  21633. /* 126 */
  21634. /***/ (function(module, exports, __webpack_require__) {
  21635. /**
  21636. * @author Richard Davey <rich@photonstorm.com>
  21637. * @copyright 2019 Photon Storm Ltd.
  21638. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21639. */
  21640. /**
  21641. * @namespace Phaser.Textures.Events
  21642. */
  21643. module.exports = {
  21644. ADD: __webpack_require__(1049),
  21645. ERROR: __webpack_require__(1048),
  21646. LOAD: __webpack_require__(1047),
  21647. READY: __webpack_require__(1046),
  21648. REMOVE: __webpack_require__(1045)
  21649. };
  21650. /***/ }),
  21651. /* 127 */
  21652. /***/ (function(module, exports) {
  21653. /**
  21654. * @author Richard Davey <rich@photonstorm.com>
  21655. * @copyright 2019 Photon Storm Ltd.
  21656. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21657. */
  21658. /**
  21659. * Checks if the given `width` and `height` are a power of two.
  21660. * Useful for checking texture dimensions.
  21661. *
  21662. * @function Phaser.Math.Pow2.IsSizePowerOfTwo
  21663. * @since 3.0.0
  21664. *
  21665. * @param {number} width - The width.
  21666. * @param {number} height - The height.
  21667. *
  21668. * @return {boolean} `true` if `width` and `height` are a power of two, otherwise `false`.
  21669. */
  21670. var IsSizePowerOfTwo = function (width, height)
  21671. {
  21672. return (width > 0 && (width & (width - 1)) === 0 && height > 0 && (height & (height - 1)) === 0);
  21673. };
  21674. module.exports = IsSizePowerOfTwo;
  21675. /***/ }),
  21676. /* 128 */
  21677. /***/ (function(module, exports, __webpack_require__) {
  21678. /**
  21679. * @author Richard Davey <rich@photonstorm.com>
  21680. * @copyright 2019 Photon Storm Ltd.
  21681. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21682. */
  21683. var OS = __webpack_require__(99);
  21684. /**
  21685. * Determines the browser type and version running this Phaser Game instance.
  21686. * These values are read-only and populated during the boot sequence of the game.
  21687. * They are then referenced by internal game systems and are available for you to access
  21688. * via `this.sys.game.device.browser` from within any Scene.
  21689. *
  21690. * @typedef {object} Phaser.Device.Browser
  21691. * @since 3.0.0
  21692. *
  21693. * @property {boolean} chrome - Set to true if running in Chrome.
  21694. * @property {boolean} edge - Set to true if running in Microsoft Edge browser.
  21695. * @property {boolean} firefox - Set to true if running in Firefox.
  21696. * @property {boolean} ie - Set to true if running in Internet Explorer 11 or less (not Edge).
  21697. * @property {boolean} mobileSafari - Set to true if running in Mobile Safari.
  21698. * @property {boolean} opera - Set to true if running in Opera.
  21699. * @property {boolean} safari - Set to true if running in Safari.
  21700. * @property {boolean} silk - Set to true if running in the Silk browser (as used on the Amazon Kindle)
  21701. * @property {boolean} trident - Set to true if running a Trident version of Internet Explorer (IE11+)
  21702. * @property {number} chromeVersion - If running in Chrome this will contain the major version number.
  21703. * @property {number} firefoxVersion - If running in Firefox this will contain the major version number.
  21704. * @property {number} ieVersion - If running in Internet Explorer this will contain the major version number. Beyond IE10 you should use Browser.trident and Browser.tridentVersion.
  21705. * @property {number} safariVersion - If running in Safari this will contain the major version number.
  21706. * @property {number} tridentVersion - If running in Internet Explorer 11 this will contain the major version number. See {@link http://msdn.microsoft.com/en-us/library/ie/ms537503(v=vs.85).aspx}
  21707. */
  21708. var Browser = {
  21709. chrome: false,
  21710. chromeVersion: 0,
  21711. edge: false,
  21712. firefox: false,
  21713. firefoxVersion: 0,
  21714. ie: false,
  21715. ieVersion: 0,
  21716. mobileSafari: false,
  21717. opera: false,
  21718. safari: false,
  21719. safariVersion: 0,
  21720. silk: false,
  21721. trident: false,
  21722. tridentVersion: 0
  21723. };
  21724. function init ()
  21725. {
  21726. var ua = navigator.userAgent;
  21727. if (/Edge\/\d+/.test(ua))
  21728. {
  21729. Browser.edge = true;
  21730. }
  21731. else if ((/Chrome\/(\d+)/).test(ua) && !OS.windowsPhone)
  21732. {
  21733. Browser.chrome = true;
  21734. Browser.chromeVersion = parseInt(RegExp.$1, 10);
  21735. }
  21736. else if ((/Firefox\D+(\d+)/).test(ua))
  21737. {
  21738. Browser.firefox = true;
  21739. Browser.firefoxVersion = parseInt(RegExp.$1, 10);
  21740. }
  21741. else if ((/AppleWebKit/).test(ua) && OS.iOS)
  21742. {
  21743. Browser.mobileSafari = true;
  21744. }
  21745. else if ((/MSIE (\d+\.\d+);/).test(ua))
  21746. {
  21747. Browser.ie = true;
  21748. Browser.ieVersion = parseInt(RegExp.$1, 10);
  21749. }
  21750. else if ((/Opera/).test(ua))
  21751. {
  21752. Browser.opera = true;
  21753. }
  21754. else if ((/Safari/).test(ua) && !OS.windowsPhone)
  21755. {
  21756. Browser.safari = true;
  21757. }
  21758. else if ((/Trident\/(\d+\.\d+)(.*)rv:(\d+\.\d+)/).test(ua))
  21759. {
  21760. Browser.ie = true;
  21761. Browser.trident = true;
  21762. Browser.tridentVersion = parseInt(RegExp.$1, 10);
  21763. Browser.ieVersion = parseInt(RegExp.$3, 10);
  21764. }
  21765. // Silk gets its own if clause because its ua also contains 'Safari'
  21766. if ((/Silk/).test(ua))
  21767. {
  21768. Browser.silk = true;
  21769. }
  21770. return Browser;
  21771. }
  21772. module.exports = init();
  21773. /***/ }),
  21774. /* 129 */
  21775. /***/ (function(module, exports) {
  21776. /**
  21777. * @author Richard Davey <rich@photonstorm.com>
  21778. * @copyright 2019 Photon Storm Ltd.
  21779. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21780. */
  21781. /**
  21782. * Calculates a linear (interpolation) value over t.
  21783. *
  21784. * @function Phaser.Math.Linear
  21785. * @since 3.0.0
  21786. *
  21787. * @param {number} p0 - The first point.
  21788. * @param {number} p1 - The second point.
  21789. * @param {number} t - The percentage between p0 and p1 to return, represented as a number between 0 and 1.
  21790. *
  21791. * @return {number} The step t% of the way between p0 and p1.
  21792. */
  21793. var Linear = function (p0, p1, t)
  21794. {
  21795. return (p1 - p0) * t + p0;
  21796. };
  21797. module.exports = Linear;
  21798. /***/ }),
  21799. /* 130 */
  21800. /***/ (function(module, exports) {
  21801. /**
  21802. * @author Richard Davey <rich@photonstorm.com>
  21803. * @copyright 2019 Photon Storm Ltd.
  21804. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21805. */
  21806. // Browser specific prefix, so not going to change between contexts, only between browsers
  21807. var prefix = '';
  21808. /**
  21809. * @namespace Phaser.Display.Canvas.Smoothing
  21810. * @since 3.0.0
  21811. */
  21812. var Smoothing = function ()
  21813. {
  21814. /**
  21815. * Gets the Smoothing Enabled vendor prefix being used on the given context, or null if not set.
  21816. *
  21817. * @function Phaser.Display.Canvas.Smoothing.getPrefix
  21818. * @since 3.0.0
  21819. *
  21820. * @param {(CanvasRenderingContext2D|WebGLRenderingContext)} context - The canvas context to check.
  21821. *
  21822. * @return {string} The name of the property on the context which controls image smoothing (either `imageSmoothingEnabled` or a vendor-prefixed version thereof), or `null` if not supported.
  21823. */
  21824. var getPrefix = function (context)
  21825. {
  21826. var vendors = [ 'i', 'webkitI', 'msI', 'mozI', 'oI' ];
  21827. for (var i = 0; i < vendors.length; i++)
  21828. {
  21829. var s = vendors[i] + 'mageSmoothingEnabled';
  21830. if (s in context)
  21831. {
  21832. return s;
  21833. }
  21834. }
  21835. return null;
  21836. };
  21837. /**
  21838. * Sets the Image Smoothing property on the given context. Set to false to disable image smoothing.
  21839. * By default browsers have image smoothing enabled, which isn't always what you visually want, especially
  21840. * when using pixel art in a game. Note that this sets the property on the context itself, so that any image
  21841. * drawn to the context will be affected. This sets the property across all current browsers but support is
  21842. * patchy on earlier browsers, especially on mobile.
  21843. *
  21844. * @function Phaser.Display.Canvas.Smoothing.enable
  21845. * @since 3.0.0
  21846. *
  21847. * @param {(CanvasRenderingContext2D|WebGLRenderingContext)} context - The context on which to enable smoothing.
  21848. *
  21849. * @return {(CanvasRenderingContext2D|WebGLRenderingContext)} The provided context.
  21850. */
  21851. var enable = function (context)
  21852. {
  21853. if (prefix === '')
  21854. {
  21855. prefix = getPrefix(context);
  21856. }
  21857. if (prefix)
  21858. {
  21859. context[prefix] = true;
  21860. }
  21861. return context;
  21862. };
  21863. /**
  21864. * Sets the Image Smoothing property on the given context. Set to false to disable image smoothing.
  21865. * By default browsers have image smoothing enabled, which isn't always what you visually want, especially
  21866. * when using pixel art in a game. Note that this sets the property on the context itself, so that any image
  21867. * drawn to the context will be affected. This sets the property across all current browsers but support is
  21868. * patchy on earlier browsers, especially on mobile.
  21869. *
  21870. * @function Phaser.Display.Canvas.Smoothing.disable
  21871. * @since 3.0.0
  21872. *
  21873. * @param {(CanvasRenderingContext2D|WebGLRenderingContext)} context - The context on which to disable smoothing.
  21874. *
  21875. * @return {(CanvasRenderingContext2D|WebGLRenderingContext)} The provided context.
  21876. */
  21877. var disable = function (context)
  21878. {
  21879. if (prefix === '')
  21880. {
  21881. prefix = getPrefix(context);
  21882. }
  21883. if (prefix)
  21884. {
  21885. context[prefix] = false;
  21886. }
  21887. return context;
  21888. };
  21889. /**
  21890. * Returns `true` if the given context has image smoothing enabled, otherwise returns `false`.
  21891. * Returns null if no smoothing prefix is available.
  21892. *
  21893. * @function Phaser.Display.Canvas.Smoothing.isEnabled
  21894. * @since 3.0.0
  21895. *
  21896. * @param {(CanvasRenderingContext2D|WebGLRenderingContext)} context - The context to check.
  21897. *
  21898. * @return {?boolean} `true` if smoothing is enabled on the context, otherwise `false`. `null` if not supported.
  21899. */
  21900. var isEnabled = function (context)
  21901. {
  21902. return (prefix !== null) ? context[prefix] : null;
  21903. };
  21904. return {
  21905. disable: disable,
  21906. enable: enable,
  21907. getPrefix: getPrefix,
  21908. isEnabled: isEnabled
  21909. };
  21910. };
  21911. module.exports = Smoothing();
  21912. /***/ }),
  21913. /* 131 */
  21914. /***/ (function(module, exports, __webpack_require__) {
  21915. /**
  21916. * @author Richard Davey <rich@photonstorm.com>
  21917. * @copyright 2019 Photon Storm Ltd.
  21918. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21919. */
  21920. var Class = __webpack_require__(0);
  21921. var Components = __webpack_require__(13);
  21922. var DegToRad = __webpack_require__(34);
  21923. var EventEmitter = __webpack_require__(11);
  21924. var Events = __webpack_require__(40);
  21925. var Rectangle = __webpack_require__(10);
  21926. var TransformMatrix = __webpack_require__(41);
  21927. var ValueToColor = __webpack_require__(192);
  21928. var Vector2 = __webpack_require__(3);
  21929. /**
  21930. * @typedef {object} JSONCameraBounds
  21931. * @property {number} x - The horizontal position of camera
  21932. * @property {number} y - The vertical position of camera
  21933. * @property {number} width - The width size of camera
  21934. * @property {number} height - The height size of camera
  21935. */
  21936. /**
  21937. * @typedef {object} JSONCamera
  21938. *
  21939. * @property {string} name - The name of the camera
  21940. * @property {number} x - The horizontal position of camera
  21941. * @property {number} y - The vertical position of camera
  21942. * @property {number} width - The width size of camera
  21943. * @property {number} height - The height size of camera
  21944. * @property {number} zoom - The zoom of camera
  21945. * @property {number} rotation - The rotation of camera
  21946. * @property {boolean} roundPixels - The round pixels st status of camera
  21947. * @property {number} scrollX - The horizontal scroll of camera
  21948. * @property {number} scrollY - The vertical scroll of camera
  21949. * @property {string} backgroundColor - The background color of camera
  21950. * @property {(JSONCameraBounds|undefined)} [bounds] - The bounds of camera
  21951. */
  21952. /**
  21953. * @classdesc
  21954. * A Base Camera class.
  21955. *
  21956. * The Camera is the way in which all games are rendered in Phaser. They provide a view into your game world,
  21957. * and can be positioned, rotated, zoomed and scrolled accordingly.
  21958. *
  21959. * A Camera consists of two elements: The viewport and the scroll values.
  21960. *
  21961. * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are
  21962. * created the same size as your game, but their position and size can be set to anything. This means if you
  21963. * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game,
  21964. * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`).
  21965. *
  21966. * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this
  21967. * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the
  21968. * viewport, and changing the viewport has no impact on the scrolling.
  21969. *
  21970. * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method,
  21971. * allowing you to filter Game Objects out on a per-Camera basis.
  21972. *
  21973. * The Base Camera is extended by the Camera class, which adds in special effects including Fade,
  21974. * Flash and Camera Shake, as well as the ability to follow Game Objects.
  21975. *
  21976. * The Base Camera was introduced in Phaser 3.12. It was split off from the Camera class, to allow
  21977. * you to isolate special effects as needed. Therefore the 'since' values for properties of this class relate
  21978. * to when they were added to the Camera class.
  21979. *
  21980. * @class BaseCamera
  21981. * @memberof Phaser.Cameras.Scene2D
  21982. * @constructor
  21983. * @since 3.12.0
  21984. *
  21985. * @extends Phaser.Events.EventEmitter
  21986. * @extends Phaser.GameObjects.Components.Alpha
  21987. * @extends Phaser.GameObjects.Components.Visible
  21988. *
  21989. * @param {number} x - The x position of the Camera, relative to the top-left of the game canvas.
  21990. * @param {number} y - The y position of the Camera, relative to the top-left of the game canvas.
  21991. * @param {number} width - The width of the Camera, in pixels.
  21992. * @param {number} height - The height of the Camera, in pixels.
  21993. */
  21994. var BaseCamera = new Class({
  21995. Extends: EventEmitter,
  21996. Mixins: [
  21997. Components.Alpha,
  21998. Components.Visible
  21999. ],
  22000. initialize:
  22001. function BaseCamera (x, y, width, height)
  22002. {
  22003. if (x === undefined) { x = 0; }
  22004. if (y === undefined) { y = 0; }
  22005. if (width === undefined) { width = 0; }
  22006. if (height === undefined) { height = 0; }
  22007. EventEmitter.call(this);
  22008. /**
  22009. * A reference to the Scene this camera belongs to.
  22010. *
  22011. * @name Phaser.Cameras.Scene2D.BaseCamera#scene
  22012. * @type {Phaser.Scene}
  22013. * @since 3.0.0
  22014. */
  22015. this.scene;
  22016. /**
  22017. * A reference to the Game Scene Manager.
  22018. *
  22019. * @name Phaser.Cameras.Scene2D.BaseCamera#sceneManager
  22020. * @type {Phaser.Scenes.SceneManager}
  22021. * @since 3.12.0
  22022. */
  22023. this.sceneManager;
  22024. /**
  22025. * A reference to the Game Scale Manager.
  22026. *
  22027. * @name Phaser.Cameras.Scene2D.BaseCamera#scaleManager
  22028. * @type {Phaser.Scale.ScaleManager}
  22029. * @since 3.16.0
  22030. */
  22031. this.scaleManager;
  22032. /**
  22033. * The Camera ID. Assigned by the Camera Manager and used to handle camera exclusion.
  22034. * This value is a bitmask.
  22035. *
  22036. * @name Phaser.Cameras.Scene2D.BaseCamera#id
  22037. * @type {integer}
  22038. * @readonly
  22039. * @since 3.11.0
  22040. */
  22041. this.id = 0;
  22042. /**
  22043. * The name of the Camera. This is left empty for your own use.
  22044. *
  22045. * @name Phaser.Cameras.Scene2D.BaseCamera#name
  22046. * @type {string}
  22047. * @default ''
  22048. * @since 3.0.0
  22049. */
  22050. this.name = '';
  22051. /**
  22052. * This property is un-used in v3.16.
  22053. *
  22054. * The resolution of the Game, used in most Camera calculations.
  22055. *
  22056. * @name Phaser.Cameras.Scene2D.BaseCamera#resolution
  22057. * @type {number}
  22058. * @readonly
  22059. * @deprecated
  22060. * @since 3.12.0
  22061. */
  22062. this.resolution = 1;
  22063. /**
  22064. * Should this camera round its pixel values to integers?
  22065. *
  22066. * @name Phaser.Cameras.Scene2D.BaseCamera#roundPixels
  22067. * @type {boolean}
  22068. * @default false
  22069. * @since 3.0.0
  22070. */
  22071. this.roundPixels = false;
  22072. /**
  22073. * Is this Camera visible or not?
  22074. *
  22075. * A visible camera will render and perform input tests.
  22076. * An invisible camera will not render anything and will skip input tests.
  22077. *
  22078. * @name Phaser.Cameras.Scene2D.BaseCamera#visible
  22079. * @type {boolean}
  22080. * @default true
  22081. * @since 3.10.0
  22082. */
  22083. /**
  22084. * Is this Camera using a bounds to restrict scrolling movement?
  22085. *
  22086. * Set this property along with the bounds via `Camera.setBounds`.
  22087. *
  22088. * @name Phaser.Cameras.Scene2D.BaseCamera#useBounds
  22089. * @type {boolean}
  22090. * @default false
  22091. * @since 3.0.0
  22092. */
  22093. this.useBounds = false;
  22094. /**
  22095. * The World View is a Rectangle that defines the area of the 'world' the Camera is currently looking at.
  22096. * This factors in the Camera viewport size, zoom and scroll position and is updated in the Camera preRender step.
  22097. * If you have enabled Camera bounds the worldview will be clamped to those bounds accordingly.
  22098. * You can use it for culling or intersection checks.
  22099. *
  22100. * @name Phaser.Cameras.Scene2D.BaseCamera#worldView
  22101. * @type {Phaser.Geom.Rectangle}
  22102. * @readonly
  22103. * @since 3.11.0
  22104. */
  22105. this.worldView = new Rectangle();
  22106. /**
  22107. * Is this Camera dirty?
  22108. *
  22109. * A dirty Camera has had either its viewport size, bounds, scroll, rotation or zoom levels changed since the last frame.
  22110. *
  22111. * This flag is cleared during the `postRenderCamera` method of the renderer.
  22112. *
  22113. * @name Phaser.Cameras.Scene2D.BaseCamera#dirty
  22114. * @type {boolean}
  22115. * @default true
  22116. * @since 3.11.0
  22117. */
  22118. this.dirty = true;
  22119. /**
  22120. * The x position of the Camera viewport, relative to the top-left of the game canvas.
  22121. * The viewport is the area into which the camera renders.
  22122. * To adjust the position the camera is looking at in the game world, see the `scrollX` value.
  22123. *
  22124. * @name Phaser.Cameras.Scene2D.BaseCamera#x
  22125. * @type {number}
  22126. * @private
  22127. * @since 3.0.0
  22128. */
  22129. this._x = x;
  22130. /**
  22131. * The y position of the Camera, relative to the top-left of the game canvas.
  22132. * The viewport is the area into which the camera renders.
  22133. * To adjust the position the camera is looking at in the game world, see the `scrollY` value.
  22134. *
  22135. * @name Phaser.Cameras.Scene2D.BaseCamera#y
  22136. * @type {number}
  22137. * @private
  22138. * @since 3.0.0
  22139. */
  22140. this._y = y;
  22141. /**
  22142. * Internal Camera X value multiplied by the resolution.
  22143. *
  22144. * @name Phaser.Cameras.Scene2D.BaseCamera#_cx
  22145. * @type {number}
  22146. * @private
  22147. * @since 3.12.0
  22148. */
  22149. this._cx = 0;
  22150. /**
  22151. * Internal Camera Y value multiplied by the resolution.
  22152. *
  22153. * @name Phaser.Cameras.Scene2D.BaseCamera#_cy
  22154. * @type {number}
  22155. * @private
  22156. * @since 3.12.0
  22157. */
  22158. this._cy = 0;
  22159. /**
  22160. * Internal Camera Width value multiplied by the resolution.
  22161. *
  22162. * @name Phaser.Cameras.Scene2D.BaseCamera#_cw
  22163. * @type {number}
  22164. * @private
  22165. * @since 3.12.0
  22166. */
  22167. this._cw = 0;
  22168. /**
  22169. * Internal Camera Height value multiplied by the resolution.
  22170. *
  22171. * @name Phaser.Cameras.Scene2D.BaseCamera#_ch
  22172. * @type {number}
  22173. * @private
  22174. * @since 3.12.0
  22175. */
  22176. this._ch = 0;
  22177. /**
  22178. * The width of the Camera viewport, in pixels.
  22179. *
  22180. * The viewport is the area into which the Camera renders. Setting the viewport does
  22181. * not restrict where the Camera can scroll to.
  22182. *
  22183. * @name Phaser.Cameras.Scene2D.BaseCamera#_width
  22184. * @type {number}
  22185. * @private
  22186. * @since 3.11.0
  22187. */
  22188. this._width = width;
  22189. /**
  22190. * The height of the Camera viewport, in pixels.
  22191. *
  22192. * The viewport is the area into which the Camera renders. Setting the viewport does
  22193. * not restrict where the Camera can scroll to.
  22194. *
  22195. * @name Phaser.Cameras.Scene2D.BaseCamera#_height
  22196. * @type {number}
  22197. * @private
  22198. * @since 3.11.0
  22199. */
  22200. this._height = height;
  22201. /**
  22202. * The bounds the camera is restrained to during scrolling.
  22203. *
  22204. * @name Phaser.Cameras.Scene2D.BaseCamera#_bounds
  22205. * @type {Phaser.Geom.Rectangle}
  22206. * @private
  22207. * @since 3.0.0
  22208. */
  22209. this._bounds = new Rectangle();
  22210. /**
  22211. * The horizontal scroll position of this Camera.
  22212. *
  22213. * Change this value to cause the Camera to scroll around your Scene.
  22214. *
  22215. * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method,
  22216. * will automatically adjust the Camera scroll values accordingly.
  22217. *
  22218. * You can set the bounds within which the Camera can scroll via the `setBounds` method.
  22219. *
  22220. * @name Phaser.Cameras.Scene2D.BaseCamera#_scrollX
  22221. * @type {number}
  22222. * @private
  22223. * @default 0
  22224. * @since 3.11.0
  22225. */
  22226. this._scrollX = 0;
  22227. /**
  22228. * The vertical scroll position of this Camera.
  22229. *
  22230. * Change this value to cause the Camera to scroll around your Scene.
  22231. *
  22232. * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method,
  22233. * will automatically adjust the Camera scroll values accordingly.
  22234. *
  22235. * You can set the bounds within which the Camera can scroll via the `setBounds` method.
  22236. *
  22237. * @name Phaser.Cameras.Scene2D.BaseCamera#_scrollY
  22238. * @type {number}
  22239. * @private
  22240. * @default 0
  22241. * @since 3.11.0
  22242. */
  22243. this._scrollY = 0;
  22244. /**
  22245. * The Camera zoom value. Change this value to zoom in, or out of, a Scene.
  22246. *
  22247. * A value of 0.5 would zoom the Camera out, so you can now see twice as much
  22248. * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel
  22249. * now takes up 2 pixels when rendered.
  22250. *
  22251. * Set to 1 to return to the default zoom level.
  22252. *
  22253. * Be careful to never set this value to zero.
  22254. *
  22255. * @name Phaser.Cameras.Scene2D.BaseCamera#_zoom
  22256. * @type {number}
  22257. * @private
  22258. * @default 1
  22259. * @since 3.11.0
  22260. */
  22261. this._zoom = 1;
  22262. /**
  22263. * The rotation of the Camera in radians.
  22264. *
  22265. * Camera rotation always takes place based on the Camera viewport. By default, rotation happens
  22266. * in the center of the viewport. You can adjust this with the `originX` and `originY` properties.
  22267. *
  22268. * Rotation influences the rendering of _all_ Game Objects visible by this Camera. However, it does not
  22269. * rotate the Camera viewport itself, which always remains an axis-aligned rectangle.
  22270. *
  22271. * @name Phaser.Cameras.Scene2D.BaseCamera#_rotation
  22272. * @type {number}
  22273. * @private
  22274. * @default 0
  22275. * @since 3.11.0
  22276. */
  22277. this._rotation = 0;
  22278. /**
  22279. * A local transform matrix used for internal calculations.
  22280. *
  22281. * @name Phaser.Cameras.Scene2D.BaseCamera#matrix
  22282. * @type {Phaser.GameObjects.Components.TransformMatrix}
  22283. * @private
  22284. * @since 3.0.0
  22285. */
  22286. this.matrix = new TransformMatrix();
  22287. /**
  22288. * Does this Camera have a transparent background?
  22289. *
  22290. * @name Phaser.Cameras.Scene2D.BaseCamera#transparent
  22291. * @type {boolean}
  22292. * @default true
  22293. * @since 3.0.0
  22294. */
  22295. this.transparent = true;
  22296. /**
  22297. * The background color of this Camera. Only used if `transparent` is `false`.
  22298. *
  22299. * @name Phaser.Cameras.Scene2D.BaseCamera#backgroundColor
  22300. * @type {Phaser.Display.Color}
  22301. * @since 3.0.0
  22302. */
  22303. this.backgroundColor = ValueToColor('rgba(0,0,0,0)');
  22304. /**
  22305. * The Camera alpha value. Setting this property impacts every single object that this Camera
  22306. * renders. You can either set the property directly, i.e. via a Tween, to fade a Camera in or out,
  22307. * or via the chainable `setAlpha` method instead.
  22308. *
  22309. * @name Phaser.Cameras.Scene2D.BaseCamera#alpha
  22310. * @type {number}
  22311. * @default 1
  22312. * @since 3.11.0
  22313. */
  22314. /**
  22315. * Should the camera cull Game Objects before checking them for input hit tests?
  22316. * In some special cases it may be beneficial to disable this.
  22317. *
  22318. * @name Phaser.Cameras.Scene2D.BaseCamera#disableCull
  22319. * @type {boolean}
  22320. * @default false
  22321. * @since 3.0.0
  22322. */
  22323. this.disableCull = false;
  22324. /**
  22325. * A temporary array of culled objects.
  22326. *
  22327. * @name Phaser.Cameras.Scene2D.BaseCamera#culledObjects
  22328. * @type {Phaser.GameObjects.GameObject[]}
  22329. * @default []
  22330. * @private
  22331. * @since 3.0.0
  22332. */
  22333. this.culledObjects = [];
  22334. /**
  22335. * The mid-point of the Camera in 'world' coordinates.
  22336. *
  22337. * Use it to obtain exactly where in the world the center of the camera is currently looking.
  22338. *
  22339. * This value is updated in the preRender method, after the scroll values and follower
  22340. * have been processed.
  22341. *
  22342. * @name Phaser.Cameras.Scene2D.BaseCamera#midPoint
  22343. * @type {Phaser.Math.Vector2}
  22344. * @readonly
  22345. * @since 3.11.0
  22346. */
  22347. this.midPoint = new Vector2(width / 2, height / 2);
  22348. /**
  22349. * The horizontal origin of rotation for this Camera.
  22350. *
  22351. * By default the camera rotates around the center of the viewport.
  22352. *
  22353. * Changing the origin allows you to adjust the point in the viewport from which rotation happens.
  22354. * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right.
  22355. *
  22356. * See `setOrigin` to set both origins in a single, chainable call.
  22357. *
  22358. * @name Phaser.Cameras.Scene2D.BaseCamera#originX
  22359. * @type {number}
  22360. * @default 0.5
  22361. * @since 3.11.0
  22362. */
  22363. this.originX = 0.5;
  22364. /**
  22365. * The vertical origin of rotation for this Camera.
  22366. *
  22367. * By default the camera rotates around the center of the viewport.
  22368. *
  22369. * Changing the origin allows you to adjust the point in the viewport from which rotation happens.
  22370. * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right.
  22371. *
  22372. * See `setOrigin` to set both origins in a single, chainable call.
  22373. *
  22374. * @name Phaser.Cameras.Scene2D.BaseCamera#originY
  22375. * @type {number}
  22376. * @default 0.5
  22377. * @since 3.11.0
  22378. */
  22379. this.originY = 0.5;
  22380. /**
  22381. * Does this Camera have a custom viewport?
  22382. *
  22383. * @name Phaser.Cameras.Scene2D.BaseCamera#_customViewport
  22384. * @type {boolean}
  22385. * @private
  22386. * @default false
  22387. * @since 3.12.0
  22388. */
  22389. this._customViewport = false;
  22390. },
  22391. /**
  22392. * Set the Alpha level of this Camera. The alpha controls the opacity of the Camera as it renders.
  22393. * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque.
  22394. *
  22395. * @method Phaser.Cameras.Scene2D.BaseCamera#setAlpha
  22396. * @since 3.11.0
  22397. *
  22398. * @param {number} [value=1] - The Camera alpha value.
  22399. *
  22400. * @return {this} This Camera instance.
  22401. */
  22402. /**
  22403. * Sets the rotation origin of this Camera.
  22404. *
  22405. * The values are given in the range 0 to 1 and are only used when calculating Camera rotation.
  22406. *
  22407. * By default the camera rotates around the center of the viewport.
  22408. *
  22409. * Changing the origin allows you to adjust the point in the viewport from which rotation happens.
  22410. * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right.
  22411. *
  22412. * @method Phaser.Cameras.Scene2D.BaseCamera#setOrigin
  22413. * @since 3.11.0
  22414. *
  22415. * @param {number} [x=0.5] - The horizontal origin value.
  22416. * @param {number} [y=x] - The vertical origin value. If not defined it will be set to the value of `x`.
  22417. *
  22418. * @return {this} This Camera instance.
  22419. */
  22420. setOrigin: function (x, y)
  22421. {
  22422. if (x === undefined) { x = 0.5; }
  22423. if (y === undefined) { y = x; }
  22424. this.originX = x;
  22425. this.originY = y;
  22426. return this;
  22427. },
  22428. /**
  22429. * Calculates what the Camera.scrollX and scrollY values would need to be in order to move
  22430. * the Camera so it is centered on the given x and y coordinates, without actually moving
  22431. * the Camera there. The results are clamped based on the Camera bounds, if set.
  22432. *
  22433. * @method Phaser.Cameras.Scene2D.BaseCamera#getScroll
  22434. * @since 3.11.0
  22435. *
  22436. * @param {number} x - The horizontal coordinate to center on.
  22437. * @param {number} y - The vertical coordinate to center on.
  22438. * @param {Phaser.Math.Vector2} [out] - A Vec2 to store the values in. If not given a new Vec2 is created.
  22439. *
  22440. * @return {Phaser.Math.Vector2} The scroll coordinates stored in the `x` and `y` properties.
  22441. */
  22442. getScroll: function (x, y, out)
  22443. {
  22444. if (out === undefined) { out = new Vector2(); }
  22445. var originX = this.width * 0.5;
  22446. var originY = this.height * 0.5;
  22447. out.x = x - originX;
  22448. out.y = y - originY;
  22449. if (this.useBounds)
  22450. {
  22451. out.x = this.clampX(out.x);
  22452. out.y = this.clampY(out.y);
  22453. }
  22454. return out;
  22455. },
  22456. /**
  22457. * Moves the Camera horizontally so that it is centered on the given x coordinate, bounds allowing.
  22458. * Calling this does not change the scrollY value.
  22459. *
  22460. * @method Phaser.Cameras.Scene2D.BaseCamera#centerOnX
  22461. * @since 3.16.0
  22462. *
  22463. * @param {number} x - The horizontal coordinate to center on.
  22464. *
  22465. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22466. */
  22467. centerOnX: function (x)
  22468. {
  22469. var originX = this.width * 0.5;
  22470. this.midPoint.x = x;
  22471. this.scrollX = x - originX;
  22472. if (this.useBounds)
  22473. {
  22474. this.scrollX = this.clampX(this.scrollX);
  22475. }
  22476. return this;
  22477. },
  22478. /**
  22479. * Moves the Camera vertically so that it is centered on the given y coordinate, bounds allowing.
  22480. * Calling this does not change the scrollX value.
  22481. *
  22482. * @method Phaser.Cameras.Scene2D.BaseCamera#centerOnY
  22483. * @since 3.16.0
  22484. *
  22485. * @param {number} y - The vertical coordinate to center on.
  22486. *
  22487. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22488. */
  22489. centerOnY: function (y)
  22490. {
  22491. var originY = this.height * 0.5;
  22492. this.midPoint.y = y;
  22493. this.scrollY = y - originY;
  22494. if (this.useBounds)
  22495. {
  22496. this.scrollY = this.clampY(this.scrollY);
  22497. }
  22498. return this;
  22499. },
  22500. /**
  22501. * Moves the Camera so that it is centered on the given coordinates, bounds allowing.
  22502. *
  22503. * @method Phaser.Cameras.Scene2D.BaseCamera#centerOn
  22504. * @since 3.11.0
  22505. *
  22506. * @param {number} x - The horizontal coordinate to center on.
  22507. * @param {number} y - The vertical coordinate to center on.
  22508. *
  22509. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22510. */
  22511. centerOn: function (x, y)
  22512. {
  22513. this.centerOnX(x);
  22514. this.centerOnY(y);
  22515. return this;
  22516. },
  22517. /**
  22518. * Moves the Camera so that it is looking at the center of the Camera Bounds, if enabled.
  22519. *
  22520. * @method Phaser.Cameras.Scene2D.BaseCamera#centerToBounds
  22521. * @since 3.0.0
  22522. *
  22523. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22524. */
  22525. centerToBounds: function ()
  22526. {
  22527. if (this.useBounds)
  22528. {
  22529. var bounds = this._bounds;
  22530. var originX = this.width * 0.5;
  22531. var originY = this.height * 0.5;
  22532. this.midPoint.set(bounds.centerX, bounds.centerY);
  22533. this.scrollX = bounds.centerX - originX;
  22534. this.scrollY = bounds.centerY - originY;
  22535. }
  22536. return this;
  22537. },
  22538. /**
  22539. * Moves the Camera so that it is re-centered based on its viewport size.
  22540. *
  22541. * @method Phaser.Cameras.Scene2D.BaseCamera#centerToSize
  22542. * @since 3.0.0
  22543. *
  22544. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22545. */
  22546. centerToSize: function ()
  22547. {
  22548. this.scrollX = this.width * 0.5;
  22549. this.scrollY = this.height * 0.5;
  22550. return this;
  22551. },
  22552. /**
  22553. * Takes an array of Game Objects and returns a new array featuring only those objects
  22554. * visible by this camera.
  22555. *
  22556. * @method Phaser.Cameras.Scene2D.BaseCamera#cull
  22557. * @since 3.0.0
  22558. *
  22559. * @generic {Phaser.GameObjects.GameObject[]} G - [renderableObjects,$return]
  22560. *
  22561. * @param {Phaser.GameObjects.GameObject[]} renderableObjects - An array of Game Objects to cull.
  22562. *
  22563. * @return {Phaser.GameObjects.GameObject[]} An array of Game Objects visible to this Camera.
  22564. */
  22565. cull: function (renderableObjects)
  22566. {
  22567. if (this.disableCull)
  22568. {
  22569. return renderableObjects;
  22570. }
  22571. var cameraMatrix = this.matrix.matrix;
  22572. var mva = cameraMatrix[0];
  22573. var mvb = cameraMatrix[1];
  22574. var mvc = cameraMatrix[2];
  22575. var mvd = cameraMatrix[3];
  22576. /* First Invert Matrix */
  22577. var determinant = (mva * mvd) - (mvb * mvc);
  22578. if (!determinant)
  22579. {
  22580. return renderableObjects;
  22581. }
  22582. var mve = cameraMatrix[4];
  22583. var mvf = cameraMatrix[5];
  22584. var scrollX = this.scrollX;
  22585. var scrollY = this.scrollY;
  22586. var cameraW = this.width;
  22587. var cameraH = this.height;
  22588. var culledObjects = this.culledObjects;
  22589. var length = renderableObjects.length;
  22590. determinant = 1 / determinant;
  22591. culledObjects.length = 0;
  22592. for (var index = 0; index < length; ++index)
  22593. {
  22594. var object = renderableObjects[index];
  22595. if (!object.hasOwnProperty('width') || object.parentContainer)
  22596. {
  22597. culledObjects.push(object);
  22598. continue;
  22599. }
  22600. var objectW = object.width;
  22601. var objectH = object.height;
  22602. var objectX = (object.x - (scrollX * object.scrollFactorX)) - (objectW * object.originX);
  22603. var objectY = (object.y - (scrollY * object.scrollFactorY)) - (objectH * object.originY);
  22604. var tx = (objectX * mva + objectY * mvc + mve);
  22605. var ty = (objectX * mvb + objectY * mvd + mvf);
  22606. var tw = ((objectX + objectW) * mva + (objectY + objectH) * mvc + mve);
  22607. var th = ((objectX + objectW) * mvb + (objectY + objectH) * mvd + mvf);
  22608. var cullTop = this.y;
  22609. var cullBottom = cullTop + cameraH;
  22610. var cullLeft = this.x;
  22611. var cullRight = cullLeft + cameraW;
  22612. if ((tw > cullLeft && tx < cullRight) && (th > cullTop && ty < cullBottom))
  22613. {
  22614. culledObjects.push(object);
  22615. }
  22616. }
  22617. return culledObjects;
  22618. },
  22619. /**
  22620. * Converts the given `x` and `y` coordinates into World space, based on this Cameras transform.
  22621. * You can optionally provide a Vector2, or similar object, to store the results in.
  22622. *
  22623. * @method Phaser.Cameras.Scene2D.BaseCamera#getWorldPoint
  22624. * @since 3.0.0
  22625. *
  22626. * @generic {Phaser.Math.Vector2} O - [output,$return]
  22627. *
  22628. * @param {number} x - The x position to convert to world space.
  22629. * @param {number} y - The y position to convert to world space.
  22630. * @param {(object|Phaser.Math.Vector2)} [output] - An optional object to store the results in. If not provided a new Vector2 will be created.
  22631. *
  22632. * @return {Phaser.Math.Vector2} An object holding the converted values in its `x` and `y` properties.
  22633. */
  22634. getWorldPoint: function (x, y, output)
  22635. {
  22636. if (output === undefined) { output = new Vector2(); }
  22637. var cameraMatrix = this.matrix.matrix;
  22638. var mva = cameraMatrix[0];
  22639. var mvb = cameraMatrix[1];
  22640. var mvc = cameraMatrix[2];
  22641. var mvd = cameraMatrix[3];
  22642. var mve = cameraMatrix[4];
  22643. var mvf = cameraMatrix[5];
  22644. // Invert Matrix
  22645. var determinant = (mva * mvd) - (mvb * mvc);
  22646. if (!determinant)
  22647. {
  22648. output.x = x;
  22649. output.y = y;
  22650. return output;
  22651. }
  22652. determinant = 1 / determinant;
  22653. var ima = mvd * determinant;
  22654. var imb = -mvb * determinant;
  22655. var imc = -mvc * determinant;
  22656. var imd = mva * determinant;
  22657. var ime = (mvc * mvf - mvd * mve) * determinant;
  22658. var imf = (mvb * mve - mva * mvf) * determinant;
  22659. var c = Math.cos(this.rotation);
  22660. var s = Math.sin(this.rotation);
  22661. var zoom = this.zoom;
  22662. var res = this.resolution;
  22663. var scrollX = this.scrollX;
  22664. var scrollY = this.scrollY;
  22665. // Works for zoom of 1 with any resolution, but resolution > 1 and zoom !== 1 breaks
  22666. var sx = x + ((scrollX * c - scrollY * s) * zoom);
  22667. var sy = y + ((scrollX * s + scrollY * c) * zoom);
  22668. // Apply transform to point
  22669. output.x = (sx * ima + sy * imc) * res + ime;
  22670. output.y = (sx * imb + sy * imd) * res + imf;
  22671. return output;
  22672. },
  22673. /**
  22674. * Given a Game Object, or an array of Game Objects, it will update all of their camera filter settings
  22675. * so that they are ignored by this Camera. This means they will not be rendered by this Camera.
  22676. *
  22677. * @method Phaser.Cameras.Scene2D.BaseCamera#ignore
  22678. * @since 3.0.0
  22679. *
  22680. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group)} entries - The Game Object, or array of Game Objects, to be ignored by this Camera.
  22681. *
  22682. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22683. */
  22684. ignore: function (entries)
  22685. {
  22686. var id = this.id;
  22687. if (!Array.isArray(entries))
  22688. {
  22689. entries = [ entries ];
  22690. }
  22691. for (var i = 0; i < entries.length; i++)
  22692. {
  22693. var entry = entries[i];
  22694. if (Array.isArray(entry))
  22695. {
  22696. this.ignore(entry);
  22697. }
  22698. else if (entry.isParent)
  22699. {
  22700. this.ignore(entry.getChildren());
  22701. }
  22702. else
  22703. {
  22704. entry.cameraFilter |= id;
  22705. }
  22706. }
  22707. return this;
  22708. },
  22709. /**
  22710. * Internal preRender step.
  22711. *
  22712. * @method Phaser.Cameras.Scene2D.BaseCamera#preRender
  22713. * @protected
  22714. * @since 3.0.0
  22715. *
  22716. * @param {number} resolution - The game resolution, as set in the Scale Manager.
  22717. */
  22718. preRender: function (resolution)
  22719. {
  22720. var width = this.width;
  22721. var height = this.height;
  22722. var halfWidth = width * 0.5;
  22723. var halfHeight = height * 0.5;
  22724. var zoom = this.zoom * resolution;
  22725. var matrix = this.matrix;
  22726. var originX = width * this.originX;
  22727. var originY = height * this.originY;
  22728. var sx = this.scrollX;
  22729. var sy = this.scrollY;
  22730. if (this.useBounds)
  22731. {
  22732. sx = this.clampX(sx);
  22733. sy = this.clampY(sy);
  22734. }
  22735. if (this.roundPixels)
  22736. {
  22737. originX = Math.round(originX);
  22738. originY = Math.round(originY);
  22739. }
  22740. // Values are in pixels and not impacted by zooming the Camera
  22741. this.scrollX = sx;
  22742. this.scrollY = sy;
  22743. var midX = sx + halfWidth;
  22744. var midY = sy + halfHeight;
  22745. // The center of the camera, in world space, so taking zoom into account
  22746. // Basically the pixel value of what it's looking at in the middle of the cam
  22747. this.midPoint.set(midX, midY);
  22748. var displayWidth = width / zoom;
  22749. var displayHeight = height / zoom;
  22750. this.worldView.setTo(
  22751. midX - (displayWidth / 2),
  22752. midY - (displayHeight / 2),
  22753. displayWidth,
  22754. displayHeight
  22755. );
  22756. matrix.applyITRS(this.x + originX, this.y + originY, this.rotation, zoom, zoom);
  22757. matrix.translate(-originX, -originY);
  22758. },
  22759. /**
  22760. * Takes an x value and checks it's within the range of the Camera bounds, adjusting if required.
  22761. * Do not call this method if you are not using camera bounds.
  22762. *
  22763. * @method Phaser.Cameras.Scene2D.BaseCamera#clampX
  22764. * @since 3.11.0
  22765. *
  22766. * @param {number} x - The value to horizontally scroll clamp.
  22767. *
  22768. * @return {number} The adjusted value to use as scrollX.
  22769. */
  22770. clampX: function (x)
  22771. {
  22772. var bounds = this._bounds;
  22773. var dw = this.displayWidth;
  22774. var bx = bounds.x + ((dw - this.width) / 2);
  22775. var bw = Math.max(bx, bx + bounds.width - dw);
  22776. if (x < bx)
  22777. {
  22778. x = bx;
  22779. }
  22780. else if (x > bw)
  22781. {
  22782. x = bw;
  22783. }
  22784. return x;
  22785. },
  22786. /**
  22787. * Takes a y value and checks it's within the range of the Camera bounds, adjusting if required.
  22788. * Do not call this method if you are not using camera bounds.
  22789. *
  22790. * @method Phaser.Cameras.Scene2D.BaseCamera#clampY
  22791. * @since 3.11.0
  22792. *
  22793. * @param {number} y - The value to vertically scroll clamp.
  22794. *
  22795. * @return {number} The adjusted value to use as scrollY.
  22796. */
  22797. clampY: function (y)
  22798. {
  22799. var bounds = this._bounds;
  22800. var dh = this.displayHeight;
  22801. var by = bounds.y + ((dh - this.height) / 2);
  22802. var bh = Math.max(by, by + bounds.height - dh);
  22803. if (y < by)
  22804. {
  22805. y = by;
  22806. }
  22807. else if (y > bh)
  22808. {
  22809. y = bh;
  22810. }
  22811. return y;
  22812. },
  22813. /*
  22814. var gap = this._zoomInversed;
  22815. return gap * Math.round((src.x - this.scrollX * src.scrollFactorX) / gap);
  22816. */
  22817. /**
  22818. * If this Camera has previously had movement bounds set on it, this will remove them.
  22819. *
  22820. * @method Phaser.Cameras.Scene2D.BaseCamera#removeBounds
  22821. * @since 3.0.0
  22822. *
  22823. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22824. */
  22825. removeBounds: function ()
  22826. {
  22827. this.useBounds = false;
  22828. this.dirty = true;
  22829. this._bounds.setEmpty();
  22830. return this;
  22831. },
  22832. /**
  22833. * Set the rotation of this Camera. This causes everything it renders to appear rotated.
  22834. *
  22835. * Rotating a camera does not rotate the viewport itself, it is applied during rendering.
  22836. *
  22837. * @method Phaser.Cameras.Scene2D.BaseCamera#setAngle
  22838. * @since 3.0.0
  22839. *
  22840. * @param {number} [value=0] - The cameras angle of rotation, given in degrees.
  22841. *
  22842. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22843. */
  22844. setAngle: function (value)
  22845. {
  22846. if (value === undefined) { value = 0; }
  22847. this.rotation = DegToRad(value);
  22848. return this;
  22849. },
  22850. /**
  22851. * Sets the background color for this Camera.
  22852. *
  22853. * By default a Camera has a transparent background but it can be given a solid color, with any level
  22854. * of transparency, via this method.
  22855. *
  22856. * The color value can be specified using CSS color notation, hex or numbers.
  22857. *
  22858. * @method Phaser.Cameras.Scene2D.BaseCamera#setBackgroundColor
  22859. * @since 3.0.0
  22860. *
  22861. * @param {(string|number|InputColorObject)} [color='rgba(0,0,0,0)'] - The color value. In CSS, hex or numeric color notation.
  22862. *
  22863. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22864. */
  22865. setBackgroundColor: function (color)
  22866. {
  22867. if (color === undefined) { color = 'rgba(0,0,0,0)'; }
  22868. this.backgroundColor = ValueToColor(color);
  22869. this.transparent = (this.backgroundColor.alpha === 0);
  22870. return this;
  22871. },
  22872. /**
  22873. * Set the bounds of the Camera. The bounds are an axis-aligned rectangle.
  22874. *
  22875. * The Camera bounds controls where the Camera can scroll to, stopping it from scrolling off the
  22876. * edges and into blank space. It does not limit the placement of Game Objects, or where
  22877. * the Camera viewport can be positioned.
  22878. *
  22879. * Temporarily disable the bounds by changing the boolean `Camera.useBounds`.
  22880. *
  22881. * Clear the bounds entirely by calling `Camera.removeBounds`.
  22882. *
  22883. * If you set bounds that are smaller than the viewport it will stop the Camera from being
  22884. * able to scroll. The bounds can be positioned where-ever you wish. By default they are from
  22885. * 0x0 to the canvas width x height. This means that the coordinate 0x0 is the top left of
  22886. * the Camera bounds. However, you can position them anywhere. So if you wanted a game world
  22887. * that was 2048x2048 in size, with 0x0 being the center of it, you can set the bounds x/y
  22888. * to be -1024, -1024, with a width and height of 2048. Depending on your game you may find
  22889. * it easier for 0x0 to be the top-left of the bounds, or you may wish 0x0 to be the middle.
  22890. *
  22891. * @method Phaser.Cameras.Scene2D.BaseCamera#setBounds
  22892. * @since 3.0.0
  22893. *
  22894. * @param {integer} x - The top-left x coordinate of the bounds.
  22895. * @param {integer} y - The top-left y coordinate of the bounds.
  22896. * @param {integer} width - The width of the bounds, in pixels.
  22897. * @param {integer} height - The height of the bounds, in pixels.
  22898. * @param {boolean} [centerOn=false] - If `true` the Camera will automatically be centered on the new bounds.
  22899. *
  22900. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22901. */
  22902. setBounds: function (x, y, width, height, centerOn)
  22903. {
  22904. if (centerOn === undefined) { centerOn = false; }
  22905. this._bounds.setTo(x, y, width, height);
  22906. this.dirty = true;
  22907. this.useBounds = true;
  22908. if (centerOn)
  22909. {
  22910. this.centerToBounds();
  22911. }
  22912. else
  22913. {
  22914. this.scrollX = this.clampX(this.scrollX);
  22915. this.scrollY = this.clampY(this.scrollY);
  22916. }
  22917. return this;
  22918. },
  22919. /**
  22920. * Returns a rectangle containing the bounds of the Camera.
  22921. *
  22922. * If the Camera does not have any bounds the rectangle will be empty.
  22923. *
  22924. * The rectangle is a copy of the bounds, so is safe to modify.
  22925. *
  22926. * @method Phaser.Cameras.Scene2D.BaseCamera#getBounds
  22927. * @since 3.16.0
  22928. *
  22929. * @param {Phaser.Geom.Rectangle} [out] - An optional Rectangle to store the bounds in. If not given, a new Rectangle will be created.
  22930. *
  22931. * @return {Phaser.Geom.Rectangle} A rectangle containing the bounds of this Camera.
  22932. */
  22933. getBounds: function (out)
  22934. {
  22935. if (out === undefined) { out = new Rectangle(); }
  22936. var source = this._bounds;
  22937. out.setTo(source.x, source.y, source.width, source.height);
  22938. return out;
  22939. },
  22940. /**
  22941. * Sets the name of this Camera.
  22942. * This value is for your own use and isn't used internally.
  22943. *
  22944. * @method Phaser.Cameras.Scene2D.BaseCamera#setName
  22945. * @since 3.0.0
  22946. *
  22947. * @param {string} [value=''] - The name of the Camera.
  22948. *
  22949. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22950. */
  22951. setName: function (value)
  22952. {
  22953. if (value === undefined) { value = ''; }
  22954. this.name = value;
  22955. return this;
  22956. },
  22957. /**
  22958. * Set the position of the Camera viewport within the game.
  22959. *
  22960. * This does not change where the camera is 'looking'. See `setScroll` to control that.
  22961. *
  22962. * @method Phaser.Cameras.Scene2D.BaseCamera#setPosition
  22963. * @since 3.0.0
  22964. *
  22965. * @param {number} x - The top-left x coordinate of the Camera viewport.
  22966. * @param {number} [y=x] - The top-left y coordinate of the Camera viewport.
  22967. *
  22968. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22969. */
  22970. setPosition: function (x, y)
  22971. {
  22972. if (y === undefined) { y = x; }
  22973. this.x = x;
  22974. this.y = y;
  22975. return this;
  22976. },
  22977. /**
  22978. * Set the rotation of this Camera. This causes everything it renders to appear rotated.
  22979. *
  22980. * Rotating a camera does not rotate the viewport itself, it is applied during rendering.
  22981. *
  22982. * @method Phaser.Cameras.Scene2D.BaseCamera#setRotation
  22983. * @since 3.0.0
  22984. *
  22985. * @param {number} [value=0] - The rotation of the Camera, in radians.
  22986. *
  22987. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  22988. */
  22989. setRotation: function (value)
  22990. {
  22991. if (value === undefined) { value = 0; }
  22992. this.rotation = value;
  22993. return this;
  22994. },
  22995. /**
  22996. * Should the Camera round pixel values to whole integers when rendering Game Objects?
  22997. *
  22998. * In some types of game, especially with pixel art, this is required to prevent sub-pixel aliasing.
  22999. *
  23000. * @method Phaser.Cameras.Scene2D.BaseCamera#setRoundPixels
  23001. * @since 3.0.0
  23002. *
  23003. * @param {boolean} value - `true` to round Camera pixels, `false` to not.
  23004. *
  23005. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  23006. */
  23007. setRoundPixels: function (value)
  23008. {
  23009. this.roundPixels = value;
  23010. return this;
  23011. },
  23012. /**
  23013. * Sets the Scene the Camera is bound to.
  23014. *
  23015. * Also populates the `resolution` property and updates the internal size values.
  23016. *
  23017. * @method Phaser.Cameras.Scene2D.BaseCamera#setScene
  23018. * @since 3.0.0
  23019. *
  23020. * @param {Phaser.Scene} scene - The Scene the camera is bound to.
  23021. *
  23022. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  23023. */
  23024. setScene: function (scene)
  23025. {
  23026. if (this.scene && this._customViewport)
  23027. {
  23028. this.sceneManager.customViewports--;
  23029. }
  23030. this.scene = scene;
  23031. this.sceneManager = scene.sys.game.scene;
  23032. this.scaleManager = scene.sys.scale;
  23033. var res = this.scaleManager.resolution;
  23034. this.resolution = res;
  23035. this._cx = this._x * res;
  23036. this._cy = this._y * res;
  23037. this._cw = this._width * res;
  23038. this._ch = this._height * res;
  23039. this.updateSystem();
  23040. return this;
  23041. },
  23042. /**
  23043. * Set the position of where the Camera is looking within the game.
  23044. * You can also modify the properties `Camera.scrollX` and `Camera.scrollY` directly.
  23045. * Use this method, or the scroll properties, to move your camera around the game world.
  23046. *
  23047. * This does not change where the camera viewport is placed. See `setPosition` to control that.
  23048. *
  23049. * @method Phaser.Cameras.Scene2D.BaseCamera#setScroll
  23050. * @since 3.0.0
  23051. *
  23052. * @param {number} x - The x coordinate of the Camera in the game world.
  23053. * @param {number} [y=x] - The y coordinate of the Camera in the game world.
  23054. *
  23055. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  23056. */
  23057. setScroll: function (x, y)
  23058. {
  23059. if (y === undefined) { y = x; }
  23060. this.scrollX = x;
  23061. this.scrollY = y;
  23062. return this;
  23063. },
  23064. /**
  23065. * Set the size of the Camera viewport.
  23066. *
  23067. * By default a Camera is the same size as the game, but can be made smaller via this method,
  23068. * allowing you to create mini-cam style effects by creating and positioning a smaller Camera
  23069. * viewport within your game.
  23070. *
  23071. * @method Phaser.Cameras.Scene2D.BaseCamera#setSize
  23072. * @since 3.0.0
  23073. *
  23074. * @param {integer} width - The width of the Camera viewport.
  23075. * @param {integer} [height=width] - The height of the Camera viewport.
  23076. *
  23077. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  23078. */
  23079. setSize: function (width, height)
  23080. {
  23081. if (height === undefined) { height = width; }
  23082. this.width = width;
  23083. this.height = height;
  23084. return this;
  23085. },
  23086. /**
  23087. * This method sets the position and size of the Camera viewport in a single call.
  23088. *
  23089. * If you're trying to change where the Camera is looking at in your game, then see
  23090. * the method `Camera.setScroll` instead. This method is for changing the viewport
  23091. * itself, not what the camera can see.
  23092. *
  23093. * By default a Camera is the same size as the game, but can be made smaller via this method,
  23094. * allowing you to create mini-cam style effects by creating and positioning a smaller Camera
  23095. * viewport within your game.
  23096. *
  23097. * @method Phaser.Cameras.Scene2D.BaseCamera#setViewport
  23098. * @since 3.0.0
  23099. *
  23100. * @param {number} x - The top-left x coordinate of the Camera viewport.
  23101. * @param {number} y - The top-left y coordinate of the Camera viewport.
  23102. * @param {integer} width - The width of the Camera viewport.
  23103. * @param {integer} [height=width] - The height of the Camera viewport.
  23104. *
  23105. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  23106. */
  23107. setViewport: function (x, y, width, height)
  23108. {
  23109. this.x = x;
  23110. this.y = y;
  23111. this.width = width;
  23112. this.height = height;
  23113. return this;
  23114. },
  23115. /**
  23116. * Set the zoom value of the Camera.
  23117. *
  23118. * Changing to a smaller value, such as 0.5, will cause the camera to 'zoom out'.
  23119. * Changing to a larger value, such as 2, will cause the camera to 'zoom in'.
  23120. *
  23121. * A value of 1 means 'no zoom' and is the default.
  23122. *
  23123. * Changing the zoom does not impact the Camera viewport in any way, it is only applied during rendering.
  23124. *
  23125. * @method Phaser.Cameras.Scene2D.BaseCamera#setZoom
  23126. * @since 3.0.0
  23127. *
  23128. * @param {number} [value=1] - The zoom value of the Camera. The minimum it can be is 0.001.
  23129. *
  23130. * @return {Phaser.Cameras.Scene2D.BaseCamera} This Camera instance.
  23131. */
  23132. setZoom: function (value)
  23133. {
  23134. if (value === undefined) { value = 1; }
  23135. if (value === 0)
  23136. {
  23137. value = 0.001;
  23138. }
  23139. this.zoom = value;
  23140. return this;
  23141. },
  23142. /**
  23143. * Sets the visibility of this Camera.
  23144. *
  23145. * An invisible Camera will skip rendering and input tests of everything it can see.
  23146. *
  23147. * @method Phaser.Cameras.Scene2D.BaseCamera#setVisible
  23148. * @since 3.10.0
  23149. *
  23150. * @param {boolean} value - The visible state of the Camera.
  23151. *
  23152. * @return {this} This Camera instance.
  23153. */
  23154. /**
  23155. * Returns an Object suitable for JSON storage containing all of the Camera viewport and rendering properties.
  23156. *
  23157. * @method Phaser.Cameras.Scene2D.BaseCamera#toJSON
  23158. * @since 3.0.0
  23159. *
  23160. * @return {JSONCamera} A well-formed object suitable for conversion to JSON.
  23161. */
  23162. toJSON: function ()
  23163. {
  23164. var output = {
  23165. name: this.name,
  23166. x: this.x,
  23167. y: this.y,
  23168. width: this.width,
  23169. height: this.height,
  23170. zoom: this.zoom,
  23171. rotation: this.rotation,
  23172. roundPixels: this.roundPixels,
  23173. scrollX: this.scrollX,
  23174. scrollY: this.scrollY,
  23175. backgroundColor: this.backgroundColor.rgba
  23176. };
  23177. if (this.useBounds)
  23178. {
  23179. output['bounds'] = {
  23180. x: this._bounds.x,
  23181. y: this._bounds.y,
  23182. width: this._bounds.width,
  23183. height: this._bounds.height
  23184. };
  23185. }
  23186. return output;
  23187. },
  23188. /**
  23189. * Internal method called automatically by the Camera Manager.
  23190. *
  23191. * @method Phaser.Cameras.Scene2D.BaseCamera#update
  23192. * @protected
  23193. * @since 3.0.0
  23194. *
  23195. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  23196. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  23197. */
  23198. update: function ()
  23199. {
  23200. // NOOP
  23201. },
  23202. /**
  23203. * Internal method called automatically when the viewport changes.
  23204. *
  23205. * @method Phaser.Cameras.Scene2D.BaseCamera#updateSystem
  23206. * @private
  23207. * @since 3.12.0
  23208. */
  23209. updateSystem: function ()
  23210. {
  23211. if (!this.scaleManager)
  23212. {
  23213. return;
  23214. }
  23215. var custom = (this._x !== 0 || this._y !== 0 || this.scaleManager.width !== this._width || this.scaleManager.height !== this._height);
  23216. var sceneManager = this.sceneManager;
  23217. if (custom && !this._customViewport)
  23218. {
  23219. // We need a custom viewport for this Camera
  23220. sceneManager.customViewports++;
  23221. }
  23222. else if (!custom && this._customViewport)
  23223. {
  23224. // We're turning off a custom viewport for this Camera
  23225. sceneManager.customViewports--;
  23226. }
  23227. this.dirty = true;
  23228. this._customViewport = custom;
  23229. },
  23230. /**
  23231. * Destroys this Camera instance and its internal properties and references.
  23232. * Once destroyed you cannot use this Camera again, even if re-added to a Camera Manager.
  23233. *
  23234. * This method is called automatically by `CameraManager.remove` if that methods `runDestroy` argument is `true`, which is the default.
  23235. *
  23236. * Unless you have a specific reason otherwise, always use `CameraManager.remove` and allow it to handle the camera destruction,
  23237. * rather than calling this method directly.
  23238. *
  23239. * @method Phaser.Cameras.Scene2D.BaseCamera#destroy
  23240. * @fires Phaser.Cameras.Scene2D.Events#DESTROY
  23241. * @since 3.0.0
  23242. */
  23243. destroy: function ()
  23244. {
  23245. this.emit(Events.DESTROY, this);
  23246. this.removeAllListeners();
  23247. this.matrix.destroy();
  23248. this.culledObjects = [];
  23249. if (this._customViewport)
  23250. {
  23251. // We're turning off a custom viewport for this Camera
  23252. this.sceneManager.customViewports--;
  23253. }
  23254. this._bounds = null;
  23255. this.scene = null;
  23256. this.scaleManager = null;
  23257. this.sceneManager = null;
  23258. },
  23259. /**
  23260. * The x position of the Camera viewport, relative to the top-left of the game canvas.
  23261. * The viewport is the area into which the camera renders.
  23262. * To adjust the position the camera is looking at in the game world, see the `scrollX` value.
  23263. *
  23264. * @name Phaser.Cameras.Scene2D.BaseCamera#x
  23265. * @type {number}
  23266. * @since 3.0.0
  23267. */
  23268. x: {
  23269. get: function ()
  23270. {
  23271. return this._x;
  23272. },
  23273. set: function (value)
  23274. {
  23275. this._x = value;
  23276. this._cx = value * this.resolution;
  23277. this.updateSystem();
  23278. }
  23279. },
  23280. /**
  23281. * The y position of the Camera viewport, relative to the top-left of the game canvas.
  23282. * The viewport is the area into which the camera renders.
  23283. * To adjust the position the camera is looking at in the game world, see the `scrollY` value.
  23284. *
  23285. * @name Phaser.Cameras.Scene2D.BaseCamera#y
  23286. * @type {number}
  23287. * @since 3.0.0
  23288. */
  23289. y: {
  23290. get: function ()
  23291. {
  23292. return this._y;
  23293. },
  23294. set: function (value)
  23295. {
  23296. this._y = value;
  23297. this._cy = value * this.resolution;
  23298. this.updateSystem();
  23299. }
  23300. },
  23301. /**
  23302. * The width of the Camera viewport, in pixels.
  23303. *
  23304. * The viewport is the area into which the Camera renders. Setting the viewport does
  23305. * not restrict where the Camera can scroll to.
  23306. *
  23307. * @name Phaser.Cameras.Scene2D.BaseCamera#width
  23308. * @type {number}
  23309. * @since 3.0.0
  23310. */
  23311. width: {
  23312. get: function ()
  23313. {
  23314. return this._width;
  23315. },
  23316. set: function (value)
  23317. {
  23318. this._width = value;
  23319. this._cw = value * this.resolution;
  23320. this.updateSystem();
  23321. }
  23322. },
  23323. /**
  23324. * The height of the Camera viewport, in pixels.
  23325. *
  23326. * The viewport is the area into which the Camera renders. Setting the viewport does
  23327. * not restrict where the Camera can scroll to.
  23328. *
  23329. * @name Phaser.Cameras.Scene2D.BaseCamera#height
  23330. * @type {number}
  23331. * @since 3.0.0
  23332. */
  23333. height: {
  23334. get: function ()
  23335. {
  23336. return this._height;
  23337. },
  23338. set: function (value)
  23339. {
  23340. this._height = value;
  23341. this._ch = value * this.resolution;
  23342. this.updateSystem();
  23343. }
  23344. },
  23345. /**
  23346. * The horizontal scroll position of this Camera.
  23347. *
  23348. * Change this value to cause the Camera to scroll around your Scene.
  23349. *
  23350. * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method,
  23351. * will automatically adjust the Camera scroll values accordingly.
  23352. *
  23353. * You can set the bounds within which the Camera can scroll via the `setBounds` method.
  23354. *
  23355. * @name Phaser.Cameras.Scene2D.BaseCamera#scrollX
  23356. * @type {number}
  23357. * @default 0
  23358. * @since 3.0.0
  23359. */
  23360. scrollX: {
  23361. get: function ()
  23362. {
  23363. return this._scrollX;
  23364. },
  23365. set: function (value)
  23366. {
  23367. this._scrollX = value;
  23368. this.dirty = true;
  23369. }
  23370. },
  23371. /**
  23372. * The vertical scroll position of this Camera.
  23373. *
  23374. * Change this value to cause the Camera to scroll around your Scene.
  23375. *
  23376. * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method,
  23377. * will automatically adjust the Camera scroll values accordingly.
  23378. *
  23379. * You can set the bounds within which the Camera can scroll via the `setBounds` method.
  23380. *
  23381. * @name Phaser.Cameras.Scene2D.BaseCamera#scrollY
  23382. * @type {number}
  23383. * @default 0
  23384. * @since 3.0.0
  23385. */
  23386. scrollY: {
  23387. get: function ()
  23388. {
  23389. return this._scrollY;
  23390. },
  23391. set: function (value)
  23392. {
  23393. this._scrollY = value;
  23394. this.dirty = true;
  23395. }
  23396. },
  23397. /**
  23398. * The Camera zoom value. Change this value to zoom in, or out of, a Scene.
  23399. *
  23400. * A value of 0.5 would zoom the Camera out, so you can now see twice as much
  23401. * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel
  23402. * now takes up 2 pixels when rendered.
  23403. *
  23404. * Set to 1 to return to the default zoom level.
  23405. *
  23406. * Be careful to never set this value to zero.
  23407. *
  23408. * @name Phaser.Cameras.Scene2D.BaseCamera#zoom
  23409. * @type {number}
  23410. * @default 1
  23411. * @since 3.0.0
  23412. */
  23413. zoom: {
  23414. get: function ()
  23415. {
  23416. return this._zoom;
  23417. },
  23418. set: function (value)
  23419. {
  23420. this._zoom = value;
  23421. this.dirty = true;
  23422. }
  23423. },
  23424. /**
  23425. * The rotation of the Camera in radians.
  23426. *
  23427. * Camera rotation always takes place based on the Camera viewport. By default, rotation happens
  23428. * in the center of the viewport. You can adjust this with the `originX` and `originY` properties.
  23429. *
  23430. * Rotation influences the rendering of _all_ Game Objects visible by this Camera. However, it does not
  23431. * rotate the Camera viewport itself, which always remains an axis-aligned rectangle.
  23432. *
  23433. * @name Phaser.Cameras.Scene2D.BaseCamera#rotation
  23434. * @type {number}
  23435. * @private
  23436. * @default 0
  23437. * @since 3.11.0
  23438. */
  23439. rotation: {
  23440. get: function ()
  23441. {
  23442. return this._rotation;
  23443. },
  23444. set: function (value)
  23445. {
  23446. this._rotation = value;
  23447. this.dirty = true;
  23448. }
  23449. },
  23450. /**
  23451. * The horizontal position of the center of the Camera's viewport, relative to the left of the game canvas.
  23452. *
  23453. * @name Phaser.Cameras.Scene2D.BaseCamera#centerX
  23454. * @type {number}
  23455. * @readonly
  23456. * @since 3.10.0
  23457. */
  23458. centerX: {
  23459. get: function ()
  23460. {
  23461. return this.x + (0.5 * this.width);
  23462. }
  23463. },
  23464. /**
  23465. * The vertical position of the center of the Camera's viewport, relative to the top of the game canvas.
  23466. *
  23467. * @name Phaser.Cameras.Scene2D.BaseCamera#centerY
  23468. * @type {number}
  23469. * @readonly
  23470. * @since 3.10.0
  23471. */
  23472. centerY: {
  23473. get: function ()
  23474. {
  23475. return this.y + (0.5 * this.height);
  23476. }
  23477. },
  23478. /**
  23479. * The displayed width of the camera viewport, factoring in the camera zoom level.
  23480. *
  23481. * If a camera has a viewport width of 800 and a zoom of 0.5 then its display width
  23482. * would be 1600, as it's displaying twice as many pixels as zoom level 1.
  23483. *
  23484. * Equally, a camera with a width of 800 and zoom of 2 would have a display width
  23485. * of 400 pixels.
  23486. *
  23487. * @name Phaser.Cameras.Scene2D.BaseCamera#displayWidth
  23488. * @type {number}
  23489. * @readonly
  23490. * @since 3.11.0
  23491. */
  23492. displayWidth: {
  23493. get: function ()
  23494. {
  23495. return this.width / this.zoom;
  23496. }
  23497. },
  23498. /**
  23499. * The displayed height of the camera viewport, factoring in the camera zoom level.
  23500. *
  23501. * If a camera has a viewport height of 600 and a zoom of 0.5 then its display height
  23502. * would be 1200, as it's displaying twice as many pixels as zoom level 1.
  23503. *
  23504. * Equally, a camera with a height of 600 and zoom of 2 would have a display height
  23505. * of 300 pixels.
  23506. *
  23507. * @name Phaser.Cameras.Scene2D.BaseCamera#displayHeight
  23508. * @type {number}
  23509. * @readonly
  23510. * @since 3.11.0
  23511. */
  23512. displayHeight: {
  23513. get: function ()
  23514. {
  23515. return this.height / this.zoom;
  23516. }
  23517. }
  23518. });
  23519. module.exports = BaseCamera;
  23520. /***/ }),
  23521. /* 132 */
  23522. /***/ (function(module, exports) {
  23523. /**
  23524. * @author Richard Davey <rich@photonstorm.com>
  23525. * @copyright 2019 Photon Storm Ltd.
  23526. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  23527. */
  23528. /**
  23529. * Shuffles the contents of the given array using the Fisher-Yates implementation.
  23530. *
  23531. * The original array is modified directly and returned.
  23532. *
  23533. * @function Phaser.Utils.Array.Shuffle
  23534. * @since 3.0.0
  23535. *
  23536. * @param {array} array - The array to shuffle. This array is modified in place.
  23537. *
  23538. * @return {array} The shuffled array.
  23539. */
  23540. var Shuffle = function (array)
  23541. {
  23542. for (var i = array.length - 1; i > 0; i--)
  23543. {
  23544. var j = Math.floor(Math.random() * (i + 1));
  23545. var temp = array[i];
  23546. array[i] = array[j];
  23547. array[j] = temp;
  23548. }
  23549. return array;
  23550. };
  23551. module.exports = Shuffle;
  23552. /***/ }),
  23553. /* 133 */
  23554. /***/ (function(module, exports, __webpack_require__) {
  23555. /**
  23556. * @author Richard Davey <rich@photonstorm.com>
  23557. * @copyright 2019 Photon Storm Ltd.
  23558. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  23559. */
  23560. /**
  23561. * @namespace Phaser.GameObjects.Events
  23562. */
  23563. module.exports = { DESTROY: __webpack_require__(1234) };
  23564. /***/ }),
  23565. /* 134 */
  23566. /***/ (function(module, exports, __webpack_require__) {
  23567. /**
  23568. * @author Richard Davey <rich@photonstorm.com>
  23569. * @copyright 2019 Photon Storm Ltd.
  23570. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  23571. */
  23572. var Class = __webpack_require__(0);
  23573. var Events = __webpack_require__(420);
  23574. /**
  23575. * @callback DataEachCallback
  23576. *
  23577. * @param {*} parent - The parent object of the DataManager.
  23578. * @param {string} key - The key of the value.
  23579. * @param {*} value - The value.
  23580. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the game object, key, and data.
  23581. */
  23582. /**
  23583. * @classdesc
  23584. * The Data Manager Component features a means to store pieces of data specific to a Game Object, System or Plugin.
  23585. * You can then search, query it, and retrieve the data. The parent must either extend EventEmitter,
  23586. * or have a property called `events` that is an instance of it.
  23587. *
  23588. * @class DataManager
  23589. * @memberof Phaser.Data
  23590. * @constructor
  23591. * @since 3.0.0
  23592. *
  23593. * @param {object} parent - The object that this DataManager belongs to.
  23594. * @param {Phaser.Events.EventEmitter} eventEmitter - The DataManager's event emitter.
  23595. */
  23596. var DataManager = new Class({
  23597. initialize:
  23598. function DataManager (parent, eventEmitter)
  23599. {
  23600. /**
  23601. * The object that this DataManager belongs to.
  23602. *
  23603. * @name Phaser.Data.DataManager#parent
  23604. * @type {*}
  23605. * @since 3.0.0
  23606. */
  23607. this.parent = parent;
  23608. /**
  23609. * The DataManager's event emitter.
  23610. *
  23611. * @name Phaser.Data.DataManager#events
  23612. * @type {Phaser.Events.EventEmitter}
  23613. * @since 3.0.0
  23614. */
  23615. this.events = eventEmitter;
  23616. if (!eventEmitter)
  23617. {
  23618. this.events = (parent.events) ? parent.events : parent;
  23619. }
  23620. /**
  23621. * The data list.
  23622. *
  23623. * @name Phaser.Data.DataManager#list
  23624. * @type {Object.<string, *>}
  23625. * @default {}
  23626. * @since 3.0.0
  23627. */
  23628. this.list = {};
  23629. /**
  23630. * The public values list. You can use this to access anything you have stored
  23631. * in this Data Manager. For example, if you set a value called `gold` you can
  23632. * access it via:
  23633. *
  23634. * ```javascript
  23635. * this.data.values.gold;
  23636. * ```
  23637. *
  23638. * You can also modify it directly:
  23639. *
  23640. * ```javascript
  23641. * this.data.values.gold += 1000;
  23642. * ```
  23643. *
  23644. * Doing so will emit a `setdata` event from the parent of this Data Manager.
  23645. *
  23646. * Do not modify this object directly. Adding properties directly to this object will not
  23647. * emit any events. Always use `DataManager.set` to create new items the first time around.
  23648. *
  23649. * @name Phaser.Data.DataManager#values
  23650. * @type {Object.<string, *>}
  23651. * @default {}
  23652. * @since 3.10.0
  23653. */
  23654. this.values = {};
  23655. /**
  23656. * Whether setting data is frozen for this DataManager.
  23657. *
  23658. * @name Phaser.Data.DataManager#_frozen
  23659. * @type {boolean}
  23660. * @private
  23661. * @default false
  23662. * @since 3.0.0
  23663. */
  23664. this._frozen = false;
  23665. if (!parent.hasOwnProperty('sys') && this.events)
  23666. {
  23667. this.events.once('destroy', this.destroy, this);
  23668. }
  23669. },
  23670. /**
  23671. * Retrieves the value for the given key, or undefined if it doesn't exist.
  23672. *
  23673. * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either:
  23674. *
  23675. * ```javascript
  23676. * this.data.get('gold');
  23677. * ```
  23678. *
  23679. * Or access the value directly:
  23680. *
  23681. * ```javascript
  23682. * this.data.values.gold;
  23683. * ```
  23684. *
  23685. * You can also pass in an array of keys, in which case an array of values will be returned:
  23686. *
  23687. * ```javascript
  23688. * this.data.get([ 'gold', 'armor', 'health' ]);
  23689. * ```
  23690. *
  23691. * This approach is useful for destructuring arrays in ES6.
  23692. *
  23693. * @method Phaser.Data.DataManager#get
  23694. * @since 3.0.0
  23695. *
  23696. * @param {(string|string[])} key - The key of the value to retrieve, or an array of keys.
  23697. *
  23698. * @return {*} The value belonging to the given key, or an array of values, the order of which will match the input array.
  23699. */
  23700. get: function (key)
  23701. {
  23702. var list = this.list;
  23703. if (Array.isArray(key))
  23704. {
  23705. var output = [];
  23706. for (var i = 0; i < key.length; i++)
  23707. {
  23708. output.push(list[key[i]]);
  23709. }
  23710. return output;
  23711. }
  23712. else
  23713. {
  23714. return list[key];
  23715. }
  23716. },
  23717. /**
  23718. * Retrieves all data values in a new object.
  23719. *
  23720. * @method Phaser.Data.DataManager#getAll
  23721. * @since 3.0.0
  23722. *
  23723. * @return {Object.<string, *>} All data values.
  23724. */
  23725. getAll: function ()
  23726. {
  23727. var results = {};
  23728. for (var key in this.list)
  23729. {
  23730. if (this.list.hasOwnProperty(key))
  23731. {
  23732. results[key] = this.list[key];
  23733. }
  23734. }
  23735. return results;
  23736. },
  23737. /**
  23738. * Queries the DataManager for the values of keys matching the given regular expression.
  23739. *
  23740. * @method Phaser.Data.DataManager#query
  23741. * @since 3.0.0
  23742. *
  23743. * @param {RegExp} search - A regular expression object. If a non-RegExp object obj is passed, it is implicitly converted to a RegExp by using new RegExp(obj).
  23744. *
  23745. * @return {Object.<string, *>} The values of the keys matching the search string.
  23746. */
  23747. query: function (search)
  23748. {
  23749. var results = {};
  23750. for (var key in this.list)
  23751. {
  23752. if (this.list.hasOwnProperty(key) && key.match(search))
  23753. {
  23754. results[key] = this.list[key];
  23755. }
  23756. }
  23757. return results;
  23758. },
  23759. /**
  23760. * Sets a value for the given key. If the key doesn't already exist in the Data Manager then it is created.
  23761. *
  23762. * ```javascript
  23763. * data.set('name', 'Red Gem Stone');
  23764. * ```
  23765. *
  23766. * You can also pass in an object of key value pairs as the first argument:
  23767. *
  23768. * ```javascript
  23769. * data.set({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 });
  23770. * ```
  23771. *
  23772. * To get a value back again you can call `get`:
  23773. *
  23774. * ```javascript
  23775. * data.get('gold');
  23776. * ```
  23777. *
  23778. * Or you can access the value directly via the `values` property, where it works like any other variable:
  23779. *
  23780. * ```javascript
  23781. * data.values.gold += 50;
  23782. * ```
  23783. *
  23784. * When the value is first set, a `setdata` event is emitted.
  23785. *
  23786. * If the key already exists, a `changedata` event is emitted instead, along an event named after the key.
  23787. * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata-PlayerLives`.
  23788. * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter.
  23789. *
  23790. * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings.
  23791. * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager.
  23792. *
  23793. * @method Phaser.Data.DataManager#set
  23794. * @fires Phaser.Data.Events#SET_DATA
  23795. * @fires Phaser.Data.Events#CHANGE_DATA
  23796. * @fires Phaser.Data.Events#CHANGE_DATA_KEY
  23797. * @since 3.0.0
  23798. *
  23799. * @param {(string|object)} key - The key to set the value for. Or an object or key value pairs. If an object the `data` argument is ignored.
  23800. * @param {*} data - The value to set for the given key. If an object is provided as the key this argument is ignored.
  23801. *
  23802. * @return {Phaser.Data.DataManager} This DataManager object.
  23803. */
  23804. set: function (key, data)
  23805. {
  23806. if (this._frozen)
  23807. {
  23808. return this;
  23809. }
  23810. if (typeof key === 'string')
  23811. {
  23812. return this.setValue(key, data);
  23813. }
  23814. else
  23815. {
  23816. for (var entry in key)
  23817. {
  23818. this.setValue(entry, key[entry]);
  23819. }
  23820. }
  23821. return this;
  23822. },
  23823. /**
  23824. * Internal value setter, called automatically by the `set` method.
  23825. *
  23826. * @method Phaser.Data.DataManager#setValue
  23827. * @fires Phaser.Data.Events#SET_DATA
  23828. * @fires Phaser.Data.Events#CHANGE_DATA
  23829. * @fires Phaser.Data.Events#CHANGE_DATA_KEY
  23830. * @private
  23831. * @since 3.10.0
  23832. *
  23833. * @param {string} key - The key to set the value for.
  23834. * @param {*} data - The value to set.
  23835. *
  23836. * @return {Phaser.Data.DataManager} This DataManager object.
  23837. */
  23838. setValue: function (key, data)
  23839. {
  23840. if (this._frozen)
  23841. {
  23842. return this;
  23843. }
  23844. if (this.has(key))
  23845. {
  23846. // Hit the key getter, which will in turn emit the events.
  23847. this.values[key] = data;
  23848. }
  23849. else
  23850. {
  23851. var _this = this;
  23852. var list = this.list;
  23853. var events = this.events;
  23854. var parent = this.parent;
  23855. Object.defineProperty(this.values, key, {
  23856. enumerable: true,
  23857. configurable: true,
  23858. get: function ()
  23859. {
  23860. return list[key];
  23861. },
  23862. set: function (value)
  23863. {
  23864. if (!_this._frozen)
  23865. {
  23866. var previousValue = list[key];
  23867. list[key] = value;
  23868. events.emit(Events.CHANGE_DATA, parent, key, value, previousValue);
  23869. events.emit(Events.CHANGE_DATA_KEY + key, parent, value, previousValue);
  23870. }
  23871. }
  23872. });
  23873. list[key] = data;
  23874. events.emit(Events.SET_DATA, parent, key, data);
  23875. }
  23876. return this;
  23877. },
  23878. /**
  23879. * Passes all data entries to the given callback.
  23880. *
  23881. * @method Phaser.Data.DataManager#each
  23882. * @since 3.0.0
  23883. *
  23884. * @param {DataEachCallback} callback - The function to call.
  23885. * @param {*} [context] - Value to use as `this` when executing callback.
  23886. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the game object, key, and data.
  23887. *
  23888. * @return {Phaser.Data.DataManager} This DataManager object.
  23889. */
  23890. each: function (callback, context)
  23891. {
  23892. var args = [ this.parent, null, undefined ];
  23893. for (var i = 1; i < arguments.length; i++)
  23894. {
  23895. args.push(arguments[i]);
  23896. }
  23897. for (var key in this.list)
  23898. {
  23899. args[1] = key;
  23900. args[2] = this.list[key];
  23901. callback.apply(context, args);
  23902. }
  23903. return this;
  23904. },
  23905. /**
  23906. * Merge the given object of key value pairs into this DataManager.
  23907. *
  23908. * Any newly created values will emit a `setdata` event. Any updated values (see the `overwrite` argument)
  23909. * will emit a `changedata` event.
  23910. *
  23911. * @method Phaser.Data.DataManager#merge
  23912. * @fires Phaser.Data.Events#SET_DATA
  23913. * @fires Phaser.Data.Events#CHANGE_DATA
  23914. * @fires Phaser.Data.Events#CHANGE_DATA_KEY
  23915. * @since 3.0.0
  23916. *
  23917. * @param {Object.<string, *>} data - The data to merge.
  23918. * @param {boolean} [overwrite=true] - Whether to overwrite existing data. Defaults to true.
  23919. *
  23920. * @return {Phaser.Data.DataManager} This DataManager object.
  23921. */
  23922. merge: function (data, overwrite)
  23923. {
  23924. if (overwrite === undefined) { overwrite = true; }
  23925. // Merge data from another component into this one
  23926. for (var key in data)
  23927. {
  23928. if (data.hasOwnProperty(key) && (overwrite || (!overwrite && !this.has(key))))
  23929. {
  23930. this.setValue(key, data[key]);
  23931. }
  23932. }
  23933. return this;
  23934. },
  23935. /**
  23936. * Remove the value for the given key.
  23937. *
  23938. * If the key is found in this Data Manager it is removed from the internal lists and a
  23939. * `removedata` event is emitted.
  23940. *
  23941. * You can also pass in an array of keys, in which case all keys in the array will be removed:
  23942. *
  23943. * ```javascript
  23944. * this.data.remove([ 'gold', 'armor', 'health' ]);
  23945. * ```
  23946. *
  23947. * @method Phaser.Data.DataManager#remove
  23948. * @fires Phaser.Data.Events#REMOVE_DATA
  23949. * @since 3.0.0
  23950. *
  23951. * @param {(string|string[])} key - The key to remove, or an array of keys to remove.
  23952. *
  23953. * @return {Phaser.Data.DataManager} This DataManager object.
  23954. */
  23955. remove: function (key)
  23956. {
  23957. if (this._frozen)
  23958. {
  23959. return this;
  23960. }
  23961. if (Array.isArray(key))
  23962. {
  23963. for (var i = 0; i < key.length; i++)
  23964. {
  23965. this.removeValue(key[i]);
  23966. }
  23967. }
  23968. else
  23969. {
  23970. return this.removeValue(key);
  23971. }
  23972. return this;
  23973. },
  23974. /**
  23975. * Internal value remover, called automatically by the `remove` method.
  23976. *
  23977. * @method Phaser.Data.DataManager#removeValue
  23978. * @private
  23979. * @fires Phaser.Data.Events#REMOVE_DATA
  23980. * @since 3.10.0
  23981. *
  23982. * @param {string} key - The key to set the value for.
  23983. *
  23984. * @return {Phaser.Data.DataManager} This DataManager object.
  23985. */
  23986. removeValue: function (key)
  23987. {
  23988. if (this.has(key))
  23989. {
  23990. var data = this.list[key];
  23991. delete this.list[key];
  23992. delete this.values[key];
  23993. this.events.emit(Events.REMOVE_DATA, this.parent, key, data);
  23994. }
  23995. return this;
  23996. },
  23997. /**
  23998. * Retrieves the data associated with the given 'key', deletes it from this Data Manager, then returns it.
  23999. *
  24000. * @method Phaser.Data.DataManager#pop
  24001. * @fires Phaser.Data.Events#REMOVE_DATA
  24002. * @since 3.0.0
  24003. *
  24004. * @param {string} key - The key of the value to retrieve and delete.
  24005. *
  24006. * @return {*} The value of the given key.
  24007. */
  24008. pop: function (key)
  24009. {
  24010. var data = undefined;
  24011. if (!this._frozen && this.has(key))
  24012. {
  24013. data = this.list[key];
  24014. delete this.list[key];
  24015. delete this.values[key];
  24016. this.events.emit(Events.REMOVE_DATA, this.parent, key, data);
  24017. }
  24018. return data;
  24019. },
  24020. /**
  24021. * Determines whether the given key is set in this Data Manager.
  24022. *
  24023. * Please note that the keys are case-sensitive and must be valid JavaScript Object property strings.
  24024. * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager.
  24025. *
  24026. * @method Phaser.Data.DataManager#has
  24027. * @since 3.0.0
  24028. *
  24029. * @param {string} key - The key to check.
  24030. *
  24031. * @return {boolean} Returns `true` if the key exists, otherwise `false`.
  24032. */
  24033. has: function (key)
  24034. {
  24035. return this.list.hasOwnProperty(key);
  24036. },
  24037. /**
  24038. * Freeze or unfreeze this Data Manager. A frozen Data Manager will block all attempts
  24039. * to create new values or update existing ones.
  24040. *
  24041. * @method Phaser.Data.DataManager#setFreeze
  24042. * @since 3.0.0
  24043. *
  24044. * @param {boolean} value - Whether to freeze or unfreeze the Data Manager.
  24045. *
  24046. * @return {Phaser.Data.DataManager} This DataManager object.
  24047. */
  24048. setFreeze: function (value)
  24049. {
  24050. this._frozen = value;
  24051. return this;
  24052. },
  24053. /**
  24054. * Delete all data in this Data Manager and unfreeze it.
  24055. *
  24056. * @method Phaser.Data.DataManager#reset
  24057. * @since 3.0.0
  24058. *
  24059. * @return {Phaser.Data.DataManager} This DataManager object.
  24060. */
  24061. reset: function ()
  24062. {
  24063. for (var key in this.list)
  24064. {
  24065. delete this.list[key];
  24066. delete this.values[key];
  24067. }
  24068. this._frozen = false;
  24069. return this;
  24070. },
  24071. /**
  24072. * Destroy this data manager.
  24073. *
  24074. * @method Phaser.Data.DataManager#destroy
  24075. * @since 3.0.0
  24076. */
  24077. destroy: function ()
  24078. {
  24079. this.reset();
  24080. this.events.off(Events.CHANGE_DATA);
  24081. this.events.off(Events.SET_DATA);
  24082. this.events.off(Events.REMOVE_DATA);
  24083. this.parent = null;
  24084. },
  24085. /**
  24086. * Gets or sets the frozen state of this Data Manager.
  24087. * A frozen Data Manager will block all attempts to create new values or update existing ones.
  24088. *
  24089. * @name Phaser.Data.DataManager#freeze
  24090. * @type {boolean}
  24091. * @since 3.0.0
  24092. */
  24093. freeze: {
  24094. get: function ()
  24095. {
  24096. return this._frozen;
  24097. },
  24098. set: function (value)
  24099. {
  24100. this._frozen = (value) ? true : false;
  24101. }
  24102. },
  24103. /**
  24104. * Return the total number of entries in this Data Manager.
  24105. *
  24106. * @name Phaser.Data.DataManager#count
  24107. * @type {integer}
  24108. * @since 3.0.0
  24109. */
  24110. count: {
  24111. get: function ()
  24112. {
  24113. var i = 0;
  24114. for (var key in this.list)
  24115. {
  24116. if (this.list[key] !== undefined)
  24117. {
  24118. i++;
  24119. }
  24120. }
  24121. return i;
  24122. }
  24123. }
  24124. });
  24125. module.exports = DataManager;
  24126. /***/ }),
  24127. /* 135 */
  24128. /***/ (function(module, exports) {
  24129. /**
  24130. * @author Richard Davey <rich@photonstorm.com>
  24131. * @copyright 2019 Photon Storm Ltd.
  24132. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  24133. */
  24134. /**
  24135. * Calculates the perimeter of a Rectangle.
  24136. *
  24137. * @function Phaser.Geom.Rectangle.Perimeter
  24138. * @since 3.0.0
  24139. *
  24140. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to use.
  24141. *
  24142. * @return {number} The perimeter of the Rectangle, equal to `(width * 2) + (height * 2)`.
  24143. */
  24144. var Perimeter = function (rect)
  24145. {
  24146. return 2 * (rect.width + rect.height);
  24147. };
  24148. module.exports = Perimeter;
  24149. /***/ }),
  24150. /* 136 */
  24151. /***/ (function(module, exports, __webpack_require__) {
  24152. /**
  24153. * @author Richard Davey <rich@photonstorm.com>
  24154. * @copyright 2019 Photon Storm Ltd.
  24155. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  24156. */
  24157. /**
  24158. * @namespace Phaser.Animations.Events
  24159. */
  24160. module.exports = {
  24161. ADD_ANIMATION: __webpack_require__(1266),
  24162. ANIMATION_COMPLETE: __webpack_require__(1265),
  24163. ANIMATION_REPEAT: __webpack_require__(1264),
  24164. ANIMATION_RESTART: __webpack_require__(1263),
  24165. ANIMATION_START: __webpack_require__(1262),
  24166. PAUSE_ALL: __webpack_require__(1261),
  24167. REMOVE_ANIMATION: __webpack_require__(1260),
  24168. RESUME_ALL: __webpack_require__(1259),
  24169. SPRITE_ANIMATION_COMPLETE: __webpack_require__(1258),
  24170. SPRITE_ANIMATION_KEY_COMPLETE: __webpack_require__(1257),
  24171. SPRITE_ANIMATION_KEY_REPEAT: __webpack_require__(1256),
  24172. SPRITE_ANIMATION_KEY_RESTART: __webpack_require__(1255),
  24173. SPRITE_ANIMATION_KEY_START: __webpack_require__(1254),
  24174. SPRITE_ANIMATION_KEY_UPDATE: __webpack_require__(1253),
  24175. SPRITE_ANIMATION_REPEAT: __webpack_require__(1252),
  24176. SPRITE_ANIMATION_RESTART: __webpack_require__(1251),
  24177. SPRITE_ANIMATION_START: __webpack_require__(1250),
  24178. SPRITE_ANIMATION_UPDATE: __webpack_require__(1249)
  24179. };
  24180. /***/ }),
  24181. /* 137 */
  24182. /***/ (function(module, exports, __webpack_require__) {
  24183. /**
  24184. * @author Richard Davey <rich@photonstorm.com>
  24185. * @copyright 2019 Photon Storm Ltd.
  24186. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  24187. */
  24188. var BlendModes = __webpack_require__(60);
  24189. var Circle = __webpack_require__(77);
  24190. var CircleContains = __webpack_require__(43);
  24191. var Class = __webpack_require__(0);
  24192. var Components = __webpack_require__(13);
  24193. var GameObject = __webpack_require__(18);
  24194. var Rectangle = __webpack_require__(10);
  24195. var RectangleContains = __webpack_require__(42);
  24196. /**
  24197. * @classdesc
  24198. * A Zone Game Object.
  24199. *
  24200. * A Zone is a non-rendering rectangular Game Object that has a position and size.
  24201. * It has no texture and never displays, but does live on the display list and
  24202. * can be moved, scaled and rotated like any other Game Object.
  24203. *
  24204. * Its primary use is for creating Drop Zones and Input Hit Areas and it has a couple of helper methods
  24205. * specifically for this. It is also useful for object overlap checks, or as a base for your own
  24206. * non-displaying Game Objects.
  24207. * The default origin is 0.5, the center of the Zone, the same as with Game Objects.
  24208. *
  24209. * @class Zone
  24210. * @extends Phaser.GameObjects.GameObject
  24211. * @memberof Phaser.GameObjects
  24212. * @constructor
  24213. * @since 3.0.0
  24214. *
  24215. * @extends Phaser.GameObjects.Components.Depth
  24216. * @extends Phaser.GameObjects.Components.GetBounds
  24217. * @extends Phaser.GameObjects.Components.Origin
  24218. * @extends Phaser.GameObjects.Components.ScaleMode
  24219. * @extends Phaser.GameObjects.Components.Transform
  24220. * @extends Phaser.GameObjects.Components.ScrollFactor
  24221. * @extends Phaser.GameObjects.Components.Visible
  24222. *
  24223. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs.
  24224. * @param {number} x - The horizontal position of this Game Object in the world.
  24225. * @param {number} y - The vertical position of this Game Object in the world.
  24226. * @param {number} [width=1] - The width of the Game Object.
  24227. * @param {number} [height=1] - The height of the Game Object.
  24228. */
  24229. var Zone = new Class({
  24230. Extends: GameObject,
  24231. Mixins: [
  24232. Components.Depth,
  24233. Components.GetBounds,
  24234. Components.Origin,
  24235. Components.ScaleMode,
  24236. Components.Transform,
  24237. Components.ScrollFactor,
  24238. Components.Visible
  24239. ],
  24240. initialize:
  24241. function Zone (scene, x, y, width, height)
  24242. {
  24243. if (width === undefined) { width = 1; }
  24244. if (height === undefined) { height = width; }
  24245. GameObject.call(this, scene, 'Zone');
  24246. this.setPosition(x, y);
  24247. /**
  24248. * The native (un-scaled) width of this Game Object.
  24249. *
  24250. * @name Phaser.GameObjects.Zone#width
  24251. * @type {number}
  24252. * @since 3.0.0
  24253. */
  24254. this.width = width;
  24255. /**
  24256. * The native (un-scaled) height of this Game Object.
  24257. *
  24258. * @name Phaser.GameObjects.Zone#height
  24259. * @type {number}
  24260. * @since 3.0.0
  24261. */
  24262. this.height = height;
  24263. /**
  24264. * The Blend Mode of the Game Object.
  24265. * Although a Zone never renders, it still has a blend mode to allow it to fit seamlessly into
  24266. * display lists without causing a batch flush.
  24267. *
  24268. * @name Phaser.GameObjects.Zone#blendMode
  24269. * @type {integer}
  24270. * @since 3.0.0
  24271. */
  24272. this.blendMode = BlendModes.NORMAL;
  24273. this.updateDisplayOrigin();
  24274. },
  24275. /**
  24276. * The displayed width of this Game Object.
  24277. * This value takes into account the scale factor.
  24278. *
  24279. * @name Phaser.GameObjects.Zone#displayWidth
  24280. * @type {number}
  24281. * @since 3.0.0
  24282. */
  24283. displayWidth: {
  24284. get: function ()
  24285. {
  24286. return this.scaleX * this.width;
  24287. },
  24288. set: function (value)
  24289. {
  24290. this.scaleX = value / this.width;
  24291. }
  24292. },
  24293. /**
  24294. * The displayed height of this Game Object.
  24295. * This value takes into account the scale factor.
  24296. *
  24297. * @name Phaser.GameObjects.Zone#displayHeight
  24298. * @type {number}
  24299. * @since 3.0.0
  24300. */
  24301. displayHeight: {
  24302. get: function ()
  24303. {
  24304. return this.scaleY * this.height;
  24305. },
  24306. set: function (value)
  24307. {
  24308. this.scaleY = value / this.height;
  24309. }
  24310. },
  24311. /**
  24312. * Sets the size of this Game Object.
  24313. *
  24314. * @method Phaser.GameObjects.Zone#setSize
  24315. * @since 3.0.0
  24316. *
  24317. * @param {number} width - The width of this Game Object.
  24318. * @param {number} height - The height of this Game Object.
  24319. * @param {boolean} [resizeInput=true] - If this Zone has a Rectangle for a hit area this argument will resize the hit area as well.
  24320. *
  24321. * @return {Phaser.GameObjects.Zone} This Game Object.
  24322. */
  24323. setSize: function (width, height, resizeInput)
  24324. {
  24325. if (resizeInput === undefined) { resizeInput = true; }
  24326. this.width = width;
  24327. this.height = height;
  24328. if (resizeInput && this.input && this.input.hitArea instanceof Rectangle)
  24329. {
  24330. this.input.hitArea.width = width;
  24331. this.input.hitArea.height = height;
  24332. }
  24333. return this;
  24334. },
  24335. /**
  24336. * Sets the display size of this Game Object.
  24337. * Calling this will adjust the scale.
  24338. *
  24339. * @method Phaser.GameObjects.Zone#setDisplaySize
  24340. * @since 3.0.0
  24341. *
  24342. * @param {number} width - The width of this Game Object.
  24343. * @param {number} height - The height of this Game Object.
  24344. *
  24345. * @return {Phaser.GameObjects.Zone} This Game Object.
  24346. */
  24347. setDisplaySize: function (width, height)
  24348. {
  24349. this.displayWidth = width;
  24350. this.displayHeight = height;
  24351. return this;
  24352. },
  24353. /**
  24354. * Sets this Zone to be a Circular Drop Zone.
  24355. * The circle is centered on this Zones `x` and `y` coordinates.
  24356. *
  24357. * @method Phaser.GameObjects.Zone#setCircleDropZone
  24358. * @since 3.0.0
  24359. *
  24360. * @param {number} radius - The radius of the Circle that will form the Drop Zone.
  24361. *
  24362. * @return {Phaser.GameObjects.Zone} This Game Object.
  24363. */
  24364. setCircleDropZone: function (radius)
  24365. {
  24366. return this.setDropZone(new Circle(0, 0, radius), CircleContains);
  24367. },
  24368. /**
  24369. * Sets this Zone to be a Rectangle Drop Zone.
  24370. * The rectangle is centered on this Zones `x` and `y` coordinates.
  24371. *
  24372. * @method Phaser.GameObjects.Zone#setRectangleDropZone
  24373. * @since 3.0.0
  24374. *
  24375. * @param {number} width - The width of the rectangle drop zone.
  24376. * @param {number} height - The height of the rectangle drop zone.
  24377. *
  24378. * @return {Phaser.GameObjects.Zone} This Game Object.
  24379. */
  24380. setRectangleDropZone: function (width, height)
  24381. {
  24382. return this.setDropZone(new Rectangle(0, 0, width, height), RectangleContains);
  24383. },
  24384. /**
  24385. * Allows you to define your own Geometry shape to be used as a Drop Zone.
  24386. *
  24387. * @method Phaser.GameObjects.Zone#setDropZone
  24388. * @since 3.0.0
  24389. *
  24390. * @param {object} shape - A Geometry shape instance, such as Phaser.Geom.Ellipse, or your own custom shape.
  24391. * @param {HitAreaCallback} callback - A function that will return `true` if the given x/y coords it is sent are within the shape.
  24392. *
  24393. * @return {Phaser.GameObjects.Zone} This Game Object.
  24394. */
  24395. setDropZone: function (shape, callback)
  24396. {
  24397. if (shape === undefined)
  24398. {
  24399. this.setRectangleDropZone(this.width, this.height);
  24400. }
  24401. else if (!this.input)
  24402. {
  24403. this.setInteractive(shape, callback, true);
  24404. }
  24405. return this;
  24406. },
  24407. /**
  24408. * A NOOP method so you can pass a Zone to a Container.
  24409. * Calling this method will do nothing. It is intentionally empty.
  24410. *
  24411. * @method Phaser.GameObjects.Zone#setAlpha
  24412. * @private
  24413. * @since 3.11.0
  24414. */
  24415. setAlpha: function ()
  24416. {
  24417. },
  24418. /**
  24419. * A NOOP method so you can pass a Zone to a Container in Canvas.
  24420. * Calling this method will do nothing. It is intentionally empty.
  24421. *
  24422. * @method Phaser.GameObjects.Zone#setBlendMode
  24423. * @private
  24424. * @since 3.16.2
  24425. */
  24426. setBlendMode: function ()
  24427. {
  24428. },
  24429. /**
  24430. * A Zone does not render.
  24431. *
  24432. * @method Phaser.GameObjects.Zone#renderCanvas
  24433. * @private
  24434. * @since 3.0.0
  24435. */
  24436. renderCanvas: function ()
  24437. {
  24438. },
  24439. /**
  24440. * A Zone does not render.
  24441. *
  24442. * @method Phaser.GameObjects.Zone#renderWebGL
  24443. * @private
  24444. * @since 3.0.0
  24445. */
  24446. renderWebGL: function ()
  24447. {
  24448. }
  24449. });
  24450. module.exports = Zone;
  24451. /***/ }),
  24452. /* 138 */
  24453. /***/ (function(module, exports, __webpack_require__) {
  24454. /**
  24455. * The `Matter.Bodies` module contains factory methods for creating rigid body models
  24456. * with commonly used body configurations (such as rectangles, circles and other polygons).
  24457. *
  24458. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  24459. *
  24460. * @class Bodies
  24461. */
  24462. // TODO: true circle bodies
  24463. var Bodies = {};
  24464. module.exports = Bodies;
  24465. var Vertices = __webpack_require__(82);
  24466. var Common = __webpack_require__(36);
  24467. var Body = __webpack_require__(72);
  24468. var Bounds = __webpack_require__(86);
  24469. var Vector = __webpack_require__(87);
  24470. var decomp = __webpack_require__(1290);
  24471. (function() {
  24472. /**
  24473. * Creates a new rigid body model with a rectangle hull.
  24474. * The options parameter is an object that specifies any properties you wish to override the defaults.
  24475. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  24476. * @method rectangle
  24477. * @param {number} x
  24478. * @param {number} y
  24479. * @param {number} width
  24480. * @param {number} height
  24481. * @param {object} [options]
  24482. * @return {body} A new rectangle body
  24483. */
  24484. Bodies.rectangle = function(x, y, width, height, options) {
  24485. options = options || {};
  24486. var rectangle = {
  24487. label: 'Rectangle Body',
  24488. position: { x: x, y: y },
  24489. vertices: Vertices.fromPath('L 0 0 L ' + width + ' 0 L ' + width + ' ' + height + ' L 0 ' + height)
  24490. };
  24491. if (options.chamfer) {
  24492. var chamfer = options.chamfer;
  24493. rectangle.vertices = Vertices.chamfer(rectangle.vertices, chamfer.radius,
  24494. chamfer.quality, chamfer.qualityMin, chamfer.qualityMax);
  24495. delete options.chamfer;
  24496. }
  24497. return Body.create(Common.extend({}, rectangle, options));
  24498. };
  24499. /**
  24500. * Creates a new rigid body model with a trapezoid hull.
  24501. * The options parameter is an object that specifies any properties you wish to override the defaults.
  24502. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  24503. * @method trapezoid
  24504. * @param {number} x
  24505. * @param {number} y
  24506. * @param {number} width
  24507. * @param {number} height
  24508. * @param {number} slope
  24509. * @param {object} [options]
  24510. * @return {body} A new trapezoid body
  24511. */
  24512. Bodies.trapezoid = function(x, y, width, height, slope, options) {
  24513. options = options || {};
  24514. slope *= 0.5;
  24515. var roof = (1 - (slope * 2)) * width;
  24516. var x1 = width * slope,
  24517. x2 = x1 + roof,
  24518. x3 = x2 + x1,
  24519. verticesPath;
  24520. if (slope < 0.5) {
  24521. verticesPath = 'L 0 0 L ' + x1 + ' ' + (-height) + ' L ' + x2 + ' ' + (-height) + ' L ' + x3 + ' 0';
  24522. } else {
  24523. verticesPath = 'L 0 0 L ' + x2 + ' ' + (-height) + ' L ' + x3 + ' 0';
  24524. }
  24525. var trapezoid = {
  24526. label: 'Trapezoid Body',
  24527. position: { x: x, y: y },
  24528. vertices: Vertices.fromPath(verticesPath)
  24529. };
  24530. if (options.chamfer) {
  24531. var chamfer = options.chamfer;
  24532. trapezoid.vertices = Vertices.chamfer(trapezoid.vertices, chamfer.radius,
  24533. chamfer.quality, chamfer.qualityMin, chamfer.qualityMax);
  24534. delete options.chamfer;
  24535. }
  24536. return Body.create(Common.extend({}, trapezoid, options));
  24537. };
  24538. /**
  24539. * Creates a new rigid body model with a circle hull.
  24540. * The options parameter is an object that specifies any properties you wish to override the defaults.
  24541. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  24542. * @method circle
  24543. * @param {number} x
  24544. * @param {number} y
  24545. * @param {number} radius
  24546. * @param {object} [options]
  24547. * @param {number} [maxSides]
  24548. * @return {body} A new circle body
  24549. */
  24550. Bodies.circle = function(x, y, radius, options, maxSides) {
  24551. options = options || {};
  24552. var circle = {
  24553. label: 'Circle Body',
  24554. circleRadius: radius
  24555. };
  24556. // approximate circles with polygons until true circles implemented in SAT
  24557. maxSides = maxSides || 25;
  24558. var sides = Math.ceil(Math.max(10, Math.min(maxSides, radius)));
  24559. // optimisation: always use even number of sides (half the number of unique axes)
  24560. if (sides % 2 === 1)
  24561. sides += 1;
  24562. return Bodies.polygon(x, y, sides, radius, Common.extend({}, circle, options));
  24563. };
  24564. /**
  24565. * Creates a new rigid body model with a regular polygon hull with the given number of sides.
  24566. * The options parameter is an object that specifies any properties you wish to override the defaults.
  24567. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  24568. * @method polygon
  24569. * @param {number} x
  24570. * @param {number} y
  24571. * @param {number} sides
  24572. * @param {number} radius
  24573. * @param {object} [options]
  24574. * @return {body} A new regular polygon body
  24575. */
  24576. Bodies.polygon = function(x, y, sides, radius, options) {
  24577. options = options || {};
  24578. if (sides < 3)
  24579. return Bodies.circle(x, y, radius, options);
  24580. var theta = 2 * Math.PI / sides,
  24581. path = '',
  24582. offset = theta * 0.5;
  24583. for (var i = 0; i < sides; i += 1) {
  24584. var angle = offset + (i * theta),
  24585. xx = Math.cos(angle) * radius,
  24586. yy = Math.sin(angle) * radius;
  24587. path += 'L ' + xx.toFixed(3) + ' ' + yy.toFixed(3) + ' ';
  24588. }
  24589. var polygon = {
  24590. label: 'Polygon Body',
  24591. position: { x: x, y: y },
  24592. vertices: Vertices.fromPath(path)
  24593. };
  24594. if (options.chamfer) {
  24595. var chamfer = options.chamfer;
  24596. polygon.vertices = Vertices.chamfer(polygon.vertices, chamfer.radius,
  24597. chamfer.quality, chamfer.qualityMin, chamfer.qualityMax);
  24598. delete options.chamfer;
  24599. }
  24600. return Body.create(Common.extend({}, polygon, options));
  24601. };
  24602. /**
  24603. * Creates a body using the supplied vertices (or an array containing multiple sets of vertices).
  24604. * If the vertices are convex, they will pass through as supplied.
  24605. * Otherwise if the vertices are concave, they will be decomposed if [poly-decomp.js](https://github.com/schteppe/poly-decomp.js) is available.
  24606. * Note that this process is not guaranteed to support complex sets of vertices (e.g. those with holes may fail).
  24607. * By default the decomposition will discard collinear edges (to improve performance).
  24608. * It can also optionally discard any parts that have an area less than `minimumArea`.
  24609. * If the vertices can not be decomposed, the result will fall back to using the convex hull.
  24610. * The options parameter is an object that specifies any `Matter.Body` properties you wish to override the defaults.
  24611. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  24612. * @method fromVertices
  24613. * @param {number} x
  24614. * @param {number} y
  24615. * @param [[vector]] vertexSets
  24616. * @param {object} [options]
  24617. * @param {bool} [flagInternal=false]
  24618. * @param {number} [removeCollinear=0.01]
  24619. * @param {number} [minimumArea=10]
  24620. * @return {body}
  24621. */
  24622. Bodies.fromVertices = function(x, y, vertexSets, options, flagInternal, removeCollinear, minimumArea) {
  24623. var body,
  24624. parts,
  24625. isConvex,
  24626. vertices,
  24627. i,
  24628. j,
  24629. k,
  24630. v,
  24631. z;
  24632. options = options || {};
  24633. parts = [];
  24634. flagInternal = typeof flagInternal !== 'undefined' ? flagInternal : false;
  24635. removeCollinear = typeof removeCollinear !== 'undefined' ? removeCollinear : 0.01;
  24636. minimumArea = typeof minimumArea !== 'undefined' ? minimumArea : 10;
  24637. if (!decomp) {
  24638. Common.warn('Bodies.fromVertices: poly-decomp.js required. Could not decompose vertices. Fallback to convex hull.');
  24639. }
  24640. // ensure vertexSets is an array of arrays
  24641. if (!Common.isArray(vertexSets[0])) {
  24642. vertexSets = [vertexSets];
  24643. }
  24644. for (v = 0; v < vertexSets.length; v += 1) {
  24645. vertices = vertexSets[v];
  24646. isConvex = Vertices.isConvex(vertices);
  24647. if (isConvex || !decomp) {
  24648. if (isConvex) {
  24649. vertices = Vertices.clockwiseSort(vertices);
  24650. } else {
  24651. // fallback to convex hull when decomposition is not possible
  24652. vertices = Vertices.hull(vertices);
  24653. }
  24654. parts.push({
  24655. position: { x: x, y: y },
  24656. vertices: vertices
  24657. });
  24658. } else {
  24659. // initialise a decomposition
  24660. var concave = vertices.map(function(vertex) {
  24661. return [vertex.x, vertex.y];
  24662. });
  24663. // vertices are concave and simple, we can decompose into parts
  24664. decomp.makeCCW(concave);
  24665. if (removeCollinear !== false)
  24666. decomp.removeCollinearPoints(concave, removeCollinear);
  24667. // use the quick decomposition algorithm (Bayazit)
  24668. var decomposed = decomp.quickDecomp(concave);
  24669. // for each decomposed chunk
  24670. for (i = 0; i < decomposed.length; i++) {
  24671. var chunk = decomposed[i];
  24672. // convert vertices into the correct structure
  24673. var chunkVertices = chunk.map(function(vertices) {
  24674. return {
  24675. x: vertices[0],
  24676. y: vertices[1]
  24677. };
  24678. });
  24679. // skip small chunks
  24680. if (minimumArea > 0 && Vertices.area(chunkVertices) < minimumArea)
  24681. continue;
  24682. // create a compound part
  24683. parts.push({
  24684. position: Vertices.centre(chunkVertices),
  24685. vertices: chunkVertices
  24686. });
  24687. }
  24688. }
  24689. }
  24690. // create body parts
  24691. for (i = 0; i < parts.length; i++) {
  24692. parts[i] = Body.create(Common.extend(parts[i], options));
  24693. }
  24694. // flag internal edges (coincident part edges)
  24695. if (flagInternal) {
  24696. var coincident_max_dist = 5;
  24697. for (i = 0; i < parts.length; i++) {
  24698. var partA = parts[i];
  24699. for (j = i + 1; j < parts.length; j++) {
  24700. var partB = parts[j];
  24701. if (Bounds.overlaps(partA.bounds, partB.bounds)) {
  24702. var pav = partA.vertices,
  24703. pbv = partB.vertices;
  24704. // iterate vertices of both parts
  24705. for (k = 0; k < partA.vertices.length; k++) {
  24706. for (z = 0; z < partB.vertices.length; z++) {
  24707. // find distances between the vertices
  24708. var da = Vector.magnitudeSquared(Vector.sub(pav[(k + 1) % pav.length], pbv[z])),
  24709. db = Vector.magnitudeSquared(Vector.sub(pav[k], pbv[(z + 1) % pbv.length]));
  24710. // if both vertices are very close, consider the edge concident (internal)
  24711. if (da < coincident_max_dist && db < coincident_max_dist) {
  24712. pav[k].isInternal = true;
  24713. pbv[z].isInternal = true;
  24714. }
  24715. }
  24716. }
  24717. }
  24718. }
  24719. }
  24720. }
  24721. if (parts.length > 1) {
  24722. // create the parent body to be returned, that contains generated compound parts
  24723. body = Body.create(Common.extend({ parts: parts.slice(0) }, options));
  24724. Body.setPosition(body, { x: x, y: y });
  24725. return body;
  24726. } else {
  24727. return parts[0];
  24728. }
  24729. };
  24730. })();
  24731. /***/ }),
  24732. /* 139 */
  24733. /***/ (function(module, exports) {
  24734. /**
  24735. * @author Richard Davey <rich@photonstorm.com>
  24736. * @copyright 2019 Photon Storm Ltd.
  24737. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  24738. */
  24739. /**
  24740. * @typedef {object} TweenDataGenConfig
  24741. *
  24742. * @property {function} delay - Time in ms/frames before tween will start.
  24743. * @property {function} duration - Duration of the tween in ms/frames, excludes time for yoyo or repeats.
  24744. * @property {function} hold - Time in ms/frames the tween will pause before running the yoyo or starting a repeat.
  24745. * @property {function} repeat - Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice.
  24746. * @property {function} repeatDelay - Time in ms/frames before the repeat will start.
  24747. */
  24748. /**
  24749. * @typedef {object} Phaser.Tweens.TweenDataConfig
  24750. *
  24751. * @property {object} target - The target to tween.
  24752. * @property {string} key - The property of the target being tweened.
  24753. * @property {function} getEndValue - The returned value sets what the property will be at the END of the Tween.
  24754. * @property {function} getStartValue - The returned value sets what the property will be at the START of the Tween.
  24755. * @property {function} ease - The ease function this tween uses.
  24756. * @property {number} [duration=0] - Duration of the tween in ms/frames, excludes time for yoyo or repeats.
  24757. * @property {number} [totalDuration=0] - The total calculated duration of this TweenData (based on duration, repeat, delay and yoyo)
  24758. * @property {number} [delay=0] - Time in ms/frames before tween will start.
  24759. * @property {boolean} [yoyo=false] - Cause the tween to return back to its start value after hold has expired.
  24760. * @property {number} [hold=0] - Time in ms/frames the tween will pause before running the yoyo or starting a repeat.
  24761. * @property {integer} [repeat=0] - Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice.
  24762. * @property {number} [repeatDelay=0] - Time in ms/frames before the repeat will start.
  24763. * @property {boolean} [flipX=false] - Automatically call toggleFlipX when the TweenData yoyos or repeats
  24764. * @property {boolean} [flipY=false] - Automatically call toggleFlipY when the TweenData yoyos or repeats
  24765. * @property {number} [progress=0] - Between 0 and 1 showing completion of this TweenData.
  24766. * @property {number} [elapsed=0] - Delta counter
  24767. * @property {integer} [repeatCounter=0] - How many repeats are left to run?
  24768. * @property {number} [start=0] - Ease value data.
  24769. * @property {number} [current=0] - Ease value data.
  24770. * @property {number} [end=0] - Ease value data.
  24771. * @property {number} [t1=0] - Time duration 1.
  24772. * @property {number} [t2=0] - Time duration 2.
  24773. * @property {TweenDataGenConfig} [gen] - LoadValue generation functions.
  24774. * @property {integer} [state=0] - TWEEN_CONST.CREATED
  24775. */
  24776. /**
  24777. * Returns a TweenDataConfig object that describes the tween data for a unique property of a unique target. A single Tween consists of multiple TweenDatas, depending on how many properties are being changed by the Tween.
  24778. *
  24779. * This is an internal function used by the TweenBuilder and should not be accessed directly, instead, Tweens should be created using the GameObjectFactory or GameObjectCreator.
  24780. *
  24781. * @function Phaser.Tweens.TweenData
  24782. * @since 3.0.0
  24783. *
  24784. * @param {object} target - The target to tween.
  24785. * @param {string} key - The property of the target to tween.
  24786. * @param {function} getEnd - What the property will be at the END of the Tween.
  24787. * @param {function} getStart - What the property will be at the START of the Tween.
  24788. * @param {function} ease - The ease function this tween uses.
  24789. * @param {number} delay - Time in ms/frames before tween will start.
  24790. * @param {number} duration - Duration of the tween in ms/frames.
  24791. * @param {boolean} yoyo - Determines whether the tween should return back to its start value after hold has expired.
  24792. * @param {number} hold - Time in ms/frames the tween will pause before repeating or returning to its starting value if yoyo is set to true.
  24793. * @param {number} repeat - Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice.
  24794. * @param {number} repeatDelay - Time in ms/frames before the repeat will start.
  24795. * @param {boolean} flipX - Should toggleFlipX be called when yoyo or repeat happens?
  24796. * @param {boolean} flipY - Should toggleFlipY be called when yoyo or repeat happens?
  24797. *
  24798. * @return {TweenDataConfig} The config object describing this TweenData.
  24799. */
  24800. var TweenData = function (target, key, getEnd, getStart, ease, delay, duration, yoyo, hold, repeat, repeatDelay, flipX, flipY)
  24801. {
  24802. return {
  24803. // The target to tween
  24804. target: target,
  24805. // The property of the target to tween
  24806. key: key,
  24807. // The returned value sets what the property will be at the END of the Tween.
  24808. getEndValue: getEnd,
  24809. // The returned value sets what the property will be at the START of the Tween.
  24810. getStartValue: getStart,
  24811. // The ease function this tween uses.
  24812. ease: ease,
  24813. // Duration of the tween in ms/frames, excludes time for yoyo or repeats.
  24814. duration: 0,
  24815. // The total calculated duration of this TweenData (based on duration, repeat, delay and yoyo)
  24816. totalDuration: 0,
  24817. // Time in ms/frames before tween will start.
  24818. delay: 0,
  24819. // Cause the tween to return back to its start value after hold has expired.
  24820. yoyo: yoyo,
  24821. // Time in ms/frames the tween will pause before running the yoyo or starting a repeat.
  24822. hold: 0,
  24823. // Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice.
  24824. repeat: 0,
  24825. // Time in ms/frames before the repeat will start.
  24826. repeatDelay: 0,
  24827. // Automatically call toggleFlipX when the TweenData yoyos or repeats
  24828. flipX: flipX,
  24829. // Automatically call toggleFlipY when the TweenData yoyos or repeats
  24830. flipY: flipY,
  24831. // Between 0 and 1 showing completion of this TweenData.
  24832. progress: 0,
  24833. // Delta counter.
  24834. elapsed: 0,
  24835. // How many repeats are left to run?
  24836. repeatCounter: 0,
  24837. // Ease Value Data:
  24838. start: 0,
  24839. current: 0,
  24840. end: 0,
  24841. // Time Durations
  24842. t1: 0,
  24843. t2: 0,
  24844. // LoadValue generation functions
  24845. gen: {
  24846. delay: delay,
  24847. duration: duration,
  24848. hold: hold,
  24849. repeat: repeat,
  24850. repeatDelay: repeatDelay
  24851. },
  24852. // TWEEN_CONST.CREATED
  24853. state: 0
  24854. };
  24855. };
  24856. module.exports = TweenData;
  24857. /***/ }),
  24858. /* 140 */
  24859. /***/ (function(module, exports, __webpack_require__) {
  24860. /**
  24861. * @author Richard Davey <rich@photonstorm.com>
  24862. * @copyright 2019 Photon Storm Ltd.
  24863. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  24864. */
  24865. var Class = __webpack_require__(0);
  24866. var GameObjectCreator = __webpack_require__(14);
  24867. var GameObjectFactory = __webpack_require__(5);
  24868. var TWEEN_CONST = __webpack_require__(89);
  24869. /**
  24870. * @classdesc
  24871. * A Tween is able to manipulate the properties of one or more objects to any given value, based
  24872. * on a duration and type of ease. They are rarely instantiated directly and instead should be
  24873. * created via the TweenManager.
  24874. *
  24875. * @class Tween
  24876. * @memberof Phaser.Tweens
  24877. * @constructor
  24878. * @since 3.0.0
  24879. *
  24880. * @param {(Phaser.Tweens.TweenManager|Phaser.Tweens.Timeline)} parent - A reference to the parent of this Tween. Either the Tween Manager or a Tween Timeline instance.
  24881. * @param {Phaser.Tweens.TweenDataConfig[]} data - An array of TweenData objects, each containing a unique property to be tweened.
  24882. * @param {array} targets - An array of targets to be tweened.
  24883. */
  24884. var Tween = new Class({
  24885. initialize:
  24886. function Tween (parent, data, targets)
  24887. {
  24888. /**
  24889. * A reference to the parent of this Tween.
  24890. * Either the Tween Manager or a Tween Timeline instance.
  24891. *
  24892. * @name Phaser.Tweens.Tween#parent
  24893. * @type {(Phaser.Tweens.TweenManager|Phaser.Tweens.Timeline)}
  24894. * @since 3.0.0
  24895. */
  24896. this.parent = parent;
  24897. /**
  24898. * Is the parent of this Tween a Timeline?
  24899. *
  24900. * @name Phaser.Tweens.Tween#parentIsTimeline
  24901. * @type {boolean}
  24902. * @since 3.0.0
  24903. */
  24904. this.parentIsTimeline = parent.hasOwnProperty('isTimeline');
  24905. /**
  24906. * An array of TweenData objects, each containing a unique property and target being tweened.
  24907. *
  24908. * @name Phaser.Tweens.Tween#data
  24909. * @type {Phaser.Tweens.TweenDataConfig[]}
  24910. * @since 3.0.0
  24911. */
  24912. this.data = data;
  24913. /**
  24914. * The cached length of the data array.
  24915. *
  24916. * @name Phaser.Tweens.Tween#totalData
  24917. * @type {integer}
  24918. * @since 3.0.0
  24919. */
  24920. this.totalData = data.length;
  24921. /**
  24922. * An array of references to the target/s this Tween is operating on.
  24923. *
  24924. * @name Phaser.Tweens.Tween#targets
  24925. * @type {object[]}
  24926. * @since 3.0.0
  24927. */
  24928. this.targets = targets;
  24929. /**
  24930. * Cached target total (not necessarily the same as the data total)
  24931. *
  24932. * @name Phaser.Tweens.Tween#totalTargets
  24933. * @type {integer}
  24934. * @since 3.0.0
  24935. */
  24936. this.totalTargets = targets.length;
  24937. /**
  24938. * If `true` then duration, delay, etc values are all frame totals.
  24939. *
  24940. * @name Phaser.Tweens.Tween#useFrames
  24941. * @type {boolean}
  24942. * @default false
  24943. * @since 3.0.0
  24944. */
  24945. this.useFrames = false;
  24946. /**
  24947. * Scales the time applied to this Tween. A value of 1 runs in real-time. A value of 0.5 runs 50% slower, and so on.
  24948. * Value isn't used when calculating total duration of the tween, it's a run-time delta adjustment only.
  24949. *
  24950. * @name Phaser.Tweens.Tween#timeScale
  24951. * @type {number}
  24952. * @default 1
  24953. * @since 3.0.0
  24954. */
  24955. this.timeScale = 1;
  24956. /**
  24957. * Loop this tween? Can be -1 for an infinite loop, or an integer.
  24958. * When enabled it will play through ALL TweenDatas again. Use TweenData.repeat to loop a single element.
  24959. *
  24960. * @name Phaser.Tweens.Tween#loop
  24961. * @type {number}
  24962. * @default 0
  24963. * @since 3.0.0
  24964. */
  24965. this.loop = 0;
  24966. /**
  24967. * Time in ms/frames before the tween loops.
  24968. *
  24969. * @name Phaser.Tweens.Tween#loopDelay
  24970. * @type {number}
  24971. * @default 0
  24972. * @since 3.0.0
  24973. */
  24974. this.loopDelay = 0;
  24975. /**
  24976. * How many loops are left to run?
  24977. *
  24978. * @name Phaser.Tweens.Tween#loopCounter
  24979. * @type {number}
  24980. * @default 0
  24981. * @since 3.0.0
  24982. */
  24983. this.loopCounter = 0;
  24984. /**
  24985. * Time in ms/frames before the 'onComplete' event fires. This never fires if loop = -1 (as it never completes)
  24986. *
  24987. * @name Phaser.Tweens.Tween#completeDelay
  24988. * @type {number}
  24989. * @default 0
  24990. * @since 3.0.0
  24991. */
  24992. this.completeDelay = 0;
  24993. /**
  24994. * Countdown timer (used by timeline offset, loopDelay and completeDelay)
  24995. *
  24996. * @name Phaser.Tweens.Tween#countdown
  24997. * @type {number}
  24998. * @default 0
  24999. * @since 3.0.0
  25000. */
  25001. this.countdown = 0;
  25002. /**
  25003. * Set only if this Tween is part of a Timeline.
  25004. *
  25005. * @name Phaser.Tweens.Tween#offset
  25006. * @type {number}
  25007. * @default 0
  25008. * @since 3.0.0
  25009. */
  25010. this.offset = 0;
  25011. /**
  25012. * Set only if this Tween is part of a Timeline. The calculated offset amount.
  25013. *
  25014. * @name Phaser.Tweens.Tween#calculatedOffset
  25015. * @type {number}
  25016. * @default 0
  25017. * @since 3.0.0
  25018. */
  25019. this.calculatedOffset = 0;
  25020. /**
  25021. * The current state of the tween
  25022. *
  25023. * @name Phaser.Tweens.Tween#state
  25024. * @type {integer}
  25025. * @since 3.0.0
  25026. */
  25027. this.state = TWEEN_CONST.PENDING_ADD;
  25028. /**
  25029. * The state of the tween when it was paused (used by Resume)
  25030. *
  25031. * @name Phaser.Tweens.Tween#_pausedState
  25032. * @type {integer}
  25033. * @private
  25034. * @since 3.0.0
  25035. */
  25036. this._pausedState = TWEEN_CONST.PENDING_ADD;
  25037. /**
  25038. * Does the Tween start off paused? (if so it needs to be started with Tween.play)
  25039. *
  25040. * @name Phaser.Tweens.Tween#paused
  25041. * @type {boolean}
  25042. * @default false
  25043. * @since 3.0.0
  25044. */
  25045. this.paused = false;
  25046. /**
  25047. * Elapsed time in ms/frames of this run through the Tween.
  25048. *
  25049. * @name Phaser.Tweens.Tween#elapsed
  25050. * @type {number}
  25051. * @default 0
  25052. * @since 3.0.0
  25053. */
  25054. this.elapsed = 0;
  25055. /**
  25056. * Total elapsed time in ms/frames of the entire Tween, including looping.
  25057. *
  25058. * @name Phaser.Tweens.Tween#totalElapsed
  25059. * @type {number}
  25060. * @default 0
  25061. * @since 3.0.0
  25062. */
  25063. this.totalElapsed = 0;
  25064. /**
  25065. * Time in ms/frames for the whole Tween to play through once, excluding loop amounts and loop delays.
  25066. *
  25067. * @name Phaser.Tweens.Tween#duration
  25068. * @type {number}
  25069. * @default 0
  25070. * @since 3.0.0
  25071. */
  25072. this.duration = 0;
  25073. /**
  25074. * Value between 0 and 1. The amount through the Tween, excluding loops.
  25075. *
  25076. * @name Phaser.Tweens.Tween#progress
  25077. * @type {number}
  25078. * @default 0
  25079. * @since 3.0.0
  25080. */
  25081. this.progress = 0;
  25082. /**
  25083. * Time in ms/frames for the Tween to complete (including looping)
  25084. *
  25085. * @name Phaser.Tweens.Tween#totalDuration
  25086. * @type {number}
  25087. * @default 0
  25088. * @since 3.0.0
  25089. */
  25090. this.totalDuration = 0;
  25091. /**
  25092. * Value between 0 and 1. The amount through the entire Tween, including looping.
  25093. *
  25094. * @name Phaser.Tweens.Tween#totalProgress
  25095. * @type {number}
  25096. * @default 0
  25097. * @since 3.0.0
  25098. */
  25099. this.totalProgress = 0;
  25100. /**
  25101. * An object containing the various Tween callback references.
  25102. *
  25103. * @name Phaser.Tweens.Tween#callbacks
  25104. * @type {object}
  25105. * @default 0
  25106. * @since 3.0.0
  25107. */
  25108. this.callbacks = {
  25109. onComplete: null,
  25110. onLoop: null,
  25111. onRepeat: null,
  25112. onStart: null,
  25113. onUpdate: null,
  25114. onYoyo: null
  25115. };
  25116. this.callbackScope;
  25117. },
  25118. /**
  25119. * Returns the current value of the Tween.
  25120. *
  25121. * @method Phaser.Tweens.Tween#getValue
  25122. * @since 3.0.0
  25123. *
  25124. * @return {number} The value of the Tween.
  25125. */
  25126. getValue: function ()
  25127. {
  25128. return this.data[0].current;
  25129. },
  25130. /**
  25131. * Set the scale the time applied to this Tween. A value of 1 runs in real-time. A value of 0.5 runs 50% slower, and so on.
  25132. *
  25133. * @method Phaser.Tweens.Tween#setTimeScale
  25134. * @since 3.0.0
  25135. *
  25136. * @param {number} value - The scale factor for timescale.
  25137. *
  25138. * @return {this} - This Tween instance.
  25139. */
  25140. setTimeScale: function (value)
  25141. {
  25142. this.timeScale = value;
  25143. return this;
  25144. },
  25145. /**
  25146. * Returns the scale of the time applied to this Tween.
  25147. *
  25148. * @method Phaser.Tweens.Tween#getTimeScale
  25149. * @since 3.0.0
  25150. *
  25151. * @return {number} The timescale of this tween (between 0 and 1)
  25152. */
  25153. getTimeScale: function ()
  25154. {
  25155. return this.timeScale;
  25156. },
  25157. /**
  25158. * Checks if the Tween is currently active.
  25159. *
  25160. * @method Phaser.Tweens.Tween#isPlaying
  25161. * @since 3.0.0
  25162. *
  25163. * @return {boolean} `true` if the Tween is active, otherwise `false`.
  25164. */
  25165. isPlaying: function ()
  25166. {
  25167. return (this.state === TWEEN_CONST.ACTIVE);
  25168. },
  25169. /**
  25170. * Checks if the Tween is currently paused.
  25171. *
  25172. * @method Phaser.Tweens.Tween#isPaused
  25173. * @since 3.0.0
  25174. *
  25175. * @return {boolean} `true` if the Tween is paused, otherwise `false`.
  25176. */
  25177. isPaused: function ()
  25178. {
  25179. return (this.state === TWEEN_CONST.PAUSED);
  25180. },
  25181. /**
  25182. * See if this Tween is currently acting upon the given target.
  25183. *
  25184. * @method Phaser.Tweens.Tween#hasTarget
  25185. * @since 3.0.0
  25186. *
  25187. * @param {object} target - The target to check against this Tween.
  25188. *
  25189. * @return {boolean} `true` if the given target is a target of this Tween, otherwise `false`.
  25190. */
  25191. hasTarget: function (target)
  25192. {
  25193. return (this.targets.indexOf(target) !== -1);
  25194. },
  25195. /**
  25196. * Updates the value of a property of this Tween to a new value, without adjusting the
  25197. * Tween duration or current progress.
  25198. *
  25199. * You can optionally tell it to set the 'start' value to be the current value (before the change).
  25200. *
  25201. * @method Phaser.Tweens.Tween#updateTo
  25202. * @since 3.0.0
  25203. *
  25204. * @param {string} key - The property to set the new value for.
  25205. * @param {*} value - The new value of the property.
  25206. * @param {boolean} [startToCurrent=false] - Should this change set the start value to be the current value?
  25207. *
  25208. * @return {this} - This Tween instance.
  25209. */
  25210. updateTo: function (key, value, startToCurrent)
  25211. {
  25212. if (startToCurrent === undefined) { startToCurrent = false; }
  25213. for (var i = 0; i < this.totalData; i++)
  25214. {
  25215. var tweenData = this.data[i];
  25216. if (tweenData.key === key)
  25217. {
  25218. tweenData.end = value;
  25219. if (startToCurrent)
  25220. {
  25221. tweenData.start = tweenData.current;
  25222. }
  25223. break;
  25224. }
  25225. }
  25226. return this;
  25227. },
  25228. /**
  25229. * Restarts the tween from the beginning.
  25230. *
  25231. * @method Phaser.Tweens.Tween#restart
  25232. * @since 3.0.0
  25233. *
  25234. * @return {this} This Tween instance.
  25235. */
  25236. restart: function ()
  25237. {
  25238. if (this.state === TWEEN_CONST.REMOVED)
  25239. {
  25240. this.seek(0);
  25241. this.parent.makeActive(this);
  25242. }
  25243. else
  25244. {
  25245. this.stop();
  25246. this.play();
  25247. }
  25248. return this;
  25249. },
  25250. /**
  25251. * Internal method that calculates the overall duration of the Tween.
  25252. *
  25253. * @method Phaser.Tweens.Tween#calcDuration
  25254. * @since 3.0.0
  25255. */
  25256. calcDuration: function ()
  25257. {
  25258. var max = 0;
  25259. var data = this.data;
  25260. for (var i = 0; i < this.totalData; i++)
  25261. {
  25262. var tweenData = data[i];
  25263. // Set t1 (duration + hold + yoyo)
  25264. tweenData.t1 = tweenData.duration + tweenData.hold;
  25265. if (tweenData.yoyo)
  25266. {
  25267. tweenData.t1 += tweenData.duration;
  25268. }
  25269. // Set t2 (repeatDelay + duration + hold + yoyo)
  25270. tweenData.t2 = tweenData.t1 + tweenData.repeatDelay;
  25271. // Total Duration
  25272. tweenData.totalDuration = tweenData.delay + tweenData.t1;
  25273. if (tweenData.repeat === -1)
  25274. {
  25275. tweenData.totalDuration += (tweenData.t2 * 999999999999);
  25276. }
  25277. else if (tweenData.repeat > 0)
  25278. {
  25279. tweenData.totalDuration += (tweenData.t2 * tweenData.repeat);
  25280. }
  25281. if (tweenData.totalDuration > max)
  25282. {
  25283. // Get the longest TweenData from the Tween, used to calculate the Tween TD
  25284. max = tweenData.totalDuration;
  25285. }
  25286. }
  25287. // Excludes loop values
  25288. this.duration = max;
  25289. this.loopCounter = (this.loop === -1) ? 999999999999 : this.loop;
  25290. if (this.loopCounter > 0)
  25291. {
  25292. this.totalDuration = this.duration + this.completeDelay + ((this.duration + this.loopDelay) * this.loopCounter);
  25293. }
  25294. else
  25295. {
  25296. this.totalDuration = this.duration + this.completeDelay;
  25297. }
  25298. },
  25299. /**
  25300. * Called by TweenManager.preUpdate as part of its loop to check pending and active tweens.
  25301. * Should not be called directly.
  25302. *
  25303. * @method Phaser.Tweens.Tween#init
  25304. * @since 3.0.0
  25305. *
  25306. * @return {boolean} Returns `true` if this Tween should be moved from the pending list to the active list by the Tween Manager.
  25307. */
  25308. init: function ()
  25309. {
  25310. var data = this.data;
  25311. var totalTargets = this.totalTargets;
  25312. for (var i = 0; i < this.totalData; i++)
  25313. {
  25314. var tweenData = data[i];
  25315. var target = tweenData.target;
  25316. var gen = tweenData.gen;
  25317. tweenData.delay = gen.delay(i, totalTargets, target);
  25318. tweenData.duration = gen.duration(i, totalTargets, target);
  25319. tweenData.hold = gen.hold(i, totalTargets, target);
  25320. tweenData.repeat = gen.repeat(i, totalTargets, target);
  25321. tweenData.repeatDelay = gen.repeatDelay(i, totalTargets, target);
  25322. }
  25323. this.calcDuration();
  25324. this.progress = 0;
  25325. this.totalProgress = 0;
  25326. this.elapsed = 0;
  25327. this.totalElapsed = 0;
  25328. // You can't have a paused Tween if it's part of a Timeline
  25329. if (this.paused && !this.parentIsTimeline)
  25330. {
  25331. this.state = TWEEN_CONST.PENDING_ADD;
  25332. this._pausedState = TWEEN_CONST.INIT;
  25333. return false;
  25334. }
  25335. else
  25336. {
  25337. this.state = TWEEN_CONST.INIT;
  25338. return true;
  25339. }
  25340. },
  25341. /**
  25342. * Internal method that advances to the next state of the Tween during playback.
  25343. *
  25344. * @method Phaser.Tweens.Tween#nextState
  25345. * @since 3.0.0
  25346. */
  25347. nextState: function ()
  25348. {
  25349. if (this.loopCounter > 0)
  25350. {
  25351. this.elapsed = 0;
  25352. this.progress = 0;
  25353. this.loopCounter--;
  25354. var onLoop = this.callbacks.onLoop;
  25355. if (onLoop)
  25356. {
  25357. onLoop.params[1] = this.targets;
  25358. onLoop.func.apply(onLoop.scope, onLoop.params);
  25359. }
  25360. this.resetTweenData(true);
  25361. if (this.loopDelay > 0)
  25362. {
  25363. this.countdown = this.loopDelay;
  25364. this.state = TWEEN_CONST.LOOP_DELAY;
  25365. }
  25366. else
  25367. {
  25368. this.state = TWEEN_CONST.ACTIVE;
  25369. }
  25370. }
  25371. else if (this.completeDelay > 0)
  25372. {
  25373. this.countdown = this.completeDelay;
  25374. this.state = TWEEN_CONST.COMPLETE_DELAY;
  25375. }
  25376. else
  25377. {
  25378. var onComplete = this.callbacks.onComplete;
  25379. if (onComplete)
  25380. {
  25381. onComplete.params[1] = this.targets;
  25382. onComplete.func.apply(onComplete.scope, onComplete.params);
  25383. }
  25384. this.state = TWEEN_CONST.PENDING_REMOVE;
  25385. }
  25386. },
  25387. /**
  25388. * Pauses the Tween immediately. Use `resume` to continue playback.
  25389. *
  25390. * @method Phaser.Tweens.Tween#pause
  25391. * @since 3.0.0
  25392. *
  25393. * @return {this} - This Tween instance.
  25394. */
  25395. pause: function ()
  25396. {
  25397. if (this.state === TWEEN_CONST.PAUSED)
  25398. {
  25399. return;
  25400. }
  25401. this.paused = true;
  25402. this._pausedState = this.state;
  25403. this.state = TWEEN_CONST.PAUSED;
  25404. return this;
  25405. },
  25406. /**
  25407. * Starts a Tween playing.
  25408. *
  25409. * You only need to call this method if you have configured the tween to be paused on creation.
  25410. *
  25411. * @method Phaser.Tweens.Tween#play
  25412. * @since 3.0.0
  25413. *
  25414. * @param {boolean} resetFromTimeline - Is this Tween being played as part of a Timeline?
  25415. *
  25416. * @return {this} This Tween instance.
  25417. */
  25418. play: function (resetFromTimeline)
  25419. {
  25420. if (this.state === TWEEN_CONST.ACTIVE)
  25421. {
  25422. return this;
  25423. }
  25424. else if (this.state === TWEEN_CONST.PENDING_REMOVE || this.state === TWEEN_CONST.REMOVED)
  25425. {
  25426. this.init();
  25427. this.parent.makeActive(this);
  25428. resetFromTimeline = true;
  25429. }
  25430. var onStart = this.callbacks.onStart;
  25431. if (this.parentIsTimeline)
  25432. {
  25433. this.resetTweenData(resetFromTimeline);
  25434. if (this.calculatedOffset === 0)
  25435. {
  25436. if (onStart)
  25437. {
  25438. onStart.params[1] = this.targets;
  25439. onStart.func.apply(onStart.scope, onStart.params);
  25440. }
  25441. this.state = TWEEN_CONST.ACTIVE;
  25442. }
  25443. else
  25444. {
  25445. this.countdown = this.calculatedOffset;
  25446. this.state = TWEEN_CONST.OFFSET_DELAY;
  25447. }
  25448. }
  25449. else if (this.paused)
  25450. {
  25451. this.paused = false;
  25452. this.parent.makeActive(this);
  25453. }
  25454. else
  25455. {
  25456. this.resetTweenData(resetFromTimeline);
  25457. this.state = TWEEN_CONST.ACTIVE;
  25458. if (onStart)
  25459. {
  25460. onStart.params[1] = this.targets;
  25461. onStart.func.apply(onStart.scope, onStart.params);
  25462. }
  25463. this.parent.makeActive(this);
  25464. }
  25465. return this;
  25466. },
  25467. /**
  25468. * Internal method that resets all of the Tween Data, including the progress and elapsed values.
  25469. *
  25470. * @method Phaser.Tweens.Tween#resetTweenData
  25471. * @since 3.0.0
  25472. *
  25473. * @param {boolean} resetFromLoop - Has this method been called as part of a loop?
  25474. */
  25475. resetTweenData: function (resetFromLoop)
  25476. {
  25477. var data = this.data;
  25478. for (var i = 0; i < this.totalData; i++)
  25479. {
  25480. var tweenData = data[i];
  25481. tweenData.progress = 0;
  25482. tweenData.elapsed = 0;
  25483. tweenData.repeatCounter = (tweenData.repeat === -1) ? 999999999999 : tweenData.repeat;
  25484. if (resetFromLoop)
  25485. {
  25486. tweenData.start = tweenData.getStartValue(tweenData.target, tweenData.key, tweenData.start);
  25487. tweenData.end = tweenData.getEndValue(tweenData.target, tweenData.key, tweenData.end);
  25488. tweenData.current = tweenData.start;
  25489. tweenData.state = TWEEN_CONST.PLAYING_FORWARD;
  25490. }
  25491. else if (tweenData.delay > 0)
  25492. {
  25493. tweenData.elapsed = tweenData.delay;
  25494. tweenData.state = TWEEN_CONST.DELAY;
  25495. }
  25496. else
  25497. {
  25498. tweenData.state = TWEEN_CONST.PENDING_RENDER;
  25499. }
  25500. }
  25501. },
  25502. /**
  25503. * Resumes the playback of a previously paused Tween.
  25504. *
  25505. * @method Phaser.Tweens.Tween#resume
  25506. * @since 3.0.0
  25507. *
  25508. * @return {this} - This Tween instance.
  25509. */
  25510. resume: function ()
  25511. {
  25512. if (this.state === TWEEN_CONST.PAUSED)
  25513. {
  25514. this.paused = false;
  25515. this.state = this._pausedState;
  25516. }
  25517. else
  25518. {
  25519. this.play();
  25520. }
  25521. return this;
  25522. },
  25523. /**
  25524. * Attempts to seek to a specific position in a Tween.
  25525. *
  25526. * @method Phaser.Tweens.Tween#seek
  25527. * @since 3.0.0
  25528. *
  25529. * @param {number} toPosition - A value between 0 and 1 which represents the progress point to seek to.
  25530. *
  25531. * @return {this} This Tween instance.
  25532. */
  25533. seek: function (toPosition)
  25534. {
  25535. var data = this.data;
  25536. for (var i = 0; i < this.totalData; i++)
  25537. {
  25538. // This won't work with loop > 0 yet
  25539. var ms = this.totalDuration * toPosition;
  25540. var tweenData = data[i];
  25541. var progress = 0;
  25542. var elapsed = 0;
  25543. if (ms <= tweenData.delay)
  25544. {
  25545. progress = 0;
  25546. elapsed = 0;
  25547. }
  25548. else if (ms >= tweenData.totalDuration)
  25549. {
  25550. progress = 1;
  25551. elapsed = tweenData.duration;
  25552. }
  25553. else if (ms > tweenData.delay && ms <= tweenData.t1)
  25554. {
  25555. // Keep it zero bound
  25556. ms = Math.max(0, ms - tweenData.delay);
  25557. // Somewhere in the first playthru range
  25558. progress = ms / tweenData.t1;
  25559. elapsed = tweenData.duration * progress;
  25560. }
  25561. else if (ms > tweenData.t1 && ms < tweenData.totalDuration)
  25562. {
  25563. // Somewhere in repeat land
  25564. ms -= tweenData.delay;
  25565. ms -= tweenData.t1;
  25566. // var repeats = Math.floor(ms / tweenData.t2);
  25567. // remainder
  25568. ms = ((ms / tweenData.t2) % 1) * tweenData.t2;
  25569. if (ms > tweenData.repeatDelay)
  25570. {
  25571. progress = ms / tweenData.t1;
  25572. elapsed = tweenData.duration * progress;
  25573. }
  25574. }
  25575. tweenData.progress = progress;
  25576. tweenData.elapsed = elapsed;
  25577. var v = tweenData.ease(tweenData.progress);
  25578. tweenData.current = tweenData.start + ((tweenData.end - tweenData.start) * v);
  25579. tweenData.target[tweenData.key] = tweenData.current;
  25580. }
  25581. return this;
  25582. },
  25583. /**
  25584. * Sets an event based callback to be invoked during playback.
  25585. *
  25586. * @method Phaser.Tweens.Tween#setCallback
  25587. * @since 3.0.0
  25588. *
  25589. * @param {string} type - Type of the callback.
  25590. * @param {function} callback - Callback function.
  25591. * @param {array} [params] - An array of parameters for specified callbacks types.
  25592. * @param {object} [scope] - The context the callback will be invoked in.
  25593. *
  25594. * @return {this} This Tween instance.
  25595. */
  25596. setCallback: function (type, callback, params, scope)
  25597. {
  25598. this.callbacks[type] = { func: callback, scope: scope, params: params };
  25599. return this;
  25600. },
  25601. /**
  25602. * Flags the Tween as being complete, whatever stage of progress it is at.
  25603. *
  25604. * If an onComplete callback has been defined it will automatically invoke it, unless a `delay`
  25605. * argument is provided, in which case the Tween will delay for that period of time before calling the callback.
  25606. *
  25607. * If you don't need a delay, or have an onComplete callback, then call `Tween.stop` instead.
  25608. *
  25609. * @method Phaser.Tweens.Tween#complete
  25610. * @since 3.2.0
  25611. *
  25612. * @param {number} [delay=0] - The time to wait before invoking the complete callback. If zero it will fire immediately.
  25613. *
  25614. * @return {this} This Tween instance.
  25615. */
  25616. complete: function (delay)
  25617. {
  25618. if (delay === undefined) { delay = 0; }
  25619. if (delay)
  25620. {
  25621. this.countdown = delay;
  25622. this.state = TWEEN_CONST.COMPLETE_DELAY;
  25623. }
  25624. else
  25625. {
  25626. var onComplete = this.callbacks.onComplete;
  25627. if (onComplete)
  25628. {
  25629. onComplete.params[1] = this.targets;
  25630. onComplete.func.apply(onComplete.scope, onComplete.params);
  25631. }
  25632. this.state = TWEEN_CONST.PENDING_REMOVE;
  25633. }
  25634. return this;
  25635. },
  25636. /**
  25637. * Stops the Tween immediately, whatever stage of progress it is at and flags it for removal by the TweenManager.
  25638. *
  25639. * @method Phaser.Tweens.Tween#stop
  25640. * @since 3.0.0
  25641. *
  25642. * @param {number} [resetTo] - A value between 0 and 1.
  25643. *
  25644. * @return {this} This Tween instance.
  25645. */
  25646. stop: function (resetTo)
  25647. {
  25648. if (this.state === TWEEN_CONST.ACTIVE)
  25649. {
  25650. if (resetTo !== undefined)
  25651. {
  25652. this.seek(resetTo);
  25653. }
  25654. }
  25655. if (this.state !== TWEEN_CONST.REMOVED)
  25656. {
  25657. if (this.state === TWEEN_CONST.PAUSED || this.state === TWEEN_CONST.PENDING_ADD)
  25658. {
  25659. this.parent._destroy.push(this);
  25660. this.parent._toProcess++;
  25661. }
  25662. this.state = TWEEN_CONST.PENDING_REMOVE;
  25663. }
  25664. return this;
  25665. },
  25666. /**
  25667. * Internal method that advances the Tween based on the time values.
  25668. *
  25669. * @method Phaser.Tweens.Tween#update
  25670. * @since 3.0.0
  25671. *
  25672. * @param {number} timestamp - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  25673. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  25674. *
  25675. * @return {boolean} Returns `true` if this Tween has finished and should be removed from the Tween Manager, otherwise returns `false`.
  25676. */
  25677. update: function (timestamp, delta)
  25678. {
  25679. if (this.state === TWEEN_CONST.PAUSED)
  25680. {
  25681. return false;
  25682. }
  25683. if (this.useFrames)
  25684. {
  25685. delta = 1 * this.parent.timeScale;
  25686. }
  25687. delta *= this.timeScale;
  25688. this.elapsed += delta;
  25689. this.progress = Math.min(this.elapsed / this.duration, 1);
  25690. this.totalElapsed += delta;
  25691. this.totalProgress = Math.min(this.totalElapsed / this.totalDuration, 1);
  25692. switch (this.state)
  25693. {
  25694. case TWEEN_CONST.ACTIVE:
  25695. var stillRunning = false;
  25696. for (var i = 0; i < this.totalData; i++)
  25697. {
  25698. if (this.updateTweenData(this, this.data[i], delta))
  25699. {
  25700. stillRunning = true;
  25701. }
  25702. }
  25703. // Anything still running? If not, we're done
  25704. if (!stillRunning)
  25705. {
  25706. this.nextState();
  25707. }
  25708. break;
  25709. case TWEEN_CONST.LOOP_DELAY:
  25710. this.countdown -= delta;
  25711. if (this.countdown <= 0)
  25712. {
  25713. this.state = TWEEN_CONST.ACTIVE;
  25714. }
  25715. break;
  25716. case TWEEN_CONST.OFFSET_DELAY:
  25717. this.countdown -= delta;
  25718. if (this.countdown <= 0)
  25719. {
  25720. var onStart = this.callbacks.onStart;
  25721. if (onStart)
  25722. {
  25723. onStart.params[1] = this.targets;
  25724. onStart.func.apply(onStart.scope, onStart.params);
  25725. }
  25726. this.state = TWEEN_CONST.ACTIVE;
  25727. }
  25728. break;
  25729. case TWEEN_CONST.COMPLETE_DELAY:
  25730. this.countdown -= delta;
  25731. if (this.countdown <= 0)
  25732. {
  25733. var onComplete = this.callbacks.onComplete;
  25734. if (onComplete)
  25735. {
  25736. onComplete.func.apply(onComplete.scope, onComplete.params);
  25737. }
  25738. this.state = TWEEN_CONST.PENDING_REMOVE;
  25739. }
  25740. break;
  25741. }
  25742. return (this.state === TWEEN_CONST.PENDING_REMOVE);
  25743. },
  25744. /**
  25745. * Internal method used as part of the playback process that sets a tween to play in reverse.
  25746. *
  25747. * @method Phaser.Tweens.Tween#setStateFromEnd
  25748. * @since 3.0.0
  25749. *
  25750. * @param {Phaser.Tweens.Tween} tween - The Tween to update.
  25751. * @param {Phaser.Tweens.TweenDataConfig} tweenData - The TweenData property to update.
  25752. * @param {number} diff - Any extra time that needs to be accounted for in the elapsed and progress values.
  25753. *
  25754. * @return {integer} The state of this Tween.
  25755. */
  25756. setStateFromEnd: function (tween, tweenData, diff)
  25757. {
  25758. if (tweenData.yoyo)
  25759. {
  25760. // We've hit the end of a Playing Forward TweenData and we have a yoyo
  25761. // Account for any extra time we got from the previous frame
  25762. tweenData.elapsed = diff;
  25763. tweenData.progress = diff / tweenData.duration;
  25764. if (tweenData.flipX)
  25765. {
  25766. tweenData.target.toggleFlipX();
  25767. }
  25768. // Problem: The flip and callback and so on gets called for every TweenData that triggers it at the same time.
  25769. // If you're tweening several properties it can fire for all of them, at once.
  25770. if (tweenData.flipY)
  25771. {
  25772. tweenData.target.toggleFlipY();
  25773. }
  25774. var onYoyo = tween.callbacks.onYoyo;
  25775. if (onYoyo)
  25776. {
  25777. // Element 1 is reserved for the target of the yoyo (and needs setting here)
  25778. onYoyo.params[1] = tweenData.target;
  25779. onYoyo.func.apply(onYoyo.scope, onYoyo.params);
  25780. }
  25781. tweenData.start = tweenData.getStartValue(tweenData.target, tweenData.key, tweenData.start);
  25782. return TWEEN_CONST.PLAYING_BACKWARD;
  25783. }
  25784. else if (tweenData.repeatCounter > 0)
  25785. {
  25786. // We've hit the end of a Playing Forward TweenData and we have a Repeat.
  25787. // So we're going to go right back to the start to repeat it again.
  25788. tweenData.repeatCounter--;
  25789. // Account for any extra time we got from the previous frame
  25790. tweenData.elapsed = diff;
  25791. tweenData.progress = diff / tweenData.duration;
  25792. if (tweenData.flipX)
  25793. {
  25794. tweenData.target.toggleFlipX();
  25795. }
  25796. if (tweenData.flipY)
  25797. {
  25798. tweenData.target.toggleFlipY();
  25799. }
  25800. var onRepeat = tween.callbacks.onRepeat;
  25801. if (onRepeat)
  25802. {
  25803. // Element 1 is reserved for the target of the repeat (and needs setting here)
  25804. onRepeat.params[1] = tweenData.target;
  25805. onRepeat.func.apply(onRepeat.scope, onRepeat.params);
  25806. }
  25807. tweenData.start = tweenData.getStartValue(tweenData.target, tweenData.key, tweenData.start);
  25808. tweenData.end = tweenData.getEndValue(tweenData.target, tweenData.key, tweenData.start);
  25809. // Delay?
  25810. if (tweenData.repeatDelay > 0)
  25811. {
  25812. tweenData.elapsed = tweenData.repeatDelay - diff;
  25813. tweenData.current = tweenData.start;
  25814. tweenData.target[tweenData.key] = tweenData.current;
  25815. return TWEEN_CONST.REPEAT_DELAY;
  25816. }
  25817. else
  25818. {
  25819. return TWEEN_CONST.PLAYING_FORWARD;
  25820. }
  25821. }
  25822. return TWEEN_CONST.COMPLETE;
  25823. },
  25824. /**
  25825. * Internal method used as part of the playback process that sets a tween to play from the start.
  25826. *
  25827. * @method Phaser.Tweens.Tween#setStateFromStart
  25828. * @since 3.0.0
  25829. *
  25830. * @param {Phaser.Tweens.Tween} tween - The Tween to update.
  25831. * @param {Phaser.Tweens.TweenDataConfig} tweenData - The TweenData property to update.
  25832. * @param {number} diff - Any extra time that needs to be accounted for in the elapsed and progress values.
  25833. *
  25834. * @return {integer} The state of this Tween.
  25835. */
  25836. setStateFromStart: function (tween, tweenData, diff)
  25837. {
  25838. if (tweenData.repeatCounter > 0)
  25839. {
  25840. tweenData.repeatCounter--;
  25841. // Account for any extra time we got from the previous frame
  25842. tweenData.elapsed = diff;
  25843. tweenData.progress = diff / tweenData.duration;
  25844. if (tweenData.flipX)
  25845. {
  25846. tweenData.target.toggleFlipX();
  25847. }
  25848. if (tweenData.flipY)
  25849. {
  25850. tweenData.target.toggleFlipY();
  25851. }
  25852. var onRepeat = tween.callbacks.onRepeat;
  25853. if (onRepeat)
  25854. {
  25855. // Element 1 is reserved for the target of the repeat (and needs setting here)
  25856. onRepeat.params[1] = tweenData.target;
  25857. onRepeat.func.apply(onRepeat.scope, onRepeat.params);
  25858. }
  25859. tweenData.end = tweenData.getEndValue(tweenData.target, tweenData.key, tweenData.start);
  25860. // Delay?
  25861. if (tweenData.repeatDelay > 0)
  25862. {
  25863. tweenData.elapsed = tweenData.repeatDelay - diff;
  25864. tweenData.current = tweenData.start;
  25865. tweenData.target[tweenData.key] = tweenData.current;
  25866. return TWEEN_CONST.REPEAT_DELAY;
  25867. }
  25868. else
  25869. {
  25870. return TWEEN_CONST.PLAYING_FORWARD;
  25871. }
  25872. }
  25873. return TWEEN_CONST.COMPLETE;
  25874. },
  25875. /**
  25876. * Internal method that advances the TweenData based on the time value given.
  25877. *
  25878. * @method Phaser.Tweens.Tween#updateTweenData
  25879. * @since 3.0.0
  25880. *
  25881. * @param {Phaser.Tweens.Tween} tween - The Tween to update.
  25882. * @param {Phaser.Tweens.TweenDataConfig} tweenData - The TweenData property to update.
  25883. * @param {number} delta - Either a value in ms, or 1 if Tween.useFrames is true
  25884. *
  25885. * @return {boolean} [description]
  25886. */
  25887. updateTweenData: function (tween, tweenData, delta)
  25888. {
  25889. switch (tweenData.state)
  25890. {
  25891. case TWEEN_CONST.PLAYING_FORWARD:
  25892. case TWEEN_CONST.PLAYING_BACKWARD:
  25893. if (!tweenData.target)
  25894. {
  25895. tweenData.state = TWEEN_CONST.COMPLETE;
  25896. break;
  25897. }
  25898. var elapsed = tweenData.elapsed;
  25899. var duration = tweenData.duration;
  25900. var diff = 0;
  25901. elapsed += delta;
  25902. if (elapsed > duration)
  25903. {
  25904. diff = elapsed - duration;
  25905. elapsed = duration;
  25906. }
  25907. var forward = (tweenData.state === TWEEN_CONST.PLAYING_FORWARD);
  25908. var progress = elapsed / duration;
  25909. var v;
  25910. if (forward)
  25911. {
  25912. v = tweenData.ease(progress);
  25913. }
  25914. else
  25915. {
  25916. v = tweenData.ease(1 - progress);
  25917. }
  25918. tweenData.current = tweenData.start + ((tweenData.end - tweenData.start) * v);
  25919. tweenData.target[tweenData.key] = tweenData.current;
  25920. tweenData.elapsed = elapsed;
  25921. tweenData.progress = progress;
  25922. var onUpdate = tween.callbacks.onUpdate;
  25923. if (onUpdate)
  25924. {
  25925. onUpdate.params[1] = tweenData.target;
  25926. onUpdate.func.apply(onUpdate.scope, onUpdate.params);
  25927. }
  25928. if (progress === 1)
  25929. {
  25930. if (forward)
  25931. {
  25932. if (tweenData.hold > 0)
  25933. {
  25934. tweenData.elapsed = tweenData.hold - diff;
  25935. tweenData.state = TWEEN_CONST.HOLD_DELAY;
  25936. }
  25937. else
  25938. {
  25939. tweenData.state = this.setStateFromEnd(tween, tweenData, diff);
  25940. }
  25941. }
  25942. else
  25943. {
  25944. tweenData.state = this.setStateFromStart(tween, tweenData, diff);
  25945. }
  25946. }
  25947. break;
  25948. case TWEEN_CONST.DELAY:
  25949. tweenData.elapsed -= delta;
  25950. if (tweenData.elapsed <= 0)
  25951. {
  25952. tweenData.elapsed = Math.abs(tweenData.elapsed);
  25953. tweenData.state = TWEEN_CONST.PENDING_RENDER;
  25954. }
  25955. break;
  25956. case TWEEN_CONST.REPEAT_DELAY:
  25957. tweenData.elapsed -= delta;
  25958. if (tweenData.elapsed <= 0)
  25959. {
  25960. tweenData.elapsed = Math.abs(tweenData.elapsed);
  25961. tweenData.state = TWEEN_CONST.PLAYING_FORWARD;
  25962. }
  25963. break;
  25964. case TWEEN_CONST.HOLD_DELAY:
  25965. tweenData.elapsed -= delta;
  25966. if (tweenData.elapsed <= 0)
  25967. {
  25968. tweenData.state = this.setStateFromEnd(tween, tweenData, Math.abs(tweenData.elapsed));
  25969. }
  25970. break;
  25971. case TWEEN_CONST.PENDING_RENDER:
  25972. if (tweenData.target)
  25973. {
  25974. tweenData.start = tweenData.getStartValue(tweenData.target, tweenData.key, tweenData.target[tweenData.key]);
  25975. tweenData.end = tweenData.getEndValue(tweenData.target, tweenData.key, tweenData.start);
  25976. tweenData.current = tweenData.start;
  25977. tweenData.target[tweenData.key] = tweenData.start;
  25978. tweenData.state = TWEEN_CONST.PLAYING_FORWARD;
  25979. }
  25980. else
  25981. {
  25982. tweenData.state = TWEEN_CONST.COMPLETE;
  25983. }
  25984. break;
  25985. }
  25986. // Return TRUE if this TweenData still playing, otherwise return FALSE
  25987. return (tweenData.state !== TWEEN_CONST.COMPLETE);
  25988. }
  25989. });
  25990. Tween.TYPES = [
  25991. 'onComplete',
  25992. 'onLoop',
  25993. 'onRepeat',
  25994. 'onStart',
  25995. 'onUpdate',
  25996. 'onYoyo'
  25997. ];
  25998. /**
  25999. * Creates a new Tween object.
  26000. *
  26001. * Note: This method will only be available Tweens have been built into Phaser.
  26002. *
  26003. * @method Phaser.GameObjects.GameObjectFactory#tween
  26004. * @since 3.0.0
  26005. *
  26006. * @param {object} config - The Tween configuration.
  26007. *
  26008. * @return {Phaser.Tweens.Tween} The Tween that was created.
  26009. */
  26010. GameObjectFactory.register('tween', function (config)
  26011. {
  26012. return this.scene.sys.tweens.add(config);
  26013. });
  26014. // When registering a factory function 'this' refers to the GameObjectFactory context.
  26015. //
  26016. // There are several properties available to use:
  26017. //
  26018. // this.scene - a reference to the Scene that owns the GameObjectFactory
  26019. // this.displayList - a reference to the Display List the Scene owns
  26020. // this.updateList - a reference to the Update List the Scene owns
  26021. /**
  26022. * Creates a new Tween object and returns it.
  26023. *
  26024. * Note: This method will only be available if Tweens have been built into Phaser.
  26025. *
  26026. * @method Phaser.GameObjects.GameObjectCreator#tween
  26027. * @since 3.0.0
  26028. *
  26029. * @param {object} config - The Tween configuration.
  26030. *
  26031. * @return {Phaser.Tweens.Tween} The Tween that was created.
  26032. */
  26033. GameObjectCreator.register('tween', function (config)
  26034. {
  26035. return this.scene.sys.tweens.create(config);
  26036. });
  26037. // When registering a factory function 'this' refers to the GameObjectCreator context.
  26038. module.exports = Tween;
  26039. /***/ }),
  26040. /* 141 */
  26041. /***/ (function(module, exports) {
  26042. /**
  26043. * @author Richard Davey <rich@photonstorm.com>
  26044. * @copyright 2019 Photon Storm Ltd.
  26045. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26046. */
  26047. /**
  26048. * @typedef {object} Phaser.Tweens.TweenConfigDefaults
  26049. *
  26050. * @property {(object|object[])} targets - The object, or an array of objects, to run the tween on.
  26051. * @property {number} [delay=0] - The number of milliseconds to delay before the tween will start.
  26052. * @property {number} [duration=1000] - The duration of the tween in milliseconds.
  26053. * @property {string} [ease='Power0'] - The easing equation to use for the tween.
  26054. * @property {array} [easeParams] - Optional easing parameters.
  26055. * @property {number} [hold=0] - The number of milliseconds to hold the tween for before yoyo'ing.
  26056. * @property {number} [repeat=0] - The number of times to repeat the tween.
  26057. * @property {number} [repeatDelay=0] - The number of milliseconds to pause before a tween will repeat.
  26058. * @property {boolean} [yoyo=false] - Should the tween complete, then reverse the values incrementally to get back to the starting tween values? The reverse tweening will also take `duration` milliseconds to complete.
  26059. * @property {boolean} [flipX=false] - Horizontally flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipX` property.
  26060. * @property {boolean} [flipY=false] - Vertically flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipY` property.
  26061. */
  26062. var TWEEN_DEFAULTS = {
  26063. targets: null,
  26064. delay: 0,
  26065. duration: 1000,
  26066. ease: 'Power0',
  26067. easeParams: null,
  26068. hold: 0,
  26069. repeat: 0,
  26070. repeatDelay: 0,
  26071. yoyo: false,
  26072. flipX: false,
  26073. flipY: false
  26074. };
  26075. module.exports = TWEEN_DEFAULTS;
  26076. /***/ }),
  26077. /* 142 */
  26078. /***/ (function(module, exports) {
  26079. /**
  26080. * @author Richard Davey <rich@photonstorm.com>
  26081. * @copyright 2019 Photon Storm Ltd.
  26082. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26083. */
  26084. function hasGetStart (def)
  26085. {
  26086. return (!!def.getStart && typeof def.getStart === 'function');
  26087. }
  26088. function hasGetEnd (def)
  26089. {
  26090. return (!!def.getEnd && typeof def.getEnd === 'function');
  26091. }
  26092. function hasGetters (def)
  26093. {
  26094. return hasGetStart(def) || hasGetEnd(def);
  26095. }
  26096. /**
  26097. * Returns `getStart` and `getEnd` functions for a Tween's Data based on a target property and end value.
  26098. *
  26099. * If the end value is a number, it will be treated as an absolute value and the property will be tweened to it. A string can be provided to specify a relative end value which consists of an operation (`+=` to add to the current value, `-=` to subtract from the current value, `*=` to multiply the current value, or `/=` to divide the current value) followed by its operand. A function can be provided to allow greater control over the end value; it will receive the target object being tweened, the name of the property being tweened, and the current value of the property as its arguments. If both the starting and the ending values need to be controlled, an object with `getStart` and `getEnd` callbacks, which will receive the same arguments, can be provided instead. If an object with a `value` property is provided, the property will be used as the effective value under the same rules described here.
  26100. *
  26101. * @function Phaser.Tweens.Builders.GetValueOp
  26102. * @since 3.0.0
  26103. *
  26104. * @param {string} key - The name of the property to modify.
  26105. * @param {*} propertyValue - The ending value of the property, as described above.
  26106. *
  26107. * @return {function} An array of two functions, `getStart` and `getEnd`, which return the starting and the ending value of the property based on the provided value.
  26108. */
  26109. var GetValueOp = function (key, propertyValue)
  26110. {
  26111. var callbacks;
  26112. // The returned value sets what the property will be at the END of the Tween (usually called at the start of the Tween)
  26113. var getEnd = function (target, key, value) { return value; };
  26114. // The returned value sets what the property will be at the START of the Tween (usually called at the end of the Tween)
  26115. var getStart = function (target, key, value) { return value; };
  26116. var t = typeof(propertyValue);
  26117. if (t === 'number')
  26118. {
  26119. // props: {
  26120. // x: 400,
  26121. // y: 300
  26122. // }
  26123. getEnd = function ()
  26124. {
  26125. return propertyValue;
  26126. };
  26127. }
  26128. else if (t === 'string')
  26129. {
  26130. // props: {
  26131. // x: '+=400',
  26132. // y: '-=300',
  26133. // z: '*=2',
  26134. // w: '/=2'
  26135. // }
  26136. var op = propertyValue[0];
  26137. var num = parseFloat(propertyValue.substr(2));
  26138. switch (op)
  26139. {
  26140. case '+':
  26141. getEnd = function (target, key, value)
  26142. {
  26143. return value + num;
  26144. };
  26145. break;
  26146. case '-':
  26147. getEnd = function (target, key, value)
  26148. {
  26149. return value - num;
  26150. };
  26151. break;
  26152. case '*':
  26153. getEnd = function (target, key, value)
  26154. {
  26155. return value * num;
  26156. };
  26157. break;
  26158. case '/':
  26159. getEnd = function (target, key, value)
  26160. {
  26161. return value / num;
  26162. };
  26163. break;
  26164. default:
  26165. getEnd = function ()
  26166. {
  26167. return parseFloat(propertyValue);
  26168. };
  26169. }
  26170. }
  26171. else if (t === 'function')
  26172. {
  26173. // The same as setting just the getEnd function and no getStart
  26174. // props: {
  26175. // x: function (target, key, value) { return value + 50); },
  26176. // }
  26177. getEnd = propertyValue;
  26178. }
  26179. else if (t === 'object' && hasGetters(propertyValue))
  26180. {
  26181. /*
  26182. x: {
  26183. // Called at the start of the Tween. The returned value sets what the property will be at the END of the Tween.
  26184. getEnd: function (target, key, value)
  26185. {
  26186. return value;
  26187. },
  26188. // Called at the end of the Tween. The returned value sets what the property will be at the START of the Tween.
  26189. getStart: function (target, key, value)
  26190. {
  26191. return value;
  26192. }
  26193. }
  26194. */
  26195. if (hasGetEnd(propertyValue))
  26196. {
  26197. getEnd = propertyValue.getEnd;
  26198. }
  26199. if (hasGetStart(propertyValue))
  26200. {
  26201. getStart = propertyValue.getStart;
  26202. }
  26203. }
  26204. else if (propertyValue.hasOwnProperty('value'))
  26205. {
  26206. // Value may still be a string, function or a number
  26207. // props: {
  26208. // x: { value: 400, ... },
  26209. // y: { value: 300, ... }
  26210. // }
  26211. callbacks = GetValueOp(key, propertyValue.value);
  26212. }
  26213. // If callback not set by the else if block above then set it here and return it
  26214. if (!callbacks)
  26215. {
  26216. callbacks = {
  26217. getEnd: getEnd,
  26218. getStart: getStart
  26219. };
  26220. }
  26221. return callbacks;
  26222. };
  26223. module.exports = GetValueOp;
  26224. /***/ }),
  26225. /* 143 */
  26226. /***/ (function(module, exports, __webpack_require__) {
  26227. /**
  26228. * @author Richard Davey <rich@photonstorm.com>
  26229. * @copyright 2019 Photon Storm Ltd.
  26230. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26231. */
  26232. var GetValue = __webpack_require__(4);
  26233. /**
  26234. * Extracts an array of targets from a Tween configuration object.
  26235. *
  26236. * The targets will be looked for in a `targets` property. If it's a function, its return value will be used as the result.
  26237. *
  26238. * @function Phaser.Tweens.Builders.GetTargets
  26239. * @since 3.0.0
  26240. *
  26241. * @param {object} config - The configuration object to use.
  26242. *
  26243. * @return {array} An array of targets (may contain only one element), or `null` if no targets were specified.
  26244. */
  26245. var GetTargets = function (config)
  26246. {
  26247. var targets = GetValue(config, 'targets', null);
  26248. if (targets === null)
  26249. {
  26250. return targets;
  26251. }
  26252. if (typeof targets === 'function')
  26253. {
  26254. targets = targets.call();
  26255. }
  26256. if (!Array.isArray(targets))
  26257. {
  26258. targets = [ targets ];
  26259. }
  26260. return targets;
  26261. };
  26262. module.exports = GetTargets;
  26263. /***/ }),
  26264. /* 144 */
  26265. /***/ (function(module, exports, __webpack_require__) {
  26266. /**
  26267. * @author Richard Davey <rich@photonstorm.com>
  26268. * @copyright 2019 Photon Storm Ltd.
  26269. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26270. */
  26271. var Formats = __webpack_require__(31);
  26272. var MapData = __webpack_require__(83);
  26273. var Parse = __webpack_require__(233);
  26274. var Tilemap = __webpack_require__(225);
  26275. /**
  26276. * Create a Tilemap from the given key or data. If neither is given, make a blank Tilemap. When
  26277. * loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing from
  26278. * a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map data. For
  26279. * an empty map, you should specify tileWidth, tileHeight, width & height.
  26280. *
  26281. * @function Phaser.Tilemaps.ParseToTilemap
  26282. * @since 3.0.0
  26283. *
  26284. * @param {Phaser.Scene} scene - The Scene to which this Tilemap belongs.
  26285. * @param {string} [key] - The key in the Phaser cache that corresponds to the loaded tilemap data.
  26286. * @param {integer} [tileWidth=32] - The width of a tile in pixels.
  26287. * @param {integer} [tileHeight=32] - The height of a tile in pixels.
  26288. * @param {integer} [width=10] - The width of the map in tiles.
  26289. * @param {integer} [height=10] - The height of the map in tiles.
  26290. * @param {integer[][]} [data] - Instead of loading from the cache, you can also load directly from
  26291. * a 2D array of tile indexes.
  26292. * @param {boolean} [insertNull=false] - Controls how empty tiles, tiles with an index of -1, in the
  26293. * map data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  26294. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  26295. * the tile data doesn't need to change then setting this value to `true` will help with memory
  26296. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  26297. * the default value set.
  26298. *
  26299. * @return {Phaser.Tilemaps.Tilemap}
  26300. */
  26301. var ParseToTilemap = function (scene, key, tileWidth, tileHeight, width, height, data, insertNull)
  26302. {
  26303. if (tileWidth === undefined) { tileWidth = 32; }
  26304. if (tileHeight === undefined) { tileHeight = 32; }
  26305. if (width === undefined) { width = 10; }
  26306. if (height === undefined) { height = 10; }
  26307. if (insertNull === undefined) { insertNull = false; }
  26308. var mapData = null;
  26309. if (Array.isArray(data))
  26310. {
  26311. var name = key !== undefined ? key : 'map';
  26312. mapData = Parse(name, Formats.ARRAY_2D, data, tileWidth, tileHeight, insertNull);
  26313. }
  26314. else if (key !== undefined)
  26315. {
  26316. var tilemapData = scene.cache.tilemap.get(key);
  26317. if (!tilemapData)
  26318. {
  26319. console.warn('No map data found for key ' + key);
  26320. }
  26321. else
  26322. {
  26323. mapData = Parse(key, tilemapData.format, tilemapData.data, tileWidth, tileHeight, insertNull);
  26324. }
  26325. }
  26326. if (mapData === null)
  26327. {
  26328. mapData = new MapData({
  26329. tileWidth: tileWidth,
  26330. tileHeight: tileHeight,
  26331. width: width,
  26332. height: height
  26333. });
  26334. }
  26335. return new Tilemap(scene, mapData);
  26336. };
  26337. module.exports = ParseToTilemap;
  26338. /***/ }),
  26339. /* 145 */
  26340. /***/ (function(module, exports, __webpack_require__) {
  26341. /**
  26342. * @author Richard Davey <rich@photonstorm.com>
  26343. * @copyright 2019 Photon Storm Ltd.
  26344. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26345. */
  26346. var Formats = __webpack_require__(31);
  26347. var LayerData = __webpack_require__(84);
  26348. var MapData = __webpack_require__(83);
  26349. var Tile = __webpack_require__(61);
  26350. /**
  26351. * Parses a 2D array of tile indexes into a new MapData object with a single layer.
  26352. *
  26353. * @function Phaser.Tilemaps.Parsers.Parse2DArray
  26354. * @since 3.0.0
  26355. *
  26356. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  26357. * @param {integer[][]} data - 2D array, CSV string or Tiled JSON object.
  26358. * @param {integer} tileWidth - The width of a tile in pixels.
  26359. * @param {integer} tileHeight - The height of a tile in pixels.
  26360. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  26361. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  26362. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  26363. * the tile data doesn't need to change then setting this value to `true` will help with memory
  26364. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  26365. * the default value set.
  26366. *
  26367. * @return {Phaser.Tilemaps.MapData} [description]
  26368. */
  26369. var Parse2DArray = function (name, data, tileWidth, tileHeight, insertNull)
  26370. {
  26371. var layerData = new LayerData({
  26372. tileWidth: tileWidth,
  26373. tileHeight: tileHeight
  26374. });
  26375. var mapData = new MapData({
  26376. name: name,
  26377. tileWidth: tileWidth,
  26378. tileHeight: tileHeight,
  26379. format: Formats.ARRAY_2D,
  26380. layers: [ layerData ]
  26381. });
  26382. var tiles = [];
  26383. var height = data.length;
  26384. var width = 0;
  26385. for (var y = 0; y < data.length; y++)
  26386. {
  26387. tiles[y] = [];
  26388. var row = data[y];
  26389. for (var x = 0; x < row.length; x++)
  26390. {
  26391. var tileIndex = parseInt(row[x], 10);
  26392. if (isNaN(tileIndex) || tileIndex === -1)
  26393. {
  26394. tiles[y][x] = insertNull
  26395. ? null
  26396. : new Tile(layerData, -1, x, y, tileWidth, tileHeight);
  26397. }
  26398. else
  26399. {
  26400. tiles[y][x] = new Tile(layerData, tileIndex, x, y, tileWidth, tileHeight);
  26401. }
  26402. }
  26403. if (width === 0)
  26404. {
  26405. width = row.length;
  26406. }
  26407. }
  26408. mapData.width = layerData.width = width;
  26409. mapData.height = layerData.height = height;
  26410. mapData.widthInPixels = layerData.widthInPixels = width * tileWidth;
  26411. mapData.heightInPixels = layerData.heightInPixels = height * tileHeight;
  26412. layerData.data = tiles;
  26413. return mapData;
  26414. };
  26415. module.exports = Parse2DArray;
  26416. /***/ }),
  26417. /* 146 */
  26418. /***/ (function(module, exports) {
  26419. /**
  26420. * @author Richard Davey <rich@photonstorm.com>
  26421. * @copyright 2019 Photon Storm Ltd.
  26422. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26423. */
  26424. /**
  26425. * Internally used method to keep track of the tile indexes that collide within a layer. This
  26426. * updates LayerData.collideIndexes to either contain or not contain the given `tileIndex`.
  26427. *
  26428. * @function Phaser.Tilemaps.Components.SetLayerCollisionIndex
  26429. * @private
  26430. * @since 3.0.0
  26431. *
  26432. * @param {integer} tileIndex - The tile index to set the collision boolean for.
  26433. * @param {boolean} [collides=true] - Should the tile index collide or not?
  26434. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  26435. */
  26436. var SetLayerCollisionIndex = function (tileIndex, collides, layer)
  26437. {
  26438. var loc = layer.collideIndexes.indexOf(tileIndex);
  26439. if (collides && loc === -1)
  26440. {
  26441. layer.collideIndexes.push(tileIndex);
  26442. }
  26443. else if (!collides && loc !== -1)
  26444. {
  26445. layer.collideIndexes.splice(loc, 1);
  26446. }
  26447. };
  26448. module.exports = SetLayerCollisionIndex;
  26449. /***/ }),
  26450. /* 147 */
  26451. /***/ (function(module, exports, __webpack_require__) {
  26452. /**
  26453. * @author Richard Davey <rich@photonstorm.com>
  26454. * @copyright 2019 Photon Storm Ltd.
  26455. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26456. */
  26457. var Tile = __webpack_require__(61);
  26458. var IsInLayerBounds = __webpack_require__(85);
  26459. var CalculateFacesAt = __webpack_require__(148);
  26460. var SetTileCollision = __webpack_require__(62);
  26461. /**
  26462. * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index
  26463. * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified
  26464. * location. If you pass in an index, only the index at the specified location will be changed.
  26465. * Collision information will be recalculated at the specified location.
  26466. *
  26467. * @function Phaser.Tilemaps.Components.PutTileAt
  26468. * @private
  26469. * @since 3.0.0
  26470. *
  26471. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  26472. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  26473. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  26474. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  26475. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  26476. *
  26477. * @return {Phaser.Tilemaps.Tile} The Tile object that was created or added to this map.
  26478. */
  26479. var PutTileAt = function (tile, tileX, tileY, recalculateFaces, layer)
  26480. {
  26481. if (!IsInLayerBounds(tileX, tileY, layer)) { return null; }
  26482. if (recalculateFaces === undefined) { recalculateFaces = true; }
  26483. var oldTile = layer.data[tileY][tileX];
  26484. var oldTileCollides = oldTile && oldTile.collides;
  26485. if (tile instanceof Tile)
  26486. {
  26487. if (layer.data[tileY][tileX] === null)
  26488. {
  26489. layer.data[tileY][tileX] = new Tile(layer, tile.index, tileX, tileY, tile.width, tile.height);
  26490. }
  26491. layer.data[tileY][tileX].copy(tile);
  26492. }
  26493. else
  26494. {
  26495. var index = tile;
  26496. if (layer.data[tileY][tileX] === null)
  26497. {
  26498. layer.data[tileY][tileX] = new Tile(layer, index, tileX, tileY, layer.tileWidth, layer.tileHeight);
  26499. }
  26500. else
  26501. {
  26502. layer.data[tileY][tileX].index = index;
  26503. }
  26504. }
  26505. // Updating colliding flag on the new tile
  26506. var newTile = layer.data[tileY][tileX];
  26507. var collides = layer.collideIndexes.indexOf(newTile.index) !== -1;
  26508. SetTileCollision(newTile, collides);
  26509. // Recalculate faces only if the colliding flag at (tileX, tileY) has changed
  26510. if (recalculateFaces && (oldTileCollides !== newTile.collides))
  26511. {
  26512. CalculateFacesAt(tileX, tileY, layer);
  26513. }
  26514. return newTile;
  26515. };
  26516. module.exports = PutTileAt;
  26517. /***/ }),
  26518. /* 148 */
  26519. /***/ (function(module, exports, __webpack_require__) {
  26520. /**
  26521. * @author Richard Davey <rich@photonstorm.com>
  26522. * @copyright 2019 Photon Storm Ltd.
  26523. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26524. */
  26525. var GetTileAt = __webpack_require__(109);
  26526. /**
  26527. * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting
  26528. * faces are used internally for optimizing collisions against tiles. This method is mostly used
  26529. * internally to optimize recalculating faces when only one tile has been changed.
  26530. *
  26531. * @function Phaser.Tilemaps.Components.CalculateFacesAt
  26532. * @private
  26533. * @since 3.0.0
  26534. *
  26535. * @param {integer} tileX - The x coordinate.
  26536. * @param {integer} tileY - The y coordinate.
  26537. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  26538. */
  26539. var CalculateFacesAt = function (tileX, tileY, layer)
  26540. {
  26541. var tile = GetTileAt(tileX, tileY, true, layer);
  26542. var above = GetTileAt(tileX, tileY - 1, true, layer);
  26543. var below = GetTileAt(tileX, tileY + 1, true, layer);
  26544. var left = GetTileAt(tileX - 1, tileY, true, layer);
  26545. var right = GetTileAt(tileX + 1, tileY, true, layer);
  26546. var tileCollides = tile && tile.collides;
  26547. // Assume the changed tile has all interesting edges
  26548. if (tileCollides)
  26549. {
  26550. tile.faceTop = true;
  26551. tile.faceBottom = true;
  26552. tile.faceLeft = true;
  26553. tile.faceRight = true;
  26554. }
  26555. // Reset edges that are shared between tile and its neighbors
  26556. if (above && above.collides)
  26557. {
  26558. if (tileCollides) { tile.faceTop = false; }
  26559. above.faceBottom = !tileCollides;
  26560. }
  26561. if (below && below.collides)
  26562. {
  26563. if (tileCollides) { tile.faceBottom = false; }
  26564. below.faceTop = !tileCollides;
  26565. }
  26566. if (left && left.collides)
  26567. {
  26568. if (tileCollides) { tile.faceLeft = false; }
  26569. left.faceRight = !tileCollides;
  26570. }
  26571. if (right && right.collides)
  26572. {
  26573. if (tileCollides) { tile.faceRight = false; }
  26574. right.faceLeft = !tileCollides;
  26575. }
  26576. if (tile && !tile.collides) { tile.resetFaces(); }
  26577. return tile;
  26578. };
  26579. module.exports = CalculateFacesAt;
  26580. /***/ }),
  26581. /* 149 */
  26582. /***/ (function(module, exports, __webpack_require__) {
  26583. /**
  26584. * The `Matter.Composite` module contains methods for creating and manipulating composite bodies.
  26585. * A composite body is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`, therefore composites form a tree structure.
  26586. * It is important to use the functions in this module to modify composites, rather than directly modifying their properties.
  26587. * Note that the `Matter.World` object is also a type of `Matter.Composite` and as such all composite methods here can also operate on a `Matter.World`.
  26588. *
  26589. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  26590. *
  26591. * @class Composite
  26592. */
  26593. var Composite = {};
  26594. module.exports = Composite;
  26595. var Events = __webpack_require__(210);
  26596. var Common = __webpack_require__(36);
  26597. var Bounds = __webpack_require__(86);
  26598. var Body = __webpack_require__(72);
  26599. (function() {
  26600. /**
  26601. * Creates a new composite. The options parameter is an object that specifies any properties you wish to override the defaults.
  26602. * See the properites section below for detailed information on what you can pass via the `options` object.
  26603. * @method create
  26604. * @param {} [options]
  26605. * @return {composite} A new composite
  26606. */
  26607. Composite.create = function(options) {
  26608. return Common.extend({
  26609. id: Common.nextId(),
  26610. type: 'composite',
  26611. parent: null,
  26612. isModified: false,
  26613. bodies: [],
  26614. constraints: [],
  26615. composites: [],
  26616. label: 'Composite',
  26617. plugin: {}
  26618. }, options);
  26619. };
  26620. /**
  26621. * Sets the composite's `isModified` flag.
  26622. * If `updateParents` is true, all parents will be set (default: false).
  26623. * If `updateChildren` is true, all children will be set (default: false).
  26624. * @method setModified
  26625. * @param {composite} composite
  26626. * @param {boolean} isModified
  26627. * @param {boolean} [updateParents=false]
  26628. * @param {boolean} [updateChildren=false]
  26629. */
  26630. Composite.setModified = function(composite, isModified, updateParents, updateChildren) {
  26631. composite.isModified = isModified;
  26632. if (updateParents && composite.parent) {
  26633. Composite.setModified(composite.parent, isModified, updateParents, updateChildren);
  26634. }
  26635. if (updateChildren) {
  26636. for(var i = 0; i < composite.composites.length; i++) {
  26637. var childComposite = composite.composites[i];
  26638. Composite.setModified(childComposite, isModified, updateParents, updateChildren);
  26639. }
  26640. }
  26641. };
  26642. /**
  26643. * Generic add function. Adds one or many body(s), constraint(s) or a composite(s) to the given composite.
  26644. * Triggers `beforeAdd` and `afterAdd` events on the `composite`.
  26645. * @method add
  26646. * @param {composite} composite
  26647. * @param {} object
  26648. * @return {composite} The original composite with the objects added
  26649. */
  26650. Composite.add = function(composite, object) {
  26651. var objects = [].concat(object);
  26652. Events.trigger(composite, 'beforeAdd', { object: object });
  26653. for (var i = 0; i < objects.length; i++) {
  26654. var obj = objects[i];
  26655. switch (obj.type) {
  26656. case 'body':
  26657. // skip adding compound parts
  26658. if (obj.parent !== obj) {
  26659. Common.warn('Composite.add: skipped adding a compound body part (you must add its parent instead)');
  26660. break;
  26661. }
  26662. Composite.addBody(composite, obj);
  26663. break;
  26664. case 'constraint':
  26665. Composite.addConstraint(composite, obj);
  26666. break;
  26667. case 'composite':
  26668. Composite.addComposite(composite, obj);
  26669. break;
  26670. case 'mouseConstraint':
  26671. Composite.addConstraint(composite, obj.constraint);
  26672. break;
  26673. }
  26674. }
  26675. Events.trigger(composite, 'afterAdd', { object: object });
  26676. return composite;
  26677. };
  26678. /**
  26679. * Generic remove function. Removes one or many body(s), constraint(s) or a composite(s) to the given composite.
  26680. * Optionally searching its children recursively.
  26681. * Triggers `beforeRemove` and `afterRemove` events on the `composite`.
  26682. * @method remove
  26683. * @param {composite} composite
  26684. * @param {} object
  26685. * @param {boolean} [deep=false]
  26686. * @return {composite} The original composite with the objects removed
  26687. */
  26688. Composite.remove = function(composite, object, deep) {
  26689. var objects = [].concat(object);
  26690. Events.trigger(composite, 'beforeRemove', { object: object });
  26691. for (var i = 0; i < objects.length; i++) {
  26692. var obj = objects[i];
  26693. switch (obj.type) {
  26694. case 'body':
  26695. Composite.removeBody(composite, obj, deep);
  26696. break;
  26697. case 'constraint':
  26698. Composite.removeConstraint(composite, obj, deep);
  26699. break;
  26700. case 'composite':
  26701. Composite.removeComposite(composite, obj, deep);
  26702. break;
  26703. case 'mouseConstraint':
  26704. Composite.removeConstraint(composite, obj.constraint);
  26705. break;
  26706. }
  26707. }
  26708. Events.trigger(composite, 'afterRemove', { object: object });
  26709. return composite;
  26710. };
  26711. /**
  26712. * Adds a composite to the given composite.
  26713. * @private
  26714. * @method addComposite
  26715. * @param {composite} compositeA
  26716. * @param {composite} compositeB
  26717. * @return {composite} The original compositeA with the objects from compositeB added
  26718. */
  26719. Composite.addComposite = function(compositeA, compositeB) {
  26720. compositeA.composites.push(compositeB);
  26721. compositeB.parent = compositeA;
  26722. Composite.setModified(compositeA, true, true, false);
  26723. return compositeA;
  26724. };
  26725. /**
  26726. * Removes a composite from the given composite, and optionally searching its children recursively.
  26727. * @private
  26728. * @method removeComposite
  26729. * @param {composite} compositeA
  26730. * @param {composite} compositeB
  26731. * @param {boolean} [deep=false]
  26732. * @return {composite} The original compositeA with the composite removed
  26733. */
  26734. Composite.removeComposite = function(compositeA, compositeB, deep) {
  26735. var position = compositeA.composites.indexOf(compositeB);
  26736. if (position !== -1) {
  26737. Composite.removeCompositeAt(compositeA, position);
  26738. Composite.setModified(compositeA, true, true, false);
  26739. }
  26740. if (deep) {
  26741. for (var i = 0; i < compositeA.composites.length; i++){
  26742. Composite.removeComposite(compositeA.composites[i], compositeB, true);
  26743. }
  26744. }
  26745. return compositeA;
  26746. };
  26747. /**
  26748. * Removes a composite from the given composite.
  26749. * @private
  26750. * @method removeCompositeAt
  26751. * @param {composite} composite
  26752. * @param {number} position
  26753. * @return {composite} The original composite with the composite removed
  26754. */
  26755. Composite.removeCompositeAt = function(composite, position) {
  26756. composite.composites.splice(position, 1);
  26757. Composite.setModified(composite, true, true, false);
  26758. return composite;
  26759. };
  26760. /**
  26761. * Adds a body to the given composite.
  26762. * @private
  26763. * @method addBody
  26764. * @param {composite} composite
  26765. * @param {body} body
  26766. * @return {composite} The original composite with the body added
  26767. */
  26768. Composite.addBody = function(composite, body) {
  26769. composite.bodies.push(body);
  26770. Composite.setModified(composite, true, true, false);
  26771. return composite;
  26772. };
  26773. /**
  26774. * Removes a body from the given composite, and optionally searching its children recursively.
  26775. * @private
  26776. * @method removeBody
  26777. * @param {composite} composite
  26778. * @param {body} body
  26779. * @param {boolean} [deep=false]
  26780. * @return {composite} The original composite with the body removed
  26781. */
  26782. Composite.removeBody = function(composite, body, deep) {
  26783. var position = composite.bodies.indexOf(body);
  26784. if (position !== -1) {
  26785. Composite.removeBodyAt(composite, position);
  26786. Composite.setModified(composite, true, true, false);
  26787. }
  26788. if (deep) {
  26789. for (var i = 0; i < composite.composites.length; i++){
  26790. Composite.removeBody(composite.composites[i], body, true);
  26791. }
  26792. }
  26793. return composite;
  26794. };
  26795. /**
  26796. * Removes a body from the given composite.
  26797. * @private
  26798. * @method removeBodyAt
  26799. * @param {composite} composite
  26800. * @param {number} position
  26801. * @return {composite} The original composite with the body removed
  26802. */
  26803. Composite.removeBodyAt = function(composite, position) {
  26804. composite.bodies.splice(position, 1);
  26805. Composite.setModified(composite, true, true, false);
  26806. return composite;
  26807. };
  26808. /**
  26809. * Adds a constraint to the given composite.
  26810. * @private
  26811. * @method addConstraint
  26812. * @param {composite} composite
  26813. * @param {constraint} constraint
  26814. * @return {composite} The original composite with the constraint added
  26815. */
  26816. Composite.addConstraint = function(composite, constraint) {
  26817. composite.constraints.push(constraint);
  26818. Composite.setModified(composite, true, true, false);
  26819. return composite;
  26820. };
  26821. /**
  26822. * Removes a constraint from the given composite, and optionally searching its children recursively.
  26823. * @private
  26824. * @method removeConstraint
  26825. * @param {composite} composite
  26826. * @param {constraint} constraint
  26827. * @param {boolean} [deep=false]
  26828. * @return {composite} The original composite with the constraint removed
  26829. */
  26830. Composite.removeConstraint = function(composite, constraint, deep) {
  26831. var position = composite.constraints.indexOf(constraint);
  26832. if (position !== -1) {
  26833. Composite.removeConstraintAt(composite, position);
  26834. }
  26835. if (deep) {
  26836. for (var i = 0; i < composite.composites.length; i++){
  26837. Composite.removeConstraint(composite.composites[i], constraint, true);
  26838. }
  26839. }
  26840. return composite;
  26841. };
  26842. /**
  26843. * Removes a body from the given composite.
  26844. * @private
  26845. * @method removeConstraintAt
  26846. * @param {composite} composite
  26847. * @param {number} position
  26848. * @return {composite} The original composite with the constraint removed
  26849. */
  26850. Composite.removeConstraintAt = function(composite, position) {
  26851. composite.constraints.splice(position, 1);
  26852. Composite.setModified(composite, true, true, false);
  26853. return composite;
  26854. };
  26855. /**
  26856. * Removes all bodies, constraints and composites from the given composite.
  26857. * Optionally clearing its children recursively.
  26858. * @method clear
  26859. * @param {composite} composite
  26860. * @param {boolean} keepStatic
  26861. * @param {boolean} [deep=false]
  26862. */
  26863. Composite.clear = function(composite, keepStatic, deep) {
  26864. if (deep) {
  26865. for (var i = 0; i < composite.composites.length; i++){
  26866. Composite.clear(composite.composites[i], keepStatic, true);
  26867. }
  26868. }
  26869. if (keepStatic) {
  26870. composite.bodies = composite.bodies.filter(function(body) { return body.isStatic; });
  26871. } else {
  26872. composite.bodies.length = 0;
  26873. }
  26874. composite.constraints.length = 0;
  26875. composite.composites.length = 0;
  26876. Composite.setModified(composite, true, true, false);
  26877. return composite;
  26878. };
  26879. /**
  26880. * Returns all bodies in the given composite, including all bodies in its children, recursively.
  26881. * @method allBodies
  26882. * @param {composite} composite
  26883. * @return {body[]} All the bodies
  26884. */
  26885. Composite.allBodies = function(composite) {
  26886. var bodies = [].concat(composite.bodies);
  26887. for (var i = 0; i < composite.composites.length; i++)
  26888. bodies = bodies.concat(Composite.allBodies(composite.composites[i]));
  26889. return bodies;
  26890. };
  26891. /**
  26892. * Returns all constraints in the given composite, including all constraints in its children, recursively.
  26893. * @method allConstraints
  26894. * @param {composite} composite
  26895. * @return {constraint[]} All the constraints
  26896. */
  26897. Composite.allConstraints = function(composite) {
  26898. var constraints = [].concat(composite.constraints);
  26899. for (var i = 0; i < composite.composites.length; i++)
  26900. constraints = constraints.concat(Composite.allConstraints(composite.composites[i]));
  26901. return constraints;
  26902. };
  26903. /**
  26904. * Returns all composites in the given composite, including all composites in its children, recursively.
  26905. * @method allComposites
  26906. * @param {composite} composite
  26907. * @return {composite[]} All the composites
  26908. */
  26909. Composite.allComposites = function(composite) {
  26910. var composites = [].concat(composite.composites);
  26911. for (var i = 0; i < composite.composites.length; i++)
  26912. composites = composites.concat(Composite.allComposites(composite.composites[i]));
  26913. return composites;
  26914. };
  26915. /**
  26916. * Searches the composite recursively for an object matching the type and id supplied, null if not found.
  26917. * @method get
  26918. * @param {composite} composite
  26919. * @param {number} id
  26920. * @param {string} type
  26921. * @return {object} The requested object, if found
  26922. */
  26923. Composite.get = function(composite, id, type) {
  26924. var objects,
  26925. object;
  26926. switch (type) {
  26927. case 'body':
  26928. objects = Composite.allBodies(composite);
  26929. break;
  26930. case 'constraint':
  26931. objects = Composite.allConstraints(composite);
  26932. break;
  26933. case 'composite':
  26934. objects = Composite.allComposites(composite).concat(composite);
  26935. break;
  26936. }
  26937. if (!objects)
  26938. return null;
  26939. object = objects.filter(function(object) {
  26940. return object.id.toString() === id.toString();
  26941. });
  26942. return object.length === 0 ? null : object[0];
  26943. };
  26944. /**
  26945. * Moves the given object(s) from compositeA to compositeB (equal to a remove followed by an add).
  26946. * @method move
  26947. * @param {compositeA} compositeA
  26948. * @param {object[]} objects
  26949. * @param {compositeB} compositeB
  26950. * @return {composite} Returns compositeA
  26951. */
  26952. Composite.move = function(compositeA, objects, compositeB) {
  26953. Composite.remove(compositeA, objects);
  26954. Composite.add(compositeB, objects);
  26955. return compositeA;
  26956. };
  26957. /**
  26958. * Assigns new ids for all objects in the composite, recursively.
  26959. * @method rebase
  26960. * @param {composite} composite
  26961. * @return {composite} Returns composite
  26962. */
  26963. Composite.rebase = function(composite) {
  26964. var objects = Composite.allBodies(composite)
  26965. .concat(Composite.allConstraints(composite))
  26966. .concat(Composite.allComposites(composite));
  26967. for (var i = 0; i < objects.length; i++) {
  26968. objects[i].id = Common.nextId();
  26969. }
  26970. Composite.setModified(composite, true, true, false);
  26971. return composite;
  26972. };
  26973. /**
  26974. * Translates all children in the composite by a given vector relative to their current positions,
  26975. * without imparting any velocity.
  26976. * @method translate
  26977. * @param {composite} composite
  26978. * @param {vector} translation
  26979. * @param {bool} [recursive=true]
  26980. */
  26981. Composite.translate = function(composite, translation, recursive) {
  26982. var bodies = recursive ? Composite.allBodies(composite) : composite.bodies;
  26983. for (var i = 0; i < bodies.length; i++) {
  26984. Body.translate(bodies[i], translation);
  26985. }
  26986. Composite.setModified(composite, true, true, false);
  26987. return composite;
  26988. };
  26989. /**
  26990. * Rotates all children in the composite by a given angle about the given point, without imparting any angular velocity.
  26991. * @method rotate
  26992. * @param {composite} composite
  26993. * @param {number} rotation
  26994. * @param {vector} point
  26995. * @param {bool} [recursive=true]
  26996. */
  26997. Composite.rotate = function(composite, rotation, point, recursive) {
  26998. var cos = Math.cos(rotation),
  26999. sin = Math.sin(rotation),
  27000. bodies = recursive ? Composite.allBodies(composite) : composite.bodies;
  27001. for (var i = 0; i < bodies.length; i++) {
  27002. var body = bodies[i],
  27003. dx = body.position.x - point.x,
  27004. dy = body.position.y - point.y;
  27005. Body.setPosition(body, {
  27006. x: point.x + (dx * cos - dy * sin),
  27007. y: point.y + (dx * sin + dy * cos)
  27008. });
  27009. Body.rotate(body, rotation);
  27010. }
  27011. Composite.setModified(composite, true, true, false);
  27012. return composite;
  27013. };
  27014. /**
  27015. * Scales all children in the composite, including updating physical properties (mass, area, axes, inertia), from a world-space point.
  27016. * @method scale
  27017. * @param {composite} composite
  27018. * @param {number} scaleX
  27019. * @param {number} scaleY
  27020. * @param {vector} point
  27021. * @param {bool} [recursive=true]
  27022. */
  27023. Composite.scale = function(composite, scaleX, scaleY, point, recursive) {
  27024. var bodies = recursive ? Composite.allBodies(composite) : composite.bodies;
  27025. for (var i = 0; i < bodies.length; i++) {
  27026. var body = bodies[i],
  27027. dx = body.position.x - point.x,
  27028. dy = body.position.y - point.y;
  27029. Body.setPosition(body, {
  27030. x: point.x + dx * scaleX,
  27031. y: point.y + dy * scaleY
  27032. });
  27033. Body.scale(body, scaleX, scaleY);
  27034. }
  27035. Composite.setModified(composite, true, true, false);
  27036. return composite;
  27037. };
  27038. /**
  27039. * Returns the union of the bounds of all of the composite's bodies.
  27040. * @method bounds
  27041. * @param {composite} composite The composite.
  27042. * @returns {bounds} The composite bounds.
  27043. */
  27044. Composite.bounds = function(composite) {
  27045. var bodies = Composite.allBodies(composite),
  27046. vertices = [];
  27047. for (var i = 0; i < bodies.length; i += 1) {
  27048. var body = bodies[i];
  27049. vertices.push(body.bounds.min, body.bounds.max);
  27050. }
  27051. return Bounds.create(vertices);
  27052. };
  27053. /*
  27054. *
  27055. * Events Documentation
  27056. *
  27057. */
  27058. /**
  27059. * Fired when a call to `Composite.add` is made, before objects have been added.
  27060. *
  27061. * @event beforeAdd
  27062. * @param {} event An event object
  27063. * @param {} event.object The object(s) to be added (may be a single body, constraint, composite or a mixed array of these)
  27064. * @param {} event.source The source object of the event
  27065. * @param {} event.name The name of the event
  27066. */
  27067. /**
  27068. * Fired when a call to `Composite.add` is made, after objects have been added.
  27069. *
  27070. * @event afterAdd
  27071. * @param {} event An event object
  27072. * @param {} event.object The object(s) that have been added (may be a single body, constraint, composite or a mixed array of these)
  27073. * @param {} event.source The source object of the event
  27074. * @param {} event.name The name of the event
  27075. */
  27076. /**
  27077. * Fired when a call to `Composite.remove` is made, before objects have been removed.
  27078. *
  27079. * @event beforeRemove
  27080. * @param {} event An event object
  27081. * @param {} event.object The object(s) to be removed (may be a single body, constraint, composite or a mixed array of these)
  27082. * @param {} event.source The source object of the event
  27083. * @param {} event.name The name of the event
  27084. */
  27085. /**
  27086. * Fired when a call to `Composite.remove` is made, after objects have been removed.
  27087. *
  27088. * @event afterRemove
  27089. * @param {} event An event object
  27090. * @param {} event.object The object(s) that have been removed (may be a single body, constraint, composite or a mixed array of these)
  27091. * @param {} event.source The source object of the event
  27092. * @param {} event.name The name of the event
  27093. */
  27094. /*
  27095. *
  27096. * Properties Documentation
  27097. *
  27098. */
  27099. /**
  27100. * An integer `Number` uniquely identifying number generated in `Composite.create` by `Common.nextId`.
  27101. *
  27102. * @property id
  27103. * @type number
  27104. */
  27105. /**
  27106. * A `String` denoting the type of object.
  27107. *
  27108. * @property type
  27109. * @type string
  27110. * @default "composite"
  27111. * @readOnly
  27112. */
  27113. /**
  27114. * An arbitrary `String` name to help the user identify and manage composites.
  27115. *
  27116. * @property label
  27117. * @type string
  27118. * @default "Composite"
  27119. */
  27120. /**
  27121. * A flag that specifies whether the composite has been modified during the current step.
  27122. * Most `Matter.Composite` methods will automatically set this flag to `true` to inform the engine of changes to be handled.
  27123. * If you need to change it manually, you should use the `Composite.setModified` method.
  27124. *
  27125. * @property isModified
  27126. * @type boolean
  27127. * @default false
  27128. */
  27129. /**
  27130. * The `Composite` that is the parent of this composite. It is automatically managed by the `Matter.Composite` methods.
  27131. *
  27132. * @property parent
  27133. * @type composite
  27134. * @default null
  27135. */
  27136. /**
  27137. * An array of `Body` that are _direct_ children of this composite.
  27138. * To add or remove bodies you should use `Composite.add` and `Composite.remove` methods rather than directly modifying this property.
  27139. * If you wish to recursively find all descendants, you should use the `Composite.allBodies` method.
  27140. *
  27141. * @property bodies
  27142. * @type body[]
  27143. * @default []
  27144. */
  27145. /**
  27146. * An array of `Constraint` that are _direct_ children of this composite.
  27147. * To add or remove constraints you should use `Composite.add` and `Composite.remove` methods rather than directly modifying this property.
  27148. * If you wish to recursively find all descendants, you should use the `Composite.allConstraints` method.
  27149. *
  27150. * @property constraints
  27151. * @type constraint[]
  27152. * @default []
  27153. */
  27154. /**
  27155. * An array of `Composite` that are _direct_ children of this composite.
  27156. * To add or remove composites you should use `Composite.add` and `Composite.remove` methods rather than directly modifying this property.
  27157. * If you wish to recursively find all descendants, you should use the `Composite.allComposites` method.
  27158. *
  27159. * @property composites
  27160. * @type composite[]
  27161. * @default []
  27162. */
  27163. /**
  27164. * An object reserved for storing plugin-specific properties.
  27165. *
  27166. * @property plugin
  27167. * @type {}
  27168. */
  27169. })();
  27170. /***/ }),
  27171. /* 150 */
  27172. /***/ (function(module, exports, __webpack_require__) {
  27173. /**
  27174. * @author Richard Davey <rich@photonstorm.com>
  27175. * @copyright 2019 Photon Storm Ltd.
  27176. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27177. */
  27178. var Class = __webpack_require__(0);
  27179. var CONST = __webpack_require__(15);
  27180. var File = __webpack_require__(22);
  27181. var FileTypesManager = __webpack_require__(7);
  27182. var GetFastValue = __webpack_require__(2);
  27183. var IsPlainObject = __webpack_require__(8);
  27184. var ParseXML = __webpack_require__(344);
  27185. /**
  27186. * @typedef {object} Phaser.Loader.FileTypes.XMLFileConfig
  27187. *
  27188. * @property {string} key - The key of the file. Must be unique within both the Loader and the Text Cache.
  27189. * @property {string} [url] - The absolute or relative URL to load the file from.
  27190. * @property {string} [extension='xml'] - The default file extension to use if no url is provided.
  27191. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  27192. */
  27193. /**
  27194. * @classdesc
  27195. * A single XML File suitable for loading by the Loader.
  27196. *
  27197. * These are created when you use the Phaser.Loader.LoaderPlugin#xml method and are not typically created directly.
  27198. *
  27199. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#xml.
  27200. *
  27201. * @class XMLFile
  27202. * @extends Phaser.Loader.File
  27203. * @memberof Phaser.Loader.FileTypes
  27204. * @constructor
  27205. * @since 3.0.0
  27206. *
  27207. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  27208. * @param {(string|Phaser.Loader.FileTypes.XMLFileConfig)} key - The key to use for this file, or a file configuration object.
  27209. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml".
  27210. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  27211. */
  27212. var XMLFile = new Class({
  27213. Extends: File,
  27214. initialize:
  27215. function XMLFile (loader, key, url, xhrSettings)
  27216. {
  27217. var extension = 'xml';
  27218. if (IsPlainObject(key))
  27219. {
  27220. var config = key;
  27221. key = GetFastValue(config, 'key');
  27222. url = GetFastValue(config, 'url');
  27223. xhrSettings = GetFastValue(config, 'xhrSettings');
  27224. extension = GetFastValue(config, 'extension', extension);
  27225. }
  27226. var fileConfig = {
  27227. type: 'xml',
  27228. cache: loader.cacheManager.xml,
  27229. extension: extension,
  27230. responseType: 'text',
  27231. key: key,
  27232. url: url,
  27233. xhrSettings: xhrSettings
  27234. };
  27235. File.call(this, loader, fileConfig);
  27236. },
  27237. /**
  27238. * Called automatically by Loader.nextFile.
  27239. * This method controls what extra work this File does with its loaded data.
  27240. *
  27241. * @method Phaser.Loader.FileTypes.XMLFile#onProcess
  27242. * @since 3.7.0
  27243. */
  27244. onProcess: function ()
  27245. {
  27246. this.state = CONST.FILE_PROCESSING;
  27247. this.data = ParseXML(this.xhrLoader.responseText);
  27248. if (this.data)
  27249. {
  27250. this.onProcessComplete();
  27251. }
  27252. else
  27253. {
  27254. console.warn('Invalid XMLFile: ' + this.key);
  27255. this.onProcessError();
  27256. }
  27257. }
  27258. });
  27259. /**
  27260. * Adds an XML file, or array of XML files, to the current load queue.
  27261. *
  27262. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  27263. *
  27264. * ```javascript
  27265. * function preload ()
  27266. * {
  27267. * this.load.xml('wavedata', 'files/AlienWaveData.xml');
  27268. * }
  27269. * ```
  27270. *
  27271. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  27272. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  27273. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  27274. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  27275. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  27276. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  27277. * loaded.
  27278. *
  27279. * The key must be a unique String. It is used to add the file to the global XML Cache upon a successful load.
  27280. * The key should be unique both in terms of files being loaded and files already present in the XML Cache.
  27281. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  27282. * then remove it from the XML Cache first, before loading a new one.
  27283. *
  27284. * Instead of passing arguments you can pass a configuration object, such as:
  27285. *
  27286. * ```javascript
  27287. * this.load.xml({
  27288. * key: 'wavedata',
  27289. * url: 'files/AlienWaveData.xml'
  27290. * });
  27291. * ```
  27292. *
  27293. * See the documentation for `Phaser.Loader.FileTypes.XMLFileConfig` for more details.
  27294. *
  27295. * Once the file has finished loading you can access it from its Cache using its key:
  27296. *
  27297. * ```javascript
  27298. * this.load.xml('wavedata', 'files/AlienWaveData.xml');
  27299. * // and later in your game ...
  27300. * var data = this.cache.xml.get('wavedata');
  27301. * ```
  27302. *
  27303. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  27304. * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and
  27305. * this is what you would use to retrieve the text from the XML Cache.
  27306. *
  27307. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  27308. *
  27309. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data"
  27310. * and no URL is given then the Loader will set the URL to be "data.xml". It will always add `.xml` as the extension, although
  27311. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  27312. *
  27313. * Note: The ability to load this type of file will only be available if the XML File type has been built into Phaser.
  27314. * It is available in the default build but can be excluded from custom builds.
  27315. *
  27316. * @method Phaser.Loader.LoaderPlugin#xml
  27317. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  27318. * @since 3.0.0
  27319. *
  27320. * @param {(string|Phaser.Loader.FileTypes.XMLFileConfig|Phaser.Loader.FileTypes.XMLFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  27321. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml".
  27322. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  27323. *
  27324. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  27325. */
  27326. FileTypesManager.register('xml', function (key, url, xhrSettings)
  27327. {
  27328. if (Array.isArray(key))
  27329. {
  27330. for (var i = 0; i < key.length; i++)
  27331. {
  27332. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  27333. this.addFile(new XMLFile(this, key[i]));
  27334. }
  27335. }
  27336. else
  27337. {
  27338. this.addFile(new XMLFile(this, key, url, xhrSettings));
  27339. }
  27340. return this;
  27341. });
  27342. module.exports = XMLFile;
  27343. /***/ }),
  27344. /* 151 */
  27345. /***/ (function(module, exports, __webpack_require__) {
  27346. /**
  27347. * @author Richard Davey <rich@photonstorm.com>
  27348. * @copyright 2019 Photon Storm Ltd.
  27349. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27350. */
  27351. var Extend = __webpack_require__(19);
  27352. var XHRSettings = __webpack_require__(112);
  27353. /**
  27354. * Takes two XHRSettings Objects and creates a new XHRSettings object from them.
  27355. *
  27356. * The new object is seeded by the values given in the global settings, but any setting in
  27357. * the local object overrides the global ones.
  27358. *
  27359. * @function Phaser.Loader.MergeXHRSettings
  27360. * @since 3.0.0
  27361. *
  27362. * @param {XHRSettingsObject} global - The global XHRSettings object.
  27363. * @param {XHRSettingsObject} local - The local XHRSettings object.
  27364. *
  27365. * @return {XHRSettingsObject} A newly formed XHRSettings object.
  27366. */
  27367. var MergeXHRSettings = function (global, local)
  27368. {
  27369. var output = (global === undefined) ? XHRSettings() : Extend({}, global);
  27370. if (local)
  27371. {
  27372. for (var setting in local)
  27373. {
  27374. if (local[setting] !== undefined)
  27375. {
  27376. output[setting] = local[setting];
  27377. }
  27378. }
  27379. }
  27380. return output;
  27381. };
  27382. module.exports = MergeXHRSettings;
  27383. /***/ }),
  27384. /* 152 */
  27385. /***/ (function(module, exports) {
  27386. /**
  27387. * @author Richard Davey <rich@photonstorm.com>
  27388. * @copyright 2019 Photon Storm Ltd.
  27389. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27390. */
  27391. /**
  27392. * Given a File and a baseURL value this returns the URL the File will use to download from.
  27393. *
  27394. * @function Phaser.Loader.GetURL
  27395. * @since 3.0.0
  27396. *
  27397. * @param {Phaser.Loader.File} file - The File object.
  27398. * @param {string} baseURL - A default base URL.
  27399. *
  27400. * @return {string} The URL the File will use.
  27401. */
  27402. var GetURL = function (file, baseURL)
  27403. {
  27404. if (!file.url)
  27405. {
  27406. return false;
  27407. }
  27408. if (file.url.match(/^(?:blob:|data:|http:\/\/|https:\/\/|\/\/)/))
  27409. {
  27410. return file.url;
  27411. }
  27412. else
  27413. {
  27414. return baseURL + file.url;
  27415. }
  27416. };
  27417. module.exports = GetURL;
  27418. /***/ }),
  27419. /* 153 */
  27420. /***/ (function(module, exports, __webpack_require__) {
  27421. /**
  27422. * @author Richard Davey <rich@photonstorm.com>
  27423. * @copyright 2019 Photon Storm Ltd.
  27424. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27425. */
  27426. /**
  27427. * @namespace Phaser.Input.Gamepad.Events
  27428. */
  27429. module.exports = {
  27430. BUTTON_DOWN: __webpack_require__(633),
  27431. BUTTON_UP: __webpack_require__(632),
  27432. CONNECTED: __webpack_require__(631),
  27433. DISCONNECTED: __webpack_require__(630),
  27434. GAMEPAD_BUTTON_DOWN: __webpack_require__(629),
  27435. GAMEPAD_BUTTON_UP: __webpack_require__(628)
  27436. };
  27437. /***/ }),
  27438. /* 154 */
  27439. /***/ (function(module, exports) {
  27440. /**
  27441. * @author Richard Davey <rich@photonstorm.com>
  27442. * @copyright 2019 Photon Storm Ltd.
  27443. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27444. */
  27445. /**
  27446. * Rotates an entire Triangle at a given angle about a specific point.
  27447. *
  27448. * @function Phaser.Geom.Triangle.RotateAroundXY
  27449. * @since 3.0.0
  27450. *
  27451. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  27452. *
  27453. * @param {Phaser.Geom.Triangle} triangle - The Triangle to rotate.
  27454. * @param {number} x - The X coordinate of the point to rotate the Triangle about.
  27455. * @param {number} y - The Y coordinate of the point to rotate the Triangle about.
  27456. * @param {number} angle - The angle by which to rotate the Triangle, in radians.
  27457. *
  27458. * @return {Phaser.Geom.Triangle} The rotated Triangle.
  27459. */
  27460. var RotateAroundXY = function (triangle, x, y, angle)
  27461. {
  27462. var c = Math.cos(angle);
  27463. var s = Math.sin(angle);
  27464. var tx = triangle.x1 - x;
  27465. var ty = triangle.y1 - y;
  27466. triangle.x1 = tx * c - ty * s + x;
  27467. triangle.y1 = tx * s + ty * c + y;
  27468. tx = triangle.x2 - x;
  27469. ty = triangle.y2 - y;
  27470. triangle.x2 = tx * c - ty * s + x;
  27471. triangle.y2 = tx * s + ty * c + y;
  27472. tx = triangle.x3 - x;
  27473. ty = triangle.y3 - y;
  27474. triangle.x3 = tx * c - ty * s + x;
  27475. triangle.y3 = tx * s + ty * c + y;
  27476. return triangle;
  27477. };
  27478. module.exports = RotateAroundXY;
  27479. /***/ }),
  27480. /* 155 */
  27481. /***/ (function(module, exports) {
  27482. /**
  27483. * @author Richard Davey <rich@photonstorm.com>
  27484. * @copyright 2019 Photon Storm Ltd.
  27485. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27486. */
  27487. /**
  27488. * Calculates the width/height ratio of a rectangle.
  27489. *
  27490. * @function Phaser.Geom.Rectangle.GetAspectRatio
  27491. * @since 3.0.0
  27492. *
  27493. * @param {Phaser.Geom.Rectangle} rect - The rectangle.
  27494. *
  27495. * @return {number} The width/height ratio of the rectangle.
  27496. */
  27497. var GetAspectRatio = function (rect)
  27498. {
  27499. return (rect.height === 0) ? NaN : rect.width / rect.height;
  27500. };
  27501. module.exports = GetAspectRatio;
  27502. /***/ }),
  27503. /* 156 */
  27504. /***/ (function(module, exports) {
  27505. /**
  27506. * @author Richard Davey <rich@photonstorm.com>
  27507. * @copyright 2019 Photon Storm Ltd.
  27508. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27509. */
  27510. /**
  27511. * Rotate a line around the given coordinates by the given angle in radians.
  27512. *
  27513. * @function Phaser.Geom.Line.RotateAroundXY
  27514. * @since 3.0.0
  27515. *
  27516. * @generic {Phaser.Geom.Line} O - [line,$return]
  27517. *
  27518. * @param {Phaser.Geom.Line} line - The line to rotate.
  27519. * @param {number} x - The horizontal coordinate to rotate the line around.
  27520. * @param {number} y - The vertical coordinate to rotate the line around.
  27521. * @param {number} angle - The angle of rotation in radians.
  27522. *
  27523. * @return {Phaser.Geom.Line} The rotated line.
  27524. */
  27525. var RotateAroundXY = function (line, x, y, angle)
  27526. {
  27527. var c = Math.cos(angle);
  27528. var s = Math.sin(angle);
  27529. var tx = line.x1 - x;
  27530. var ty = line.y1 - y;
  27531. line.x1 = tx * c - ty * s + x;
  27532. line.y1 = tx * s + ty * c + y;
  27533. tx = line.x2 - x;
  27534. ty = line.y2 - y;
  27535. line.x2 = tx * c - ty * s + x;
  27536. line.y2 = tx * s + ty * c + y;
  27537. return line;
  27538. };
  27539. module.exports = RotateAroundXY;
  27540. /***/ }),
  27541. /* 157 */
  27542. /***/ (function(module, exports) {
  27543. /**
  27544. * @author Richard Davey <rich@photonstorm.com>
  27545. * @copyright 2019 Photon Storm Ltd.
  27546. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27547. */
  27548. // http://www.blackpawn.com/texts/pointinpoly/
  27549. // points is an array of Point-like objects with public x/y properties
  27550. // returns an array containing all points that are within the triangle, or an empty array if none
  27551. // if 'returnFirst' is true it will return after the first point within the triangle is found
  27552. /**
  27553. * Filters an array of point-like objects to only those contained within a triangle.
  27554. * If `returnFirst` is true, will return an array containing only the first point in the provided array that is within the triangle (or an empty array if there are no such points).
  27555. *
  27556. * @function Phaser.Geom.Triangle.ContainsArray
  27557. * @since 3.0.0
  27558. *
  27559. * @param {Phaser.Geom.Triangle} triangle - The triangle that the points are being checked in.
  27560. * @param {Phaser.Geom.Point[]} points - An array of point-like objects (objects that have an `x` and `y` property)
  27561. * @param {boolean} [returnFirst=false] - If `true`, return an array containing only the first point found that is within the triangle.
  27562. * @param {array} [out] - If provided, the points that are within the triangle will be appended to this array instead of being added to a new array. If `returnFirst` is true, only the first point found within the triangle will be appended. This array will also be returned by this function.
  27563. *
  27564. * @return {Phaser.Geom.Point[]} An array containing all the points from `points` that are within the triangle, if an array was provided as `out`, points will be appended to that array and it will also be returned here.
  27565. */
  27566. var ContainsArray = function (triangle, points, returnFirst, out)
  27567. {
  27568. if (returnFirst === undefined) { returnFirst = false; }
  27569. if (out === undefined) { out = []; }
  27570. var v0x = triangle.x3 - triangle.x1;
  27571. var v0y = triangle.y3 - triangle.y1;
  27572. var v1x = triangle.x2 - triangle.x1;
  27573. var v1y = triangle.y2 - triangle.y1;
  27574. var dot00 = (v0x * v0x) + (v0y * v0y);
  27575. var dot01 = (v0x * v1x) + (v0y * v1y);
  27576. var dot11 = (v1x * v1x) + (v1y * v1y);
  27577. // Compute barycentric coordinates
  27578. var b = ((dot00 * dot11) - (dot01 * dot01));
  27579. var inv = (b === 0) ? 0 : (1 / b);
  27580. var u;
  27581. var v;
  27582. var v2x;
  27583. var v2y;
  27584. var dot02;
  27585. var dot12;
  27586. var x1 = triangle.x1;
  27587. var y1 = triangle.y1;
  27588. for (var i = 0; i < points.length; i++)
  27589. {
  27590. v2x = points[i].x - x1;
  27591. v2y = points[i].y - y1;
  27592. dot02 = (v0x * v2x) + (v0y * v2y);
  27593. dot12 = (v1x * v2x) + (v1y * v2y);
  27594. u = ((dot11 * dot02) - (dot01 * dot12)) * inv;
  27595. v = ((dot00 * dot12) - (dot01 * dot02)) * inv;
  27596. if (u >= 0 && v >= 0 && (u + v < 1))
  27597. {
  27598. out.push({ x: points[i].x, y: points[i].y });
  27599. if (returnFirst)
  27600. {
  27601. break;
  27602. }
  27603. }
  27604. }
  27605. return out;
  27606. };
  27607. module.exports = ContainsArray;
  27608. /***/ }),
  27609. /* 158 */
  27610. /***/ (function(module, exports) {
  27611. /**
  27612. * @author Richard Davey <rich@photonstorm.com>
  27613. * @copyright 2019 Photon Storm Ltd.
  27614. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27615. */
  27616. /**
  27617. * Checks if two Rectangles intersect.
  27618. *
  27619. * A Rectangle intersects another Rectangle if any part of its bounds is within the other Rectangle's bounds. As such, the two Rectangles are considered "solid". A Rectangle with no width or no height will never intersect another Rectangle.
  27620. *
  27621. * @function Phaser.Geom.Intersects.RectangleToRectangle
  27622. * @since 3.0.0
  27623. *
  27624. * @param {Phaser.Geom.Rectangle} rectA - The first Rectangle to check for intersection.
  27625. * @param {Phaser.Geom.Rectangle} rectB - The second Rectangle to check for intersection.
  27626. *
  27627. * @return {boolean} `true` if the two Rectangles intersect, otherwise `false`.
  27628. */
  27629. var RectangleToRectangle = function (rectA, rectB)
  27630. {
  27631. if (rectA.width <= 0 || rectA.height <= 0 || rectB.width <= 0 || rectB.height <= 0)
  27632. {
  27633. return false;
  27634. }
  27635. return !(rectA.right < rectB.x || rectA.bottom < rectB.y || rectA.x > rectB.right || rectA.y > rectB.bottom);
  27636. };
  27637. module.exports = RectangleToRectangle;
  27638. /***/ }),
  27639. /* 159 */
  27640. /***/ (function(module, exports, __webpack_require__) {
  27641. /**
  27642. * @author Richard Davey <rich@photonstorm.com>
  27643. * @copyright 2019 Photon Storm Ltd.
  27644. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27645. */
  27646. var Class = __webpack_require__(0);
  27647. var Mesh = __webpack_require__(116);
  27648. /**
  27649. * @classdesc
  27650. * A Quad Game Object.
  27651. *
  27652. * A Quad is a Mesh Game Object pre-configured with two triangles arranged into a rectangle, with a single
  27653. * texture spread across them.
  27654. *
  27655. * You can manipulate the corner points of the quad via the getters and setters such as `topLeftX`, and also
  27656. * change their alpha and color values. The quad itself can be moved by adjusting the `x` and `y` properties.
  27657. *
  27658. * @class Quad
  27659. * @extends Phaser.GameObjects.Mesh
  27660. * @memberof Phaser.GameObjects
  27661. * @constructor
  27662. * @webglOnly
  27663. * @since 3.0.0
  27664. *
  27665. * @param {Phaser.Scene} scene - The Scene to which this Quad belongs.
  27666. * @param {number} x - The horizontal position of this Game Object in the world.
  27667. * @param {number} y - The vertical position of this Game Object in the world.
  27668. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  27669. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  27670. */
  27671. var Quad = new Class({
  27672. Extends: Mesh,
  27673. initialize:
  27674. function Quad (scene, x, y, texture, frame)
  27675. {
  27676. // 0----3
  27677. // |\ B|
  27678. // | \ |
  27679. // | \ |
  27680. // | A \|
  27681. // | \
  27682. // 1----2
  27683. var vertices = [
  27684. 0, 0, // tl
  27685. 0, 0, // bl
  27686. 0, 0, // br
  27687. 0, 0, // tl
  27688. 0, 0, // br
  27689. 0, 0 // tr
  27690. ];
  27691. var uv = [
  27692. 0, 0, // tl
  27693. 0, 1, // bl
  27694. 1, 1, // br
  27695. 0, 0, // tl
  27696. 1, 1, // br
  27697. 1, 0 // tr
  27698. ];
  27699. var colors = [
  27700. 0xffffff, // tl
  27701. 0xffffff, // bl
  27702. 0xffffff, // br
  27703. 0xffffff, // tl
  27704. 0xffffff, // br
  27705. 0xffffff // tr
  27706. ];
  27707. var alphas = [
  27708. 1, // tl
  27709. 1, // bl
  27710. 1, // br
  27711. 1, // tl
  27712. 1, // br
  27713. 1 // tr
  27714. ];
  27715. Mesh.call(this, scene, x, y, vertices, uv, colors, alphas, texture, frame);
  27716. this.resetPosition();
  27717. },
  27718. /**
  27719. * Sets the frame this Game Object will use to render with.
  27720. *
  27721. * The Frame has to belong to the current Texture being used.
  27722. *
  27723. * It can be either a string or an index.
  27724. *
  27725. * Calling `setFrame` will modify the `width` and `height` properties of your Game Object.
  27726. * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer.
  27727. *
  27728. * @method Phaser.GameObjects.Quad#setFrame
  27729. * @since 3.11.0
  27730. *
  27731. * @param {(string|integer)} frame - The name or index of the frame within the Texture.
  27732. *
  27733. * @return {this} This Game Object instance.
  27734. */
  27735. setFrame: function (frame)
  27736. {
  27737. this.frame = this.texture.get(frame);
  27738. if (!this.frame.cutWidth || !this.frame.cutHeight)
  27739. {
  27740. this.renderFlags &= ~8;
  27741. }
  27742. else
  27743. {
  27744. this.renderFlags |= 8;
  27745. }
  27746. frame = this.frame;
  27747. // TL
  27748. this.uv[0] = frame.u0;
  27749. this.uv[1] = frame.v0;
  27750. // BL
  27751. this.uv[2] = frame.u0;
  27752. this.uv[3] = frame.v1;
  27753. // BR
  27754. this.uv[4] = frame.u1;
  27755. this.uv[5] = frame.v1;
  27756. // TL
  27757. this.uv[6] = frame.u0;
  27758. this.uv[7] = frame.v0;
  27759. // BR
  27760. this.uv[8] = frame.u1;
  27761. this.uv[9] = frame.v1;
  27762. // TR
  27763. this.uv[10] = frame.u1;
  27764. this.uv[11] = frame.v0;
  27765. return this;
  27766. },
  27767. /**
  27768. * The top-left x vertex of this Quad.
  27769. *
  27770. * @name Phaser.GameObjects.Quad#topLeftX
  27771. * @type {number}
  27772. * @since 3.0.0
  27773. */
  27774. topLeftX: {
  27775. get: function ()
  27776. {
  27777. return this.x + this.vertices[0];
  27778. },
  27779. set: function (value)
  27780. {
  27781. this.vertices[0] = value - this.x;
  27782. this.vertices[6] = value - this.x;
  27783. }
  27784. },
  27785. /**
  27786. * The top-left y vertex of this Quad.
  27787. *
  27788. * @name Phaser.GameObjects.Quad#topLeftY
  27789. * @type {number}
  27790. * @since 3.0.0
  27791. */
  27792. topLeftY: {
  27793. get: function ()
  27794. {
  27795. return this.y + this.vertices[1];
  27796. },
  27797. set: function (value)
  27798. {
  27799. this.vertices[1] = value - this.y;
  27800. this.vertices[7] = value - this.y;
  27801. }
  27802. },
  27803. /**
  27804. * The top-right x vertex of this Quad.
  27805. *
  27806. * @name Phaser.GameObjects.Quad#topRightX
  27807. * @type {number}
  27808. * @since 3.0.0
  27809. */
  27810. topRightX: {
  27811. get: function ()
  27812. {
  27813. return this.x + this.vertices[10];
  27814. },
  27815. set: function (value)
  27816. {
  27817. this.vertices[10] = value - this.x;
  27818. }
  27819. },
  27820. /**
  27821. * The top-right y vertex of this Quad.
  27822. *
  27823. * @name Phaser.GameObjects.Quad#topRightY
  27824. * @type {number}
  27825. * @since 3.0.0
  27826. */
  27827. topRightY: {
  27828. get: function ()
  27829. {
  27830. return this.y + this.vertices[11];
  27831. },
  27832. set: function (value)
  27833. {
  27834. this.vertices[11] = value - this.y;
  27835. }
  27836. },
  27837. /**
  27838. * The bottom-left x vertex of this Quad.
  27839. *
  27840. * @name Phaser.GameObjects.Quad#bottomLeftX
  27841. * @type {number}
  27842. * @since 3.0.0
  27843. */
  27844. bottomLeftX: {
  27845. get: function ()
  27846. {
  27847. return this.x + this.vertices[2];
  27848. },
  27849. set: function (value)
  27850. {
  27851. this.vertices[2] = value - this.x;
  27852. }
  27853. },
  27854. /**
  27855. * The bottom-left y vertex of this Quad.
  27856. *
  27857. * @name Phaser.GameObjects.Quad#bottomLeftY
  27858. * @type {number}
  27859. * @since 3.0.0
  27860. */
  27861. bottomLeftY: {
  27862. get: function ()
  27863. {
  27864. return this.y + this.vertices[3];
  27865. },
  27866. set: function (value)
  27867. {
  27868. this.vertices[3] = value - this.y;
  27869. }
  27870. },
  27871. /**
  27872. * The bottom-right x vertex of this Quad.
  27873. *
  27874. * @name Phaser.GameObjects.Quad#bottomRightX
  27875. * @type {number}
  27876. * @since 3.0.0
  27877. */
  27878. bottomRightX: {
  27879. get: function ()
  27880. {
  27881. return this.x + this.vertices[4];
  27882. },
  27883. set: function (value)
  27884. {
  27885. this.vertices[4] = value - this.x;
  27886. this.vertices[8] = value - this.x;
  27887. }
  27888. },
  27889. /**
  27890. * The bottom-right y vertex of this Quad.
  27891. *
  27892. * @name Phaser.GameObjects.Quad#bottomRightY
  27893. * @type {number}
  27894. * @since 3.0.0
  27895. */
  27896. bottomRightY: {
  27897. get: function ()
  27898. {
  27899. return this.y + this.vertices[5];
  27900. },
  27901. set: function (value)
  27902. {
  27903. this.vertices[5] = value - this.y;
  27904. this.vertices[9] = value - this.y;
  27905. }
  27906. },
  27907. /**
  27908. * The top-left alpha value of this Quad.
  27909. *
  27910. * @name Phaser.GameObjects.Quad#topLeftAlpha
  27911. * @type {number}
  27912. * @since 3.0.0
  27913. */
  27914. topLeftAlpha: {
  27915. get: function ()
  27916. {
  27917. return this.alphas[0];
  27918. },
  27919. set: function (value)
  27920. {
  27921. this.alphas[0] = value;
  27922. this.alphas[3] = value;
  27923. }
  27924. },
  27925. /**
  27926. * The top-right alpha value of this Quad.
  27927. *
  27928. * @name Phaser.GameObjects.Quad#topRightAlpha
  27929. * @type {number}
  27930. * @since 3.0.0
  27931. */
  27932. topRightAlpha: {
  27933. get: function ()
  27934. {
  27935. return this.alphas[5];
  27936. },
  27937. set: function (value)
  27938. {
  27939. this.alphas[5] = value;
  27940. }
  27941. },
  27942. /**
  27943. * The bottom-left alpha value of this Quad.
  27944. *
  27945. * @name Phaser.GameObjects.Quad#bottomLeftAlpha
  27946. * @type {number}
  27947. * @since 3.0.0
  27948. */
  27949. bottomLeftAlpha: {
  27950. get: function ()
  27951. {
  27952. return this.alphas[1];
  27953. },
  27954. set: function (value)
  27955. {
  27956. this.alphas[1] = value;
  27957. }
  27958. },
  27959. /**
  27960. * The bottom-right alpha value of this Quad.
  27961. *
  27962. * @name Phaser.GameObjects.Quad#bottomRightAlpha
  27963. * @type {number}
  27964. * @since 3.0.0
  27965. */
  27966. bottomRightAlpha: {
  27967. get: function ()
  27968. {
  27969. return this.alphas[2];
  27970. },
  27971. set: function (value)
  27972. {
  27973. this.alphas[2] = value;
  27974. this.alphas[4] = value;
  27975. }
  27976. },
  27977. /**
  27978. * The top-left color value of this Quad.
  27979. *
  27980. * @name Phaser.GameObjects.Quad#topLeftColor
  27981. * @type {number}
  27982. * @since 3.0.0
  27983. */
  27984. topLeftColor: {
  27985. get: function ()
  27986. {
  27987. return this.colors[0];
  27988. },
  27989. set: function (value)
  27990. {
  27991. this.colors[0] = value;
  27992. this.colors[3] = value;
  27993. }
  27994. },
  27995. /**
  27996. * The top-right color value of this Quad.
  27997. *
  27998. * @name Phaser.GameObjects.Quad#topRightColor
  27999. * @type {number}
  28000. * @since 3.0.0
  28001. */
  28002. topRightColor: {
  28003. get: function ()
  28004. {
  28005. return this.colors[5];
  28006. },
  28007. set: function (value)
  28008. {
  28009. this.colors[5] = value;
  28010. }
  28011. },
  28012. /**
  28013. * The bottom-left color value of this Quad.
  28014. *
  28015. * @name Phaser.GameObjects.Quad#bottomLeftColor
  28016. * @type {number}
  28017. * @since 3.0.0
  28018. */
  28019. bottomLeftColor: {
  28020. get: function ()
  28021. {
  28022. return this.colors[1];
  28023. },
  28024. set: function (value)
  28025. {
  28026. this.colors[1] = value;
  28027. }
  28028. },
  28029. /**
  28030. * The bottom-right color value of this Quad.
  28031. *
  28032. * @name Phaser.GameObjects.Quad#bottomRightColor
  28033. * @type {number}
  28034. * @since 3.0.0
  28035. */
  28036. bottomRightColor: {
  28037. get: function ()
  28038. {
  28039. return this.colors[2];
  28040. },
  28041. set: function (value)
  28042. {
  28043. this.colors[2] = value;
  28044. this.colors[4] = value;
  28045. }
  28046. },
  28047. /**
  28048. * Sets the top-left vertex position of this Quad.
  28049. *
  28050. * @method Phaser.GameObjects.Quad#setTopLeft
  28051. * @since 3.0.0
  28052. *
  28053. * @param {number} x - The horizontal coordinate of the vertex.
  28054. * @param {number} y - The vertical coordinate of the vertex.
  28055. *
  28056. * @return {Phaser.GameObjects.Quad} This Game Object.
  28057. */
  28058. setTopLeft: function (x, y)
  28059. {
  28060. this.topLeftX = x;
  28061. this.topLeftY = y;
  28062. return this;
  28063. },
  28064. /**
  28065. * Sets the top-right vertex position of this Quad.
  28066. *
  28067. * @method Phaser.GameObjects.Quad#setTopRight
  28068. * @since 3.0.0
  28069. *
  28070. * @param {number} x - The horizontal coordinate of the vertex.
  28071. * @param {number} y - The vertical coordinate of the vertex.
  28072. *
  28073. * @return {Phaser.GameObjects.Quad} This Game Object.
  28074. */
  28075. setTopRight: function (x, y)
  28076. {
  28077. this.topRightX = x;
  28078. this.topRightY = y;
  28079. return this;
  28080. },
  28081. /**
  28082. * Sets the bottom-left vertex position of this Quad.
  28083. *
  28084. * @method Phaser.GameObjects.Quad#setBottomLeft
  28085. * @since 3.0.0
  28086. *
  28087. * @param {number} x - The horizontal coordinate of the vertex.
  28088. * @param {number} y - The vertical coordinate of the vertex.
  28089. *
  28090. * @return {Phaser.GameObjects.Quad} This Game Object.
  28091. */
  28092. setBottomLeft: function (x, y)
  28093. {
  28094. this.bottomLeftX = x;
  28095. this.bottomLeftY = y;
  28096. return this;
  28097. },
  28098. /**
  28099. * Sets the bottom-right vertex position of this Quad.
  28100. *
  28101. * @method Phaser.GameObjects.Quad#setBottomRight
  28102. * @since 3.0.0
  28103. *
  28104. * @param {number} x - The horizontal coordinate of the vertex.
  28105. * @param {number} y - The vertical coordinate of the vertex.
  28106. *
  28107. * @return {Phaser.GameObjects.Quad} This Game Object.
  28108. */
  28109. setBottomRight: function (x, y)
  28110. {
  28111. this.bottomRightX = x;
  28112. this.bottomRightY = y;
  28113. return this;
  28114. },
  28115. /**
  28116. * Resets the positions of the four corner vertices of this Quad.
  28117. *
  28118. * @method Phaser.GameObjects.Quad#resetPosition
  28119. * @since 3.0.0
  28120. *
  28121. * @return {Phaser.GameObjects.Quad} This Game Object.
  28122. */
  28123. resetPosition: function ()
  28124. {
  28125. var x = this.x;
  28126. var y = this.y;
  28127. var halfWidth = Math.floor(this.width / 2);
  28128. var halfHeight = Math.floor(this.height / 2);
  28129. this.setTopLeft(x - halfWidth, y - halfHeight);
  28130. this.setTopRight(x + halfWidth, y - halfHeight);
  28131. this.setBottomLeft(x - halfWidth, y + halfHeight);
  28132. this.setBottomRight(x + halfWidth, y + halfHeight);
  28133. return this;
  28134. },
  28135. /**
  28136. * Resets the alpha values used by this Quad back to 1.
  28137. *
  28138. * @method Phaser.GameObjects.Quad#resetAlpha
  28139. * @since 3.0.0
  28140. *
  28141. * @return {Phaser.GameObjects.Quad} This Game Object.
  28142. */
  28143. resetAlpha: function ()
  28144. {
  28145. var alphas = this.alphas;
  28146. alphas[0] = 1;
  28147. alphas[1] = 1;
  28148. alphas[2] = 1;
  28149. alphas[3] = 1;
  28150. alphas[4] = 1;
  28151. alphas[5] = 1;
  28152. return this;
  28153. },
  28154. /**
  28155. * Resets the color values used by this Quad back to 0xffffff.
  28156. *
  28157. * @method Phaser.GameObjects.Quad#resetColors
  28158. * @since 3.0.0
  28159. *
  28160. * @return {Phaser.GameObjects.Quad} This Game Object.
  28161. */
  28162. resetColors: function ()
  28163. {
  28164. var colors = this.colors;
  28165. colors[0] = 0xffffff;
  28166. colors[1] = 0xffffff;
  28167. colors[2] = 0xffffff;
  28168. colors[3] = 0xffffff;
  28169. colors[4] = 0xffffff;
  28170. colors[5] = 0xffffff;
  28171. return this;
  28172. },
  28173. /**
  28174. * Resets the position, alpha and color values used by this Quad.
  28175. *
  28176. * @method Phaser.GameObjects.Quad#reset
  28177. * @since 3.0.0
  28178. *
  28179. * @return {Phaser.GameObjects.Quad} This Game Object.
  28180. */
  28181. reset: function ()
  28182. {
  28183. this.resetPosition();
  28184. this.resetAlpha();
  28185. return this.resetColors();
  28186. }
  28187. });
  28188. module.exports = Quad;
  28189. /***/ }),
  28190. /* 160 */
  28191. /***/ (function(module, exports) {
  28192. /**
  28193. * @author Richard Davey <rich@photonstorm.com>
  28194. * @copyright 2019 Photon Storm Ltd.
  28195. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28196. */
  28197. // Checks whether the x and y coordinates are contained within this polygon.
  28198. // Adapted from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html by Jonas Raoni Soares Silva
  28199. /**
  28200. * Checks if a point is within the bounds of a Polygon.
  28201. *
  28202. * @function Phaser.Geom.Polygon.Contains
  28203. * @since 3.0.0
  28204. *
  28205. * @param {Phaser.Geom.Polygon} polygon - The Polygon to check against.
  28206. * @param {number} x - The X coordinate of the point to check.
  28207. * @param {number} y - The Y coordinate of the point to check.
  28208. *
  28209. * @return {boolean} `true` if the point is within the bounds of the Polygon, otherwise `false`.
  28210. */
  28211. var Contains = function (polygon, x, y)
  28212. {
  28213. var inside = false;
  28214. for (var i = -1, j = polygon.points.length - 1; ++i < polygon.points.length; j = i)
  28215. {
  28216. var ix = polygon.points[i].x;
  28217. var iy = polygon.points[i].y;
  28218. var jx = polygon.points[j].x;
  28219. var jy = polygon.points[j].y;
  28220. if (((iy <= y && y < jy) || (jy <= y && y < iy)) && (x < (jx - ix) * (y - iy) / (jy - iy) + ix))
  28221. {
  28222. inside = !inside;
  28223. }
  28224. }
  28225. return inside;
  28226. };
  28227. module.exports = Contains;
  28228. /***/ }),
  28229. /* 161 */
  28230. /***/ (function(module, exports, __webpack_require__) {
  28231. /**
  28232. * @author Richard Davey <rich@photonstorm.com>
  28233. * @copyright 2019 Photon Storm Ltd.
  28234. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28235. */
  28236. var Class = __webpack_require__(0);
  28237. var Contains = __webpack_require__(160);
  28238. var GetPoints = __webpack_require__(289);
  28239. /**
  28240. * @classdesc
  28241. * A Polygon object
  28242. *
  28243. * The polygon is a closed shape consists of a series of connected straight lines defined by list of ordered points.
  28244. * Several formats are supported to define the list of points, check the setTo method for details.
  28245. * This is a geometry object allowing you to define and inspect the shape.
  28246. * It is not a Game Object, in that you cannot add it to the display list, and it has no texture.
  28247. * To render a Polygon you should look at the capabilities of the Graphics class.
  28248. *
  28249. * @class Polygon
  28250. * @memberof Phaser.Geom
  28251. * @constructor
  28252. * @since 3.0.0
  28253. *
  28254. * @param {Phaser.Geom.Point[]} [points] - List of points defining the perimeter of this Polygon. Several formats are supported:
  28255. * - A string containing paired x y values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'`
  28256. * - An array of Point objects: `[new Phaser.Point(x1, y1), ...]`
  28257. * - An array of objects with public x y properties: `[obj1, obj2, ...]`
  28258. * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]`
  28259. * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]`
  28260. */
  28261. var Polygon = new Class({
  28262. initialize:
  28263. function Polygon (points)
  28264. {
  28265. /**
  28266. * The area of this Polygon.
  28267. *
  28268. * @name Phaser.Geom.Polygon#area
  28269. * @type {number}
  28270. * @default 0
  28271. * @since 3.0.0
  28272. */
  28273. this.area = 0;
  28274. /**
  28275. * An array of number pair objects that make up this polygon. I.e. [ {x,y}, {x,y}, {x,y} ]
  28276. *
  28277. * @name Phaser.Geom.Polygon#points
  28278. * @type {Phaser.Geom.Point[]}
  28279. * @since 3.0.0
  28280. */
  28281. this.points = [];
  28282. if (points)
  28283. {
  28284. this.setTo(points);
  28285. }
  28286. },
  28287. /**
  28288. * Check to see if the Polygon contains the given x / y coordinates.
  28289. *
  28290. * @method Phaser.Geom.Polygon#contains
  28291. * @since 3.0.0
  28292. *
  28293. * @param {number} x - The x coordinate to check within the polygon.
  28294. * @param {number} y - The y coordinate to check within the polygon.
  28295. *
  28296. * @return {boolean} `true` if the coordinates are within the polygon, otherwise `false`.
  28297. */
  28298. contains: function (x, y)
  28299. {
  28300. return Contains(this, x, y);
  28301. },
  28302. /**
  28303. * Sets this Polygon to the given points.
  28304. *
  28305. * The points can be set from a variety of formats:
  28306. *
  28307. * - A string containing paired values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'`
  28308. * - An array of Point objects: `[new Phaser.Point(x1, y1), ...]`
  28309. * - An array of objects with public x/y properties: `[obj1, obj2, ...]`
  28310. * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]`
  28311. * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]`
  28312. *
  28313. * `setTo` may also be called without any arguments to remove all points.
  28314. *
  28315. * @method Phaser.Geom.Polygon#setTo
  28316. * @since 3.0.0
  28317. *
  28318. * @param {array} points - Points defining the perimeter of this polygon. Please check function description above for the different supported formats.
  28319. *
  28320. * @return {Phaser.Geom.Polygon} This Polygon object.
  28321. */
  28322. setTo: function (points)
  28323. {
  28324. this.area = 0;
  28325. this.points = [];
  28326. if (typeof points === 'string')
  28327. {
  28328. points = points.split(' ');
  28329. }
  28330. if (!Array.isArray(points))
  28331. {
  28332. return this;
  28333. }
  28334. var p;
  28335. var y0 = Number.MAX_VALUE;
  28336. // The points argument is an array, so iterate through it
  28337. for (var i = 0; i < points.length; i++)
  28338. {
  28339. p = { x: 0, y: 0 };
  28340. if (typeof points[i] === 'number' || typeof points[i] === 'string')
  28341. {
  28342. p.x = parseFloat(points[i]);
  28343. p.y = parseFloat(points[i + 1]);
  28344. i++;
  28345. }
  28346. else if (Array.isArray(points[i]))
  28347. {
  28348. // An array of arrays?
  28349. p.x = points[i][0];
  28350. p.y = points[i][1];
  28351. }
  28352. else
  28353. {
  28354. p.x = points[i].x;
  28355. p.y = points[i].y;
  28356. }
  28357. this.points.push(p);
  28358. // Lowest boundary
  28359. if (p.y < y0)
  28360. {
  28361. y0 = p.y;
  28362. }
  28363. }
  28364. this.calculateArea(y0);
  28365. return this;
  28366. },
  28367. /**
  28368. * Calculates the area of the Polygon. This is available in the property Polygon.area
  28369. *
  28370. * @method Phaser.Geom.Polygon#calculateArea
  28371. * @since 3.0.0
  28372. *
  28373. * @return {number} The area of the polygon.
  28374. */
  28375. calculateArea: function ()
  28376. {
  28377. if (this.points.length < 3)
  28378. {
  28379. this.area = 0;
  28380. return this.area;
  28381. }
  28382. var sum = 0;
  28383. var p1;
  28384. var p2;
  28385. for (var i = 0; i < this.points.length - 1; i++)
  28386. {
  28387. p1 = this.points[i];
  28388. p2 = this.points[i + 1];
  28389. sum += (p2.x - p1.x) * (p1.y + p2.y);
  28390. }
  28391. p1 = this.points[0];
  28392. p2 = this.points[this.points.length - 1];
  28393. sum += (p1.x - p2.x) * (p2.y + p1.y);
  28394. this.area = -sum * 0.5;
  28395. return this.area;
  28396. },
  28397. /**
  28398. * Returns an array of Point objects containing the coordinates of the points around the perimeter of the Polygon,
  28399. * based on the given quantity or stepRate values.
  28400. *
  28401. * @method Phaser.Geom.Polygon#getPoints
  28402. * @since 3.12.0
  28403. *
  28404. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  28405. * @param {number} [stepRate] - Sets the quantity by getting the perimeter of the Polygon and dividing it by the stepRate.
  28406. * @param {array} [output] - An array to insert the points in to. If not provided a new array will be created.
  28407. *
  28408. * @return {Phaser.Geom.Point[]} An array of Point objects pertaining to the points around the perimeter of the Polygon.
  28409. */
  28410. getPoints: function (quantity, step, output)
  28411. {
  28412. return GetPoints(this, quantity, step, output);
  28413. }
  28414. });
  28415. module.exports = Polygon;
  28416. /***/ }),
  28417. /* 162 */
  28418. /***/ (function(module, exports, __webpack_require__) {
  28419. /**
  28420. * @author Richard Davey <rich@photonstorm.com>
  28421. * @copyright 2019 Photon Storm Ltd.
  28422. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28423. */
  28424. var CanvasPool = __webpack_require__(24);
  28425. var Class = __webpack_require__(0);
  28426. var Components = __webpack_require__(13);
  28427. var CONST = __webpack_require__(28);
  28428. var GameObject = __webpack_require__(18);
  28429. var GetPowerOfTwo = __webpack_require__(376);
  28430. var Smoothing = __webpack_require__(130);
  28431. var TileSpriteRender = __webpack_require__(828);
  28432. var Vector2 = __webpack_require__(3);
  28433. // bitmask flag for GameObject.renderMask
  28434. var _FLAG = 8; // 1000
  28435. /**
  28436. * @classdesc
  28437. * A TileSprite is a Sprite that has a repeating texture.
  28438. *
  28439. * The texture can be scrolled and scaled independently of the TileSprite itself. Textures will automatically wrap and
  28440. * are designed so that you can create game backdrops using seamless textures as a source.
  28441. *
  28442. * You shouldn't ever create a TileSprite any larger than your actual canvas size. If you want to create a large repeating background
  28443. * that scrolls across the whole map of your game, then you create a TileSprite that fits the canvas size and then use the `tilePosition`
  28444. * property to scroll the texture as the player moves. If you create a TileSprite that is thousands of pixels in size then it will
  28445. * consume huge amounts of memory and cause performance issues. Remember: use `tilePosition` to scroll your texture and `tileScale` to
  28446. * adjust the scale of the texture - don't resize the sprite itself or make it larger than it needs.
  28447. *
  28448. * An important note about Tile Sprites and NPOT textures: Internally, TileSprite textures use GL_REPEAT to provide
  28449. * seamless repeating of the textures. This, combined with the way in which the textures are handled in WebGL, means
  28450. * they need to be POT (power-of-two) sizes in order to wrap. If you provide a NPOT (non power-of-two) texture to a
  28451. * TileSprite it will generate a POT sized canvas and draw your texture to it, scaled up to the POT size. It's then
  28452. * scaled back down again during rendering to the original dimensions. While this works, in that it allows you to use
  28453. * any size texture for a Tile Sprite, it does mean that NPOT textures are going to appear anti-aliased when rendered,
  28454. * due to the interpolation that took place when it was resized into a POT texture. This is especially visible in
  28455. * pixel art graphics. If you notice it and it becomes an issue, the only way to avoid it is to ensure that you
  28456. * provide POT textures for Tile Sprites.
  28457. *
  28458. * @class TileSprite
  28459. * @extends Phaser.GameObjects.GameObject
  28460. * @memberof Phaser.GameObjects
  28461. * @constructor
  28462. * @since 3.0.0
  28463. *
  28464. * @extends Phaser.GameObjects.Components.Alpha
  28465. * @extends Phaser.GameObjects.Components.BlendMode
  28466. * @extends Phaser.GameObjects.Components.ComputedSize
  28467. * @extends Phaser.GameObjects.Components.Crop
  28468. * @extends Phaser.GameObjects.Components.Depth
  28469. * @extends Phaser.GameObjects.Components.Flip
  28470. * @extends Phaser.GameObjects.Components.GetBounds
  28471. * @extends Phaser.GameObjects.Components.Mask
  28472. * @extends Phaser.GameObjects.Components.Origin
  28473. * @extends Phaser.GameObjects.Components.Pipeline
  28474. * @extends Phaser.GameObjects.Components.ScaleMode
  28475. * @extends Phaser.GameObjects.Components.ScrollFactor
  28476. * @extends Phaser.GameObjects.Components.Tint
  28477. * @extends Phaser.GameObjects.Components.Transform
  28478. * @extends Phaser.GameObjects.Components.Visible
  28479. *
  28480. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  28481. * @param {number} x - The horizontal position of this Game Object in the world.
  28482. * @param {number} y - The vertical position of this Game Object in the world.
  28483. * @param {integer} width - The width of the Game Object. If zero it will use the size of the texture frame.
  28484. * @param {integer} height - The height of the Game Object. If zero it will use the size of the texture frame.
  28485. * @param {string} textureKey - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  28486. * @param {(string|integer)} [frameKey] - An optional frame from the Texture this Game Object is rendering with.
  28487. */
  28488. var TileSprite = new Class({
  28489. Extends: GameObject,
  28490. Mixins: [
  28491. Components.Alpha,
  28492. Components.BlendMode,
  28493. Components.ComputedSize,
  28494. Components.Crop,
  28495. Components.Depth,
  28496. Components.Flip,
  28497. Components.GetBounds,
  28498. Components.Mask,
  28499. Components.Origin,
  28500. Components.Pipeline,
  28501. Components.ScaleMode,
  28502. Components.ScrollFactor,
  28503. Components.Tint,
  28504. Components.Transform,
  28505. Components.Visible,
  28506. TileSpriteRender
  28507. ],
  28508. initialize:
  28509. function TileSprite (scene, x, y, width, height, textureKey, frameKey)
  28510. {
  28511. var renderer = scene.sys.game.renderer;
  28512. GameObject.call(this, scene, 'TileSprite');
  28513. var displayTexture = scene.sys.textures.get(textureKey);
  28514. var displayFrame = displayTexture.get(frameKey);
  28515. if (!width || !height)
  28516. {
  28517. width = displayFrame.width;
  28518. height = displayFrame.height;
  28519. }
  28520. else
  28521. {
  28522. width = Math.floor(width);
  28523. height = Math.floor(height);
  28524. }
  28525. /**
  28526. * Internal tile position vector.
  28527. *
  28528. * @name Phaser.GameObjects.TileSprite#_tilePosition
  28529. * @type {Phaser.Math.Vector2}
  28530. * @private
  28531. * @since 3.12.0
  28532. */
  28533. this._tilePosition = new Vector2();
  28534. /**
  28535. * Internal tile scale vector.
  28536. *
  28537. * @name Phaser.GameObjects.TileSprite#_tileScale
  28538. * @type {Phaser.Math.Vector2}
  28539. * @private
  28540. * @since 3.12.0
  28541. */
  28542. this._tileScale = new Vector2(1, 1);
  28543. /**
  28544. * Whether the Tile Sprite has changed in some way, requiring an re-render of its tile texture.
  28545. *
  28546. * Such changes include the texture frame and scroll position of the Tile Sprite.
  28547. *
  28548. * @name Phaser.GameObjects.TileSprite#dirty
  28549. * @type {boolean}
  28550. * @default false
  28551. * @since 3.0.0
  28552. */
  28553. this.dirty = false;
  28554. /**
  28555. * The renderer in use by this Tile Sprite.
  28556. *
  28557. * @name Phaser.GameObjects.TileSprite#renderer
  28558. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  28559. * @since 3.0.0
  28560. */
  28561. this.renderer = renderer;
  28562. /**
  28563. * The Canvas element that the TileSprite renders its fill pattern in to.
  28564. * Only used in Canvas mode.
  28565. *
  28566. * @name Phaser.GameObjects.TileSprite#canvas
  28567. * @type {?HTMLCanvasElement}
  28568. * @since 3.12.0
  28569. */
  28570. this.canvas = CanvasPool.create(this, width, height);
  28571. /**
  28572. * The Context of the Canvas element that the TileSprite renders its fill pattern in to.
  28573. * Only used in Canvas mode.
  28574. *
  28575. * @name Phaser.GameObjects.TileSprite#context
  28576. * @type {CanvasRenderingContext2D}
  28577. * @since 3.12.0
  28578. */
  28579. this.context = this.canvas.getContext('2d');
  28580. /**
  28581. * The Texture the TileSprite is using as its fill pattern.
  28582. *
  28583. * @name Phaser.GameObjects.TileSprite#displayTexture
  28584. * @type {Phaser.Textures.Texture|Phaser.Textures.CanvasTexture}
  28585. * @private
  28586. * @since 3.12.0
  28587. */
  28588. this.displayTexture = displayTexture;
  28589. /**
  28590. * The Frame the TileSprite is using as its fill pattern.
  28591. *
  28592. * @name Phaser.GameObjects.TileSprite#displayFrame
  28593. * @type {Phaser.Textures.Frame}
  28594. * @private
  28595. * @since 3.12.0
  28596. */
  28597. this.displayFrame = displayFrame;
  28598. /**
  28599. * The internal crop data object, as used by `setCrop` and passed to the `Frame.setCropUVs` method.
  28600. *
  28601. * @name Phaser.GameObjects.TileSprite#_crop
  28602. * @type {object}
  28603. * @private
  28604. * @since 3.12.0
  28605. */
  28606. this._crop = this.resetCropObject();
  28607. /**
  28608. * The Texture this Game Object is using to render with.
  28609. *
  28610. * @name Phaser.GameObjects.TileSprite#texture
  28611. * @type {Phaser.Textures.Texture|Phaser.Textures.CanvasTexture}
  28612. * @since 3.0.0
  28613. */
  28614. this.texture = scene.sys.textures.addCanvas(null, this.canvas, true);
  28615. /**
  28616. * The Texture Frame this Game Object is using to render with.
  28617. *
  28618. * @name Phaser.GameObjects.TileSprite#frame
  28619. * @type {Phaser.Textures.Frame}
  28620. * @since 3.0.0
  28621. */
  28622. this.frame = this.texture.get();
  28623. /**
  28624. * The next power of two value from the width of the Fill Pattern frame.
  28625. *
  28626. * @name Phaser.GameObjects.TileSprite#potWidth
  28627. * @type {integer}
  28628. * @since 3.0.0
  28629. */
  28630. this.potWidth = GetPowerOfTwo(displayFrame.width);
  28631. /**
  28632. * The next power of two value from the height of the Fill Pattern frame.
  28633. *
  28634. * @name Phaser.GameObjects.TileSprite#potHeight
  28635. * @type {integer}
  28636. * @since 3.0.0
  28637. */
  28638. this.potHeight = GetPowerOfTwo(displayFrame.height);
  28639. /**
  28640. * The Canvas that the TileSprites texture is rendered to.
  28641. * This is used to create a WebGL texture from.
  28642. *
  28643. * @name Phaser.GameObjects.TileSprite#fillCanvas
  28644. * @type {HTMLCanvasElement}
  28645. * @since 3.12.0
  28646. */
  28647. this.fillCanvas = CanvasPool.create2D(this, this.potWidth, this.potHeight);
  28648. /**
  28649. * The Canvas Context used to render the TileSprites texture.
  28650. *
  28651. * @name Phaser.GameObjects.TileSprite#fillContext
  28652. * @type {CanvasRenderingContext2D}
  28653. * @since 3.12.0
  28654. */
  28655. this.fillContext = this.fillCanvas.getContext('2d');
  28656. /**
  28657. * The texture that the Tile Sprite is rendered to, which is then rendered to a Scene.
  28658. * In WebGL this is a WebGLTexture. In Canvas it's a Canvas Fill Pattern.
  28659. *
  28660. * @name Phaser.GameObjects.TileSprite#fillPattern
  28661. * @type {?(WebGLTexture|CanvasPattern)}
  28662. * @since 3.12.0
  28663. */
  28664. this.fillPattern = null;
  28665. this.setPosition(x, y);
  28666. this.setSize(width, height);
  28667. this.setFrame(frameKey);
  28668. this.setOriginFromFrame();
  28669. this.initPipeline();
  28670. if (scene.sys.game.config.renderType === CONST.WEBGL)
  28671. {
  28672. scene.sys.game.renderer.onContextRestored(function (renderer)
  28673. {
  28674. var gl = renderer.gl;
  28675. this.dirty = true;
  28676. this.fillPattern = null;
  28677. this.fillPattern = renderer.createTexture2D(0, gl.LINEAR, gl.LINEAR, gl.REPEAT, gl.REPEAT, gl.RGBA, this.fillCanvas, this.potWidth, this.potHeight);
  28678. }, this);
  28679. }
  28680. },
  28681. /**
  28682. * Sets the texture and frame this Game Object will use to render with.
  28683. *
  28684. * Textures are referenced by their string-based keys, as stored in the Texture Manager.
  28685. *
  28686. * @method Phaser.GameObjects.TileSprite#setTexture
  28687. * @since 3.0.0
  28688. *
  28689. * @param {string} key - The key of the texture to be used, as stored in the Texture Manager.
  28690. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  28691. *
  28692. * @return {this} This Game Object instance.
  28693. */
  28694. setTexture: function (key, frame)
  28695. {
  28696. this.displayTexture = this.scene.sys.textures.get(key);
  28697. return this.setFrame(frame);
  28698. },
  28699. /**
  28700. * Sets the frame this Game Object will use to render with.
  28701. *
  28702. * The Frame has to belong to the current Texture being used.
  28703. *
  28704. * It can be either a string or an index.
  28705. *
  28706. * @method Phaser.GameObjects.TileSprite#setFrame
  28707. * @since 3.0.0
  28708. *
  28709. * @param {(string|integer)} frame - The name or index of the frame within the Texture.
  28710. *
  28711. * @return {this} This Game Object instance.
  28712. */
  28713. setFrame: function (frame)
  28714. {
  28715. this.displayFrame = this.displayTexture.get(frame);
  28716. if (!this.displayFrame.cutWidth || !this.displayFrame.cutHeight)
  28717. {
  28718. this.renderFlags &= ~_FLAG;
  28719. }
  28720. else
  28721. {
  28722. this.renderFlags |= _FLAG;
  28723. }
  28724. this.dirty = true;
  28725. this.updateTileTexture();
  28726. return this;
  28727. },
  28728. /**
  28729. * Sets {@link Phaser.GameObjects.TileSprite#tilePositionX} and {@link Phaser.GameObjects.TileSprite#tilePositionY}.
  28730. *
  28731. * @method Phaser.GameObjects.TileSprite#setTilePosition
  28732. * @since 3.3.0
  28733. *
  28734. * @param {number} [x] - The x position of this sprite's tiling texture.
  28735. * @param {number} [y] - The y position of this sprite's tiling texture.
  28736. *
  28737. * @return {this} This Tile Sprite instance.
  28738. */
  28739. setTilePosition: function (x, y)
  28740. {
  28741. if (x !== undefined)
  28742. {
  28743. this.tilePositionX = x;
  28744. }
  28745. if (y !== undefined)
  28746. {
  28747. this.tilePositionY = y;
  28748. }
  28749. return this;
  28750. },
  28751. /**
  28752. * Sets {@link Phaser.GameObjects.TileSprite#tileScaleX} and {@link Phaser.GameObjects.TileSprite#tileScaleY}.
  28753. *
  28754. * @method Phaser.GameObjects.TileSprite#setTileScale
  28755. * @since 3.12.0
  28756. *
  28757. * @param {number} [x] - The horizontal scale of the tiling texture. If not given it will use the current `tileScaleX` value.
  28758. * @param {number} [y=x] - The vertical scale of the tiling texture. If not given it will use the `x` value.
  28759. *
  28760. * @return {this} This Tile Sprite instance.
  28761. */
  28762. setTileScale: function (x, y)
  28763. {
  28764. if (x === undefined) { x = this.tileScaleX; }
  28765. if (y === undefined) { y = x; }
  28766. this.tileScaleX = x;
  28767. this.tileScaleY = y;
  28768. return this;
  28769. },
  28770. /**
  28771. * Render the tile texture if it is dirty, or if the frame has changed.
  28772. *
  28773. * @method Phaser.GameObjects.TileSprite#updateTileTexture
  28774. * @private
  28775. * @since 3.0.0
  28776. */
  28777. updateTileTexture: function ()
  28778. {
  28779. if (!this.dirty || !this.renderer)
  28780. {
  28781. return;
  28782. }
  28783. // Draw the displayTexture to our fillCanvas
  28784. var frame = this.displayFrame;
  28785. var ctx = this.fillContext;
  28786. var canvas = this.fillCanvas;
  28787. var fw = this.potWidth;
  28788. var fh = this.potHeight;
  28789. if (!this.renderer.gl)
  28790. {
  28791. fw = frame.cutWidth;
  28792. fh = frame.cutHeight;
  28793. }
  28794. ctx.clearRect(0, 0, fw, fh);
  28795. canvas.width = fw;
  28796. canvas.height = fh;
  28797. ctx.drawImage(
  28798. frame.source.image,
  28799. frame.cutX, frame.cutY,
  28800. frame.cutWidth, frame.cutHeight,
  28801. 0, 0,
  28802. fw, fh
  28803. );
  28804. if (this.renderer.gl)
  28805. {
  28806. this.fillPattern = this.renderer.canvasToTexture(canvas, this.fillPattern);
  28807. }
  28808. else
  28809. {
  28810. this.fillPattern = ctx.createPattern(canvas, 'repeat');
  28811. }
  28812. this.updateCanvas();
  28813. this.dirty = false;
  28814. },
  28815. /**
  28816. * Draw the fill pattern to the internal canvas.
  28817. *
  28818. * @method Phaser.GameObjects.TileSprite#updateCanvas
  28819. * @private
  28820. * @since 3.12.0
  28821. */
  28822. updateCanvas: function ()
  28823. {
  28824. var canvas = this.canvas;
  28825. if (canvas.width !== this.width || canvas.height !== this.height)
  28826. {
  28827. canvas.width = this.width;
  28828. canvas.height = this.height;
  28829. this.frame.setSize(this.width, this.height);
  28830. this.updateDisplayOrigin();
  28831. this.dirty = true;
  28832. }
  28833. if (!this.dirty || this.renderer && this.renderer.gl)
  28834. {
  28835. this.dirty = false;
  28836. return;
  28837. }
  28838. var ctx = this.context;
  28839. if (!this.scene.sys.game.config.antialias)
  28840. {
  28841. Smoothing.disable(ctx);
  28842. }
  28843. var scaleX = this._tileScale.x;
  28844. var scaleY = this._tileScale.y;
  28845. var positionX = this._tilePosition.x;
  28846. var positionY = this._tilePosition.y;
  28847. ctx.clearRect(0, 0, this.width, this.height);
  28848. ctx.save();
  28849. ctx.scale(scaleX, scaleY);
  28850. ctx.translate(-positionX, -positionY);
  28851. ctx.fillStyle = this.fillPattern;
  28852. ctx.fillRect(positionX, positionY, this.width / scaleX, this.height / scaleY);
  28853. ctx.restore();
  28854. this.dirty = false;
  28855. },
  28856. /**
  28857. * Internal destroy handler, called as part of the destroy process.
  28858. *
  28859. * @method Phaser.GameObjects.TileSprite#preDestroy
  28860. * @protected
  28861. * @since 3.9.0
  28862. */
  28863. preDestroy: function ()
  28864. {
  28865. if (this.renderer && this.renderer.gl)
  28866. {
  28867. this.renderer.deleteTexture(this.fillPattern);
  28868. }
  28869. CanvasPool.remove(this.canvas);
  28870. CanvasPool.remove(this.fillCanvas);
  28871. this.fillPattern = null;
  28872. this.fillContext = null;
  28873. this.fillCanvas = null;
  28874. this.displayTexture = null;
  28875. this.displayFrame = null;
  28876. this.texture.destroy();
  28877. this.renderer = null;
  28878. },
  28879. /**
  28880. * The horizontal scroll position of the Tile Sprite.
  28881. *
  28882. * @name Phaser.GameObjects.TileSprite#tilePositionX
  28883. * @type {number}
  28884. * @default 0
  28885. * @since 3.0.0
  28886. */
  28887. tilePositionX: {
  28888. get: function ()
  28889. {
  28890. return this._tilePosition.x;
  28891. },
  28892. set: function (value)
  28893. {
  28894. this._tilePosition.x = value;
  28895. this.dirty = true;
  28896. }
  28897. },
  28898. /**
  28899. * The vertical scroll position of the Tile Sprite.
  28900. *
  28901. * @name Phaser.GameObjects.TileSprite#tilePositionY
  28902. * @type {number}
  28903. * @default 0
  28904. * @since 3.0.0
  28905. */
  28906. tilePositionY: {
  28907. get: function ()
  28908. {
  28909. return this._tilePosition.y;
  28910. },
  28911. set: function (value)
  28912. {
  28913. this._tilePosition.y = value;
  28914. this.dirty = true;
  28915. }
  28916. },
  28917. /**
  28918. * The horizontal scale of the Tile Sprite texture.
  28919. *
  28920. * @name Phaser.GameObjects.TileSprite#tileScaleX
  28921. * @type {number}
  28922. * @default 1
  28923. * @since 3.11.0
  28924. */
  28925. tileScaleX: {
  28926. get: function ()
  28927. {
  28928. return this._tileScale.x;
  28929. },
  28930. set: function (value)
  28931. {
  28932. this._tileScale.x = value;
  28933. this.dirty = true;
  28934. }
  28935. },
  28936. /**
  28937. * The vertical scale of the Tile Sprite texture.
  28938. *
  28939. * @name Phaser.GameObjects.TileSprite#tileScaleY
  28940. * @type {number}
  28941. * @default 1
  28942. * @since 3.11.0
  28943. */
  28944. tileScaleY: {
  28945. get: function ()
  28946. {
  28947. return this._tileScale.y;
  28948. },
  28949. set: function (value)
  28950. {
  28951. this._tileScale.y = value;
  28952. this.dirty = true;
  28953. }
  28954. }
  28955. });
  28956. module.exports = TileSprite;
  28957. /***/ }),
  28958. /* 163 */
  28959. /***/ (function(module, exports, __webpack_require__) {
  28960. /**
  28961. * @author Richard Davey <rich@photonstorm.com>
  28962. * @copyright 2019 Photon Storm Ltd.
  28963. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28964. */
  28965. var AddToDOM = __webpack_require__(179);
  28966. var CanvasPool = __webpack_require__(24);
  28967. var Class = __webpack_require__(0);
  28968. var Components = __webpack_require__(13);
  28969. var CONST = __webpack_require__(28);
  28970. var GameObject = __webpack_require__(18);
  28971. var GetTextSize = __webpack_require__(834);
  28972. var GetValue = __webpack_require__(4);
  28973. var RemoveFromDOM = __webpack_require__(343);
  28974. var TextRender = __webpack_require__(833);
  28975. var TextStyle = __webpack_require__(830);
  28976. /**
  28977. * @classdesc
  28978. * A Text Game Object.
  28979. *
  28980. * Text objects work by creating their own internal hidden Canvas and then renders text to it using
  28981. * the standard Canvas `fillText` API. It then creates a texture from this canvas which is rendered
  28982. * to your game during the render pass.
  28983. *
  28984. * Because it uses the Canvas API you can take advantage of all the features this offers, such as
  28985. * applying gradient fills to the text, or strokes, shadows and more. You can also use custom fonts
  28986. * loaded externally, such as Google or TypeKit Web fonts.
  28987. *
  28988. * **Important:** If the font you wish to use has a space or digit in its name, such as
  28989. * 'Press Start 2P' or 'Roboto Condensed', then you _must_ put the font name in quotes, either
  28990. * when creating the Text object, or when setting the font via `setFont` or `setFontFamily`. I.e.:
  28991. *
  28992. * ```javascript
  28993. * this.add.text(0, 0, 'Hello World', { fontFamily: '"Roboto Condensed"' });
  28994. * ```
  28995. *
  28996. * Equally, if you wish to provide a list of fallback fonts, then you should ensure they are all
  28997. * quoted properly, too:
  28998. *
  28999. * ```javascript
  29000. * this.add.text(0, 0, 'Hello World', { fontFamily: 'Verdana, "Times New Roman", Tahoma, serif' });
  29001. * ```
  29002. *
  29003. * You can only display fonts that are currently loaded and available to the browser: therefore fonts must
  29004. * be pre-loaded. Phaser does not do ths for you, so you will require the use of a 3rd party font loader,
  29005. * or have the fonts ready available in the CSS on the page in which your Phaser game resides.
  29006. *
  29007. * See {@link http://www.jordanm.co.uk/tinytype this compatibility table} for the available default fonts
  29008. * across mobile browsers.
  29009. *
  29010. * A note on performance: Every time the contents of a Text object changes, i.e. changing the text being
  29011. * displayed, or the style of the text, it needs to remake the Text canvas, and if on WebGL, re-upload the
  29012. * new texture to the GPU. This can be an expensive operation if used often, or with large quantities of
  29013. * Text objects in your game. If you run into performance issues you would be better off using Bitmap Text
  29014. * instead, as it benefits from batching and avoids expensive Canvas API calls.
  29015. *
  29016. * @class Text
  29017. * @extends Phaser.GameObjects.GameObject
  29018. * @memberof Phaser.GameObjects
  29019. * @constructor
  29020. * @since 3.0.0
  29021. *
  29022. * @extends Phaser.GameObjects.Components.Alpha
  29023. * @extends Phaser.GameObjects.Components.BlendMode
  29024. * @extends Phaser.GameObjects.Components.ComputedSize
  29025. * @extends Phaser.GameObjects.Components.Crop
  29026. * @extends Phaser.GameObjects.Components.Depth
  29027. * @extends Phaser.GameObjects.Components.Flip
  29028. * @extends Phaser.GameObjects.Components.GetBounds
  29029. * @extends Phaser.GameObjects.Components.Mask
  29030. * @extends Phaser.GameObjects.Components.Origin
  29031. * @extends Phaser.GameObjects.Components.Pipeline
  29032. * @extends Phaser.GameObjects.Components.ScaleMode
  29033. * @extends Phaser.GameObjects.Components.ScrollFactor
  29034. * @extends Phaser.GameObjects.Components.Tint
  29035. * @extends Phaser.GameObjects.Components.Transform
  29036. * @extends Phaser.GameObjects.Components.Visible
  29037. *
  29038. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  29039. * @param {number} x - The horizontal position of this Game Object in the world.
  29040. * @param {number} y - The vertical position of this Game Object in the world.
  29041. * @param {(string|string[])} text - The text this Text object will display.
  29042. * @param {object} style - The text style configuration object.
  29043. */
  29044. var Text = new Class({
  29045. Extends: GameObject,
  29046. Mixins: [
  29047. Components.Alpha,
  29048. Components.BlendMode,
  29049. Components.ComputedSize,
  29050. Components.Crop,
  29051. Components.Depth,
  29052. Components.Flip,
  29053. Components.GetBounds,
  29054. Components.Mask,
  29055. Components.Origin,
  29056. Components.Pipeline,
  29057. Components.ScaleMode,
  29058. Components.ScrollFactor,
  29059. Components.Tint,
  29060. Components.Transform,
  29061. Components.Visible,
  29062. TextRender
  29063. ],
  29064. initialize:
  29065. function Text (scene, x, y, text, style)
  29066. {
  29067. if (x === undefined) { x = 0; }
  29068. if (y === undefined) { y = 0; }
  29069. GameObject.call(this, scene, 'Text');
  29070. /**
  29071. * The renderer in use by this Text object.
  29072. *
  29073. * @name Phaser.GameObjects.Text#renderer
  29074. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  29075. * @since 3.12.0
  29076. */
  29077. this.renderer = scene.sys.game.renderer;
  29078. this.setPosition(x, y);
  29079. this.setOrigin(0, 0);
  29080. this.initPipeline();
  29081. /**
  29082. * The canvas element that the text is rendered to.
  29083. *
  29084. * @name Phaser.GameObjects.Text#canvas
  29085. * @type {HTMLCanvasElement}
  29086. * @since 3.0.0
  29087. */
  29088. this.canvas = CanvasPool.create(this);
  29089. /**
  29090. * The context of the canvas element that the text is rendered to.
  29091. *
  29092. * @name Phaser.GameObjects.Text#context
  29093. * @type {CanvasRenderingContext2D}
  29094. * @since 3.0.0
  29095. */
  29096. this.context = this.canvas.getContext('2d');
  29097. /**
  29098. * The Text Style object.
  29099. *
  29100. * Manages the style of this Text object.
  29101. *
  29102. * @name Phaser.GameObjects.Text#style
  29103. * @type {Phaser.GameObjects.TextStyle}
  29104. * @since 3.0.0
  29105. */
  29106. this.style = new TextStyle(this, style);
  29107. /**
  29108. * Whether to automatically round line positions.
  29109. *
  29110. * @name Phaser.GameObjects.Text#autoRound
  29111. * @type {boolean}
  29112. * @default true
  29113. * @since 3.0.0
  29114. */
  29115. this.autoRound = true;
  29116. /**
  29117. * The Regular Expression that is used to split the text up into lines, in
  29118. * multi-line text. By default this is `/(?:\r\n|\r|\n)/`.
  29119. * You can change this RegExp to be anything else that you may need.
  29120. *
  29121. * @name Phaser.GameObjects.Text#splitRegExp
  29122. * @type {object}
  29123. * @since 3.0.0
  29124. */
  29125. this.splitRegExp = /(?:\r\n|\r|\n)/;
  29126. /**
  29127. * The text to display.
  29128. *
  29129. * @name Phaser.GameObjects.Text#_text
  29130. * @type {string}
  29131. * @private
  29132. * @since 3.12.0
  29133. */
  29134. this._text = '';
  29135. /**
  29136. * Specify a padding value which is added to the line width and height when calculating the Text size.
  29137. * Allows you to add extra spacing if the browser is unable to accurately determine the true font dimensions.
  29138. *
  29139. * @name Phaser.GameObjects.Text#padding
  29140. * @type {{left:number,right:number,top:number,bottom:number}}
  29141. * @since 3.0.0
  29142. */
  29143. this.padding = { left: 0, right: 0, top: 0, bottom: 0 };
  29144. /**
  29145. * The width of this Text object.
  29146. *
  29147. * @name Phaser.GameObjects.Text#width
  29148. * @type {number}
  29149. * @default 1
  29150. * @since 3.0.0
  29151. */
  29152. this.width = 1;
  29153. /**
  29154. * The height of this Text object.
  29155. *
  29156. * @name Phaser.GameObjects.Text#height
  29157. * @type {number}
  29158. * @default 1
  29159. * @since 3.0.0
  29160. */
  29161. this.height = 1;
  29162. /**
  29163. * The line spacing value.
  29164. * This value is added to the font height to calculate the overall line height.
  29165. * Only has an effect if this Text object contains multiple lines of text.
  29166. *
  29167. * If you update this property directly, instead of using the `setLineSpacing` method, then
  29168. * be sure to call `updateText` after, or you won't see the change reflected in the Text object.
  29169. *
  29170. * @name Phaser.GameObjects.Text#lineSpacing
  29171. * @type {number}
  29172. * @since 3.13.0
  29173. */
  29174. this.lineSpacing = 0;
  29175. /**
  29176. * Whether the text or its settings have changed and need updating.
  29177. *
  29178. * @name Phaser.GameObjects.Text#dirty
  29179. * @type {boolean}
  29180. * @default false
  29181. * @since 3.0.0
  29182. */
  29183. this.dirty = false;
  29184. // If resolution wasn't set, then we get it from the game config
  29185. if (this.style.resolution === 0)
  29186. {
  29187. this.style.resolution = scene.sys.game.config.resolution;
  29188. }
  29189. /**
  29190. * The internal crop data object, as used by `setCrop` and passed to the `Frame.setCropUVs` method.
  29191. *
  29192. * @name Phaser.GameObjects.Text#_crop
  29193. * @type {object}
  29194. * @private
  29195. * @since 3.12.0
  29196. */
  29197. this._crop = this.resetCropObject();
  29198. // Create a Texture for this Text object
  29199. this.texture = scene.sys.textures.addCanvas(null, this.canvas, true);
  29200. // Get the frame
  29201. this.frame = this.texture.get();
  29202. // Set the resolution
  29203. this.frame.source.resolution = this.style.resolution;
  29204. if (this.renderer && this.renderer.gl)
  29205. {
  29206. // Clear the default 1x1 glTexture, as we override it later
  29207. this.renderer.deleteTexture(this.frame.source.glTexture);
  29208. this.frame.source.glTexture = null;
  29209. }
  29210. this.initRTL();
  29211. if (style && style.padding)
  29212. {
  29213. this.setPadding(style.padding);
  29214. }
  29215. if (style && style.lineSpacing)
  29216. {
  29217. this.lineSpacing = style.lineSpacing;
  29218. }
  29219. this.setText(text);
  29220. if (scene.sys.game.config.renderType === CONST.WEBGL)
  29221. {
  29222. scene.sys.game.renderer.onContextRestored(function ()
  29223. {
  29224. this.dirty = true;
  29225. }, this);
  29226. }
  29227. },
  29228. /**
  29229. * Initialize right to left text.
  29230. *
  29231. * @method Phaser.GameObjects.Text#initRTL
  29232. * @since 3.0.0
  29233. */
  29234. initRTL: function ()
  29235. {
  29236. if (!this.style.rtl)
  29237. {
  29238. return;
  29239. }
  29240. // Here is where the crazy starts.
  29241. //
  29242. // Due to browser implementation issues, you cannot fillText BiDi text to a canvas
  29243. // that is not part of the DOM. It just completely ignores the direction property.
  29244. this.canvas.dir = 'rtl';
  29245. // Experimental atm, but one day ...
  29246. this.context.direction = 'rtl';
  29247. // Add it to the DOM, but hidden within the parent canvas.
  29248. this.canvas.style.display = 'none';
  29249. AddToDOM(this.canvas, this.scene.sys.canvas);
  29250. // And finally we set the x origin
  29251. this.originX = 1;
  29252. },
  29253. /**
  29254. * Greedy wrapping algorithm that will wrap words as the line grows longer than its horizontal
  29255. * bounds.
  29256. *
  29257. * @method Phaser.GameObjects.Text#runWordWrap
  29258. * @since 3.0.0
  29259. *
  29260. * @param {string} text - The text to perform word wrap detection against.
  29261. *
  29262. * @return {string} The text after wrapping has been applied.
  29263. */
  29264. runWordWrap: function (text)
  29265. {
  29266. var style = this.style;
  29267. if (style.wordWrapCallback)
  29268. {
  29269. var wrappedLines = style.wordWrapCallback.call(style.wordWrapCallbackScope, text, this);
  29270. if (Array.isArray(wrappedLines))
  29271. {
  29272. wrappedLines = wrappedLines.join('\n');
  29273. }
  29274. return wrappedLines;
  29275. }
  29276. else if (style.wordWrapWidth)
  29277. {
  29278. if (style.wordWrapUseAdvanced)
  29279. {
  29280. return this.advancedWordWrap(text, this.context, this.style.wordWrapWidth);
  29281. }
  29282. else
  29283. {
  29284. return this.basicWordWrap(text, this.context, this.style.wordWrapWidth);
  29285. }
  29286. }
  29287. else
  29288. {
  29289. return text;
  29290. }
  29291. },
  29292. /**
  29293. * Advanced wrapping algorithm that will wrap words as the line grows longer than its horizontal
  29294. * bounds. Consecutive spaces will be collapsed and replaced with a single space. Lines will be
  29295. * trimmed of white space before processing. Throws an error if wordWrapWidth is less than a
  29296. * single character.
  29297. *
  29298. * @method Phaser.GameObjects.Text#advancedWordWrap
  29299. * @since 3.0.0
  29300. *
  29301. * @param {string} text - The text to perform word wrap detection against.
  29302. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  29303. * @param {number} wordWrapWidth - The word wrap width.
  29304. *
  29305. * @return {string} The wrapped text.
  29306. */
  29307. advancedWordWrap: function (text, context, wordWrapWidth)
  29308. {
  29309. var output = '';
  29310. // Condense consecutive spaces and split into lines
  29311. var lines = text
  29312. .replace(/ +/gi, ' ')
  29313. .split(this.splitRegExp);
  29314. var linesCount = lines.length;
  29315. for (var i = 0; i < linesCount; i++)
  29316. {
  29317. var line = lines[i];
  29318. var out = '';
  29319. // Trim whitespace
  29320. line = line.replace(/^ *|\s*$/gi, '');
  29321. // If entire line is less than wordWrapWidth append the entire line and exit early
  29322. var lineWidth = context.measureText(line).width;
  29323. if (lineWidth < wordWrapWidth)
  29324. {
  29325. output += line + '\n';
  29326. continue;
  29327. }
  29328. // Otherwise, calculate new lines
  29329. var currentLineWidth = wordWrapWidth;
  29330. // Split into words
  29331. var words = line.split(' ');
  29332. for (var j = 0; j < words.length; j++)
  29333. {
  29334. var word = words[j];
  29335. var wordWithSpace = word + ' ';
  29336. var wordWidth = context.measureText(wordWithSpace).width;
  29337. if (wordWidth > currentLineWidth)
  29338. {
  29339. // Break word
  29340. if (j === 0)
  29341. {
  29342. // Shave off letters from word until it's small enough
  29343. var newWord = wordWithSpace;
  29344. while (newWord.length)
  29345. {
  29346. newWord = newWord.slice(0, -1);
  29347. wordWidth = context.measureText(newWord).width;
  29348. if (wordWidth <= currentLineWidth)
  29349. {
  29350. break;
  29351. }
  29352. }
  29353. // If wordWrapWidth is too small for even a single letter, shame user
  29354. // failure with a fatal error
  29355. if (!newWord.length)
  29356. {
  29357. throw new Error('This text\'s wordWrapWidth setting is less than a single character!');
  29358. }
  29359. // Replace current word in array with remainder
  29360. var secondPart = word.substr(newWord.length);
  29361. words[j] = secondPart;
  29362. // Append first piece to output
  29363. out += newWord;
  29364. }
  29365. // If existing word length is 0, don't include it
  29366. var offset = (words[j].length) ? j : j + 1;
  29367. // Collapse rest of sentence and remove any trailing white space
  29368. var remainder = words.slice(offset).join(' ')
  29369. .replace(/[ \n]*$/gi, '');
  29370. // Prepend remainder to next line
  29371. lines[i + 1] = remainder + ' ' + (lines[i + 1] || '');
  29372. linesCount = lines.length;
  29373. break; // Processing on this line
  29374. // Append word with space to output
  29375. }
  29376. else
  29377. {
  29378. out += wordWithSpace;
  29379. currentLineWidth -= wordWidth;
  29380. }
  29381. }
  29382. // Append processed line to output
  29383. output += out.replace(/[ \n]*$/gi, '') + '\n';
  29384. }
  29385. // Trim the end of the string
  29386. output = output.replace(/[\s|\n]*$/gi, '');
  29387. return output;
  29388. },
  29389. /**
  29390. * Greedy wrapping algorithm that will wrap words as the line grows longer than its horizontal
  29391. * bounds. Spaces are not collapsed and whitespace is not trimmed.
  29392. *
  29393. * @method Phaser.GameObjects.Text#basicWordWrap
  29394. * @since 3.0.0
  29395. *
  29396. * @param {string} text - The text to perform word wrap detection against.
  29397. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  29398. * @param {number} wordWrapWidth - The word wrap width.
  29399. *
  29400. * @return {string} The wrapped text.
  29401. */
  29402. basicWordWrap: function (text, context, wordWrapWidth)
  29403. {
  29404. var result = '';
  29405. var lines = text.split(this.splitRegExp);
  29406. for (var i = 0; i < lines.length; i++)
  29407. {
  29408. var spaceLeft = wordWrapWidth;
  29409. var words = lines[i].split(' ');
  29410. for (var j = 0; j < words.length; j++)
  29411. {
  29412. var wordWidth = context.measureText(words[j]).width;
  29413. var wordWidthWithSpace = wordWidth + context.measureText(' ').width;
  29414. if (wordWidthWithSpace > spaceLeft)
  29415. {
  29416. // Skip printing the newline if it's the first word of the line that is greater
  29417. // than the word wrap width.
  29418. if (j > 0)
  29419. {
  29420. result += '\n';
  29421. }
  29422. result += words[j] + ' ';
  29423. spaceLeft = wordWrapWidth - wordWidth;
  29424. }
  29425. else
  29426. {
  29427. spaceLeft -= wordWidthWithSpace;
  29428. result += words[j];
  29429. if (j < (words.length - 1))
  29430. {
  29431. result += ' ';
  29432. }
  29433. }
  29434. }
  29435. if (i < lines.length - 1)
  29436. {
  29437. result += '\n';
  29438. }
  29439. }
  29440. return result;
  29441. },
  29442. /**
  29443. * Runs the given text through this Text objects word wrapping and returns the results as an
  29444. * array, where each element of the array corresponds to a wrapped line of text.
  29445. *
  29446. * @method Phaser.GameObjects.Text#getWrappedText
  29447. * @since 3.0.0
  29448. *
  29449. * @param {string} text - The text for which the wrapping will be calculated. If unspecified, the Text objects current text will be used.
  29450. *
  29451. * @return {string[]} An array of strings with the pieces of wrapped text.
  29452. */
  29453. getWrappedText: function (text)
  29454. {
  29455. if (text === undefined) { text = this._text; }
  29456. this.style.syncFont(this.canvas, this.context);
  29457. var wrappedLines = this.runWordWrap(text);
  29458. return wrappedLines.split(this.splitRegExp);
  29459. },
  29460. /**
  29461. * Set the text to display.
  29462. *
  29463. * An array of strings will be joined with `\n` line breaks.
  29464. *
  29465. * @method Phaser.GameObjects.Text#setText
  29466. * @since 3.0.0
  29467. *
  29468. * @param {(string|string[])} value - The string, or array of strings, to be set as the content of this Text object.
  29469. *
  29470. * @return {Phaser.GameObjects.Text} This Text object.
  29471. */
  29472. setText: function (value)
  29473. {
  29474. if (!value && value !== 0)
  29475. {
  29476. value = '';
  29477. }
  29478. if (Array.isArray(value))
  29479. {
  29480. value = value.join('\n');
  29481. }
  29482. if (value !== this._text)
  29483. {
  29484. this._text = value.toString();
  29485. this.updateText();
  29486. }
  29487. return this;
  29488. },
  29489. /**
  29490. * Set the text style.
  29491. *
  29492. * @example
  29493. * text.setStyle({
  29494. * fontSize: '64px',
  29495. * fontFamily: 'Arial',
  29496. * color: '#ffffff',
  29497. * align: 'center',
  29498. * backgroundColor: '#ff00ff'
  29499. * });
  29500. *
  29501. * @method Phaser.GameObjects.Text#setStyle
  29502. * @since 3.0.0
  29503. *
  29504. * @param {object} style - The style settings to set.
  29505. *
  29506. * @return {Phaser.GameObjects.Text} This Text object.
  29507. */
  29508. setStyle: function (style)
  29509. {
  29510. return this.style.setStyle(style);
  29511. },
  29512. /**
  29513. * Set the font.
  29514. *
  29515. * If a string is given, the font family is set.
  29516. *
  29517. * If an object is given, the `fontFamily`, `fontSize` and `fontStyle`
  29518. * properties of that object are set.
  29519. *
  29520. * **Important:** If the font you wish to use has a space or digit in its name, such as
  29521. * 'Press Start 2P' or 'Roboto Condensed', then you _must_ put the font name in quotes:
  29522. *
  29523. * ```javascript
  29524. * Text.setFont('"Roboto Condensed"');
  29525. * ```
  29526. *
  29527. * Equally, if you wish to provide a list of fallback fonts, then you should ensure they are all
  29528. * quoted properly, too:
  29529. *
  29530. * ```javascript
  29531. * Text.setFont('Verdana, "Times New Roman", Tahoma, serif');
  29532. * ```
  29533. *
  29534. * @method Phaser.GameObjects.Text#setFont
  29535. * @since 3.0.0
  29536. *
  29537. * @param {string} font - The font family or font settings to set.
  29538. *
  29539. * @return {Phaser.GameObjects.Text} This Text object.
  29540. */
  29541. setFont: function (font)
  29542. {
  29543. return this.style.setFont(font);
  29544. },
  29545. /**
  29546. * Set the font family.
  29547. *
  29548. * **Important:** If the font you wish to use has a space or digit in its name, such as
  29549. * 'Press Start 2P' or 'Roboto Condensed', then you _must_ put the font name in quotes:
  29550. *
  29551. * ```javascript
  29552. * Text.setFont('"Roboto Condensed"');
  29553. * ```
  29554. *
  29555. * Equally, if you wish to provide a list of fallback fonts, then you should ensure they are all
  29556. * quoted properly, too:
  29557. *
  29558. * ```javascript
  29559. * Text.setFont('Verdana, "Times New Roman", Tahoma, serif');
  29560. * ```
  29561. *
  29562. * @method Phaser.GameObjects.Text#setFontFamily
  29563. * @since 3.0.0
  29564. *
  29565. * @param {string} family - The font family.
  29566. *
  29567. * @return {Phaser.GameObjects.Text} This Text object.
  29568. */
  29569. setFontFamily: function (family)
  29570. {
  29571. return this.style.setFontFamily(family);
  29572. },
  29573. /**
  29574. * Set the font size.
  29575. *
  29576. * @method Phaser.GameObjects.Text#setFontSize
  29577. * @since 3.0.0
  29578. *
  29579. * @param {number} size - The font size.
  29580. *
  29581. * @return {Phaser.GameObjects.Text} This Text object.
  29582. */
  29583. setFontSize: function (size)
  29584. {
  29585. return this.style.setFontSize(size);
  29586. },
  29587. /**
  29588. * Set the font style.
  29589. *
  29590. * @method Phaser.GameObjects.Text#setFontStyle
  29591. * @since 3.0.0
  29592. *
  29593. * @param {string} style - The font style.
  29594. *
  29595. * @return {Phaser.GameObjects.Text} This Text object.
  29596. */
  29597. setFontStyle: function (style)
  29598. {
  29599. return this.style.setFontStyle(style);
  29600. },
  29601. /**
  29602. * Set a fixed width and height for the text.
  29603. *
  29604. * Pass in `0` for either of these parameters to disable fixed width or height respectively.
  29605. *
  29606. * @method Phaser.GameObjects.Text#setFixedSize
  29607. * @since 3.0.0
  29608. *
  29609. * @param {number} width - The fixed width to set. `0` disables fixed width.
  29610. * @param {number} height - The fixed height to set. `0` disables fixed height.
  29611. *
  29612. * @return {Phaser.GameObjects.Text} This Text object.
  29613. */
  29614. setFixedSize: function (width, height)
  29615. {
  29616. return this.style.setFixedSize(width, height);
  29617. },
  29618. /**
  29619. * Set the background color.
  29620. *
  29621. * @method Phaser.GameObjects.Text#setBackgroundColor
  29622. * @since 3.0.0
  29623. *
  29624. * @param {string} color - The background color.
  29625. *
  29626. * @return {Phaser.GameObjects.Text} This Text object.
  29627. */
  29628. setBackgroundColor: function (color)
  29629. {
  29630. return this.style.setBackgroundColor(color);
  29631. },
  29632. /**
  29633. * Set the fill style to be used by the Text object.
  29634. *
  29635. * This can be any valid CanvasRenderingContext2D fillStyle value, such as
  29636. * a color (in hex, rgb, rgba, hsl or named values), a gradient or a pattern.
  29637. *
  29638. * See the [MDN fillStyle docs](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle) for more details.
  29639. *
  29640. * @method Phaser.GameObjects.Text#setFill
  29641. * @since 3.0.0
  29642. *
  29643. * @param {(string|any)} color - The text fill style. Can be any valid CanvasRenderingContext `fillStyle` value.
  29644. *
  29645. * @return {Phaser.GameObjects.Text} This Text object.
  29646. */
  29647. setFill: function (fillStyle)
  29648. {
  29649. return this.style.setFill(fillStyle);
  29650. },
  29651. /**
  29652. * Set the text fill color.
  29653. *
  29654. * @method Phaser.GameObjects.Text#setColor
  29655. * @since 3.0.0
  29656. *
  29657. * @param {string} color - The text fill color.
  29658. *
  29659. * @return {Phaser.GameObjects.Text} This Text object.
  29660. */
  29661. setColor: function (color)
  29662. {
  29663. return this.style.setColor(color);
  29664. },
  29665. /**
  29666. * Set the stroke settings.
  29667. *
  29668. * @method Phaser.GameObjects.Text#setStroke
  29669. * @since 3.0.0
  29670. *
  29671. * @param {string} color - The stroke color.
  29672. * @param {number} thickness - The stroke thickness.
  29673. *
  29674. * @return {Phaser.GameObjects.Text} This Text object.
  29675. */
  29676. setStroke: function (color, thickness)
  29677. {
  29678. return this.style.setStroke(color, thickness);
  29679. },
  29680. /**
  29681. * Set the shadow settings.
  29682. *
  29683. * @method Phaser.GameObjects.Text#setShadow
  29684. * @since 3.0.0
  29685. *
  29686. * @param {number} [x=0] - The horizontal shadow offset.
  29687. * @param {number} [y=0] - The vertical shadow offset.
  29688. * @param {string} [color='#000'] - The shadow color.
  29689. * @param {number} [blur=0] - The shadow blur radius.
  29690. * @param {boolean} [shadowStroke=false] - Whether to stroke the shadow.
  29691. * @param {boolean} [shadowFill=true] - Whether to fill the shadow.
  29692. *
  29693. * @return {Phaser.GameObjects.Text} This Text object.
  29694. */
  29695. setShadow: function (x, y, color, blur, shadowStroke, shadowFill)
  29696. {
  29697. return this.style.setShadow(x, y, color, blur, shadowStroke, shadowFill);
  29698. },
  29699. /**
  29700. * Set the shadow offset.
  29701. *
  29702. * @method Phaser.GameObjects.Text#setShadowOffset
  29703. * @since 3.0.0
  29704. *
  29705. * @param {number} x - The horizontal shadow offset.
  29706. * @param {number} y - The vertical shadow offset.
  29707. *
  29708. * @return {Phaser.GameObjects.Text} This Text object.
  29709. */
  29710. setShadowOffset: function (x, y)
  29711. {
  29712. return this.style.setShadowOffset(x, y);
  29713. },
  29714. /**
  29715. * Set the shadow color.
  29716. *
  29717. * @method Phaser.GameObjects.Text#setShadowColor
  29718. * @since 3.0.0
  29719. *
  29720. * @param {string} color - The shadow color.
  29721. *
  29722. * @return {Phaser.GameObjects.Text} This Text object.
  29723. */
  29724. setShadowColor: function (color)
  29725. {
  29726. return this.style.setShadowColor(color);
  29727. },
  29728. /**
  29729. * Set the shadow blur radius.
  29730. *
  29731. * @method Phaser.GameObjects.Text#setShadowBlur
  29732. * @since 3.0.0
  29733. *
  29734. * @param {number} blur - The shadow blur radius.
  29735. *
  29736. * @return {Phaser.GameObjects.Text} This Text object.
  29737. */
  29738. setShadowBlur: function (blur)
  29739. {
  29740. return this.style.setShadowBlur(blur);
  29741. },
  29742. /**
  29743. * Enable or disable shadow stroke.
  29744. *
  29745. * @method Phaser.GameObjects.Text#setShadowStroke
  29746. * @since 3.0.0
  29747. *
  29748. * @param {boolean} enabled - Whether shadow stroke is enabled or not.
  29749. *
  29750. * @return {Phaser.GameObjects.Text} This Text object.
  29751. */
  29752. setShadowStroke: function (enabled)
  29753. {
  29754. return this.style.setShadowStroke(enabled);
  29755. },
  29756. /**
  29757. * Enable or disable shadow fill.
  29758. *
  29759. * @method Phaser.GameObjects.Text#setShadowFill
  29760. * @since 3.0.0
  29761. *
  29762. * @param {boolean} enabled - Whether shadow fill is enabled or not.
  29763. *
  29764. * @return {Phaser.GameObjects.Text} This Text object.
  29765. */
  29766. setShadowFill: function (enabled)
  29767. {
  29768. return this.style.setShadowFill(enabled);
  29769. },
  29770. /**
  29771. * Set the width (in pixels) to use for wrapping lines. Pass in null to remove wrapping by width.
  29772. *
  29773. * @method Phaser.GameObjects.Text#setWordWrapWidth
  29774. * @since 3.0.0
  29775. *
  29776. * @param {?number} width - The maximum width of a line in pixels. Set to null to remove wrapping.
  29777. * @param {boolean} [useAdvancedWrap=false] - Whether or not to use the advanced wrapping
  29778. * algorithm. If true, spaces are collapsed and whitespace is trimmed from lines. If false,
  29779. * spaces and whitespace are left as is.
  29780. *
  29781. * @return {Phaser.GameObjects.Text} This Text object.
  29782. */
  29783. setWordWrapWidth: function (width, useAdvancedWrap)
  29784. {
  29785. return this.style.setWordWrapWidth(width, useAdvancedWrap);
  29786. },
  29787. /**
  29788. * Set a custom callback for wrapping lines. Pass in null to remove wrapping by callback.
  29789. *
  29790. * @method Phaser.GameObjects.Text#setWordWrapCallback
  29791. * @since 3.0.0
  29792. *
  29793. * @param {TextStyleWordWrapCallback} callback - A custom function that will be responsible for wrapping the
  29794. * text. It will receive two arguments: text (the string to wrap), textObject (this Text
  29795. * instance). It should return the wrapped lines either as an array of lines or as a string with
  29796. * newline characters in place to indicate where breaks should happen.
  29797. * @param {object} [scope=null] - The scope that will be applied when the callback is invoked.
  29798. *
  29799. * @return {Phaser.GameObjects.Text} This Text object.
  29800. */
  29801. setWordWrapCallback: function (callback, scope)
  29802. {
  29803. return this.style.setWordWrapCallback(callback, scope);
  29804. },
  29805. /**
  29806. * Set the text alignment.
  29807. *
  29808. * Expects values like `'left'`, `'right'`, `'center'` or `'justified'`.
  29809. *
  29810. * @method Phaser.GameObjects.Text#setAlign
  29811. * @since 3.0.0
  29812. *
  29813. * @param {string} align - The text alignment.
  29814. *
  29815. * @return {Phaser.GameObjects.Text} This Text object.
  29816. */
  29817. setAlign: function (align)
  29818. {
  29819. return this.style.setAlign(align);
  29820. },
  29821. /**
  29822. * Set the resolution used by this Text object.
  29823. *
  29824. * By default it will be set to match the resolution set in the Game Config,
  29825. * but you can override it via this method, or by specifying it in the Text style configuration object.
  29826. *
  29827. * It allows for much clearer text on High DPI devices, at the cost of memory because it uses larger
  29828. * internal Canvas textures for the Text.
  29829. *
  29830. * Therefore, please use with caution, as the more high res Text you have, the more memory it uses.
  29831. *
  29832. * @method Phaser.GameObjects.Text#setResolution
  29833. * @since 3.12.0
  29834. *
  29835. * @param {number} value - The resolution for this Text object to use.
  29836. *
  29837. * @return {Phaser.GameObjects.Text} This Text object.
  29838. */
  29839. setResolution: function (value)
  29840. {
  29841. return this.style.setResolution(value);
  29842. },
  29843. /**
  29844. * Sets the line spacing value.
  29845. *
  29846. * This value is _added_ to the height of the font when calculating the overall line height.
  29847. * This only has an effect if this Text object consists of multiple lines of text.
  29848. *
  29849. * @method Phaser.GameObjects.Text#setLineSpacing
  29850. * @since 3.13.0
  29851. *
  29852. * @param {number} value - The amount to add to the font height to achieve the overall line height.
  29853. *
  29854. * @return {Phaser.GameObjects.Text} This Text object.
  29855. */
  29856. setLineSpacing: function (value)
  29857. {
  29858. this.lineSpacing = value;
  29859. return this.updateText();
  29860. },
  29861. /**
  29862. * Set the text padding.
  29863. *
  29864. * 'left' can be an object.
  29865. *
  29866. * If only 'left' and 'top' are given they are treated as 'x' and 'y'.
  29867. *
  29868. * @method Phaser.GameObjects.Text#setPadding
  29869. * @since 3.0.0
  29870. *
  29871. * @param {(number|object)} left - The left padding value, or a padding config object.
  29872. * @param {number} top - The top padding value.
  29873. * @param {number} right - The right padding value.
  29874. * @param {number} bottom - The bottom padding value.
  29875. *
  29876. * @return {Phaser.GameObjects.Text} This Text object.
  29877. */
  29878. setPadding: function (left, top, right, bottom)
  29879. {
  29880. if (typeof left === 'object')
  29881. {
  29882. var config = left;
  29883. // If they specify x and/or y this applies to all
  29884. var x = GetValue(config, 'x', null);
  29885. if (x !== null)
  29886. {
  29887. left = x;
  29888. right = x;
  29889. }
  29890. else
  29891. {
  29892. left = GetValue(config, 'left', 0);
  29893. right = GetValue(config, 'right', left);
  29894. }
  29895. var y = GetValue(config, 'y', null);
  29896. if (y !== null)
  29897. {
  29898. top = y;
  29899. bottom = y;
  29900. }
  29901. else
  29902. {
  29903. top = GetValue(config, 'top', 0);
  29904. bottom = GetValue(config, 'bottom', top);
  29905. }
  29906. }
  29907. else
  29908. {
  29909. if (left === undefined) { left = 0; }
  29910. if (top === undefined) { top = left; }
  29911. if (right === undefined) { right = left; }
  29912. if (bottom === undefined) { bottom = top; }
  29913. }
  29914. this.padding.left = left;
  29915. this.padding.top = top;
  29916. this.padding.right = right;
  29917. this.padding.bottom = bottom;
  29918. return this.updateText();
  29919. },
  29920. /**
  29921. * Set the maximum number of lines to draw.
  29922. *
  29923. * @method Phaser.GameObjects.Text#setMaxLines
  29924. * @since 3.0.0
  29925. *
  29926. * @param {integer} [max=0] - The maximum number of lines to draw.
  29927. *
  29928. * @return {Phaser.GameObjects.Text} This Text object.
  29929. */
  29930. setMaxLines: function (max)
  29931. {
  29932. return this.style.setMaxLines(max);
  29933. },
  29934. /**
  29935. * Update the displayed text.
  29936. *
  29937. * @method Phaser.GameObjects.Text#updateText
  29938. * @since 3.0.0
  29939. *
  29940. * @return {Phaser.GameObjects.Text} This Text object.
  29941. */
  29942. updateText: function ()
  29943. {
  29944. var canvas = this.canvas;
  29945. var context = this.context;
  29946. var style = this.style;
  29947. var resolution = style.resolution;
  29948. var size = style.metrics;
  29949. style.syncFont(canvas, context);
  29950. var outputText = this._text;
  29951. if (style.wordWrapWidth || style.wordWrapCallback)
  29952. {
  29953. outputText = this.runWordWrap(this._text);
  29954. }
  29955. // Split text into lines
  29956. var lines = outputText.split(this.splitRegExp);
  29957. var textSize = GetTextSize(this, size, lines);
  29958. var padding = this.padding;
  29959. var w = textSize.width + padding.left + padding.right;
  29960. var h = textSize.height + padding.top + padding.bottom;
  29961. if (style.fixedWidth === 0)
  29962. {
  29963. this.width = w;
  29964. }
  29965. if (style.fixedHeight === 0)
  29966. {
  29967. this.height = h;
  29968. }
  29969. this.updateDisplayOrigin();
  29970. w *= resolution;
  29971. h *= resolution;
  29972. w = Math.max(w, 1);
  29973. h = Math.max(h, 1);
  29974. if (canvas.width !== w || canvas.height !== h)
  29975. {
  29976. canvas.width = w;
  29977. canvas.height = h;
  29978. this.frame.setSize(w, h);
  29979. style.syncFont(canvas, context); // Resizing resets the context
  29980. }
  29981. else
  29982. {
  29983. context.clearRect(0, 0, w, h);
  29984. }
  29985. context.save();
  29986. context.scale(resolution, resolution);
  29987. if (style.backgroundColor)
  29988. {
  29989. context.fillStyle = style.backgroundColor;
  29990. context.fillRect(0, 0, w, h);
  29991. }
  29992. style.syncStyle(canvas, context);
  29993. context.textBaseline = 'alphabetic';
  29994. // Apply padding
  29995. context.translate(padding.left, padding.top);
  29996. var linePositionX;
  29997. var linePositionY;
  29998. // Draw text line by line
  29999. for (var i = 0; i < textSize.lines; i++)
  30000. {
  30001. linePositionX = style.strokeThickness / 2;
  30002. linePositionY = (style.strokeThickness / 2 + i * textSize.lineHeight) + size.ascent;
  30003. if (i > 0)
  30004. {
  30005. linePositionY += (textSize.lineSpacing * i);
  30006. }
  30007. if (style.rtl)
  30008. {
  30009. linePositionX = w - linePositionX;
  30010. }
  30011. else if (style.align === 'right')
  30012. {
  30013. linePositionX += textSize.width - textSize.lineWidths[i];
  30014. }
  30015. else if (style.align === 'center')
  30016. {
  30017. linePositionX += (textSize.width - textSize.lineWidths[i]) / 2;
  30018. }
  30019. if (this.autoRound)
  30020. {
  30021. linePositionX = Math.round(linePositionX);
  30022. linePositionY = Math.round(linePositionY);
  30023. }
  30024. if (style.strokeThickness)
  30025. {
  30026. this.style.syncShadow(context, style.shadowStroke);
  30027. context.strokeText(lines[i], linePositionX, linePositionY);
  30028. }
  30029. if (style.color)
  30030. {
  30031. this.style.syncShadow(context, style.shadowFill);
  30032. context.fillText(lines[i], linePositionX, linePositionY);
  30033. }
  30034. }
  30035. context.restore();
  30036. if (this.renderer.gl)
  30037. {
  30038. this.frame.source.glTexture = this.renderer.canvasToTexture(canvas, this.frame.source.glTexture, true);
  30039. this.frame.glTexture = this.frame.source.glTexture;
  30040. }
  30041. this.dirty = true;
  30042. return this;
  30043. },
  30044. /**
  30045. * Get the current text metrics.
  30046. *
  30047. * @method Phaser.GameObjects.Text#getTextMetrics
  30048. * @since 3.0.0
  30049. *
  30050. * @return {object} The text metrics.
  30051. */
  30052. getTextMetrics: function ()
  30053. {
  30054. return this.style.getTextMetrics();
  30055. },
  30056. /**
  30057. * The text string being rendered by this Text Game Object.
  30058. *
  30059. * @name Phaser.GameObjects.Text#text
  30060. * @type {string}
  30061. * @since 3.0.0
  30062. */
  30063. text: {
  30064. get: function ()
  30065. {
  30066. return this._text;
  30067. },
  30068. set: function (value)
  30069. {
  30070. this.setText(value);
  30071. }
  30072. },
  30073. /**
  30074. * Build a JSON representation of the Text object.
  30075. *
  30076. * @method Phaser.GameObjects.Text#toJSON
  30077. * @since 3.0.0
  30078. *
  30079. * @return {JSONGameObject} A JSON representation of the Text object.
  30080. */
  30081. toJSON: function ()
  30082. {
  30083. var out = Components.ToJSON(this);
  30084. // Extra Text data is added here
  30085. var data = {
  30086. autoRound: this.autoRound,
  30087. text: this._text,
  30088. style: this.style.toJSON(),
  30089. padding: {
  30090. left: this.padding.left,
  30091. right: this.padding.right,
  30092. top: this.padding.top,
  30093. bottom: this.padding.bottom
  30094. }
  30095. };
  30096. out.data = data;
  30097. return out;
  30098. },
  30099. /**
  30100. * Internal destroy handler, called as part of the destroy process.
  30101. *
  30102. * @method Phaser.GameObjects.Text#preDestroy
  30103. * @protected
  30104. * @since 3.0.0
  30105. */
  30106. preDestroy: function ()
  30107. {
  30108. if (this.style.rtl)
  30109. {
  30110. RemoveFromDOM(this.canvas);
  30111. }
  30112. CanvasPool.remove(this.canvas);
  30113. this.texture.destroy();
  30114. }
  30115. });
  30116. module.exports = Text;
  30117. /***/ }),
  30118. /* 164 */
  30119. /***/ (function(module, exports, __webpack_require__) {
  30120. /**
  30121. * @author Richard Davey <rich@photonstorm.com>
  30122. * @copyright 2019 Photon Storm Ltd.
  30123. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  30124. */
  30125. var BlendModes = __webpack_require__(60);
  30126. var Camera = __webpack_require__(131);
  30127. var CanvasPool = __webpack_require__(24);
  30128. var Class = __webpack_require__(0);
  30129. var Components = __webpack_require__(13);
  30130. var CONST = __webpack_require__(28);
  30131. var Frame = __webpack_require__(121);
  30132. var GameObject = __webpack_require__(18);
  30133. var Render = __webpack_require__(840);
  30134. var Utils = __webpack_require__(9);
  30135. var UUID = __webpack_require__(299);
  30136. /**
  30137. * @classdesc
  30138. * A Render Texture.
  30139. *
  30140. * A Render Texture is a special texture that allows any number of Game Objects to be drawn to it. You can take many complex objects and
  30141. * draw them all to this one texture, which can they be used as the texture for other Game Object's. It's a way to generate dynamic
  30142. * textures at run-time that are WebGL friendly and don't invoke expensive GPU uploads.
  30143. *
  30144. * Note that under WebGL a FrameBuffer, which is what the Render Texture uses internally, cannot be anti-aliased. This means
  30145. * that when drawing objects such as Shapes to a Render Texture they will appear to be drawn with no aliasing, however this
  30146. * is a technical limitation of WebGL. To get around it, create your shape as a texture in an art package, then draw that
  30147. * to the Render Texture.
  30148. *
  30149. * @class RenderTexture
  30150. * @extends Phaser.GameObjects.GameObject
  30151. * @memberof Phaser.GameObjects
  30152. * @constructor
  30153. * @since 3.2.0
  30154. *
  30155. * @extends Phaser.GameObjects.Components.Alpha
  30156. * @extends Phaser.GameObjects.Components.BlendMode
  30157. * @extends Phaser.GameObjects.Components.ComputedSize
  30158. * @extends Phaser.GameObjects.Components.Depth
  30159. * @extends Phaser.GameObjects.Components.Flip
  30160. * @extends Phaser.GameObjects.Components.GetBounds
  30161. * @extends Phaser.GameObjects.Components.Mask
  30162. * @extends Phaser.GameObjects.Components.Origin
  30163. * @extends Phaser.GameObjects.Components.Pipeline
  30164. * @extends Phaser.GameObjects.Components.ScaleMode
  30165. * @extends Phaser.GameObjects.Components.ScrollFactor
  30166. * @extends Phaser.GameObjects.Components.Tint
  30167. * @extends Phaser.GameObjects.Components.Transform
  30168. * @extends Phaser.GameObjects.Components.Visible
  30169. *
  30170. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  30171. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  30172. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  30173. * @param {integer} [width=32] - The width of the Render Texture.
  30174. * @param {integer} [height=32] - The height of the Render Texture.
  30175. */
  30176. var RenderTexture = new Class({
  30177. Extends: GameObject,
  30178. Mixins: [
  30179. Components.Alpha,
  30180. Components.BlendMode,
  30181. Components.ComputedSize,
  30182. Components.Crop,
  30183. Components.Depth,
  30184. Components.Flip,
  30185. Components.GetBounds,
  30186. Components.Mask,
  30187. Components.Origin,
  30188. Components.Pipeline,
  30189. Components.ScaleMode,
  30190. Components.ScrollFactor,
  30191. Components.Tint,
  30192. Components.Transform,
  30193. Components.Visible,
  30194. Render
  30195. ],
  30196. initialize:
  30197. function RenderTexture (scene, x, y, width, height)
  30198. {
  30199. if (x === undefined) { x = 0; }
  30200. if (y === undefined) { y = 0; }
  30201. if (width === undefined) { width = 32; }
  30202. if (height === undefined) { height = 32; }
  30203. GameObject.call(this, scene, 'RenderTexture');
  30204. /**
  30205. * A reference to either the Canvas or WebGL Renderer that the Game instance is using.
  30206. *
  30207. * @name Phaser.GameObjects.RenderTexture#renderer
  30208. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  30209. * @since 3.2.0
  30210. */
  30211. this.renderer = scene.sys.game.renderer;
  30212. /**
  30213. * A reference to the Texture Manager.
  30214. *
  30215. * @name Phaser.GameObjects.RenderTexture#textureManager
  30216. * @type {Phaser.Textures.TextureManager}
  30217. * @since 3.12.0
  30218. */
  30219. this.textureManager = scene.sys.textures;
  30220. /**
  30221. * The tint of the Render Texture when rendered.
  30222. *
  30223. * @name Phaser.GameObjects.RenderTexture#globalTint
  30224. * @type {number}
  30225. * @default 0xffffff
  30226. * @since 3.2.0
  30227. */
  30228. this.globalTint = 0xffffff;
  30229. /**
  30230. * The alpha of the Render Texture when rendered.
  30231. *
  30232. * @name Phaser.GameObjects.RenderTexture#globalAlpha
  30233. * @type {number}
  30234. * @default 1
  30235. * @since 3.2.0
  30236. */
  30237. this.globalAlpha = 1;
  30238. /**
  30239. * The HTML Canvas Element that the Render Texture is drawing to when using the Canvas Renderer.
  30240. *
  30241. * @name Phaser.GameObjects.RenderTexture#canvas
  30242. * @type {HTMLCanvasElement}
  30243. * @since 3.2.0
  30244. */
  30245. this.canvas = CanvasPool.create2D(this, width, height);
  30246. /**
  30247. * A reference to the Rendering Context belonging to the Canvas Element this Render Texture is drawing to.
  30248. *
  30249. * @name Phaser.GameObjects.RenderTexture#context
  30250. * @type {CanvasRenderingContext2D}
  30251. * @since 3.2.0
  30252. */
  30253. this.context = this.canvas.getContext('2d');
  30254. /**
  30255. * A reference to the GL Frame Buffer this Render Texture is drawing to.
  30256. * This is only set if Phaser is running with the WebGL Renderer.
  30257. *
  30258. * @name Phaser.GameObjects.RenderTexture#framebuffer
  30259. * @type {?WebGLFramebuffer}
  30260. * @since 3.2.0
  30261. */
  30262. this.framebuffer = null;
  30263. /**
  30264. * The internal crop data object, as used by `setCrop` and passed to the `Frame.setCropUVs` method.
  30265. *
  30266. * @name Phaser.GameObjects.RenderTexture#_crop
  30267. * @type {object}
  30268. * @private
  30269. * @since 3.12.0
  30270. */
  30271. this._crop = this.resetCropObject();
  30272. /**
  30273. * The Texture corresponding to this Render Texture.
  30274. *
  30275. * @name Phaser.GameObjects.RenderTexture#texture
  30276. * @type {Phaser.Textures.Texture}
  30277. * @since 3.12.0
  30278. */
  30279. this.texture = scene.sys.textures.addCanvas(UUID(), this.canvas);
  30280. /**
  30281. * The Frame corresponding to this Render Texture.
  30282. *
  30283. * @name Phaser.GameObjects.RenderTexture#frame
  30284. * @type {Phaser.Textures.Frame}
  30285. * @since 3.12.0
  30286. */
  30287. this.frame = this.texture.get();
  30288. /**
  30289. * Internal saved texture flag.
  30290. *
  30291. * @name Phaser.GameObjects.RenderTexture#_saved
  30292. * @type {boolean}
  30293. * @private
  30294. * @since 3.12.0
  30295. */
  30296. this._saved = false;
  30297. /**
  30298. * Internal erase mode flag.
  30299. *
  30300. * @name Phaser.GameObjects.RenderTexture#_eraseMode
  30301. * @type {boolean}
  30302. * @private
  30303. * @since 3.16.0
  30304. */
  30305. this._eraseMode = false;
  30306. /**
  30307. * An internal Camera that can be used to move around the Render Texture.
  30308. * Control it just like you would any Scene Camera. The difference is that it only impacts the placement of what
  30309. * is drawn to the Render Texture. You can scroll, zoom and rotate this Camera.
  30310. *
  30311. * @name Phaser.GameObjects.RenderTexture#camera
  30312. * @type {Phaser.Cameras.Scene2D.BaseCamera}
  30313. * @since 3.12.0
  30314. */
  30315. this.camera = new Camera(0, 0, width, height);
  30316. /**
  30317. * Is this Render Texture dirty or not? If not it won't spend time clearing or filling itself.
  30318. *
  30319. * @name Phaser.GameObjects.RenderTexture#dirty
  30320. * @type {boolean}
  30321. * @since 3.12.0
  30322. */
  30323. this.dirty = false;
  30324. /**
  30325. * A reference to the WebGL Rendering Context.
  30326. *
  30327. * @name Phaser.GameObjects.RenderTexture#gl
  30328. * @type {WebGLRenderingContext}
  30329. * @default null
  30330. * @since 3.0.0
  30331. */
  30332. this.gl = null;
  30333. var renderer = this.renderer;
  30334. if (renderer.type === CONST.WEBGL)
  30335. {
  30336. var gl = renderer.gl;
  30337. this.gl = gl;
  30338. this.drawGameObject = this.batchGameObjectWebGL;
  30339. this.framebuffer = renderer.createFramebuffer(width, height, this.frame.source.glTexture, false);
  30340. }
  30341. else if (renderer.type === CONST.CANVAS)
  30342. {
  30343. this.drawGameObject = this.batchGameObjectCanvas;
  30344. }
  30345. this.camera.setScene(scene);
  30346. this.setPosition(x, y);
  30347. this.setSize(width, height);
  30348. this.setOrigin(0, 0);
  30349. this.initPipeline();
  30350. },
  30351. /**
  30352. * Sets the size of this Game Object.
  30353. *
  30354. * @method Phaser.GameObjects.RenderTexture#setSize
  30355. * @since 3.0.0
  30356. *
  30357. * @param {number} width - The width of this Game Object.
  30358. * @param {number} height - The height of this Game Object.
  30359. *
  30360. * @return {this} This Game Object instance.
  30361. */
  30362. setSize: function (width, height)
  30363. {
  30364. return this.resize(width, height);
  30365. },
  30366. /**
  30367. * Resizes the Render Texture to the new dimensions given.
  30368. *
  30369. * In WebGL it will destroy and then re-create the frame buffer being used by the Render Texture.
  30370. * In Canvas it will resize the underlying canvas element.
  30371. * Both approaches will erase everything currently drawn to the Render Texture.
  30372. *
  30373. * If the dimensions given are the same as those already being used, calling this method will do nothing.
  30374. *
  30375. * @method Phaser.GameObjects.RenderTexture#resize
  30376. * @since 3.10.0
  30377. *
  30378. * @param {number} width - The new width of the Render Texture.
  30379. * @param {number} [height] - The new height of the Render Texture. If not specified, will be set the same as the `width`.
  30380. *
  30381. * @return {this} This Render Texture.
  30382. */
  30383. resize: function (width, height)
  30384. {
  30385. if (height === undefined) { height = width; }
  30386. if (width !== this.width || height !== this.height)
  30387. {
  30388. this.canvas.width = width;
  30389. this.canvas.height = height;
  30390. if (this.gl)
  30391. {
  30392. var gl = this.gl;
  30393. this.renderer.deleteTexture(this.frame.source.glTexture);
  30394. this.renderer.deleteFramebuffer(this.framebuffer);
  30395. this.frame.source.glTexture = this.renderer.createTexture2D(0, gl.NEAREST, gl.NEAREST, gl.CLAMP_TO_EDGE, gl.CLAMP_TO_EDGE, gl.RGBA, null, width, height, false);
  30396. this.framebuffer = this.renderer.createFramebuffer(width, height, this.frame.source.glTexture, false);
  30397. this.frame.glTexture = this.frame.source.glTexture;
  30398. }
  30399. this.frame.source.width = width;
  30400. this.frame.source.height = height;
  30401. this.camera.setSize(width, height);
  30402. this.frame.setSize(width, height);
  30403. this.width = width;
  30404. this.height = height;
  30405. }
  30406. return this;
  30407. },
  30408. /**
  30409. * Set the tint to use when rendering this Render Texture.
  30410. *
  30411. * @method Phaser.GameObjects.RenderTexture#setGlobalTint
  30412. * @since 3.2.0
  30413. *
  30414. * @param {integer} tint - The tint value.
  30415. *
  30416. * @return {this} This Render Texture.
  30417. */
  30418. setGlobalTint: function (tint)
  30419. {
  30420. this.globalTint = tint;
  30421. return this;
  30422. },
  30423. /**
  30424. * Set the alpha to use when rendering this Render Texture.
  30425. *
  30426. * @method Phaser.GameObjects.RenderTexture#setGlobalAlpha
  30427. * @since 3.2.0
  30428. *
  30429. * @param {number} alpha - The alpha value.
  30430. *
  30431. * @return {this} This Render Texture.
  30432. */
  30433. setGlobalAlpha: function (alpha)
  30434. {
  30435. this.globalAlpha = alpha;
  30436. return this;
  30437. },
  30438. /**
  30439. * Stores a copy of this Render Texture in the Texture Manager using the given key.
  30440. *
  30441. * After doing this, any texture based Game Object, such as a Sprite, can use the contents of this
  30442. * Render Texture by using the texture key:
  30443. *
  30444. * ```javascript
  30445. * var rt = this.add.renderTexture(0, 0, 128, 128);
  30446. *
  30447. * // Draw something to the Render Texture
  30448. *
  30449. * rt.saveTexture('doodle');
  30450. *
  30451. * this.add.image(400, 300, 'doodle');
  30452. * ```
  30453. *
  30454. * Updating the contents of this Render Texture will automatically update _any_ Game Object
  30455. * that is using it as a texture. Calling `saveTexture` again will not save another copy
  30456. * of the same texture, it will just rename the key of the existing copy.
  30457. *
  30458. * By default it will create a single base texture. You can add frames to the texture
  30459. * by using the `Texture.add` method. After doing this, you can then allow Game Objects
  30460. * to use a specific frame from a Render Texture.
  30461. *
  30462. * @method Phaser.GameObjects.RenderTexture#saveTexture
  30463. * @since 3.12.0
  30464. *
  30465. * @param {string} key - The unique key to store the texture as within the global Texture Manager.
  30466. *
  30467. * @return {Phaser.Textures.Texture} The Texture that was saved.
  30468. */
  30469. saveTexture: function (key)
  30470. {
  30471. this.textureManager.renameTexture(this.texture.key, key);
  30472. this._saved = true;
  30473. return this.texture;
  30474. },
  30475. /**
  30476. * Fills the Render Texture with the given color.
  30477. *
  30478. * @method Phaser.GameObjects.RenderTexture#fill
  30479. * @since 3.2.0
  30480. *
  30481. * @param {number} rgb - The color to fill the Render Texture with.
  30482. * @param {number} [alpha=1] - The alpha value used by the fill.
  30483. *
  30484. * @return {this} This Render Texture instance.
  30485. */
  30486. fill: function (rgb, alpha)
  30487. {
  30488. if (alpha === undefined) { alpha = 1; }
  30489. var r = ((rgb >> 16) | 0) & 0xff;
  30490. var g = ((rgb >> 8) | 0) & 0xff;
  30491. var b = (rgb | 0) & 0xff;
  30492. var gl = this.gl;
  30493. if (gl)
  30494. {
  30495. var renderer = this.renderer;
  30496. var bounds = this.getBounds();
  30497. renderer.setFramebuffer(this.framebuffer, true);
  30498. this.pipeline.drawFillRect(
  30499. bounds.x, bounds.y, bounds.right, bounds.bottom,
  30500. Utils.getTintFromFloats(r / 255, g / 255, b / 255, 1),
  30501. alpha
  30502. );
  30503. renderer.setFramebuffer(null, true);
  30504. }
  30505. else
  30506. {
  30507. this.context.fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + alpha + ')';
  30508. this.context.fillRect(0, 0, this.canvas.width, this.canvas.height);
  30509. }
  30510. return this;
  30511. },
  30512. /**
  30513. * Clears the Render Texture.
  30514. *
  30515. * @method Phaser.GameObjects.RenderTexture#clear
  30516. * @since 3.2.0
  30517. *
  30518. * @return {this} This Render Texture instance.
  30519. */
  30520. clear: function ()
  30521. {
  30522. if (this.dirty)
  30523. {
  30524. var gl = this.gl;
  30525. if (gl)
  30526. {
  30527. var renderer = this.renderer;
  30528. renderer.setFramebuffer(this.framebuffer, true);
  30529. gl.clearColor(0, 0, 0, 0);
  30530. gl.clear(gl.COLOR_BUFFER_BIT);
  30531. renderer.setFramebuffer(null, true);
  30532. }
  30533. else
  30534. {
  30535. var ctx = this.context;
  30536. ctx.save();
  30537. ctx.setTransform(1, 0, 0, 1, 0, 0);
  30538. ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
  30539. ctx.restore();
  30540. }
  30541. this.dirty = false;
  30542. }
  30543. return this;
  30544. },
  30545. /**
  30546. * Draws the given object, or an array of objects, to this Render Texture using a blend mode of ERASE.
  30547. * This has the effect of erasing any filled pixels in the objects from this Render Texture.
  30548. *
  30549. * It can accept any of the following:
  30550. *
  30551. * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite.
  30552. * * Dynamic and Static Tilemap Layers.
  30553. * * A Group. The contents of which will be iterated and drawn in turn.
  30554. * * A Container. The contents of which will be iterated fully, and drawn in turn.
  30555. * * A Scene's Display List. Pass in `Scene.children` to draw the whole list.
  30556. * * Another Render Texture.
  30557. * * A Texture Frame instance.
  30558. * * A string. This is used to look-up a texture from the Texture Manager.
  30559. *
  30560. * Note: You cannot erase a Render Texture from itself.
  30561. *
  30562. * If passing in a Group or Container it will only draw children that return `true`
  30563. * when their `willRender()` method is called. I.e. a Container with 10 children,
  30564. * 5 of which have `visible=false` will only draw the 5 visible ones.
  30565. *
  30566. * If passing in an array of Game Objects it will draw them all, regardless if
  30567. * they pass a `willRender` check or not.
  30568. *
  30569. * You can pass in a string in which case it will look for a texture in the Texture
  30570. * Manager matching that string, and draw the base frame.
  30571. *
  30572. * You can pass in the `x` and `y` coordinates to draw the objects at. The use of
  30573. * the coordinates differ based on what objects are being drawn. If the object is
  30574. * a Group, Container or Display List, the coordinates are _added_ to the positions
  30575. * of the children. For all other types of object, the coordinates are exact.
  30576. *
  30577. * Calling this method causes the WebGL batch to flush, so it can write the texture
  30578. * data to the framebuffer being used internally. The batch is flushed at the end,
  30579. * after the entries have been iterated. So if you've a bunch of objects to draw,
  30580. * try and pass them in an array in one single call, rather than making lots of
  30581. * separate calls.
  30582. *
  30583. * @method Phaser.GameObjects.RenderTexture#erase
  30584. * @since 3.16.0
  30585. *
  30586. * @param {any} entries - Any renderable Game Object, or Group, Container, Display List, other Render Texture, Texture Frame or an array of any of these.
  30587. * @param {number} [x] - The x position to draw the Frame at, or the offset applied to the object.
  30588. * @param {number} [y] - The y position to draw the Frame at, or the offset applied to the object.
  30589. *
  30590. * @return {this} This Render Texture instance.
  30591. */
  30592. erase: function (entries, x, y)
  30593. {
  30594. this._eraseMode = true;
  30595. var blendMode = this.renderer.currentBlendMode;
  30596. this.renderer.setBlendMode(BlendModes.ERASE);
  30597. this.draw(entries, x, y, 1, 16777215);
  30598. this.renderer.setBlendMode(blendMode);
  30599. this._eraseMode = false;
  30600. return this;
  30601. },
  30602. /**
  30603. * Draws the given object, or an array of objects, to this Render Texture.
  30604. *
  30605. * It can accept any of the following:
  30606. *
  30607. * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite.
  30608. * * Dynamic and Static Tilemap Layers.
  30609. * * A Group. The contents of which will be iterated and drawn in turn.
  30610. * * A Container. The contents of which will be iterated fully, and drawn in turn.
  30611. * * A Scene's Display List. Pass in `Scene.children` to draw the whole list.
  30612. * * Another Render Texture.
  30613. * * A Texture Frame instance.
  30614. * * A string. This is used to look-up a texture from the Texture Manager.
  30615. *
  30616. * Note: You cannot draw a Render Texture to itself.
  30617. *
  30618. * If passing in a Group or Container it will only draw children that return `true`
  30619. * when their `willRender()` method is called. I.e. a Container with 10 children,
  30620. * 5 of which have `visible=false` will only draw the 5 visible ones.
  30621. *
  30622. * If passing in an array of Game Objects it will draw them all, regardless if
  30623. * they pass a `willRender` check or not.
  30624. *
  30625. * You can pass in a string in which case it will look for a texture in the Texture
  30626. * Manager matching that string, and draw the base frame. If you need to specify
  30627. * exactly which frame to draw then use the method `drawFrame` instead.
  30628. *
  30629. * You can pass in the `x` and `y` coordinates to draw the objects at. The use of
  30630. * the coordinates differ based on what objects are being drawn. If the object is
  30631. * a Group, Container or Display List, the coordinates are _added_ to the positions
  30632. * of the children. For all other types of object, the coordinates are exact.
  30633. *
  30634. * The `alpha` and `tint` values are only used by Texture Frames.
  30635. * Game Objects use their own alpha and tint values when being drawn.
  30636. *
  30637. * Calling this method causes the WebGL batch to flush, so it can write the texture
  30638. * data to the framebuffer being used internally. The batch is flushed at the end,
  30639. * after the entries have been iterated. So if you've a bunch of objects to draw,
  30640. * try and pass them in an array in one single call, rather than making lots of
  30641. * separate calls.
  30642. *
  30643. * @method Phaser.GameObjects.RenderTexture#draw
  30644. * @since 3.2.0
  30645. *
  30646. * @param {any} entries - Any renderable Game Object, or Group, Container, Display List, other Render Texture, Texture Frame or an array of any of these.
  30647. * @param {number} [x] - The x position to draw the Frame at, or the offset applied to the object.
  30648. * @param {number} [y] - The y position to draw the Frame at, or the offset applied to the object.
  30649. * @param {number} [alpha] - The alpha value. Only used for Texture Frames and if not specified defaults to the `globalAlpha` property. Game Objects use their own current alpha value.
  30650. * @param {number} [tint] - WebGL only. The tint color value. Only used for Texture Frames and if not specified defaults to the `globalTint` property. Game Objects use their own current tint value.
  30651. *
  30652. * @return {this} This Render Texture instance.
  30653. */
  30654. draw: function (entries, x, y, alpha, tint)
  30655. {
  30656. if (alpha === undefined) { alpha = this.globalAlpha; }
  30657. if (tint === undefined)
  30658. {
  30659. tint = (this.globalTint >> 16) + (this.globalTint & 0xff00) + ((this.globalTint & 0xff) << 16);
  30660. }
  30661. else
  30662. {
  30663. tint = (tint >> 16) + (tint & 0xff00) + ((tint & 0xff) << 16);
  30664. }
  30665. if (!Array.isArray(entries))
  30666. {
  30667. entries = [ entries ];
  30668. }
  30669. var gl = this.gl;
  30670. this.camera.preRender(1, 1);
  30671. if (gl)
  30672. {
  30673. var cx = this.camera._cx;
  30674. var cy = this.camera._cy;
  30675. var cw = this.camera._cw;
  30676. var ch = this.camera._ch;
  30677. this.renderer.setFramebuffer(this.framebuffer, false);
  30678. this.renderer.pushScissor(cx, cy, cw, ch, ch);
  30679. var pipeline = this.pipeline;
  30680. pipeline.projOrtho(0, this.width, 0, this.height, -1000.0, 1000.0);
  30681. this.batchList(entries, x, y, alpha, tint);
  30682. pipeline.flush();
  30683. this.renderer.setFramebuffer(null, false);
  30684. this.renderer.popScissor();
  30685. pipeline.projOrtho(0, pipeline.width, pipeline.height, 0, -1000.0, 1000.0);
  30686. }
  30687. else
  30688. {
  30689. this.renderer.setContext(this.context);
  30690. this.batchList(entries, x, y, alpha, tint);
  30691. this.renderer.setContext();
  30692. }
  30693. this.dirty = true;
  30694. return this;
  30695. },
  30696. /**
  30697. * Draws the Texture Frame to the Render Texture at the given position.
  30698. *
  30699. * Textures are referenced by their string-based keys, as stored in the Texture Manager.
  30700. *
  30701. * ```javascript
  30702. * var rt = this.add.renderTexture(0, 0, 800, 600);
  30703. * rt.drawFrame(key, frame);
  30704. * ```
  30705. *
  30706. * You can optionally provide a position, alpha and tint value to apply to the frame
  30707. * before it is drawn.
  30708. *
  30709. * Calling this method will cause a batch flush, so if you've got a stack of things to draw
  30710. * in a tight loop, try using the `draw` method instead.
  30711. *
  30712. * If you need to draw a Sprite to this Render Texture, use the `draw` method instead.
  30713. *
  30714. * @method Phaser.GameObjects.RenderTexture#drawFrame
  30715. * @since 3.12.0
  30716. *
  30717. * @param {string} key - The key of the texture to be used, as stored in the Texture Manager.
  30718. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  30719. * @param {number} [x=0] - The x position to draw the frame at.
  30720. * @param {number} [y=0] - The y position to draw the frame at.
  30721. * @param {number} [alpha] - The alpha to use. If not specified it uses the `globalAlpha` property.
  30722. * @param {number} [tint] - WebGL only. The tint color to use. If not specified it uses the `globalTint` property.
  30723. *
  30724. * @return {this} This Render Texture instance.
  30725. */
  30726. drawFrame: function (key, frame, x, y, alpha, tint)
  30727. {
  30728. if (x === undefined) { x = 0; }
  30729. if (y === undefined) { y = 0; }
  30730. if (alpha === undefined) { alpha = this.globalAlpha; }
  30731. if (tint === undefined)
  30732. {
  30733. tint = (this.globalTint >> 16) + (this.globalTint & 0xff00) + ((this.globalTint & 0xff) << 16);
  30734. }
  30735. else
  30736. {
  30737. tint = (tint >> 16) + (tint & 0xff00) + ((tint & 0xff) << 16);
  30738. }
  30739. var gl = this.gl;
  30740. var textureFrame = this.textureManager.getFrame(key, frame);
  30741. if (textureFrame)
  30742. {
  30743. this.camera.preRender(1, 1);
  30744. if (gl)
  30745. {
  30746. var cx = this.camera._cx;
  30747. var cy = this.camera._cy;
  30748. var cw = this.camera._cw;
  30749. var ch = this.camera._ch;
  30750. this.renderer.setFramebuffer(this.framebuffer, false);
  30751. this.renderer.pushScissor(cx, cy, cw, ch, ch);
  30752. var pipeline = this.pipeline;
  30753. pipeline.projOrtho(0, this.width, 0, this.height, -1000.0, 1000.0);
  30754. pipeline.batchTextureFrame(textureFrame, x, y, tint, alpha, this.camera.matrix, null);
  30755. pipeline.flush();
  30756. this.renderer.setFramebuffer(null, false);
  30757. this.renderer.popScissor();
  30758. pipeline.projOrtho(0, pipeline.width, pipeline.height, 0, -1000.0, 1000.0);
  30759. }
  30760. else
  30761. {
  30762. this.batchTextureFrame(textureFrame, x, y, alpha, tint);
  30763. }
  30764. this.dirty = true;
  30765. }
  30766. return this;
  30767. },
  30768. /**
  30769. * Internal method that handles the drawing of an array of children.
  30770. *
  30771. * @method Phaser.GameObjects.RenderTexture#batchList
  30772. * @private
  30773. * @since 3.12.0
  30774. *
  30775. * @param {array} children - The array of Game Objects to draw.
  30776. * @param {number} x - The x position to offset the Game Object by.
  30777. * @param {number} y - The y position to offset the Game Object by.
  30778. * @param {number} [alpha] - The alpha to use. If not specified it uses the `globalAlpha` property.
  30779. * @param {number} [tint] - The tint color to use. If not specified it uses the `globalTint` property.
  30780. */
  30781. batchList: function (children, x, y, alpha, tint)
  30782. {
  30783. for (var i = 0; i < children.length; i++)
  30784. {
  30785. var entry = children[i];
  30786. if (!entry || entry === this)
  30787. {
  30788. continue;
  30789. }
  30790. if (entry.renderWebGL || entry.renderCanvas)
  30791. {
  30792. // Game Objects
  30793. this.drawGameObject(entry, x, y);
  30794. }
  30795. else if (entry.isParent || entry.list)
  30796. {
  30797. // Groups / Display Lists
  30798. this.batchGroup(entry.getChildren(), x, y);
  30799. }
  30800. else if (typeof entry === 'string')
  30801. {
  30802. // Texture key
  30803. this.batchTextureFrameKey(entry, null, x, y, alpha, tint);
  30804. }
  30805. else if (entry instanceof Frame)
  30806. {
  30807. // Texture Frame instance
  30808. this.batchTextureFrame(entry, x, y, alpha, tint);
  30809. }
  30810. else if (Array.isArray(entry))
  30811. {
  30812. // Another Array
  30813. this.batchList(entry, x, y, alpha, tint);
  30814. }
  30815. }
  30816. },
  30817. /**
  30818. * Internal method that handles the drawing a Phaser Group contents.
  30819. *
  30820. * @method Phaser.GameObjects.RenderTexture#batchGroup
  30821. * @private
  30822. * @since 3.12.0
  30823. *
  30824. * @param {array} children - The array of Game Objects to draw.
  30825. * @param {number} x - The x position to offset the Game Object by.
  30826. * @param {number} y - The y position to offset the Game Object by.
  30827. */
  30828. batchGroup: function (children, x, y)
  30829. {
  30830. if (x === undefined) { x = 0; }
  30831. if (y === undefined) { y = 0; }
  30832. for (var i = 0; i < children.length; i++)
  30833. {
  30834. var entry = children[i];
  30835. if (entry.willRender())
  30836. {
  30837. var tx = entry.x + x;
  30838. var ty = entry.y + y;
  30839. this.drawGameObject(entry, tx, ty);
  30840. }
  30841. }
  30842. },
  30843. /**
  30844. * Internal method that handles drawing a single Phaser Game Object to this Render Texture using WebGL.
  30845. *
  30846. * @method Phaser.GameObjects.RenderTexture#batchGameObjectWebGL
  30847. * @private
  30848. * @since 3.12.0
  30849. *
  30850. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to draw.
  30851. * @param {number} x - The x position to draw the Game Object at.
  30852. * @param {number} y - The y position to draw the Game Object at.
  30853. */
  30854. batchGameObjectWebGL: function (gameObject, x, y)
  30855. {
  30856. if (x === undefined) { x = gameObject.x; }
  30857. if (y === undefined) { y = gameObject.y; }
  30858. var prevX = gameObject.x;
  30859. var prevY = gameObject.y;
  30860. if (!this._eraseMode)
  30861. {
  30862. this.renderer.setBlendMode(gameObject.blendMode);
  30863. }
  30864. gameObject.setPosition(x, y);
  30865. gameObject.renderWebGL(this.renderer, gameObject, 0, this.camera, null);
  30866. gameObject.setPosition(prevX, prevY);
  30867. },
  30868. /**
  30869. * Internal method that handles drawing a single Phaser Game Object to this Render Texture using Canvas.
  30870. *
  30871. * @method Phaser.GameObjects.RenderTexture#batchGameObjectCanvas
  30872. * @private
  30873. * @since 3.12.0
  30874. *
  30875. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to draw.
  30876. * @param {number} x - The x position to draw the Game Object at.
  30877. * @param {number} y - The y position to draw the Game Object at.
  30878. */
  30879. batchGameObjectCanvas: function (gameObject, x, y)
  30880. {
  30881. if (x === undefined) { x = gameObject.x; }
  30882. if (y === undefined) { y = gameObject.y; }
  30883. var prevX = gameObject.x;
  30884. var prevY = gameObject.y;
  30885. if (this._eraseMode)
  30886. {
  30887. var blendMode = gameObject.blendMode;
  30888. gameObject.blendMode = BlendModes.ERASE;
  30889. }
  30890. gameObject.setPosition(x, y);
  30891. gameObject.renderCanvas(this.renderer, gameObject, 0, this.camera, null);
  30892. gameObject.setPosition(prevX, prevY);
  30893. if (this._eraseMode)
  30894. {
  30895. gameObject.blendMode = blendMode;
  30896. }
  30897. },
  30898. /**
  30899. * Internal method that handles the drawing of an array of children.
  30900. *
  30901. * @method Phaser.GameObjects.RenderTexture#batchTextureFrameKey
  30902. * @private
  30903. * @since 3.12.0
  30904. *
  30905. * @param {string} key - The key of the texture to be used, as stored in the Texture Manager.
  30906. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  30907. * @param {number} x - The x position to offset the Game Object by.
  30908. * @param {number} y - The y position to offset the Game Object by.
  30909. * @param {number} [alpha] - The alpha to use. If not specified it uses the `globalAlpha` property.
  30910. * @param {number} [tint] - The tint color to use. If not specified it uses the `globalTint` property.
  30911. *
  30912. * @return {boolean} `true` if the frame was found and drawn, otherwise `false`.
  30913. */
  30914. batchTextureFrameKey: function (key, frame, x, y, alpha, tint)
  30915. {
  30916. var textureFrame = this.textureManager.getFrame(key, frame);
  30917. if (textureFrame)
  30918. {
  30919. this.batchTextureFrame(textureFrame, x, y, alpha, tint);
  30920. }
  30921. },
  30922. /**
  30923. * Internal method that handles the drawing of a Texture Frame to this Render Texture.
  30924. *
  30925. * @method Phaser.GameObjects.RenderTexture#batchTextureFrame
  30926. * @private
  30927. * @since 3.12.0
  30928. *
  30929. * @param {Phaser.Textures.Frame} textureFrame - The Texture Frame to draw.
  30930. * @param {number} x - The x position to draw the Frame at.
  30931. * @param {number} y - The y position to draw the Frame at.
  30932. * @param {number} [tint] - A tint color to be applied to the frame drawn to the Render Texture.
  30933. */
  30934. batchTextureFrame: function (textureFrame, x, y, alpha, tint)
  30935. {
  30936. if (x === undefined) { x = 0; }
  30937. if (y === undefined) { y = 0; }
  30938. if (this.gl)
  30939. {
  30940. this.pipeline.batchTextureFrame(textureFrame, x, y, tint, alpha, this.camera.matrix, null);
  30941. }
  30942. else
  30943. {
  30944. var ctx = this.context;
  30945. var cd = textureFrame.canvasData;
  30946. var source = textureFrame.source.image;
  30947. var matrix = this.camera.matrix;
  30948. ctx.globalAlpha = this.globalAlpha;
  30949. ctx.setTransform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  30950. ctx.drawImage(source, cd.x, cd.y, cd.width, cd.height, x, y, cd.width, cd.height);
  30951. }
  30952. },
  30953. /**
  30954. * Internal destroy handler, called as part of the destroy process.
  30955. *
  30956. * @method Phaser.GameObjects.RenderTexture#preDestroy
  30957. * @protected
  30958. * @since 3.9.0
  30959. */
  30960. preDestroy: function ()
  30961. {
  30962. if (!this._saved)
  30963. {
  30964. CanvasPool.remove(this.canvas);
  30965. if (this.gl)
  30966. {
  30967. this.renderer.deleteFramebuffer(this.framebuffer);
  30968. }
  30969. this.texture.destroy();
  30970. this.camera.destroy();
  30971. this.canvas = null;
  30972. this.context = null;
  30973. this.framebuffer = null;
  30974. this.texture = null;
  30975. }
  30976. }
  30977. });
  30978. module.exports = RenderTexture;
  30979. /***/ }),
  30980. /* 165 */
  30981. /***/ (function(module, exports, __webpack_require__) {
  30982. /**
  30983. * @author Richard Davey <rich@photonstorm.com>
  30984. * @copyright 2019 Photon Storm Ltd.
  30985. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  30986. */
  30987. var Class = __webpack_require__(0);
  30988. var Components = __webpack_require__(13);
  30989. var GameObject = __webpack_require__(18);
  30990. var GravityWell = __webpack_require__(307);
  30991. var List = __webpack_require__(120);
  30992. var ParticleEmitter = __webpack_require__(305);
  30993. var Render = __webpack_require__(844);
  30994. /**
  30995. * @classdesc
  30996. * A Particle Emitter Manager creates and controls {@link Phaser.GameObjects.Particles.ParticleEmitter Particle Emitters} and {@link Phaser.GameObjects.Particles.GravityWell Gravity Wells}.
  30997. *
  30998. * @class ParticleEmitterManager
  30999. * @extends Phaser.GameObjects.GameObject
  31000. * @memberof Phaser.GameObjects.Particles
  31001. * @constructor
  31002. * @since 3.0.0
  31003. *
  31004. * @extends Phaser.GameObjects.Components.Depth
  31005. * @extends Phaser.GameObjects.Components.Pipeline
  31006. * @extends Phaser.GameObjects.Components.Transform
  31007. * @extends Phaser.GameObjects.Components.Visible
  31008. *
  31009. * @param {Phaser.Scene} scene - The Scene to which this Emitter Manager belongs.
  31010. * @param {string} texture - The key of the Texture this Emitter Manager will use to render particles, as stored in the Texture Manager.
  31011. * @param {(string|integer)} [frame] - An optional frame from the Texture this Emitter Manager will use to render particles.
  31012. * @param {ParticleEmitterConfig|ParticleEmitterConfig[]} [emitters] - Configuration settings for one or more emitters to create.
  31013. */
  31014. var ParticleEmitterManager = new Class({
  31015. Extends: GameObject,
  31016. Mixins: [
  31017. Components.Depth,
  31018. Components.Pipeline,
  31019. Components.Transform,
  31020. Components.Visible,
  31021. Render
  31022. ],
  31023. initialize:
  31024. // frame is optional and can contain the emitters array or object if skipped
  31025. function ParticleEmitterManager (scene, texture, frame, emitters)
  31026. {
  31027. GameObject.call(this, scene, 'ParticleEmitterManager');
  31028. /**
  31029. * The blend mode applied to all emitters and particles.
  31030. *
  31031. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#blendMode
  31032. * @type {integer}
  31033. * @default -1
  31034. * @private
  31035. * @since 3.0.0
  31036. */
  31037. this.blendMode = -1;
  31038. /**
  31039. * The time scale applied to all emitters and particles, affecting flow rate, lifespan, and movement.
  31040. * Values larger than 1 are faster than normal.
  31041. * This is multiplied with any timeScale set on each individual emitter.
  31042. *
  31043. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#timeScale
  31044. * @type {number}
  31045. * @default 1
  31046. * @since 3.0.0
  31047. */
  31048. this.timeScale = 1;
  31049. /**
  31050. * The texture used to render this Emitter Manager's particles.
  31051. *
  31052. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#texture
  31053. * @type {Phaser.Textures.Texture}
  31054. * @default null
  31055. * @since 3.0.0
  31056. */
  31057. this.texture = null;
  31058. /**
  31059. * The texture frame used to render this Emitter Manager's particles.
  31060. *
  31061. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#frame
  31062. * @type {Phaser.Textures.Frame}
  31063. * @default null
  31064. * @since 3.0.0
  31065. */
  31066. this.frame = null;
  31067. /**
  31068. * Names of this Emitter Manager's texture frames.
  31069. *
  31070. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#frameNames
  31071. * @type {string[]}
  31072. * @since 3.0.0
  31073. */
  31074. this.frameNames = [];
  31075. // frame is optional and can contain the emitters array or object if skipped
  31076. if (frame !== null && (typeof frame === 'object' || Array.isArray(frame)))
  31077. {
  31078. emitters = frame;
  31079. frame = null;
  31080. }
  31081. this.setTexture(texture, frame);
  31082. this.initPipeline();
  31083. /**
  31084. * A list of Emitters being managed by this Emitter Manager.
  31085. *
  31086. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#emitters
  31087. * @type {Phaser.Structs.List.<Phaser.GameObjects.Particles.ParticleEmitter>}
  31088. * @since 3.0.0
  31089. */
  31090. this.emitters = new List(this);
  31091. /**
  31092. * A list of Gravity Wells being managed by this Emitter Manager.
  31093. *
  31094. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#wells
  31095. * @type {Phaser.Structs.List.<Phaser.GameObjects.Particles.GravityWell>}
  31096. * @since 3.0.0
  31097. */
  31098. this.wells = new List(this);
  31099. if (emitters)
  31100. {
  31101. // An array of emitter configs?
  31102. if (!Array.isArray(emitters))
  31103. {
  31104. emitters = [ emitters ];
  31105. }
  31106. for (var i = 0; i < emitters.length; i++)
  31107. {
  31108. this.createEmitter(emitters[i]);
  31109. }
  31110. }
  31111. },
  31112. /**
  31113. * Sets the texture and frame this Emitter Manager will use to render with.
  31114. *
  31115. * Textures are referenced by their string-based keys, as stored in the Texture Manager.
  31116. *
  31117. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setTexture
  31118. * @since 3.0.0
  31119. *
  31120. * @param {string} key - The key of the texture to be used, as stored in the Texture Manager.
  31121. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  31122. *
  31123. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  31124. */
  31125. setTexture: function (key, frame)
  31126. {
  31127. this.texture = this.scene.sys.textures.get(key);
  31128. return this.setFrame(frame);
  31129. },
  31130. /**
  31131. * Sets the frame this Emitter Manager will use to render with.
  31132. *
  31133. * The Frame has to belong to the current Texture being used.
  31134. *
  31135. * It can be either a string or an index.
  31136. *
  31137. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setFrame
  31138. * @since 3.0.0
  31139. *
  31140. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  31141. *
  31142. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  31143. */
  31144. setFrame: function (frame)
  31145. {
  31146. this.frame = this.texture.get(frame);
  31147. var frames = this.texture.getFramesFromTextureSource(this.frame.sourceIndex);
  31148. var names = [];
  31149. frames.forEach(function (sourceFrame)
  31150. {
  31151. names.push(sourceFrame.name);
  31152. });
  31153. this.frameNames = names;
  31154. this.defaultFrame = this.frame;
  31155. return this;
  31156. },
  31157. /**
  31158. * Assigns texture frames to an emitter.
  31159. *
  31160. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setEmitterFrames
  31161. * @since 3.0.0
  31162. *
  31163. * @param {(Phaser.Textures.Frame|Phaser.Textures.Frame[])} frames - The texture frames.
  31164. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The particle emitter to modify.
  31165. *
  31166. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  31167. */
  31168. setEmitterFrames: function (frames, emitter)
  31169. {
  31170. if (!Array.isArray(frames))
  31171. {
  31172. frames = [ frames ];
  31173. }
  31174. var out = emitter.frames;
  31175. out.length = 0;
  31176. for (var i = 0; i < frames.length; i++)
  31177. {
  31178. var frame = frames[i];
  31179. if (this.frameNames.indexOf(frame) !== -1)
  31180. {
  31181. out.push(this.texture.get(frame));
  31182. }
  31183. }
  31184. if (out.length > 0)
  31185. {
  31186. emitter.defaultFrame = out[0];
  31187. }
  31188. else
  31189. {
  31190. emitter.defaultFrame = this.defaultFrame;
  31191. }
  31192. return this;
  31193. },
  31194. /**
  31195. * Adds an existing Particle Emitter to this Emitter Manager.
  31196. *
  31197. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#addEmitter
  31198. * @since 3.0.0
  31199. *
  31200. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The Particle Emitter to add to this Emitter Manager.
  31201. *
  31202. * @return {Phaser.GameObjects.Particles.ParticleEmitter} The Particle Emitter that was added to this Emitter Manager.
  31203. */
  31204. addEmitter: function (emitter)
  31205. {
  31206. return this.emitters.add(emitter);
  31207. },
  31208. /**
  31209. * Creates a new Particle Emitter object, adds it to this Emitter Manager and returns a reference to it.
  31210. *
  31211. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#createEmitter
  31212. * @since 3.0.0
  31213. *
  31214. * @param {ParticleEmitterConfig} config - Configuration settings for the Particle Emitter to create.
  31215. *
  31216. * @return {Phaser.GameObjects.Particles.ParticleEmitter} The Particle Emitter that was created.
  31217. */
  31218. createEmitter: function (config)
  31219. {
  31220. return this.addEmitter(new ParticleEmitter(this, config));
  31221. },
  31222. /**
  31223. * Adds an existing Gravity Well object to this Emitter Manager.
  31224. *
  31225. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#addGravityWell
  31226. * @since 3.0.0
  31227. *
  31228. * @param {Phaser.GameObjects.Particles.GravityWell} well - The Gravity Well to add to this Emitter Manager.
  31229. *
  31230. * @return {Phaser.GameObjects.Particles.GravityWell} The Gravity Well that was added to this Emitter Manager.
  31231. */
  31232. addGravityWell: function (well)
  31233. {
  31234. return this.wells.add(well);
  31235. },
  31236. /**
  31237. * Creates a new Gravity Well, adds it to this Emitter Manager and returns a reference to it.
  31238. *
  31239. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#createGravityWell
  31240. * @since 3.0.0
  31241. *
  31242. * @param {GravityWellConfig} config - Configuration settings for the Gravity Well to create.
  31243. *
  31244. * @return {Phaser.GameObjects.Particles.GravityWell} The Gravity Well that was created.
  31245. */
  31246. createGravityWell: function (config)
  31247. {
  31248. return this.addGravityWell(new GravityWell(config));
  31249. },
  31250. /**
  31251. * Emits particles from each active emitter.
  31252. *
  31253. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#emitParticle
  31254. * @since 3.0.0
  31255. *
  31256. * @param {integer} [count] - The number of particles to release from each emitter. The default is the emitter's own {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity}.
  31257. * @param {number} [x] - The x-coordinate to to emit particles from. The default is the x-coordinate of the emitter's current location.
  31258. * @param {number} [y] - The y-coordinate to to emit particles from. The default is the y-coordinate of the emitter's current location.
  31259. *
  31260. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  31261. */
  31262. emitParticle: function (count, x, y)
  31263. {
  31264. var emitters = this.emitters.list;
  31265. for (var i = 0; i < emitters.length; i++)
  31266. {
  31267. var emitter = emitters[i];
  31268. if (emitter.active)
  31269. {
  31270. emitter.emitParticle(count, x, y);
  31271. }
  31272. }
  31273. return this;
  31274. },
  31275. /**
  31276. * Emits particles from each active emitter.
  31277. *
  31278. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#emitParticleAt
  31279. * @since 3.0.0
  31280. *
  31281. * @param {number} [x] - The x-coordinate to to emit particles from. The default is the x-coordinate of the emitter's current location.
  31282. * @param {number} [y] - The y-coordinate to to emit particles from. The default is the y-coordinate of the emitter's current location.
  31283. * @param {integer} [count] - The number of particles to release from each emitter. The default is the emitter's own {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity}.
  31284. *
  31285. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  31286. */
  31287. emitParticleAt: function (x, y, count)
  31288. {
  31289. return this.emitParticle(count, x, y);
  31290. },
  31291. /**
  31292. * Pauses this Emitter Manager.
  31293. *
  31294. * This has the effect of pausing all emitters, and all particles of those emitters, currently under its control.
  31295. *
  31296. * The particles will still render, but they will not have any of their logic updated.
  31297. *
  31298. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#pause
  31299. * @since 3.0.0
  31300. *
  31301. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  31302. */
  31303. pause: function ()
  31304. {
  31305. this.active = false;
  31306. return this;
  31307. },
  31308. /**
  31309. * Resumes this Emitter Manager, should it have been previously paused.
  31310. *
  31311. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#resume
  31312. * @since 3.0.0
  31313. *
  31314. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  31315. */
  31316. resume: function ()
  31317. {
  31318. this.active = true;
  31319. return this;
  31320. },
  31321. /**
  31322. * Gets all active particle processors (gravity wells).
  31323. *
  31324. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#getProcessors
  31325. * @since 3.0.0
  31326. *
  31327. * @return {Phaser.GameObjects.Particles.GravityWell[]} - The active gravity wells.
  31328. */
  31329. getProcessors: function ()
  31330. {
  31331. return this.wells.getAll('active', true);
  31332. },
  31333. /**
  31334. * Updates all active emitters.
  31335. *
  31336. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#preUpdate
  31337. * @since 3.0.0
  31338. *
  31339. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  31340. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  31341. */
  31342. preUpdate: function (time, delta)
  31343. {
  31344. // Scale the delta
  31345. delta *= this.timeScale;
  31346. var emitters = this.emitters.list;
  31347. for (var i = 0; i < emitters.length; i++)
  31348. {
  31349. var emitter = emitters[i];
  31350. if (emitter.active)
  31351. {
  31352. emitter.preUpdate(time, delta);
  31353. }
  31354. }
  31355. },
  31356. /**
  31357. * A NOOP method so you can pass an EmitterManager to a Container.
  31358. * Calling this method will do nothing. It is intentionally empty.
  31359. *
  31360. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setAlpha
  31361. * @private
  31362. * @since 3.10.0
  31363. */
  31364. setAlpha: function ()
  31365. {
  31366. },
  31367. /**
  31368. * A NOOP method so you can pass an EmitterManager to a Container.
  31369. * Calling this method will do nothing. It is intentionally empty.
  31370. *
  31371. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setScrollFactor
  31372. * @private
  31373. * @since 3.10.0
  31374. */
  31375. setScrollFactor: function ()
  31376. {
  31377. },
  31378. /**
  31379. * A NOOP method so you can pass an EmitterManager to a Container.
  31380. * Calling this method will do nothing. It is intentionally empty.
  31381. *
  31382. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setBlendMode
  31383. * @private
  31384. * @since 3.15.0
  31385. */
  31386. setBlendMode: function ()
  31387. {
  31388. }
  31389. });
  31390. module.exports = ParticleEmitterManager;
  31391. /***/ }),
  31392. /* 166 */
  31393. /***/ (function(module, exports, __webpack_require__) {
  31394. /**
  31395. * @author Richard Davey <rich@photonstorm.com>
  31396. * @copyright 2019 Photon Storm Ltd.
  31397. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31398. */
  31399. var Point = __webpack_require__(6);
  31400. /**
  31401. * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse based on the given angle.
  31402. *
  31403. * @function Phaser.Geom.Ellipse.CircumferencePoint
  31404. * @since 3.0.0
  31405. *
  31406. * @generic {Phaser.Geom.Point} O - [out,$return]
  31407. *
  31408. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the circumference point on.
  31409. * @param {number} angle - The angle from the center of the Ellipse to the circumference to return the point from. Given in radians.
  31410. * @param {(Phaser.Geom.Point|object)} [out] - A Point, or point-like object, to store the results in. If not given a Point will be created.
  31411. *
  31412. * @return {(Phaser.Geom.Point|object)} A Point object where the `x` and `y` properties are the point on the circumference.
  31413. */
  31414. var CircumferencePoint = function (ellipse, angle, out)
  31415. {
  31416. if (out === undefined) { out = new Point(); }
  31417. var halfWidth = ellipse.width / 2;
  31418. var halfHeight = ellipse.height / 2;
  31419. out.x = ellipse.x + halfWidth * Math.cos(angle);
  31420. out.y = ellipse.y + halfHeight * Math.sin(angle);
  31421. return out;
  31422. };
  31423. module.exports = CircumferencePoint;
  31424. /***/ }),
  31425. /* 167 */
  31426. /***/ (function(module, exports) {
  31427. /**
  31428. * @author Richard Davey <rich@photonstorm.com>
  31429. * @copyright 2019 Photon Storm Ltd.
  31430. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31431. */
  31432. module.exports = {
  31433. ARC: 0,
  31434. BEGIN_PATH: 1,
  31435. CLOSE_PATH: 2,
  31436. FILL_RECT: 3,
  31437. LINE_TO: 4,
  31438. MOVE_TO: 5,
  31439. LINE_STYLE: 6,
  31440. FILL_STYLE: 7,
  31441. FILL_PATH: 8,
  31442. STROKE_PATH: 9,
  31443. FILL_TRIANGLE: 10,
  31444. STROKE_TRIANGLE: 11,
  31445. LINE_FX_TO: 12,
  31446. MOVE_FX_TO: 13,
  31447. SAVE: 14,
  31448. RESTORE: 15,
  31449. TRANSLATE: 16,
  31450. SCALE: 17,
  31451. ROTATE: 18,
  31452. SET_TEXTURE: 19,
  31453. CLEAR_TEXTURE: 20,
  31454. GRADIENT_FILL_STYLE: 21,
  31455. GRADIENT_LINE_STYLE: 22
  31456. };
  31457. /***/ }),
  31458. /* 168 */
  31459. /***/ (function(module, exports, __webpack_require__) {
  31460. /**
  31461. * @author Richard Davey <rich@photonstorm.com>
  31462. * @copyright 2019 Photon Storm Ltd.
  31463. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31464. */
  31465. var BaseCamera = __webpack_require__(131);
  31466. var Class = __webpack_require__(0);
  31467. var Commands = __webpack_require__(167);
  31468. var ComponentsAlpha = __webpack_require__(435);
  31469. var ComponentsBlendMode = __webpack_require__(432);
  31470. var ComponentsDepth = __webpack_require__(431);
  31471. var ComponentsMask = __webpack_require__(427);
  31472. var ComponentsPipeline = __webpack_require__(200);
  31473. var ComponentsTransform = __webpack_require__(422);
  31474. var ComponentsVisible = __webpack_require__(421);
  31475. var ComponentsScrollFactor = __webpack_require__(424);
  31476. var Ellipse = __webpack_require__(96);
  31477. var GameObject = __webpack_require__(18);
  31478. var GetFastValue = __webpack_require__(2);
  31479. var GetValue = __webpack_require__(4);
  31480. var MATH_CONST = __webpack_require__(20);
  31481. var Render = __webpack_require__(854);
  31482. /**
  31483. * Graphics line style (or stroke style) settings.
  31484. *
  31485. * @typedef {object} GraphicsLineStyle
  31486. *
  31487. * @property {number} [width] - The stroke width.
  31488. * @property {number} [color] - The stroke color.
  31489. * @property {number} [alpha] - The stroke alpha.
  31490. */
  31491. /**
  31492. * Graphics fill style settings.
  31493. *
  31494. * @typedef {object} GraphicsFillStyle
  31495. *
  31496. * @property {number} [color] - The fill color.
  31497. * @property {number} [alpha] - The fill alpha.
  31498. */
  31499. /**
  31500. * Graphics style settings.
  31501. *
  31502. * @typedef {object} GraphicsStyles
  31503. *
  31504. * @property {GraphicsLineStyle} [lineStyle] - The style applied to shape outlines.
  31505. * @property {GraphicsFillStyle} [fillStyle] - The style applied to shape areas.
  31506. */
  31507. /**
  31508. * Options for the Graphics game Object.
  31509. *
  31510. * @typedef {object} GraphicsOptions
  31511. * @extends GraphicsStyles
  31512. *
  31513. * @property {number} [x] - The x coordinate of the Graphics.
  31514. * @property {number} [y] - The y coordinate of the Graphics.
  31515. */
  31516. /**
  31517. * @classdesc
  31518. * A Graphics object is a way to draw primitive shapes to your game. Primitives include forms of geometry, such as
  31519. * Rectangles, Circles, and Polygons. They also include lines, arcs and curves. When you initially create a Graphics
  31520. * object it will be empty.
  31521. *
  31522. * To draw to it you must first specify a line style or fill style (or both), draw shapes using paths, and finally
  31523. * fill or stroke them. For example:
  31524. *
  31525. * ```javascript
  31526. * graphics.lineStyle(5, 0xFF00FF, 1.0);
  31527. * graphics.beginPath();
  31528. * graphics.moveTo(100, 100);
  31529. * graphics.lineTo(200, 200);
  31530. * graphics.closePath();
  31531. * graphics.strokePath();
  31532. * ```
  31533. *
  31534. * There are also many helpful methods that draw and fill/stroke common shapes for you.
  31535. *
  31536. * ```javascript
  31537. * graphics.lineStyle(5, 0xFF00FF, 1.0);
  31538. * graphics.fillStyle(0xFFFFFF, 1.0);
  31539. * graphics.fillRect(50, 50, 400, 200);
  31540. * graphics.strokeRect(50, 50, 400, 200);
  31541. * ```
  31542. *
  31543. * When a Graphics object is rendered it will render differently based on if the game is running under Canvas or WebGL.
  31544. * Under Canvas it will use the HTML Canvas context drawing operations to draw the path.
  31545. * Under WebGL the graphics data is decomposed into polygons. Both of these are expensive processes, especially with
  31546. * complex shapes.
  31547. *
  31548. * If your Graphics object doesn't change much (or at all) once you've drawn your shape to it, then you will help
  31549. * performance by calling {@link Phaser.GameObjects.Graphics#generateTexture}. This will 'bake' the Graphics object into
  31550. * a Texture, and return it. You can then use this Texture for Sprites or other display objects. If your Graphics object
  31551. * updates frequently then you should avoid doing this, as it will constantly generate new textures, which will consume
  31552. * memory.
  31553. *
  31554. * As you can tell, Graphics objects are a bit of a trade-off. While they are extremely useful, you need to be careful
  31555. * in their complexity and quantity of them in your game.
  31556. *
  31557. * @class Graphics
  31558. * @extends Phaser.GameObjects.GameObject
  31559. * @memberof Phaser.GameObjects
  31560. * @constructor
  31561. * @since 3.0.0
  31562. *
  31563. * @extends Phaser.GameObjects.Components.Alpha
  31564. * @extends Phaser.GameObjects.Components.BlendMode
  31565. * @extends Phaser.GameObjects.Components.Depth
  31566. * @extends Phaser.GameObjects.Components.Mask
  31567. * @extends Phaser.GameObjects.Components.Pipeline
  31568. * @extends Phaser.GameObjects.Components.Transform
  31569. * @extends Phaser.GameObjects.Components.Visible
  31570. * @extends Phaser.GameObjects.Components.ScrollFactor
  31571. *
  31572. * @param {Phaser.Scene} scene - The Scene to which this Graphics object belongs.
  31573. * @param {GraphicsOptions} [options] - Options that set the position and default style of this Graphics object.
  31574. */
  31575. var Graphics = new Class({
  31576. Extends: GameObject,
  31577. Mixins: [
  31578. ComponentsAlpha,
  31579. ComponentsBlendMode,
  31580. ComponentsDepth,
  31581. ComponentsMask,
  31582. ComponentsPipeline,
  31583. ComponentsTransform,
  31584. ComponentsVisible,
  31585. ComponentsScrollFactor,
  31586. Render
  31587. ],
  31588. initialize:
  31589. function Graphics (scene, options)
  31590. {
  31591. var x = GetValue(options, 'x', 0);
  31592. var y = GetValue(options, 'y', 0);
  31593. GameObject.call(this, scene, 'Graphics');
  31594. this.setPosition(x, y);
  31595. this.initPipeline();
  31596. /**
  31597. * The horizontal display origin of the Graphics.
  31598. *
  31599. * @name Phaser.GameObjects.Graphics#displayOriginX
  31600. * @type {number}
  31601. * @default 0
  31602. * @since 3.0.0
  31603. */
  31604. this.displayOriginX = 0;
  31605. /**
  31606. * The vertical display origin of the Graphics.
  31607. *
  31608. * @name Phaser.GameObjects.Graphics#displayOriginY
  31609. * @type {number}
  31610. * @default 0
  31611. * @since 3.0.0
  31612. */
  31613. this.displayOriginY = 0;
  31614. /**
  31615. * The array of commands used to render the Graphics.
  31616. *
  31617. * @name Phaser.GameObjects.Graphics#commandBuffer
  31618. * @type {array}
  31619. * @default []
  31620. * @since 3.0.0
  31621. */
  31622. this.commandBuffer = [];
  31623. /**
  31624. * The default fill color for shapes rendered by this Graphics object.
  31625. *
  31626. * @name Phaser.GameObjects.Graphics#defaultFillColor
  31627. * @type {number}
  31628. * @default -1
  31629. * @since 3.0.0
  31630. */
  31631. this.defaultFillColor = -1;
  31632. /**
  31633. * The default fill alpha for shapes rendered by this Graphics object.
  31634. *
  31635. * @name Phaser.GameObjects.Graphics#defaultFillAlpha
  31636. * @type {number}
  31637. * @default 1
  31638. * @since 3.0.0
  31639. */
  31640. this.defaultFillAlpha = 1;
  31641. /**
  31642. * The default stroke width for shapes rendered by this Graphics object.
  31643. *
  31644. * @name Phaser.GameObjects.Graphics#defaultStrokeWidth
  31645. * @type {number}
  31646. * @default 1
  31647. * @since 3.0.0
  31648. */
  31649. this.defaultStrokeWidth = 1;
  31650. /**
  31651. * The default stroke color for shapes rendered by this Graphics object.
  31652. *
  31653. * @name Phaser.GameObjects.Graphics#defaultStrokeColor
  31654. * @type {number}
  31655. * @default -1
  31656. * @since 3.0.0
  31657. */
  31658. this.defaultStrokeColor = -1;
  31659. /**
  31660. * The default stroke alpha for shapes rendered by this Graphics object.
  31661. *
  31662. * @name Phaser.GameObjects.Graphics#defaultStrokeAlpha
  31663. * @type {number}
  31664. * @default 1
  31665. * @since 3.0.0
  31666. */
  31667. this.defaultStrokeAlpha = 1;
  31668. /**
  31669. * Internal property that keeps track of the line width style setting.
  31670. *
  31671. * @name Phaser.GameObjects.Graphics#_lineWidth
  31672. * @type {number}
  31673. * @private
  31674. * @since 3.0.0
  31675. */
  31676. this._lineWidth = 1.0;
  31677. this.setDefaultStyles(options);
  31678. },
  31679. /**
  31680. * Set the default style settings for this Graphics object.
  31681. *
  31682. * @method Phaser.GameObjects.Graphics#setDefaultStyles
  31683. * @since 3.0.0
  31684. *
  31685. * @param {GraphicsStyles} options - The styles to set as defaults.
  31686. *
  31687. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31688. */
  31689. setDefaultStyles: function (options)
  31690. {
  31691. if (GetValue(options, 'lineStyle', null))
  31692. {
  31693. this.defaultStrokeWidth = GetValue(options, 'lineStyle.width', 1);
  31694. this.defaultStrokeColor = GetValue(options, 'lineStyle.color', 0xffffff);
  31695. this.defaultStrokeAlpha = GetValue(options, 'lineStyle.alpha', 1);
  31696. this.lineStyle(this.defaultStrokeWidth, this.defaultStrokeColor, this.defaultStrokeAlpha);
  31697. }
  31698. if (GetValue(options, 'fillStyle', null))
  31699. {
  31700. this.defaultFillColor = GetValue(options, 'fillStyle.color', 0xffffff);
  31701. this.defaultFillAlpha = GetValue(options, 'fillStyle.alpha', 1);
  31702. this.fillStyle(this.defaultFillColor, this.defaultFillAlpha);
  31703. }
  31704. return this;
  31705. },
  31706. /**
  31707. * Set the current line style.
  31708. *
  31709. * @method Phaser.GameObjects.Graphics#lineStyle
  31710. * @since 3.0.0
  31711. *
  31712. * @param {number} lineWidth - The stroke width.
  31713. * @param {number} color - The stroke color.
  31714. * @param {number} [alpha=1] - The stroke alpha.
  31715. *
  31716. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31717. */
  31718. lineStyle: function (lineWidth, color, alpha)
  31719. {
  31720. if (alpha === undefined) { alpha = 1; }
  31721. this.commandBuffer.push(
  31722. Commands.LINE_STYLE,
  31723. lineWidth, color, alpha
  31724. );
  31725. this._lineWidth = lineWidth;
  31726. return this;
  31727. },
  31728. /**
  31729. * Set the current fill style.
  31730. *
  31731. * @method Phaser.GameObjects.Graphics#fillStyle
  31732. * @since 3.0.0
  31733. *
  31734. * @param {number} color - The fill color.
  31735. * @param {number} [alpha=1] - The fill alpha.
  31736. *
  31737. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31738. */
  31739. fillStyle: function (color, alpha)
  31740. {
  31741. if (alpha === undefined) { alpha = 1; }
  31742. this.commandBuffer.push(
  31743. Commands.FILL_STYLE,
  31744. color, alpha
  31745. );
  31746. return this;
  31747. },
  31748. /**
  31749. * Sets a gradient fill style. This is a WebGL only feature.
  31750. *
  31751. * The gradient color values represent the 4 corners of an untransformed rectangle.
  31752. * The gradient is used to color all filled shapes and paths drawn after calling this method.
  31753. * If you wish to turn a gradient off, call `fillStyle` and provide a new single fill color.
  31754. *
  31755. * When filling a triangle only the first 3 color values provided are used for the 3 points of a triangle.
  31756. *
  31757. * This feature is best used only on rectangles and triangles. All other shapes will give strange results.
  31758. *
  31759. * Note that for objects such as arcs or ellipses, or anything which is made out of triangles, each triangle used
  31760. * will be filled with a gradient on its own. There is no ability to gradient fill a shape or path as a single
  31761. * entity at this time.
  31762. *
  31763. * @method Phaser.GameObjects.Graphics#fillGradientStyle
  31764. * @webglOnly
  31765. * @since 3.12.0
  31766. *
  31767. * @param {integer} topLeft - The tint being applied to the top-left of the Game Object.
  31768. * @param {integer} topRight - The tint being applied to the top-right of the Game Object.
  31769. * @param {integer} bottomLeft - The tint being applied to the bottom-left of the Game Object.
  31770. * @param {integer} bottomRight - The tint being applied to the bottom-right of the Game Object.
  31771. * @param {number} [alpha=1] - The fill alpha.
  31772. *
  31773. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31774. */
  31775. fillGradientStyle: function (topLeft, topRight, bottomLeft, bottomRight, alpha)
  31776. {
  31777. if (alpha === undefined) { alpha = 1; }
  31778. this.commandBuffer.push(
  31779. Commands.GRADIENT_FILL_STYLE,
  31780. alpha, topLeft, topRight, bottomLeft, bottomRight
  31781. );
  31782. return this;
  31783. },
  31784. /**
  31785. * Sets a gradient line style. This is a WebGL only feature.
  31786. *
  31787. * The gradient color values represent the 4 corners of an untransformed rectangle.
  31788. * The gradient is used to color all stroked shapes and paths drawn after calling this method.
  31789. * If you wish to turn a gradient off, call `lineStyle` and provide a new single line color.
  31790. *
  31791. * This feature is best used only on single lines. All other shapes will give strange results.
  31792. *
  31793. * Note that for objects such as arcs or ellipses, or anything which is made out of triangles, each triangle used
  31794. * will be filled with a gradient on its own. There is no ability to gradient stroke a shape or path as a single
  31795. * entity at this time.
  31796. *
  31797. * @method Phaser.GameObjects.Graphics#lineGradientStyle
  31798. * @webglOnly
  31799. * @since 3.12.0
  31800. *
  31801. * @param {number} lineWidth - The stroke width.
  31802. * @param {integer} topLeft - The tint being applied to the top-left of the Game Object.
  31803. * @param {integer} topRight - The tint being applied to the top-right of the Game Object.
  31804. * @param {integer} bottomLeft - The tint being applied to the bottom-left of the Game Object.
  31805. * @param {integer} bottomRight - The tint being applied to the bottom-right of the Game Object.
  31806. * @param {number} [alpha=1] - The fill alpha.
  31807. *
  31808. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31809. */
  31810. lineGradientStyle: function (lineWidth, topLeft, topRight, bottomLeft, bottomRight, alpha)
  31811. {
  31812. if (alpha === undefined) { alpha = 1; }
  31813. this.commandBuffer.push(
  31814. Commands.GRADIENT_LINE_STYLE,
  31815. lineWidth, alpha, topLeft, topRight, bottomLeft, bottomRight
  31816. );
  31817. return this;
  31818. },
  31819. /**
  31820. * Sets the texture frame this Graphics Object will use when drawing all shapes defined after calling this.
  31821. *
  31822. * Textures are referenced by their string-based keys, as stored in the Texture Manager.
  31823. *
  31824. * Once set, all shapes will use this texture. Call this method with no arguments to clear it.
  31825. *
  31826. * The textures are not tiled. They are stretched to the dimensions of the shapes being rendered. For this reason,
  31827. * it works best with seamless / tileable textures.
  31828. *
  31829. * The mode argument controls how the textures are combined with the fill colors. The default value (0) will
  31830. * multiply the texture by the fill color. A value of 1 will use just the fill color, but the alpha data from the texture,
  31831. * and a value of 2 will use just the texture and no fill color at all.
  31832. *
  31833. * @method Phaser.GameObjects.Graphics#setTexture
  31834. * @since 3.12.0
  31835. * @webglOnly
  31836. *
  31837. * @param {string} [key] - The key of the texture to be used, as stored in the Texture Manager. Leave blank to clear a previously set texture.
  31838. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  31839. * @param {number} [mode=0] - The texture tint mode. 0 is multiply, 1 is alpha only and 2 is texture only.
  31840. *
  31841. * @return {this} This Game Object.
  31842. */
  31843. setTexture: function (key, frame, mode)
  31844. {
  31845. if (mode === undefined) { mode = 0; }
  31846. if (key === undefined)
  31847. {
  31848. this.commandBuffer.push(
  31849. Commands.CLEAR_TEXTURE
  31850. );
  31851. }
  31852. else
  31853. {
  31854. var textureFrame = this.scene.sys.textures.getFrame(key, frame);
  31855. if (textureFrame)
  31856. {
  31857. if (mode === 2)
  31858. {
  31859. mode = 3;
  31860. }
  31861. this.commandBuffer.push(
  31862. Commands.SET_TEXTURE,
  31863. textureFrame,
  31864. mode
  31865. );
  31866. }
  31867. }
  31868. return this;
  31869. },
  31870. /**
  31871. * Start a new shape path.
  31872. *
  31873. * @method Phaser.GameObjects.Graphics#beginPath
  31874. * @since 3.0.0
  31875. *
  31876. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31877. */
  31878. beginPath: function ()
  31879. {
  31880. this.commandBuffer.push(
  31881. Commands.BEGIN_PATH
  31882. );
  31883. return this;
  31884. },
  31885. /**
  31886. * Close the current path.
  31887. *
  31888. * @method Phaser.GameObjects.Graphics#closePath
  31889. * @since 3.0.0
  31890. *
  31891. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31892. */
  31893. closePath: function ()
  31894. {
  31895. this.commandBuffer.push(
  31896. Commands.CLOSE_PATH
  31897. );
  31898. return this;
  31899. },
  31900. /**
  31901. * Fill the current path.
  31902. *
  31903. * @method Phaser.GameObjects.Graphics#fillPath
  31904. * @since 3.0.0
  31905. *
  31906. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31907. */
  31908. fillPath: function ()
  31909. {
  31910. this.commandBuffer.push(
  31911. Commands.FILL_PATH
  31912. );
  31913. return this;
  31914. },
  31915. /**
  31916. * Fill the current path.
  31917. *
  31918. * This is an alias for `Graphics.fillPath` and does the same thing.
  31919. * It was added to match the CanvasRenderingContext 2D API.
  31920. *
  31921. * @method Phaser.GameObjects.Graphics#fill
  31922. * @since 3.16.0
  31923. *
  31924. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31925. */
  31926. fill: function ()
  31927. {
  31928. this.commandBuffer.push(
  31929. Commands.FILL_PATH
  31930. );
  31931. return this;
  31932. },
  31933. /**
  31934. * Stroke the current path.
  31935. *
  31936. * @method Phaser.GameObjects.Graphics#strokePath
  31937. * @since 3.0.0
  31938. *
  31939. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31940. */
  31941. strokePath: function ()
  31942. {
  31943. this.commandBuffer.push(
  31944. Commands.STROKE_PATH
  31945. );
  31946. return this;
  31947. },
  31948. /**
  31949. * Stroke the current path.
  31950. *
  31951. * This is an alias for `Graphics.strokePath` and does the same thing.
  31952. * It was added to match the CanvasRenderingContext 2D API.
  31953. *
  31954. * @method Phaser.GameObjects.Graphics#stroke
  31955. * @since 3.16.0
  31956. *
  31957. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31958. */
  31959. stroke: function ()
  31960. {
  31961. this.commandBuffer.push(
  31962. Commands.STROKE_PATH
  31963. );
  31964. return this;
  31965. },
  31966. /**
  31967. * Fill the given circle.
  31968. *
  31969. * @method Phaser.GameObjects.Graphics#fillCircleShape
  31970. * @since 3.0.0
  31971. *
  31972. * @param {Phaser.Geom.Circle} circle - The circle to fill.
  31973. *
  31974. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31975. */
  31976. fillCircleShape: function (circle)
  31977. {
  31978. return this.fillCircle(circle.x, circle.y, circle.radius);
  31979. },
  31980. /**
  31981. * Stroke the given circle.
  31982. *
  31983. * @method Phaser.GameObjects.Graphics#strokeCircleShape
  31984. * @since 3.0.0
  31985. *
  31986. * @param {Phaser.Geom.Circle} circle - The circle to stroke.
  31987. *
  31988. * @return {Phaser.GameObjects.Graphics} This Game Object.
  31989. */
  31990. strokeCircleShape: function (circle)
  31991. {
  31992. return this.strokeCircle(circle.x, circle.y, circle.radius);
  31993. },
  31994. /**
  31995. * Fill a circle with the given position and radius.
  31996. *
  31997. * @method Phaser.GameObjects.Graphics#fillCircle
  31998. * @since 3.0.0
  31999. *
  32000. * @param {number} x - The x coordinate of the center of the circle.
  32001. * @param {number} y - The y coordinate of the center of the circle.
  32002. * @param {number} radius - The radius of the circle.
  32003. *
  32004. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32005. */
  32006. fillCircle: function (x, y, radius)
  32007. {
  32008. this.beginPath();
  32009. this.arc(x, y, radius, 0, MATH_CONST.PI2);
  32010. this.fillPath();
  32011. return this;
  32012. },
  32013. /**
  32014. * Stroke a circle with the given position and radius.
  32015. *
  32016. * @method Phaser.GameObjects.Graphics#strokeCircle
  32017. * @since 3.0.0
  32018. *
  32019. * @param {number} x - The x coordinate of the center of the circle.
  32020. * @param {number} y - The y coordinate of the center of the circle.
  32021. * @param {number} radius - The radius of the circle.
  32022. *
  32023. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32024. */
  32025. strokeCircle: function (x, y, radius)
  32026. {
  32027. this.beginPath();
  32028. this.arc(x, y, radius, 0, MATH_CONST.PI2);
  32029. this.strokePath();
  32030. return this;
  32031. },
  32032. /**
  32033. * Fill the given rectangle.
  32034. *
  32035. * @method Phaser.GameObjects.Graphics#fillRectShape
  32036. * @since 3.0.0
  32037. *
  32038. * @param {Phaser.Geom.Rectangle} rect - The rectangle to fill.
  32039. *
  32040. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32041. */
  32042. fillRectShape: function (rect)
  32043. {
  32044. return this.fillRect(rect.x, rect.y, rect.width, rect.height);
  32045. },
  32046. /**
  32047. * Stroke the given rectangle.
  32048. *
  32049. * @method Phaser.GameObjects.Graphics#strokeRectShape
  32050. * @since 3.0.0
  32051. *
  32052. * @param {Phaser.Geom.Rectangle} rect - The rectangle to stroke.
  32053. *
  32054. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32055. */
  32056. strokeRectShape: function (rect)
  32057. {
  32058. return this.strokeRect(rect.x, rect.y, rect.width, rect.height);
  32059. },
  32060. /**
  32061. * Fill a rectangle with the given position and size.
  32062. *
  32063. * @method Phaser.GameObjects.Graphics#fillRect
  32064. * @since 3.0.0
  32065. *
  32066. * @param {number} x - The x coordinate of the top-left of the rectangle.
  32067. * @param {number} y - The y coordinate of the top-left of the rectangle.
  32068. * @param {number} width - The width of the rectangle.
  32069. * @param {number} height - The height of the rectangle.
  32070. *
  32071. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32072. */
  32073. fillRect: function (x, y, width, height)
  32074. {
  32075. this.commandBuffer.push(
  32076. Commands.FILL_RECT,
  32077. x, y, width, height
  32078. );
  32079. return this;
  32080. },
  32081. /**
  32082. * Stroke a rectangle with the given position and size.
  32083. *
  32084. * @method Phaser.GameObjects.Graphics#strokeRect
  32085. * @since 3.0.0
  32086. *
  32087. * @param {number} x - The x coordinate of the top-left of the rectangle.
  32088. * @param {number} y - The y coordinate of the top-left of the rectangle.
  32089. * @param {number} width - The width of the rectangle.
  32090. * @param {number} height - The height of the rectangle.
  32091. *
  32092. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32093. */
  32094. strokeRect: function (x, y, width, height)
  32095. {
  32096. var lineWidthHalf = this._lineWidth / 2;
  32097. var minx = x - lineWidthHalf;
  32098. var maxx = x + lineWidthHalf;
  32099. this.beginPath();
  32100. this.moveTo(x, y);
  32101. this.lineTo(x, y + height);
  32102. this.strokePath();
  32103. this.beginPath();
  32104. this.moveTo(x + width, y);
  32105. this.lineTo(x + width, y + height);
  32106. this.strokePath();
  32107. this.beginPath();
  32108. this.moveTo(minx, y);
  32109. this.lineTo(maxx + width, y);
  32110. this.strokePath();
  32111. this.beginPath();
  32112. this.moveTo(minx, y + height);
  32113. this.lineTo(maxx + width, y + height);
  32114. this.strokePath();
  32115. return this;
  32116. },
  32117. /**
  32118. * @typedef {object} RoundedRectRadius
  32119. *
  32120. * @property {number} [tl=20] - Top left
  32121. * @property {number} [tr=20] - Top right
  32122. * @property {number} [br=20] - Bottom right
  32123. * @property {number} [bl=20] - Bottom left
  32124. */
  32125. /**
  32126. * Fill a rounded rectangle with the given position, size and radius.
  32127. *
  32128. * @method Phaser.GameObjects.Graphics#fillRoundedRect
  32129. * @since 3.11.0
  32130. *
  32131. * @param {number} x - The x coordinate of the top-left of the rectangle.
  32132. * @param {number} y - The y coordinate of the top-left of the rectangle.
  32133. * @param {number} width - The width of the rectangle.
  32134. * @param {number} height - The height of the rectangle.
  32135. * @param {(RoundedRectRadius|number)} [radius=20] - The corner radius; It can also be an object to specify different radii for corners.
  32136. *
  32137. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32138. */
  32139. fillRoundedRect: function (x, y, width, height, radius)
  32140. {
  32141. if (radius === undefined) { radius = 20; }
  32142. var tl = radius;
  32143. var tr = radius;
  32144. var bl = radius;
  32145. var br = radius;
  32146. if (typeof radius !== 'number')
  32147. {
  32148. tl = GetFastValue(radius, 'tl', 20);
  32149. tr = GetFastValue(radius, 'tr', 20);
  32150. bl = GetFastValue(radius, 'bl', 20);
  32151. br = GetFastValue(radius, 'br', 20);
  32152. }
  32153. this.beginPath();
  32154. this.moveTo(x + tl, y);
  32155. this.lineTo(x + width - tr, y);
  32156. this.arc(x + width - tr, y + tr, tr, -MATH_CONST.TAU, 0);
  32157. this.lineTo(x + width, y + height - br);
  32158. this.arc(x + width - br, y + height - br, br, 0, MATH_CONST.TAU);
  32159. this.lineTo(x + bl, y + height);
  32160. this.arc(x + bl, y + height - bl, bl, MATH_CONST.TAU, Math.PI);
  32161. this.lineTo(x, y + tl);
  32162. this.arc(x + tl, y + tl, tl, -Math.PI, -MATH_CONST.TAU);
  32163. this.fillPath();
  32164. return this;
  32165. },
  32166. /**
  32167. * Stroke a rounded rectangle with the given position, size and radius.
  32168. *
  32169. * @method Phaser.GameObjects.Graphics#strokeRoundedRect
  32170. * @since 3.11.0
  32171. *
  32172. * @param {number} x - The x coordinate of the top-left of the rectangle.
  32173. * @param {number} y - The y coordinate of the top-left of the rectangle.
  32174. * @param {number} width - The width of the rectangle.
  32175. * @param {number} height - The height of the rectangle.
  32176. * @param {(RoundedRectRadius|number)} [radius=20] - The corner radius; It can also be an object to specify different radii for corners.
  32177. *
  32178. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32179. */
  32180. strokeRoundedRect: function (x, y, width, height, radius)
  32181. {
  32182. if (radius === undefined) { radius = 20; }
  32183. var tl = radius;
  32184. var tr = radius;
  32185. var bl = radius;
  32186. var br = radius;
  32187. if (typeof radius !== 'number')
  32188. {
  32189. tl = GetFastValue(radius, 'tl', 20);
  32190. tr = GetFastValue(radius, 'tr', 20);
  32191. bl = GetFastValue(radius, 'bl', 20);
  32192. br = GetFastValue(radius, 'br', 20);
  32193. }
  32194. this.beginPath();
  32195. this.moveTo(x + tl, y);
  32196. this.lineTo(x + width - tr, y);
  32197. this.arc(x + width - tr, y + tr, tr, -MATH_CONST.TAU, 0);
  32198. this.lineTo(x + width, y + height - br);
  32199. this.arc(x + width - br, y + height - br, br, 0, MATH_CONST.TAU);
  32200. this.lineTo(x + bl, y + height);
  32201. this.arc(x + bl, y + height - bl, bl, MATH_CONST.TAU, Math.PI);
  32202. this.lineTo(x, y + tl);
  32203. this.arc(x + tl, y + tl, tl, -Math.PI, -MATH_CONST.TAU);
  32204. this.strokePath();
  32205. return this;
  32206. },
  32207. /**
  32208. * Fill the given point.
  32209. *
  32210. * Draws a square at the given position, 1 pixel in size by default.
  32211. *
  32212. * @method Phaser.GameObjects.Graphics#fillPointShape
  32213. * @since 3.0.0
  32214. *
  32215. * @param {(Phaser.Geom.Point|Phaser.Math.Vector2|object)} point - The point to fill.
  32216. * @param {number} [size=1] - The size of the square to draw.
  32217. *
  32218. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32219. */
  32220. fillPointShape: function (point, size)
  32221. {
  32222. return this.fillPoint(point.x, point.y, size);
  32223. },
  32224. /**
  32225. * Fill a point at the given position.
  32226. *
  32227. * Draws a square at the given position, 1 pixel in size by default.
  32228. *
  32229. * @method Phaser.GameObjects.Graphics#fillPoint
  32230. * @since 3.0.0
  32231. *
  32232. * @param {number} x - The x coordinate of the point.
  32233. * @param {number} y - The y coordinate of the point.
  32234. * @param {number} [size=1] - The size of the square to draw.
  32235. *
  32236. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32237. */
  32238. fillPoint: function (x, y, size)
  32239. {
  32240. if (!size || size < 1)
  32241. {
  32242. size = 1;
  32243. }
  32244. else
  32245. {
  32246. x -= (size / 2);
  32247. y -= (size / 2);
  32248. }
  32249. this.commandBuffer.push(
  32250. Commands.FILL_RECT,
  32251. x, y, size, size
  32252. );
  32253. return this;
  32254. },
  32255. /**
  32256. * Fill the given triangle.
  32257. *
  32258. * @method Phaser.GameObjects.Graphics#fillTriangleShape
  32259. * @since 3.0.0
  32260. *
  32261. * @param {Phaser.Geom.Triangle} triangle - The triangle to fill.
  32262. *
  32263. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32264. */
  32265. fillTriangleShape: function (triangle)
  32266. {
  32267. return this.fillTriangle(triangle.x1, triangle.y1, triangle.x2, triangle.y2, triangle.x3, triangle.y3);
  32268. },
  32269. /**
  32270. * Stroke the given triangle.
  32271. *
  32272. * @method Phaser.GameObjects.Graphics#strokeTriangleShape
  32273. * @since 3.0.0
  32274. *
  32275. * @param {Phaser.Geom.Triangle} triangle - The triangle to stroke.
  32276. *
  32277. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32278. */
  32279. strokeTriangleShape: function (triangle)
  32280. {
  32281. return this.strokeTriangle(triangle.x1, triangle.y1, triangle.x2, triangle.y2, triangle.x3, triangle.y3);
  32282. },
  32283. /**
  32284. * Fill a triangle with the given points.
  32285. *
  32286. * @method Phaser.GameObjects.Graphics#fillTriangle
  32287. * @since 3.0.0
  32288. *
  32289. * @param {number} x0 - The x coordinate of the first point.
  32290. * @param {number} y0 - The y coordinate of the first point.
  32291. * @param {number} x1 - The x coordinate of the second point.
  32292. * @param {number} y1 - The y coordinate of the second point.
  32293. * @param {number} x2 - The x coordinate of the third point.
  32294. * @param {number} y2 - The y coordinate of the third point.
  32295. *
  32296. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32297. */
  32298. fillTriangle: function (x0, y0, x1, y1, x2, y2)
  32299. {
  32300. this.commandBuffer.push(
  32301. Commands.FILL_TRIANGLE,
  32302. x0, y0, x1, y1, x2, y2
  32303. );
  32304. return this;
  32305. },
  32306. /**
  32307. * Stroke a triangle with the given points.
  32308. *
  32309. * @method Phaser.GameObjects.Graphics#strokeTriangle
  32310. * @since 3.0.0
  32311. *
  32312. * @param {number} x0 - The x coordinate of the first point.
  32313. * @param {number} y0 - The y coordinate of the first point.
  32314. * @param {number} x1 - The x coordinate of the second point.
  32315. * @param {number} y1 - The y coordinate of the second point.
  32316. * @param {number} x2 - The x coordinate of the third point.
  32317. * @param {number} y2 - The y coordinate of the third point.
  32318. *
  32319. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32320. */
  32321. strokeTriangle: function (x0, y0, x1, y1, x2, y2)
  32322. {
  32323. this.commandBuffer.push(
  32324. Commands.STROKE_TRIANGLE,
  32325. x0, y0, x1, y1, x2, y2
  32326. );
  32327. return this;
  32328. },
  32329. /**
  32330. * Draw the given line.
  32331. *
  32332. * @method Phaser.GameObjects.Graphics#strokeLineShape
  32333. * @since 3.0.0
  32334. *
  32335. * @param {Phaser.Geom.Line} line - The line to stroke.
  32336. *
  32337. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32338. */
  32339. strokeLineShape: function (line)
  32340. {
  32341. return this.lineBetween(line.x1, line.y1, line.x2, line.y2);
  32342. },
  32343. /**
  32344. * Draw a line between the given points.
  32345. *
  32346. * @method Phaser.GameObjects.Graphics#lineBetween
  32347. * @since 3.0.0
  32348. *
  32349. * @param {number} x1 - The x coordinate of the start point of the line.
  32350. * @param {number} y1 - The y coordinate of the start point of the line.
  32351. * @param {number} x2 - The x coordinate of the end point of the line.
  32352. * @param {number} y2 - The y coordinate of the end point of the line.
  32353. *
  32354. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32355. */
  32356. lineBetween: function (x1, y1, x2, y2)
  32357. {
  32358. this.beginPath();
  32359. this.moveTo(x1, y1);
  32360. this.lineTo(x2, y2);
  32361. this.strokePath();
  32362. return this;
  32363. },
  32364. /**
  32365. * Draw a line from the current drawing position to the given position.
  32366. *
  32367. * Moves the current drawing position to the given position.
  32368. *
  32369. * @method Phaser.GameObjects.Graphics#lineTo
  32370. * @since 3.0.0
  32371. *
  32372. * @param {number} x - The x coordinate to draw the line to.
  32373. * @param {number} y - The y coordinate to draw the line to.
  32374. *
  32375. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32376. */
  32377. lineTo: function (x, y)
  32378. {
  32379. this.commandBuffer.push(
  32380. Commands.LINE_TO,
  32381. x, y
  32382. );
  32383. return this;
  32384. },
  32385. /**
  32386. * Move the current drawing position to the given position.
  32387. *
  32388. * @method Phaser.GameObjects.Graphics#moveTo
  32389. * @since 3.0.0
  32390. *
  32391. * @param {number} x - The x coordinate to move to.
  32392. * @param {number} y - The y coordinate to move to.
  32393. *
  32394. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32395. */
  32396. moveTo: function (x, y)
  32397. {
  32398. this.commandBuffer.push(
  32399. Commands.MOVE_TO,
  32400. x, y
  32401. );
  32402. return this;
  32403. },
  32404. /**
  32405. * Draw a line from the current drawing position to the given position with a specific width and color.
  32406. *
  32407. * @method Phaser.GameObjects.Graphics#lineFxTo
  32408. * @since 3.0.0
  32409. *
  32410. * @param {number} x - The x coordinate to draw the line to.
  32411. * @param {number} y - The y coordinate to draw the line to.
  32412. * @param {number} width - The width of the stroke.
  32413. * @param {number} rgb - The color of the stroke.
  32414. *
  32415. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32416. */
  32417. lineFxTo: function (x, y, width, rgb)
  32418. {
  32419. this.commandBuffer.push(
  32420. Commands.LINE_FX_TO,
  32421. x, y, width, rgb, 1
  32422. );
  32423. return this;
  32424. },
  32425. /**
  32426. * Move the current drawing position to the given position and change the pen width and color.
  32427. *
  32428. * @method Phaser.GameObjects.Graphics#moveFxTo
  32429. * @since 3.0.0
  32430. *
  32431. * @param {number} x - The x coordinate to move to.
  32432. * @param {number} y - The y coordinate to move to.
  32433. * @param {number} width - The new stroke width.
  32434. * @param {number} rgb - The new stroke color.
  32435. *
  32436. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32437. */
  32438. moveFxTo: function (x, y, width, rgb)
  32439. {
  32440. this.commandBuffer.push(
  32441. Commands.MOVE_FX_TO,
  32442. x, y, width, rgb, 1
  32443. );
  32444. return this;
  32445. },
  32446. /**
  32447. * Stroke the shape represented by the given array of points.
  32448. *
  32449. * Pass `true` to `autoClose` to close the shape automatically.
  32450. *
  32451. * @method Phaser.GameObjects.Graphics#strokePoints
  32452. * @since 3.0.0
  32453. *
  32454. * @param {(array|Phaser.Geom.Point[])} points - The points to stroke.
  32455. * @param {boolean} [autoClose=false] - When `true`, the shape is closed by joining the last point to the first point.
  32456. * @param {integer} [endIndex] - The index of `points` to stop drawing at. Defaults to `points.length`.
  32457. *
  32458. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32459. */
  32460. strokePoints: function (points, autoClose, endIndex)
  32461. {
  32462. if (autoClose === undefined) { autoClose = false; }
  32463. if (endIndex === undefined) { endIndex = points.length; }
  32464. this.beginPath();
  32465. this.moveTo(points[0].x, points[0].y);
  32466. for (var i = 1; i < endIndex; i++)
  32467. {
  32468. this.lineTo(points[i].x, points[i].y);
  32469. }
  32470. if (autoClose)
  32471. {
  32472. this.lineTo(points[0].x, points[0].y);
  32473. }
  32474. this.strokePath();
  32475. return this;
  32476. },
  32477. /**
  32478. * Fill the shape represented by the given array of points.
  32479. *
  32480. * Pass `true` to `autoClose` to close the shape automatically.
  32481. *
  32482. * @method Phaser.GameObjects.Graphics#fillPoints
  32483. * @since 3.0.0
  32484. *
  32485. * @param {(array|Phaser.Geom.Point[])} points - The points to fill.
  32486. * @param {boolean} [autoClose=false] - Whether to automatically close the polygon.
  32487. * @param {integer} [endIndex] - The index of `points` to stop at. Defaults to `points.length`.
  32488. *
  32489. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32490. */
  32491. fillPoints: function (points, autoClose, endIndex)
  32492. {
  32493. if (autoClose === undefined) { autoClose = false; }
  32494. if (endIndex === undefined) { endIndex = points.length; }
  32495. this.beginPath();
  32496. this.moveTo(points[0].x, points[0].y);
  32497. for (var i = 1; i < endIndex; i++)
  32498. {
  32499. this.lineTo(points[i].x, points[i].y);
  32500. }
  32501. if (autoClose)
  32502. {
  32503. this.lineTo(points[0].x, points[0].y);
  32504. }
  32505. this.fillPath();
  32506. return this;
  32507. },
  32508. /**
  32509. * Stroke the given ellipse.
  32510. *
  32511. * @method Phaser.GameObjects.Graphics#strokeEllipseShape
  32512. * @since 3.0.0
  32513. *
  32514. * @param {Phaser.Geom.Ellipse} ellipse - The ellipse to stroke.
  32515. * @param {integer} [smoothness=32] - The number of points to draw the ellipse with.
  32516. *
  32517. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32518. */
  32519. strokeEllipseShape: function (ellipse, smoothness)
  32520. {
  32521. if (smoothness === undefined) { smoothness = 32; }
  32522. var points = ellipse.getPoints(smoothness);
  32523. return this.strokePoints(points, true);
  32524. },
  32525. /**
  32526. * Stroke an ellipse with the given position and size.
  32527. *
  32528. * @method Phaser.GameObjects.Graphics#strokeEllipse
  32529. * @since 3.0.0
  32530. *
  32531. * @param {number} x - The x coordinate of the center of the ellipse.
  32532. * @param {number} y - The y coordinate of the center of the ellipse.
  32533. * @param {number} width - The width of the ellipse.
  32534. * @param {number} height - The height of the ellipse.
  32535. * @param {integer} [smoothness=32] - The number of points to draw the ellipse with.
  32536. *
  32537. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32538. */
  32539. strokeEllipse: function (x, y, width, height, smoothness)
  32540. {
  32541. if (smoothness === undefined) { smoothness = 32; }
  32542. var ellipse = new Ellipse(x, y, width, height);
  32543. var points = ellipse.getPoints(smoothness);
  32544. return this.strokePoints(points, true);
  32545. },
  32546. /**
  32547. * Fill the given ellipse.
  32548. *
  32549. * @method Phaser.GameObjects.Graphics#fillEllipseShape
  32550. * @since 3.0.0
  32551. *
  32552. * @param {Phaser.Geom.Ellipse} ellipse - The ellipse to fill.
  32553. * @param {integer} [smoothness=32] - The number of points to draw the ellipse with.
  32554. *
  32555. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32556. */
  32557. fillEllipseShape: function (ellipse, smoothness)
  32558. {
  32559. if (smoothness === undefined) { smoothness = 32; }
  32560. var points = ellipse.getPoints(smoothness);
  32561. return this.fillPoints(points, true);
  32562. },
  32563. /**
  32564. * Fill an ellipse with the given position and size.
  32565. *
  32566. * @method Phaser.GameObjects.Graphics#fillEllipse
  32567. * @since 3.0.0
  32568. *
  32569. * @param {number} x - The x coordinate of the center of the ellipse.
  32570. * @param {number} y - The y coordinate of the center of the ellipse.
  32571. * @param {number} width - The width of the ellipse.
  32572. * @param {number} height - The height of the ellipse.
  32573. * @param {integer} [smoothness=32] - The number of points to draw the ellipse with.
  32574. *
  32575. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32576. */
  32577. fillEllipse: function (x, y, width, height, smoothness)
  32578. {
  32579. if (smoothness === undefined) { smoothness = 32; }
  32580. var ellipse = new Ellipse(x, y, width, height);
  32581. var points = ellipse.getPoints(smoothness);
  32582. return this.fillPoints(points, true);
  32583. },
  32584. /**
  32585. * Draw an arc.
  32586. *
  32587. * This method can be used to create circles, or parts of circles.
  32588. *
  32589. * Make sure you call `beginPath` before starting the arc unless you wish for the arc to automatically
  32590. * close when filled or stroked.
  32591. *
  32592. * Use the optional `overshoot` argument increase the number of iterations that take place when
  32593. * the arc is rendered in WebGL. This is useful if you're drawing an arc with an especially thick line,
  32594. * as it will allow the arc to fully join-up. Try small values at first, i.e. 0.01.
  32595. *
  32596. * Call {@link Phaser.GameObjects.Graphics#fillPath} or {@link Phaser.GameObjects.Graphics#strokePath} after calling
  32597. * this method to draw the arc.
  32598. *
  32599. * @method Phaser.GameObjects.Graphics#arc
  32600. * @since 3.0.0
  32601. *
  32602. * @param {number} x - The x coordinate of the center of the circle.
  32603. * @param {number} y - The y coordinate of the center of the circle.
  32604. * @param {number} radius - The radius of the circle.
  32605. * @param {number} startAngle - The starting angle, in radians.
  32606. * @param {number} endAngle - The ending angle, in radians.
  32607. * @param {boolean} [anticlockwise=false] - Whether the drawing should be anticlockwise or clockwise.
  32608. * @param {number} [overshoot=0] - This value allows you to increase the segment iterations in WebGL rendering. Useful if the arc has a thick stroke and needs to overshoot to join-up cleanly. Use small numbers such as 0.01 to start with and increase as needed.
  32609. *
  32610. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32611. */
  32612. arc: function (x, y, radius, startAngle, endAngle, anticlockwise, overshoot)
  32613. {
  32614. if (anticlockwise === undefined) { anticlockwise = false; }
  32615. if (overshoot === undefined) { overshoot = 0; }
  32616. this.commandBuffer.push(
  32617. Commands.ARC,
  32618. x, y, radius, startAngle, endAngle, anticlockwise, overshoot
  32619. );
  32620. return this;
  32621. },
  32622. /**
  32623. * Creates a pie-chart slice shape centered at `x`, `y` with the given radius.
  32624. * You must define the start and end angle of the slice.
  32625. *
  32626. * Setting the `anticlockwise` argument to `true` creates a shape similar to Pacman.
  32627. * Setting it to `false` creates a shape like a slice of pie.
  32628. *
  32629. * This method will begin a new path and close the path at the end of it.
  32630. * To display the actual slice you need to call either `strokePath` or `fillPath` after it.
  32631. *
  32632. * @method Phaser.GameObjects.Graphics#slice
  32633. * @since 3.4.0
  32634. *
  32635. * @param {number} x - The horizontal center of the slice.
  32636. * @param {number} y - The vertical center of the slice.
  32637. * @param {number} radius - The radius of the slice.
  32638. * @param {number} startAngle - The start angle of the slice, given in radians.
  32639. * @param {number} endAngle - The end angle of the slice, given in radians.
  32640. * @param {boolean} [anticlockwise=false] - Whether the drawing should be anticlockwise or clockwise.
  32641. * @param {number} [overshoot=0] - This value allows you to overshoot the endAngle by this amount. Useful if the arc has a thick stroke and needs to overshoot to join-up cleanly.
  32642. *
  32643. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32644. */
  32645. slice: function (x, y, radius, startAngle, endAngle, anticlockwise, overshoot)
  32646. {
  32647. if (anticlockwise === undefined) { anticlockwise = false; }
  32648. if (overshoot === undefined) { overshoot = 0; }
  32649. this.commandBuffer.push(Commands.BEGIN_PATH);
  32650. this.commandBuffer.push(Commands.MOVE_TO, x, y);
  32651. this.commandBuffer.push(Commands.ARC, x, y, radius, startAngle, endAngle, anticlockwise, overshoot);
  32652. this.commandBuffer.push(Commands.CLOSE_PATH);
  32653. return this;
  32654. },
  32655. /**
  32656. * Saves the state of the Graphics by pushing the current state onto a stack.
  32657. *
  32658. * The most recently saved state can then be restored with {@link Phaser.GameObjects.Graphics#restore}.
  32659. *
  32660. * @method Phaser.GameObjects.Graphics#save
  32661. * @since 3.0.0
  32662. *
  32663. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32664. */
  32665. save: function ()
  32666. {
  32667. this.commandBuffer.push(
  32668. Commands.SAVE
  32669. );
  32670. return this;
  32671. },
  32672. /**
  32673. * Restores the most recently saved state of the Graphics by popping from the state stack.
  32674. *
  32675. * Use {@link Phaser.GameObjects.Graphics#save} to save the current state, and call this afterwards to restore that state.
  32676. *
  32677. * If there is no saved state, this command does nothing.
  32678. *
  32679. * @method Phaser.GameObjects.Graphics#restore
  32680. * @since 3.0.0
  32681. *
  32682. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32683. */
  32684. restore: function ()
  32685. {
  32686. this.commandBuffer.push(
  32687. Commands.RESTORE
  32688. );
  32689. return this;
  32690. },
  32691. /**
  32692. * Translate the graphics.
  32693. *
  32694. * @method Phaser.GameObjects.Graphics#translate
  32695. * @since 3.0.0
  32696. *
  32697. * @param {number} x - The horizontal translation to apply.
  32698. * @param {number} y - The vertical translation to apply.
  32699. *
  32700. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32701. */
  32702. translate: function (x, y)
  32703. {
  32704. this.commandBuffer.push(
  32705. Commands.TRANSLATE,
  32706. x, y
  32707. );
  32708. return this;
  32709. },
  32710. /**
  32711. * Scale the graphics.
  32712. *
  32713. * @method Phaser.GameObjects.Graphics#scale
  32714. * @since 3.0.0
  32715. *
  32716. * @param {number} x - The horizontal scale to apply.
  32717. * @param {number} y - The vertical scale to apply.
  32718. *
  32719. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32720. */
  32721. scale: function (x, y)
  32722. {
  32723. this.commandBuffer.push(
  32724. Commands.SCALE,
  32725. x, y
  32726. );
  32727. return this;
  32728. },
  32729. /**
  32730. * Rotate the graphics.
  32731. *
  32732. * @method Phaser.GameObjects.Graphics#rotate
  32733. * @since 3.0.0
  32734. *
  32735. * @param {number} radians - The rotation angle, in radians.
  32736. *
  32737. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32738. */
  32739. rotate: function (radians)
  32740. {
  32741. this.commandBuffer.push(
  32742. Commands.ROTATE,
  32743. radians
  32744. );
  32745. return this;
  32746. },
  32747. /**
  32748. * Clear the command buffer and reset the fill style and line style to their defaults.
  32749. *
  32750. * @method Phaser.GameObjects.Graphics#clear
  32751. * @since 3.0.0
  32752. *
  32753. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32754. */
  32755. clear: function ()
  32756. {
  32757. this.commandBuffer.length = 0;
  32758. if (this.defaultFillColor > -1)
  32759. {
  32760. this.fillStyle(this.defaultFillColor, this.defaultFillAlpha);
  32761. }
  32762. if (this.defaultStrokeColor > -1)
  32763. {
  32764. this.lineStyle(this.defaultStrokeWidth, this.defaultStrokeColor, this.defaultStrokeAlpha);
  32765. }
  32766. return this;
  32767. },
  32768. /**
  32769. * Generate a texture from this Graphics object.
  32770. *
  32771. * If `key` is a string it'll generate a new texture using it and add it into the
  32772. * Texture Manager (assuming no key conflict happens).
  32773. *
  32774. * If `key` is a Canvas it will draw the texture to that canvas context. Note that it will NOT
  32775. * automatically upload it to the GPU in WebGL mode.
  32776. *
  32777. * @method Phaser.GameObjects.Graphics#generateTexture
  32778. * @since 3.0.0
  32779. *
  32780. * @param {(string|HTMLCanvasElement)} key - The key to store the texture with in the Texture Manager, or a Canvas to draw to.
  32781. * @param {integer} [width] - The width of the graphics to generate.
  32782. * @param {integer} [height] - The height of the graphics to generate.
  32783. *
  32784. * @return {Phaser.GameObjects.Graphics} This Game Object.
  32785. */
  32786. generateTexture: function (key, width, height)
  32787. {
  32788. var sys = this.scene.sys;
  32789. var renderer = sys.game.renderer;
  32790. if (width === undefined) { width = sys.scale.width; }
  32791. if (height === undefined) { height = sys.scale.height; }
  32792. Graphics.TargetCamera.setScene(this.scene);
  32793. Graphics.TargetCamera.setViewport(0, 0, width, height);
  32794. Graphics.TargetCamera.scrollX = this.x;
  32795. Graphics.TargetCamera.scrollY = this.y;
  32796. var texture;
  32797. var ctx;
  32798. if (typeof key === 'string')
  32799. {
  32800. if (sys.textures.exists(key))
  32801. {
  32802. // Key is a string, it DOES exist in the Texture Manager AND is a canvas, so draw to it
  32803. texture = sys.textures.get(key);
  32804. var src = texture.getSourceImage();
  32805. if (src instanceof HTMLCanvasElement)
  32806. {
  32807. ctx = src.getContext('2d');
  32808. }
  32809. }
  32810. else
  32811. {
  32812. // Key is a string and doesn't exist in the Texture Manager, so generate and save it
  32813. texture = sys.textures.createCanvas(key, width, height);
  32814. ctx = texture.getSourceImage().getContext('2d');
  32815. }
  32816. }
  32817. else if (key instanceof HTMLCanvasElement)
  32818. {
  32819. // Key is a Canvas, so draw to it
  32820. ctx = key.getContext('2d');
  32821. }
  32822. if (ctx)
  32823. {
  32824. // var GraphicsCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix, renderTargetCtx, allowClip)
  32825. this.renderCanvas(renderer, this, 0, Graphics.TargetCamera, null, ctx, false);
  32826. if (texture)
  32827. {
  32828. texture.refresh();
  32829. }
  32830. }
  32831. return this;
  32832. },
  32833. /**
  32834. * Internal destroy handler, called as part of the destroy process.
  32835. *
  32836. * @method Phaser.GameObjects.Graphics#preDestroy
  32837. * @protected
  32838. * @since 3.9.0
  32839. */
  32840. preDestroy: function ()
  32841. {
  32842. this.commandBuffer = [];
  32843. }
  32844. });
  32845. /**
  32846. * A Camera used specifically by the Graphics system for rendering to textures.
  32847. *
  32848. * @name Phaser.GameObjects.Graphics.TargetCamera
  32849. * @type {Phaser.Cameras.Scene2D.Camera}
  32850. * @since 3.1.0
  32851. */
  32852. Graphics.TargetCamera = new BaseCamera();
  32853. module.exports = Graphics;
  32854. /***/ }),
  32855. /* 169 */
  32856. /***/ (function(module, exports, __webpack_require__) {
  32857. /**
  32858. * @author Richard Davey <rich@photonstorm.com>
  32859. * @copyright 2019 Photon Storm Ltd.
  32860. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  32861. */
  32862. var BitmapText = __webpack_require__(117);
  32863. var Class = __webpack_require__(0);
  32864. var Render = __webpack_require__(860);
  32865. /**
  32866. * @typedef {object} DisplayCallbackConfig
  32867. *
  32868. * @property {Phaser.GameObjects.DynamicBitmapText} parent - The Dynamic Bitmap Text object that owns this character being rendered.
  32869. * @property {{topLeft:number, topRight:number, bottomLeft:number, bottomRight:number}} tint - The tint of the character being rendered. Always zero in Canvas.
  32870. * @property {number} index - The index of the character being rendered.
  32871. * @property {number} charCode - The character code of the character being rendered.
  32872. * @property {number} x - The x position of the character being rendered.
  32873. * @property {number} y - The y position of the character being rendered.
  32874. * @property {number} scale - The scale of the character being rendered.
  32875. * @property {number} rotation - The rotation of the character being rendered.
  32876. * @property {any} data - Custom data stored with the character being rendered.
  32877. */
  32878. /**
  32879. * @callback DisplayCallback
  32880. *
  32881. * @param {DisplayCallbackConfig} display - Settings of the character that is about to be rendered.
  32882. *
  32883. * @return {{x:number, y:number, scale:number, rotation:number}} Altered position, scale and rotation values for the character that is about to be rendered.
  32884. */
  32885. /**
  32886. * @classdesc
  32887. * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure.
  32888. *
  32889. * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to
  32890. * match the font structure.
  32891. *
  32892. * Dynamic Bitmap Text objects are different from Static Bitmap Text in that they invoke a callback for each
  32893. * letter being rendered during the render pass. This callback allows you to manipulate the properties of
  32894. * each letter being rendered, such as its position, scale or tint, allowing you to create interesting effects
  32895. * like jiggling text, which can't be done with Static text. This means that Dynamic Text takes more processing
  32896. * time, so only use them if you require the callback ability they have.
  32897. *
  32898. * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability
  32899. * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by
  32900. * processing the font texture in an image editor, applying fills and any other effects required.
  32901. *
  32902. * To create multi-line text insert \r, \n or \r\n escape codes into the text string.
  32903. *
  32904. * To create a BitmapText data files you need a 3rd party app such as:
  32905. *
  32906. * BMFont (Windows, free): http://www.angelcode.com/products/bmfont/
  32907. * Glyph Designer (OS X, commercial): http://www.71squared.com/en/glyphdesigner
  32908. * Littera (Web-based, free): http://kvazars.com/littera/
  32909. *
  32910. * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of
  32911. * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: http://codebeautify.org/xmltojson
  32912. *
  32913. * @class DynamicBitmapText
  32914. * @extends Phaser.GameObjects.BitmapText
  32915. * @memberof Phaser.GameObjects
  32916. * @constructor
  32917. * @since 3.0.0
  32918. *
  32919. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. It can only belong to one Scene at any given time.
  32920. * @param {number} x - The x coordinate of this Game Object in world space.
  32921. * @param {number} y - The y coordinate of this Game Object in world space.
  32922. * @param {string} font - The key of the font to use from the Bitmap Font cache.
  32923. * @param {(string|string[])} [text] - The string, or array of strings, to be set as the content of this Bitmap Text.
  32924. * @param {number} [size] - The font size of this Bitmap Text.
  32925. * @param {integer} [align=0] - The alignment of the text in a multi-line BitmapText object.
  32926. */
  32927. var DynamicBitmapText = new Class({
  32928. Extends: BitmapText,
  32929. Mixins: [
  32930. Render
  32931. ],
  32932. initialize:
  32933. function DynamicBitmapText (scene, x, y, font, text, size, align)
  32934. {
  32935. BitmapText.call(this, scene, x, y, font, text, size, align);
  32936. this.type = 'DynamicBitmapText';
  32937. /**
  32938. * The horizontal scroll position of the Bitmap Text.
  32939. *
  32940. * @name Phaser.GameObjects.DynamicBitmapText#scrollX
  32941. * @type {number}
  32942. * @default 0
  32943. * @since 3.0.0
  32944. */
  32945. this.scrollX = 0;
  32946. /**
  32947. * The vertical scroll position of the Bitmap Text.
  32948. *
  32949. * @name Phaser.GameObjects.DynamicBitmapText#scrollY
  32950. * @type {number}
  32951. * @default 0
  32952. * @since 3.0.0
  32953. */
  32954. this.scrollY = 0;
  32955. /**
  32956. * The crop width of the Bitmap Text.
  32957. *
  32958. * @name Phaser.GameObjects.DynamicBitmapText#cropWidth
  32959. * @type {number}
  32960. * @default 0
  32961. * @since 3.0.0
  32962. */
  32963. this.cropWidth = 0;
  32964. /**
  32965. * The crop height of the Bitmap Text.
  32966. *
  32967. * @name Phaser.GameObjects.DynamicBitmapText#cropHeight
  32968. * @type {number}
  32969. * @default 0
  32970. * @since 3.0.0
  32971. */
  32972. this.cropHeight = 0;
  32973. /**
  32974. * A callback that alters how each character of the Bitmap Text is rendered.
  32975. *
  32976. * @name Phaser.GameObjects.DynamicBitmapText#displayCallback
  32977. * @type {DisplayCallback}
  32978. * @since 3.0.0
  32979. */
  32980. this.displayCallback;
  32981. /**
  32982. * The data object that is populated during rendering, then passed to the displayCallback.
  32983. * You should modify this object then return it back from the callback. It's updated values
  32984. * will be used to render the specific glyph.
  32985. *
  32986. * Please note that if you need a reference to this object locally in your game code then you
  32987. * should shallow copy it, as it's updated and re-used for every glyph in the text.
  32988. *
  32989. * @name Phaser.GameObjects.DynamicBitmapText#callbackData
  32990. * @type {DisplayCallbackConfig}
  32991. * @since 3.11.0
  32992. */
  32993. this.callbackData = {
  32994. parent: this,
  32995. color: 0,
  32996. tint: {
  32997. topLeft: 0,
  32998. topRight: 0,
  32999. bottomLeft: 0,
  33000. bottomRight: 0
  33001. },
  33002. index: 0,
  33003. charCode: 0,
  33004. x: 0,
  33005. y: 0,
  33006. scale: 0,
  33007. rotation: 0,
  33008. data: 0
  33009. };
  33010. },
  33011. /**
  33012. * Set the crop size of this Bitmap Text.
  33013. *
  33014. * @method Phaser.GameObjects.DynamicBitmapText#setSize
  33015. * @since 3.0.0
  33016. *
  33017. * @param {number} width - The width of the crop.
  33018. * @param {number} height - The height of the crop.
  33019. *
  33020. * @return {Phaser.GameObjects.DynamicBitmapText} This Game Object.
  33021. */
  33022. setSize: function (width, height)
  33023. {
  33024. this.cropWidth = width;
  33025. this.cropHeight = height;
  33026. return this;
  33027. },
  33028. /**
  33029. * Set a callback that alters how each character of the Bitmap Text is rendered.
  33030. *
  33031. * The callback receives a {@link DisplayCallbackConfig} object that contains information about the character that's
  33032. * about to be rendered.
  33033. *
  33034. * It should return an object with `x`, `y`, `scale` and `rotation` properties that will be used instead of the
  33035. * usual values when rendering.
  33036. *
  33037. * @method Phaser.GameObjects.DynamicBitmapText#setDisplayCallback
  33038. * @since 3.0.0
  33039. *
  33040. * @param {DisplayCallback} callback - The display callback to set.
  33041. *
  33042. * @return {Phaser.GameObjects.DynamicBitmapText} This Game Object.
  33043. */
  33044. setDisplayCallback: function (callback)
  33045. {
  33046. this.displayCallback = callback;
  33047. return this;
  33048. },
  33049. /**
  33050. * Set the horizontal scroll position of this Bitmap Text.
  33051. *
  33052. * @method Phaser.GameObjects.DynamicBitmapText#setScrollX
  33053. * @since 3.0.0
  33054. *
  33055. * @param {number} value - The horizontal scroll position to set.
  33056. *
  33057. * @return {Phaser.GameObjects.DynamicBitmapText} This Game Object.
  33058. */
  33059. setScrollX: function (value)
  33060. {
  33061. this.scrollX = value;
  33062. return this;
  33063. },
  33064. /**
  33065. * Set the vertical scroll position of this Bitmap Text.
  33066. *
  33067. * @method Phaser.GameObjects.DynamicBitmapText#setScrollY
  33068. * @since 3.0.0
  33069. *
  33070. * @param {number} value - The vertical scroll position to set.
  33071. *
  33072. * @return {Phaser.GameObjects.DynamicBitmapText} This Game Object.
  33073. */
  33074. setScrollY: function (value)
  33075. {
  33076. this.scrollY = value;
  33077. return this;
  33078. }
  33079. });
  33080. module.exports = DynamicBitmapText;
  33081. /***/ }),
  33082. /* 170 */
  33083. /***/ (function(module, exports, __webpack_require__) {
  33084. /**
  33085. * @author Richard Davey <rich@photonstorm.com>
  33086. * @author Felipe Alfonso <@bitnenfer>
  33087. * @copyright 2019 Photon Storm Ltd.
  33088. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  33089. */
  33090. var ArrayUtils = __webpack_require__(174);
  33091. var BlendModes = __webpack_require__(60);
  33092. var Class = __webpack_require__(0);
  33093. var Components = __webpack_require__(13);
  33094. var Events = __webpack_require__(133);
  33095. var GameObject = __webpack_require__(18);
  33096. var Rectangle = __webpack_require__(10);
  33097. var Render = __webpack_require__(863);
  33098. var Union = __webpack_require__(313);
  33099. var Vector2 = __webpack_require__(3);
  33100. /**
  33101. * @classdesc
  33102. * A Container Game Object.
  33103. *
  33104. * A Container, as the name implies, can 'contain' other types of Game Object.
  33105. * When a Game Object is added to a Container, the Container becomes responsible for the rendering of it.
  33106. * By default it will be removed from the Display List and instead added to the Containers own internal list.
  33107. *
  33108. * The position of the Game Object automatically becomes relative to the position of the Container.
  33109. *
  33110. * When the Container is rendered, all of its children are rendered as well, in the order in which they exist
  33111. * within the Container. Container children can be repositioned using methods such as `MoveUp`, `MoveDown` and `SendToBack`.
  33112. *
  33113. * If you modify a transform property of the Container, such as `Container.x` or `Container.rotation` then it will
  33114. * automatically influence all children as well.
  33115. *
  33116. * Containers can include other Containers for deeply nested transforms.
  33117. *
  33118. * Containers can have masks set on them and can be used as a mask too. However, Container children cannot be masked.
  33119. * The masks do not 'stack up'. Only a Container on the root of the display list will use its mask.
  33120. *
  33121. * Containers can be enabled for input. Because they do not have a texture you need to provide a shape for them
  33122. * to use as their hit area. Container children can also be enabled for input, independent of the Container.
  33123. *
  33124. * Containers can be given a physics body for either Arcade Physics, Impact Physics or Matter Physics. However,
  33125. * if Container _children_ are enabled for physics you may get unexpected results, such as offset bodies,
  33126. * if the Container itself, or any of its ancestors, is positioned anywhere other than at 0 x 0. Container children
  33127. * with physics do not factor in the Container due to the excessive extra calculations needed. Please structure
  33128. * your game to work around this.
  33129. *
  33130. * It's important to understand the impact of using Containers. They add additional processing overhead into
  33131. * every one of their children. The deeper you nest them, the more the cost escalates. This is especially true
  33132. * for input events. You also loose the ability to set the display depth of Container children in the same
  33133. * flexible manner as those not within them. In short, don't use them for the sake of it. You pay a small cost
  33134. * every time you create one, try to structure your game around avoiding that where possible.
  33135. *
  33136. * @class Container
  33137. * @extends Phaser.GameObjects.GameObject
  33138. * @memberof Phaser.GameObjects
  33139. * @constructor
  33140. * @since 3.4.0
  33141. *
  33142. * @extends Phaser.GameObjects.Components.Alpha
  33143. * @extends Phaser.GameObjects.Components.BlendMode
  33144. * @extends Phaser.GameObjects.Components.ComputedSize
  33145. * @extends Phaser.GameObjects.Components.Depth
  33146. * @extends Phaser.GameObjects.Components.Mask
  33147. * @extends Phaser.GameObjects.Components.ScrollFactor
  33148. * @extends Phaser.GameObjects.Components.Transform
  33149. * @extends Phaser.GameObjects.Components.Visible
  33150. *
  33151. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  33152. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  33153. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  33154. * @param {Phaser.GameObjects.GameObject[]} [children] - An optional array of Game Objects to add to this Container.
  33155. */
  33156. var Container = new Class({
  33157. Extends: GameObject,
  33158. Mixins: [
  33159. Components.Alpha,
  33160. Components.BlendMode,
  33161. Components.ComputedSize,
  33162. Components.Depth,
  33163. Components.Mask,
  33164. Components.ScrollFactor,
  33165. Components.Transform,
  33166. Components.Visible,
  33167. Render
  33168. ],
  33169. initialize:
  33170. function Container (scene, x, y, children)
  33171. {
  33172. GameObject.call(this, scene, 'Container');
  33173. /**
  33174. * An array holding the children of this Container.
  33175. *
  33176. * @name Phaser.GameObjects.Container#list
  33177. * @type {Phaser.GameObjects.GameObject[]}
  33178. * @since 3.4.0
  33179. */
  33180. this.list = [];
  33181. /**
  33182. * Does this Container exclusively manage its children?
  33183. *
  33184. * The default is `true` which means a child added to this Container cannot
  33185. * belong in another Container, which includes the Scene display list.
  33186. *
  33187. * If you disable this then this Container will no longer exclusively manage its children.
  33188. * This allows you to create all kinds of interesting graphical effects, such as replicating
  33189. * Game Objects without reparenting them all over the Scene.
  33190. * However, doing so will prevent children from receiving any kind of input event or have
  33191. * their physics bodies work by default, as they're no longer a single entity on the
  33192. * display list, but are being replicated where-ever this Container is.
  33193. *
  33194. * @name Phaser.GameObjects.Container#exclusive
  33195. * @type {boolean}
  33196. * @default true
  33197. * @since 3.4.0
  33198. */
  33199. this.exclusive = true;
  33200. /**
  33201. * Containers can have an optional maximum size. If set to anything above 0 it
  33202. * will constrict the addition of new Game Objects into the Container, capping off
  33203. * the maximum limit the Container can grow in size to.
  33204. *
  33205. * @name Phaser.GameObjects.Container#maxSize
  33206. * @type {integer}
  33207. * @default -1
  33208. * @since 3.4.0
  33209. */
  33210. this.maxSize = -1;
  33211. /**
  33212. * The cursor position.
  33213. *
  33214. * @name Phaser.GameObjects.Container#position
  33215. * @type {integer}
  33216. * @since 3.4.0
  33217. */
  33218. this.position = 0;
  33219. /**
  33220. * Internal Transform Matrix used for local space conversion.
  33221. *
  33222. * @name Phaser.GameObjects.Container#localTransform
  33223. * @type {Phaser.GameObjects.Components.TransformMatrix}
  33224. * @since 3.4.0
  33225. */
  33226. this.localTransform = new Components.TransformMatrix();
  33227. /**
  33228. * Internal temporary Transform Matrix used to avoid object creation.
  33229. *
  33230. * @name Phaser.GameObjects.Container#tempTransformMatrix
  33231. * @type {Phaser.GameObjects.Components.TransformMatrix}
  33232. * @private
  33233. * @since 3.4.0
  33234. */
  33235. this.tempTransformMatrix = new Components.TransformMatrix();
  33236. /**
  33237. * A reference to the Scene Display List.
  33238. *
  33239. * @name Phaser.GameObjects.Container#_displayList
  33240. * @type {Phaser.GameObjects.DisplayList}
  33241. * @private
  33242. * @since 3.4.0
  33243. */
  33244. this._displayList = scene.sys.displayList;
  33245. /**
  33246. * The property key to sort by.
  33247. *
  33248. * @name Phaser.GameObjects.Container#_sortKey
  33249. * @type {string}
  33250. * @private
  33251. * @since 3.4.0
  33252. */
  33253. this._sortKey = '';
  33254. /**
  33255. * A reference to the Scene Systems Event Emitter.
  33256. *
  33257. * @name Phaser.GameObjects.Container#_sysEvents
  33258. * @type {Phaser.Events.EventEmitter}
  33259. * @private
  33260. * @since 3.9.0
  33261. */
  33262. this._sysEvents = scene.sys.events;
  33263. this.setPosition(x, y);
  33264. this.clearAlpha();
  33265. this.setBlendMode(BlendModes.SKIP_CHECK);
  33266. if (children)
  33267. {
  33268. this.add(children);
  33269. }
  33270. },
  33271. /**
  33272. * Internal value to allow Containers to be used for input and physics.
  33273. * Do not change this value. It has no effect other than to break things.
  33274. *
  33275. * @name Phaser.GameObjects.Container#originX
  33276. * @type {number}
  33277. * @readonly
  33278. * @since 3.4.0
  33279. */
  33280. originX: {
  33281. get: function ()
  33282. {
  33283. return 0.5;
  33284. }
  33285. },
  33286. /**
  33287. * Internal value to allow Containers to be used for input and physics.
  33288. * Do not change this value. It has no effect other than to break things.
  33289. *
  33290. * @name Phaser.GameObjects.Container#originY
  33291. * @type {number}
  33292. * @readonly
  33293. * @since 3.4.0
  33294. */
  33295. originY: {
  33296. get: function ()
  33297. {
  33298. return 0.5;
  33299. }
  33300. },
  33301. /**
  33302. * Internal value to allow Containers to be used for input and physics.
  33303. * Do not change this value. It has no effect other than to break things.
  33304. *
  33305. * @name Phaser.GameObjects.Container#displayOriginX
  33306. * @type {number}
  33307. * @readonly
  33308. * @since 3.4.0
  33309. */
  33310. displayOriginX: {
  33311. get: function ()
  33312. {
  33313. return this.width * 0.5;
  33314. }
  33315. },
  33316. /**
  33317. * Internal value to allow Containers to be used for input and physics.
  33318. * Do not change this value. It has no effect other than to break things.
  33319. *
  33320. * @name Phaser.GameObjects.Container#displayOriginY
  33321. * @type {number}
  33322. * @readonly
  33323. * @since 3.4.0
  33324. */
  33325. displayOriginY: {
  33326. get: function ()
  33327. {
  33328. return this.height * 0.5;
  33329. }
  33330. },
  33331. /**
  33332. * Does this Container exclusively manage its children?
  33333. *
  33334. * The default is `true` which means a child added to this Container cannot
  33335. * belong in another Container, which includes the Scene display list.
  33336. *
  33337. * If you disable this then this Container will no longer exclusively manage its children.
  33338. * This allows you to create all kinds of interesting graphical effects, such as replicating
  33339. * Game Objects without reparenting them all over the Scene.
  33340. * However, doing so will prevent children from receiving any kind of input event or have
  33341. * their physics bodies work by default, as they're no longer a single entity on the
  33342. * display list, but are being replicated where-ever this Container is.
  33343. *
  33344. * @method Phaser.GameObjects.Container#setExclusive
  33345. * @since 3.4.0
  33346. *
  33347. * @param {boolean} [value=true] - The exclusive state of this Container.
  33348. *
  33349. * @return {Phaser.GameObjects.Container} This Container.
  33350. */
  33351. setExclusive: function (value)
  33352. {
  33353. if (value === undefined) { value = true; }
  33354. this.exclusive = value;
  33355. return this;
  33356. },
  33357. /**
  33358. * Gets the bounds of this Container. It works by iterating all children of the Container,
  33359. * getting their respective bounds, and then working out a min-max rectangle from that.
  33360. * It does not factor in if the children render or not, all are included.
  33361. *
  33362. * Some children are unable to return their bounds, such as Graphics objects, in which case
  33363. * they are skipped.
  33364. *
  33365. * Depending on the quantity of children in this Container it could be a really expensive call,
  33366. * so cache it and only poll it as needed.
  33367. *
  33368. * The values are stored and returned in a Rectangle object.
  33369. *
  33370. * @method Phaser.GameObjects.Container#getBounds
  33371. * @since 3.4.0
  33372. *
  33373. * @param {Phaser.Geom.Rectangle} [output] - A Geom.Rectangle object to store the values in. If not provided a new Rectangle will be created.
  33374. *
  33375. * @return {Phaser.Geom.Rectangle} The values stored in the output object.
  33376. */
  33377. getBounds: function (output)
  33378. {
  33379. if (output === undefined) { output = new Rectangle(); }
  33380. output.setTo(this.x, this.y, 0, 0);
  33381. if (this.list.length > 0)
  33382. {
  33383. var children = this.list;
  33384. var tempRect = new Rectangle();
  33385. for (var i = 0; i < children.length; i++)
  33386. {
  33387. var entry = children[i];
  33388. if (entry.getBounds)
  33389. {
  33390. entry.getBounds(tempRect);
  33391. Union(tempRect, output, output);
  33392. }
  33393. }
  33394. }
  33395. return output;
  33396. },
  33397. /**
  33398. * Internal add handler.
  33399. *
  33400. * @method Phaser.GameObjects.Container#addHandler
  33401. * @private
  33402. * @since 3.4.0
  33403. *
  33404. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that was just added to this Container.
  33405. */
  33406. addHandler: function (gameObject)
  33407. {
  33408. gameObject.once(Events.DESTROY, this.remove, this);
  33409. if (this.exclusive)
  33410. {
  33411. this._displayList.remove(gameObject);
  33412. if (gameObject.parentContainer)
  33413. {
  33414. gameObject.parentContainer.remove(gameObject);
  33415. }
  33416. gameObject.parentContainer = this;
  33417. }
  33418. },
  33419. /**
  33420. * Internal remove handler.
  33421. *
  33422. * @method Phaser.GameObjects.Container#removeHandler
  33423. * @private
  33424. * @since 3.4.0
  33425. *
  33426. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that was just removed from this Container.
  33427. */
  33428. removeHandler: function (gameObject)
  33429. {
  33430. gameObject.off(Events.DESTROY, this.remove);
  33431. if (this.exclusive)
  33432. {
  33433. gameObject.parentContainer = null;
  33434. }
  33435. },
  33436. /**
  33437. * Takes a Point-like object, such as a Vector2, Geom.Point or object with public x and y properties,
  33438. * and transforms it into the space of this Container, then returns it in the output object.
  33439. *
  33440. * @method Phaser.GameObjects.Container#pointToContainer
  33441. * @since 3.4.0
  33442. *
  33443. * @param {(object|Phaser.Geom.Point|Phaser.Math.Vector2)} source - The Source Point to be transformed.
  33444. * @param {(object|Phaser.Geom.Point|Phaser.Math.Vector2)} [output] - A destination object to store the transformed point in. If none given a Vector2 will be created and returned.
  33445. *
  33446. * @return {(object|Phaser.Geom.Point|Phaser.Math.Vector2)} The transformed point.
  33447. */
  33448. pointToContainer: function (source, output)
  33449. {
  33450. if (output === undefined) { output = new Vector2(); }
  33451. if (this.parentContainer)
  33452. {
  33453. return this.parentContainer.pointToContainer(source, output);
  33454. }
  33455. var tempMatrix = this.tempTransformMatrix;
  33456. // No need to loadIdentity because applyITRS overwrites every value anyway
  33457. tempMatrix.applyITRS(this.x, this.y, this.rotation, this.scaleX, this.scaleY);
  33458. tempMatrix.invert();
  33459. tempMatrix.transformPoint(source.x, source.y, output);
  33460. return output;
  33461. },
  33462. /**
  33463. * Returns the world transform matrix as used for Bounds checks.
  33464. *
  33465. * The returned matrix is temporal and shouldn't be stored.
  33466. *
  33467. * @method Phaser.GameObjects.Container#getBoundsTransformMatrix
  33468. * @since 3.4.0
  33469. *
  33470. * @return {Phaser.GameObjects.Components.TransformMatrix} The world transform matrix.
  33471. */
  33472. getBoundsTransformMatrix: function ()
  33473. {
  33474. return this.getWorldTransformMatrix(this.tempTransformMatrix, this.localTransform);
  33475. },
  33476. /**
  33477. * Adds the given Game Object, or array of Game Objects, to this Container.
  33478. *
  33479. * Each Game Object must be unique within the Container.
  33480. *
  33481. * @method Phaser.GameObjects.Container#add
  33482. * @since 3.4.0
  33483. *
  33484. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} child - The Game Object, or array of Game Objects, to add to the Container.
  33485. *
  33486. * @return {Phaser.GameObjects.Container} This Container instance.
  33487. */
  33488. add: function (child)
  33489. {
  33490. ArrayUtils.Add(this.list, child, this.maxSize, this.addHandler, this);
  33491. return this;
  33492. },
  33493. /**
  33494. * Adds the given Game Object, or array of Game Objects, to this Container at the specified position.
  33495. *
  33496. * Existing Game Objects in the Container are shifted up.
  33497. *
  33498. * Each Game Object must be unique within the Container.
  33499. *
  33500. * @method Phaser.GameObjects.Container#addAt
  33501. * @since 3.4.0
  33502. *
  33503. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} child - The Game Object, or array of Game Objects, to add to the Container.
  33504. * @param {integer} [index=0] - The position to insert the Game Object/s at.
  33505. *
  33506. * @return {Phaser.GameObjects.Container} This Container instance.
  33507. */
  33508. addAt: function (child, index)
  33509. {
  33510. ArrayUtils.AddAt(this.list, child, index, this.maxSize, this.addHandler, this);
  33511. return this;
  33512. },
  33513. /**
  33514. * Returns the Game Object at the given position in this Container.
  33515. *
  33516. * @method Phaser.GameObjects.Container#getAt
  33517. * @since 3.4.0
  33518. *
  33519. * @param {integer} index - The position to get the Game Object from.
  33520. *
  33521. * @return {?Phaser.GameObjects.GameObject} The Game Object at the specified index, or `null` if none found.
  33522. */
  33523. getAt: function (index)
  33524. {
  33525. return this.list[index];
  33526. },
  33527. /**
  33528. * Returns the index of the given Game Object in this Container.
  33529. *
  33530. * @method Phaser.GameObjects.Container#getIndex
  33531. * @since 3.4.0
  33532. *
  33533. * @param {Phaser.GameObjects.GameObject} child - The Game Object to search for in this Container.
  33534. *
  33535. * @return {integer} The index of the Game Object in this Container, or -1 if not found.
  33536. */
  33537. getIndex: function (child)
  33538. {
  33539. return this.list.indexOf(child);
  33540. },
  33541. /**
  33542. * Sort the contents of this Container so the items are in order based on the given property.
  33543. * For example: `sort('alpha')` would sort the elements based on the value of their `alpha` property.
  33544. *
  33545. * @method Phaser.GameObjects.Container#sort
  33546. * @since 3.4.0
  33547. *
  33548. * @param {string} property - The property to lexically sort by.
  33549. * @param {function} [handler] - Provide your own custom handler function. Will receive 2 children which it should compare and return a boolean.
  33550. *
  33551. * @return {Phaser.GameObjects.Container} This Container instance.
  33552. */
  33553. sort: function (property, handler)
  33554. {
  33555. if (!property)
  33556. {
  33557. return this;
  33558. }
  33559. if (handler === undefined)
  33560. {
  33561. handler = function (childA, childB)
  33562. {
  33563. return childA[property] - childB[property];
  33564. };
  33565. }
  33566. ArrayUtils.StableSort.inplace(this.list, handler);
  33567. return this;
  33568. },
  33569. /**
  33570. * Searches for the first instance of a child with its `name` property matching the given argument.
  33571. * Should more than one child have the same name only the first is returned.
  33572. *
  33573. * @method Phaser.GameObjects.Container#getByName
  33574. * @since 3.4.0
  33575. *
  33576. * @param {string} name - The name to search for.
  33577. *
  33578. * @return {?Phaser.GameObjects.GameObject} The first child with a matching name, or `null` if none were found.
  33579. */
  33580. getByName: function (name)
  33581. {
  33582. return ArrayUtils.GetFirst(this.list, 'name', name);
  33583. },
  33584. /**
  33585. * Returns a random Game Object from this Container.
  33586. *
  33587. * @method Phaser.GameObjects.Container#getRandom
  33588. * @since 3.4.0
  33589. *
  33590. * @param {integer} [startIndex=0] - An optional start index.
  33591. * @param {integer} [length] - An optional length, the total number of elements (from the startIndex) to choose from.
  33592. *
  33593. * @return {?Phaser.GameObjects.GameObject} A random child from the Container, or `null` if the Container is empty.
  33594. */
  33595. getRandom: function (startIndex, length)
  33596. {
  33597. return ArrayUtils.GetRandom(this.list, startIndex, length);
  33598. },
  33599. /**
  33600. * Gets the first Game Object in this Container.
  33601. *
  33602. * You can also specify a property and value to search for, in which case it will return the first
  33603. * Game Object in this Container with a matching property and / or value.
  33604. *
  33605. * For example: `getFirst('visible', true)` would return the first Game Object that had its `visible` property set.
  33606. *
  33607. * You can limit the search to the `startIndex` - `endIndex` range.
  33608. *
  33609. * @method Phaser.GameObjects.Container#getFirst
  33610. * @since 3.4.0
  33611. *
  33612. * @param {string} property - The property to test on each Game Object in the Container.
  33613. * @param {*} value - The value to test the property against. Must pass a strict (`===`) comparison check.
  33614. * @param {integer} [startIndex=0] - An optional start index to search from.
  33615. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  33616. *
  33617. * @return {?Phaser.GameObjects.GameObject} The first matching Game Object, or `null` if none was found.
  33618. */
  33619. getFirst: function (property, value, startIndex, endIndex)
  33620. {
  33621. return ArrayUtils.GetFirst(this.list, property, value, startIndex, endIndex);
  33622. },
  33623. /**
  33624. * Returns all Game Objects in this Container.
  33625. *
  33626. * You can optionally specify a matching criteria using the `property` and `value` arguments.
  33627. *
  33628. * For example: `getAll('body')` would return only Game Objects that have a body property.
  33629. *
  33630. * You can also specify a value to compare the property to:
  33631. *
  33632. * `getAll('visible', true)` would return only Game Objects that have their visible property set to `true`.
  33633. *
  33634. * Optionally you can specify a start and end index. For example if this Container had 100 Game Objects,
  33635. * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only
  33636. * the first 50 Game Objects.
  33637. *
  33638. * @method Phaser.GameObjects.Container#getAll
  33639. * @since 3.4.0
  33640. *
  33641. * @param {string} [property] - The property to test on each Game Object in the Container.
  33642. * @param {any} [value] - If property is set then the `property` must strictly equal this value to be included in the results.
  33643. * @param {integer} [startIndex=0] - An optional start index to search from.
  33644. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  33645. *
  33646. * @return {Phaser.GameObjects.GameObject[]} An array of matching Game Objects from this Container.
  33647. */
  33648. getAll: function (property, value, startIndex, endIndex)
  33649. {
  33650. return ArrayUtils.GetAll(this.list, property, value, startIndex, endIndex);
  33651. },
  33652. /**
  33653. * Returns the total number of Game Objects in this Container that have a property
  33654. * matching the given value.
  33655. *
  33656. * For example: `count('visible', true)` would count all the elements that have their visible property set.
  33657. *
  33658. * You can optionally limit the operation to the `startIndex` - `endIndex` range.
  33659. *
  33660. * @method Phaser.GameObjects.Container#count
  33661. * @since 3.4.0
  33662. *
  33663. * @param {string} property - The property to check.
  33664. * @param {any} value - The value to check.
  33665. * @param {integer} [startIndex=0] - An optional start index to search from.
  33666. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  33667. *
  33668. * @return {integer} The total number of Game Objects in this Container with a property matching the given value.
  33669. */
  33670. count: function (property, value, startIndex, endIndex)
  33671. {
  33672. return ArrayUtils.CountAllMatching(this.list, property, value, startIndex, endIndex);
  33673. },
  33674. /**
  33675. * Swaps the position of two Game Objects in this Container.
  33676. * Both Game Objects must belong to this Container.
  33677. *
  33678. * @method Phaser.GameObjects.Container#swap
  33679. * @since 3.4.0
  33680. *
  33681. * @param {Phaser.GameObjects.GameObject} child1 - The first Game Object to swap.
  33682. * @param {Phaser.GameObjects.GameObject} child2 - The second Game Object to swap.
  33683. *
  33684. * @return {Phaser.GameObjects.Container} This Container instance.
  33685. */
  33686. swap: function (child1, child2)
  33687. {
  33688. ArrayUtils.Swap(this.list, child1, child2);
  33689. return this;
  33690. },
  33691. /**
  33692. * Moves a Game Object to a new position within this Container.
  33693. *
  33694. * The Game Object must already be a child of this Container.
  33695. *
  33696. * The Game Object is removed from its old position and inserted into the new one.
  33697. * Therefore the Container size does not change. Other children will change position accordingly.
  33698. *
  33699. * @method Phaser.GameObjects.Container#moveTo
  33700. * @since 3.4.0
  33701. *
  33702. * @param {Phaser.GameObjects.GameObject} child - The Game Object to move.
  33703. * @param {integer} index - The new position of the Game Object in this Container.
  33704. *
  33705. * @return {Phaser.GameObjects.Container} This Container instance.
  33706. */
  33707. moveTo: function (child, index)
  33708. {
  33709. ArrayUtils.MoveTo(this.list, child, index);
  33710. return this;
  33711. },
  33712. /**
  33713. * Removes the given Game Object, or array of Game Objects, from this Container.
  33714. *
  33715. * The Game Objects must already be children of this Container.
  33716. *
  33717. * You can also optionally call `destroy` on each Game Object that is removed from the Container.
  33718. *
  33719. * @method Phaser.GameObjects.Container#remove
  33720. * @since 3.4.0
  33721. *
  33722. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} child - The Game Object, or array of Game Objects, to be removed from the Container.
  33723. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on each child successfully removed from this Container.
  33724. *
  33725. * @return {Phaser.GameObjects.Container} This Container instance.
  33726. */
  33727. remove: function (child, destroyChild)
  33728. {
  33729. var removed = ArrayUtils.Remove(this.list, child, this.removeHandler, this);
  33730. if (destroyChild && removed)
  33731. {
  33732. if (!Array.isArray(removed))
  33733. {
  33734. removed = [ removed ];
  33735. }
  33736. for (var i = 0; i < removed.length; i++)
  33737. {
  33738. removed[i].destroy();
  33739. }
  33740. }
  33741. return this;
  33742. },
  33743. /**
  33744. * Removes the Game Object at the given position in this Container.
  33745. *
  33746. * You can also optionally call `destroy` on the Game Object, if one is found.
  33747. *
  33748. * @method Phaser.GameObjects.Container#removeAt
  33749. * @since 3.4.0
  33750. *
  33751. * @param {integer} index - The index of the Game Object to be removed.
  33752. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on the Game Object if successfully removed from this Container.
  33753. *
  33754. * @return {Phaser.GameObjects.Container} This Container instance.
  33755. */
  33756. removeAt: function (index, destroyChild)
  33757. {
  33758. var removed = ArrayUtils.RemoveAt(this.list, index, this.removeHandler, this);
  33759. if (destroyChild && removed)
  33760. {
  33761. removed.destroy();
  33762. }
  33763. return this;
  33764. },
  33765. /**
  33766. * Removes the Game Objects between the given positions in this Container.
  33767. *
  33768. * You can also optionally call `destroy` on each Game Object that is removed from the Container.
  33769. *
  33770. * @method Phaser.GameObjects.Container#removeBetween
  33771. * @since 3.4.0
  33772. *
  33773. * @param {integer} [startIndex=0] - An optional start index to search from.
  33774. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  33775. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on each Game Object successfully removed from this Container.
  33776. *
  33777. * @return {Phaser.GameObjects.Container} This Container instance.
  33778. */
  33779. removeBetween: function (startIndex, endIndex, destroyChild)
  33780. {
  33781. var removed = ArrayUtils.RemoveBetween(this.list, startIndex, endIndex, this.removeHandler, this);
  33782. if (destroyChild)
  33783. {
  33784. for (var i = 0; i < removed.length; i++)
  33785. {
  33786. removed[i].destroy();
  33787. }
  33788. }
  33789. return this;
  33790. },
  33791. /**
  33792. * Removes all Game Objects from this Container.
  33793. *
  33794. * You can also optionally call `destroy` on each Game Object that is removed from the Container.
  33795. *
  33796. * @method Phaser.GameObjects.Container#removeAll
  33797. * @since 3.4.0
  33798. *
  33799. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on each Game Object successfully removed from this Container.
  33800. *
  33801. * @return {Phaser.GameObjects.Container} This Container instance.
  33802. */
  33803. removeAll: function (destroyChild)
  33804. {
  33805. var removed = ArrayUtils.RemoveBetween(this.list, 0, this.list.length, this.removeHandler, this);
  33806. if (destroyChild)
  33807. {
  33808. for (var i = 0; i < removed.length; i++)
  33809. {
  33810. removed[i].destroy();
  33811. }
  33812. }
  33813. return this;
  33814. },
  33815. /**
  33816. * Brings the given Game Object to the top of this Container.
  33817. * This will cause it to render on-top of any other objects in the Container.
  33818. *
  33819. * @method Phaser.GameObjects.Container#bringToTop
  33820. * @since 3.4.0
  33821. *
  33822. * @param {Phaser.GameObjects.GameObject} child - The Game Object to bring to the top of the Container.
  33823. *
  33824. * @return {Phaser.GameObjects.Container} This Container instance.
  33825. */
  33826. bringToTop: function (child)
  33827. {
  33828. ArrayUtils.BringToTop(this.list, child);
  33829. return this;
  33830. },
  33831. /**
  33832. * Sends the given Game Object to the bottom of this Container.
  33833. * This will cause it to render below any other objects in the Container.
  33834. *
  33835. * @method Phaser.GameObjects.Container#sendToBack
  33836. * @since 3.4.0
  33837. *
  33838. * @param {Phaser.GameObjects.GameObject} child - The Game Object to send to the bottom of the Container.
  33839. *
  33840. * @return {Phaser.GameObjects.Container} This Container instance.
  33841. */
  33842. sendToBack: function (child)
  33843. {
  33844. ArrayUtils.SendToBack(this.list, child);
  33845. return this;
  33846. },
  33847. /**
  33848. * Moves the given Game Object up one place in this Container, unless it's already at the top.
  33849. *
  33850. * @method Phaser.GameObjects.Container#moveUp
  33851. * @since 3.4.0
  33852. *
  33853. * @param {Phaser.GameObjects.GameObject} child - The Game Object to be moved in the Container.
  33854. *
  33855. * @return {Phaser.GameObjects.Container} This Container instance.
  33856. */
  33857. moveUp: function (child)
  33858. {
  33859. ArrayUtils.MoveUp(this.list, child);
  33860. return this;
  33861. },
  33862. /**
  33863. * Moves the given Game Object down one place in this Container, unless it's already at the bottom.
  33864. *
  33865. * @method Phaser.GameObjects.Container#moveDown
  33866. * @since 3.4.0
  33867. *
  33868. * @param {Phaser.GameObjects.GameObject} child - The Game Object to be moved in the Container.
  33869. *
  33870. * @return {Phaser.GameObjects.Container} This Container instance.
  33871. */
  33872. moveDown: function (child)
  33873. {
  33874. ArrayUtils.MoveDown(this.list, child);
  33875. return this;
  33876. },
  33877. /**
  33878. * Reverses the order of all Game Objects in this Container.
  33879. *
  33880. * @method Phaser.GameObjects.Container#reverse
  33881. * @since 3.4.0
  33882. *
  33883. * @return {Phaser.GameObjects.Container} This Container instance.
  33884. */
  33885. reverse: function ()
  33886. {
  33887. this.list.reverse();
  33888. return this;
  33889. },
  33890. /**
  33891. * Shuffles the all Game Objects in this Container using the Fisher-Yates implementation.
  33892. *
  33893. * @method Phaser.GameObjects.Container#shuffle
  33894. * @since 3.4.0
  33895. *
  33896. * @return {Phaser.GameObjects.Container} This Container instance.
  33897. */
  33898. shuffle: function ()
  33899. {
  33900. ArrayUtils.Shuffle(this.list);
  33901. return this;
  33902. },
  33903. /**
  33904. * Replaces a Game Object in this Container with the new Game Object.
  33905. * The new Game Object cannot already be a child of this Container.
  33906. *
  33907. * @method Phaser.GameObjects.Container#replace
  33908. * @since 3.4.0
  33909. *
  33910. * @param {Phaser.GameObjects.GameObject} oldChild - The Game Object in this Container that will be replaced.
  33911. * @param {Phaser.GameObjects.GameObject} newChild - The Game Object to be added to this Container.
  33912. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on the Game Object if successfully removed from this Container.
  33913. *
  33914. * @return {Phaser.GameObjects.Container} This Container instance.
  33915. */
  33916. replace: function (oldChild, newChild, destroyChild)
  33917. {
  33918. var moved = ArrayUtils.Replace(this.list, oldChild, newChild);
  33919. if (moved)
  33920. {
  33921. this.addHandler(newChild);
  33922. this.removeHandler(oldChild);
  33923. if (destroyChild)
  33924. {
  33925. oldChild.destroy();
  33926. }
  33927. }
  33928. return this;
  33929. },
  33930. /**
  33931. * Returns `true` if the given Game Object is a direct child of this Container.
  33932. *
  33933. * This check does not scan nested Containers.
  33934. *
  33935. * @method Phaser.GameObjects.Container#exists
  33936. * @since 3.4.0
  33937. *
  33938. * @param {Phaser.GameObjects.GameObject} child - The Game Object to check for within this Container.
  33939. *
  33940. * @return {boolean} True if the Game Object is an immediate child of this Container, otherwise false.
  33941. */
  33942. exists: function (child)
  33943. {
  33944. return (this.list.indexOf(child) > -1);
  33945. },
  33946. /**
  33947. * Sets the property to the given value on all Game Objects in this Container.
  33948. *
  33949. * Optionally you can specify a start and end index. For example if this Container had 100 Game Objects,
  33950. * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only
  33951. * the first 50 Game Objects.
  33952. *
  33953. * @method Phaser.GameObjects.Container#setAll
  33954. * @since 3.4.0
  33955. *
  33956. * @param {string} property - The property that must exist on the Game Object.
  33957. * @param {any} value - The value to get the property to.
  33958. * @param {integer} [startIndex=0] - An optional start index to search from.
  33959. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  33960. *
  33961. * @return {Phaser.GameObjects.Container} This Container instance.
  33962. */
  33963. setAll: function (property, value, startIndex, endIndex)
  33964. {
  33965. ArrayUtils.SetAll(this.list, property, value, startIndex, endIndex);
  33966. return this;
  33967. },
  33968. /**
  33969. * @callback EachContainerCallback
  33970. * @generic I - [item]
  33971. *
  33972. * @param {*} item - The child Game Object of the Container.
  33973. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  33974. */
  33975. /**
  33976. * Passes all Game Objects in this Container to the given callback.
  33977. *
  33978. * A copy of the Container is made before passing each entry to your callback.
  33979. * This protects against the callback itself modifying the Container.
  33980. *
  33981. * If you know for sure that the callback will not change the size of this Container
  33982. * then you can use the more performant `Container.iterate` method instead.
  33983. *
  33984. * @method Phaser.GameObjects.Container#each
  33985. * @since 3.4.0
  33986. *
  33987. * @param {function} callback - The function to call.
  33988. * @param {object} [context] - Value to use as `this` when executing callback.
  33989. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  33990. *
  33991. * @return {Phaser.GameObjects.Container} This Container instance.
  33992. */
  33993. each: function (callback, context)
  33994. {
  33995. var args = [ null ];
  33996. var i;
  33997. var temp = this.list.slice();
  33998. var len = temp.length;
  33999. for (i = 2; i < arguments.length; i++)
  34000. {
  34001. args.push(arguments[i]);
  34002. }
  34003. for (i = 0; i < len; i++)
  34004. {
  34005. args[0] = temp[i];
  34006. callback.apply(context, args);
  34007. }
  34008. return this;
  34009. },
  34010. /**
  34011. * Passes all Game Objects in this Container to the given callback.
  34012. *
  34013. * Only use this method when you absolutely know that the Container will not be modified during
  34014. * the iteration, i.e. by removing or adding to its contents.
  34015. *
  34016. * @method Phaser.GameObjects.Container#iterate
  34017. * @since 3.4.0
  34018. *
  34019. * @param {function} callback - The function to call.
  34020. * @param {object} [context] - Value to use as `this` when executing callback.
  34021. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  34022. *
  34023. * @return {Phaser.GameObjects.Container} This Container instance.
  34024. */
  34025. iterate: function (callback, context)
  34026. {
  34027. var args = [ null ];
  34028. var i;
  34029. for (i = 2; i < arguments.length; i++)
  34030. {
  34031. args.push(arguments[i]);
  34032. }
  34033. for (i = 0; i < this.list.length; i++)
  34034. {
  34035. args[0] = this.list[i];
  34036. callback.apply(context, args);
  34037. }
  34038. return this;
  34039. },
  34040. /**
  34041. * The number of Game Objects inside this Container.
  34042. *
  34043. * @name Phaser.GameObjects.Container#length
  34044. * @type {integer}
  34045. * @readonly
  34046. * @since 3.4.0
  34047. */
  34048. length: {
  34049. get: function ()
  34050. {
  34051. return this.list.length;
  34052. }
  34053. },
  34054. /**
  34055. * Returns the first Game Object within the Container, or `null` if it is empty.
  34056. *
  34057. * You can move the cursor by calling `Container.next` and `Container.previous`.
  34058. *
  34059. * @name Phaser.GameObjects.Container#first
  34060. * @type {?Phaser.GameObjects.GameObject}
  34061. * @readonly
  34062. * @since 3.4.0
  34063. */
  34064. first: {
  34065. get: function ()
  34066. {
  34067. this.position = 0;
  34068. if (this.list.length > 0)
  34069. {
  34070. return this.list[0];
  34071. }
  34072. else
  34073. {
  34074. return null;
  34075. }
  34076. }
  34077. },
  34078. /**
  34079. * Returns the last Game Object within the Container, or `null` if it is empty.
  34080. *
  34081. * You can move the cursor by calling `Container.next` and `Container.previous`.
  34082. *
  34083. * @name Phaser.GameObjects.Container#last
  34084. * @type {?Phaser.GameObjects.GameObject}
  34085. * @readonly
  34086. * @since 3.4.0
  34087. */
  34088. last: {
  34089. get: function ()
  34090. {
  34091. if (this.list.length > 0)
  34092. {
  34093. this.position = this.list.length - 1;
  34094. return this.list[this.position];
  34095. }
  34096. else
  34097. {
  34098. return null;
  34099. }
  34100. }
  34101. },
  34102. /**
  34103. * Returns the next Game Object within the Container, or `null` if it is empty.
  34104. *
  34105. * You can move the cursor by calling `Container.next` and `Container.previous`.
  34106. *
  34107. * @name Phaser.GameObjects.Container#next
  34108. * @type {?Phaser.GameObjects.GameObject}
  34109. * @readonly
  34110. * @since 3.4.0
  34111. */
  34112. next: {
  34113. get: function ()
  34114. {
  34115. if (this.position < this.list.length)
  34116. {
  34117. this.position++;
  34118. return this.list[this.position];
  34119. }
  34120. else
  34121. {
  34122. return null;
  34123. }
  34124. }
  34125. },
  34126. /**
  34127. * Returns the previous Game Object within the Container, or `null` if it is empty.
  34128. *
  34129. * You can move the cursor by calling `Container.next` and `Container.previous`.
  34130. *
  34131. * @name Phaser.GameObjects.Container#previous
  34132. * @type {?Phaser.GameObjects.GameObject}
  34133. * @readonly
  34134. * @since 3.4.0
  34135. */
  34136. previous: {
  34137. get: function ()
  34138. {
  34139. if (this.position > 0)
  34140. {
  34141. this.position--;
  34142. return this.list[this.position];
  34143. }
  34144. else
  34145. {
  34146. return null;
  34147. }
  34148. }
  34149. },
  34150. /**
  34151. * Internal destroy handler, called as part of the destroy process.
  34152. *
  34153. * @method Phaser.GameObjects.Container#preDestroy
  34154. * @protected
  34155. * @since 3.9.0
  34156. */
  34157. preDestroy: function ()
  34158. {
  34159. this.removeAll(!!this.exclusive);
  34160. this.localTransform.destroy();
  34161. this.tempTransformMatrix.destroy();
  34162. this.list = [];
  34163. this._displayList = null;
  34164. }
  34165. });
  34166. module.exports = Container;
  34167. /***/ }),
  34168. /* 171 */
  34169. /***/ (function(module, exports, __webpack_require__) {
  34170. /**
  34171. * @author Richard Davey <rich@photonstorm.com>
  34172. * @copyright 2019 Photon Storm Ltd.
  34173. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34174. */
  34175. var BlitterRender = __webpack_require__(867);
  34176. var Bob = __webpack_require__(864);
  34177. var Class = __webpack_require__(0);
  34178. var Components = __webpack_require__(13);
  34179. var Frame = __webpack_require__(121);
  34180. var GameObject = __webpack_require__(18);
  34181. var List = __webpack_require__(120);
  34182. /**
  34183. * @callback CreateCallback
  34184. *
  34185. * @param {Phaser.GameObjects.Bob} bob - The Bob that was created by the Blitter.
  34186. * @param {integer} index - The position of the Bob within the Blitter display list.
  34187. */
  34188. /**
  34189. * @classdesc
  34190. * A Blitter Game Object.
  34191. *
  34192. * The Blitter Game Object is a special kind of container that creates, updates and manages Bob objects.
  34193. * Bobs are designed for rendering speed rather than flexibility. They consist of a texture, or frame from a texture,
  34194. * a position and an alpha value. You cannot scale or rotate them. They use a batched drawing method for speed
  34195. * during rendering.
  34196. *
  34197. * A Blitter Game Object has one texture bound to it. Bobs created by the Blitter can use any Frame from this
  34198. * Texture to render with, but they cannot use any other Texture. It is this single texture-bind that allows
  34199. * them their speed.
  34200. *
  34201. * If you have a need to blast a large volume of frames around the screen then Blitter objects are well worth
  34202. * investigating. They are especially useful for using as a base for your own special effects systems.
  34203. *
  34204. * @class Blitter
  34205. * @extends Phaser.GameObjects.GameObject
  34206. * @memberof Phaser.GameObjects
  34207. * @constructor
  34208. * @since 3.0.0
  34209. *
  34210. * @extends Phaser.GameObjects.Components.Alpha
  34211. * @extends Phaser.GameObjects.Components.BlendMode
  34212. * @extends Phaser.GameObjects.Components.Depth
  34213. * @extends Phaser.GameObjects.Components.Mask
  34214. * @extends Phaser.GameObjects.Components.Pipeline
  34215. * @extends Phaser.GameObjects.Components.ScaleMode
  34216. * @extends Phaser.GameObjects.Components.ScrollFactor
  34217. * @extends Phaser.GameObjects.Components.Size
  34218. * @extends Phaser.GameObjects.Components.Texture
  34219. * @extends Phaser.GameObjects.Components.Transform
  34220. * @extends Phaser.GameObjects.Components.Visible
  34221. *
  34222. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. It can only belong to one Scene at any given time.
  34223. * @param {number} [x=0] - The x coordinate of this Game Object in world space.
  34224. * @param {number} [y=0] - The y coordinate of this Game Object in world space.
  34225. * @param {string} [texture='__DEFAULT'] - The key of the texture this Game Object will use for rendering. The Texture must already exist in the Texture Manager.
  34226. * @param {(string|integer)} [frame=0] - The Frame of the Texture that this Game Object will use. Only set if the Texture has multiple frames, such as a Texture Atlas or Sprite Sheet.
  34227. */
  34228. var Blitter = new Class({
  34229. Extends: GameObject,
  34230. Mixins: [
  34231. Components.Alpha,
  34232. Components.BlendMode,
  34233. Components.Depth,
  34234. Components.Mask,
  34235. Components.Pipeline,
  34236. Components.ScaleMode,
  34237. Components.ScrollFactor,
  34238. Components.Size,
  34239. Components.Texture,
  34240. Components.Transform,
  34241. Components.Visible,
  34242. BlitterRender
  34243. ],
  34244. initialize:
  34245. function Blitter (scene, x, y, texture, frame)
  34246. {
  34247. GameObject.call(this, scene, 'Blitter');
  34248. this.setTexture(texture, frame);
  34249. this.setPosition(x, y);
  34250. this.initPipeline();
  34251. /**
  34252. * The children of this Blitter.
  34253. * This List contains all of the Bob objects created by the Blitter.
  34254. *
  34255. * @name Phaser.GameObjects.Blitter#children
  34256. * @type {Phaser.Structs.List.<Phaser.GameObjects.Bob>}
  34257. * @since 3.0.0
  34258. */
  34259. this.children = new List();
  34260. /**
  34261. * A transient array that holds all of the Bobs that will be rendered this frame.
  34262. * The array is re-populated whenever the dirty flag is set.
  34263. *
  34264. * @name Phaser.GameObjects.Blitter#renderList
  34265. * @type {Phaser.GameObjects.Bob[]}
  34266. * @default []
  34267. * @private
  34268. * @since 3.0.0
  34269. */
  34270. this.renderList = [];
  34271. /**
  34272. * Is the Blitter considered dirty?
  34273. * A 'dirty' Blitter has had its child count changed since the last frame.
  34274. *
  34275. * @name Phaser.GameObjects.Blitter#dirty
  34276. * @type {boolean}
  34277. * @since 3.0.0
  34278. */
  34279. this.dirty = false;
  34280. },
  34281. /**
  34282. * Creates a new Bob in this Blitter.
  34283. *
  34284. * The Bob is created at the given coordinates, relative to the Blitter and uses the given frame.
  34285. * A Bob can use any frame belonging to the texture bound to the Blitter.
  34286. *
  34287. * @method Phaser.GameObjects.Blitter#create
  34288. * @since 3.0.0
  34289. *
  34290. * @param {number} x - The x position of the Bob. Bob coordinate are relative to the position of the Blitter object.
  34291. * @param {number} y - The y position of the Bob. Bob coordinate are relative to the position of the Blitter object.
  34292. * @param {(string|integer|Phaser.Textures.Frame)} [frame] - The Frame the Bob will use. It _must_ be part of the Texture the parent Blitter object is using.
  34293. * @param {boolean} [visible=true] - Should the created Bob render or not?
  34294. * @param {integer} [index] - The position in the Blitters Display List to add the new Bob at. Defaults to the top of the list.
  34295. *
  34296. * @return {Phaser.GameObjects.Bob} The newly created Bob object.
  34297. */
  34298. create: function (x, y, frame, visible, index)
  34299. {
  34300. if (visible === undefined) { visible = true; }
  34301. if (index === undefined) { index = this.children.length; }
  34302. if (frame === undefined)
  34303. {
  34304. frame = this.frame;
  34305. }
  34306. else if (!(frame instanceof Frame))
  34307. {
  34308. frame = this.texture.get(frame);
  34309. }
  34310. var bob = new Bob(this, x, y, frame, visible);
  34311. this.children.addAt(bob, index, false);
  34312. this.dirty = true;
  34313. return bob;
  34314. },
  34315. /**
  34316. * Creates multiple Bob objects within this Blitter and then passes each of them to the specified callback.
  34317. *
  34318. * @method Phaser.GameObjects.Blitter#createFromCallback
  34319. * @since 3.0.0
  34320. *
  34321. * @param {CreateCallback} callback - The callback to invoke after creating a bob. It will be sent two arguments: The Bob and the index of the Bob.
  34322. * @param {integer} quantity - The quantity of Bob objects to create.
  34323. * @param {(string|integer|Phaser.Textures.Frame|string[]|integer[]|Phaser.Textures.Frame[])} [frame] - The Frame the Bobs will use. It must be part of the Blitter Texture.
  34324. * @param {boolean} [visible=true] - Should the created Bob render or not?
  34325. *
  34326. * @return {Phaser.GameObjects.Bob[]} An array of Bob objects that were created.
  34327. */
  34328. createFromCallback: function (callback, quantity, frame, visible)
  34329. {
  34330. var bobs = this.createMultiple(quantity, frame, visible);
  34331. for (var i = 0; i < bobs.length; i++)
  34332. {
  34333. var bob = bobs[i];
  34334. callback.call(this, bob, i);
  34335. }
  34336. return bobs;
  34337. },
  34338. /**
  34339. * Creates multiple Bobs in one call.
  34340. *
  34341. * The amount created is controlled by a combination of the `quantity` argument and the number of frames provided.
  34342. *
  34343. * If the quantity is set to 10 and you provide 2 frames, then 20 Bobs will be created. 10 with the first
  34344. * frame and 10 with the second.
  34345. *
  34346. * @method Phaser.GameObjects.Blitter#createMultiple
  34347. * @since 3.0.0
  34348. *
  34349. * @param {integer} quantity - The quantity of Bob objects to create.
  34350. * @param {(string|integer|Phaser.Textures.Frame|string[]|integer[]|Phaser.Textures.Frame[])} [frame] - The Frame the Bobs will use. It must be part of the Blitter Texture.
  34351. * @param {boolean} [visible=true] - Should the created Bob render or not?
  34352. *
  34353. * @return {Phaser.GameObjects.Bob[]} An array of Bob objects that were created.
  34354. */
  34355. createMultiple: function (quantity, frame, visible)
  34356. {
  34357. if (frame === undefined) { frame = this.frame.name; }
  34358. if (visible === undefined) { visible = true; }
  34359. if (!Array.isArray(frame))
  34360. {
  34361. frame = [ frame ];
  34362. }
  34363. var bobs = [];
  34364. var _this = this;
  34365. frame.forEach(function (singleFrame)
  34366. {
  34367. for (var i = 0; i < quantity; i++)
  34368. {
  34369. bobs.push(_this.create(0, 0, singleFrame, visible));
  34370. }
  34371. });
  34372. return bobs;
  34373. },
  34374. /**
  34375. * Checks if the given child can render or not, by checking its `visible` and `alpha` values.
  34376. *
  34377. * @method Phaser.GameObjects.Blitter#childCanRender
  34378. * @since 3.0.0
  34379. *
  34380. * @param {Phaser.GameObjects.Bob} child - The Bob to check for rendering.
  34381. *
  34382. * @return {boolean} Returns `true` if the given child can render, otherwise `false`.
  34383. */
  34384. childCanRender: function (child)
  34385. {
  34386. return (child.visible && child.alpha > 0);
  34387. },
  34388. /**
  34389. * Returns an array of Bobs to be rendered.
  34390. * If the Blitter is dirty then a new list is generated and stored in `renderList`.
  34391. *
  34392. * @method Phaser.GameObjects.Blitter#getRenderList
  34393. * @since 3.0.0
  34394. *
  34395. * @return {Phaser.GameObjects.Bob[]} An array of Bob objects that will be rendered this frame.
  34396. */
  34397. getRenderList: function ()
  34398. {
  34399. if (this.dirty)
  34400. {
  34401. this.renderList = this.children.list.filter(this.childCanRender, this);
  34402. this.dirty = false;
  34403. }
  34404. return this.renderList;
  34405. },
  34406. /**
  34407. * Removes all Bobs from the children List and clears the dirty flag.
  34408. *
  34409. * @method Phaser.GameObjects.Blitter#clear
  34410. * @since 3.0.0
  34411. */
  34412. clear: function ()
  34413. {
  34414. this.children.removeAll();
  34415. this.dirty = true;
  34416. },
  34417. /**
  34418. * Internal destroy handler, called as part of the destroy process.
  34419. *
  34420. * @method Phaser.GameObjects.Blitter#preDestroy
  34421. * @protected
  34422. * @since 3.9.0
  34423. */
  34424. preDestroy: function ()
  34425. {
  34426. this.children.destroy();
  34427. this.renderList = [];
  34428. }
  34429. });
  34430. module.exports = Blitter;
  34431. /***/ }),
  34432. /* 172 */
  34433. /***/ (function(module, exports) {
  34434. /**
  34435. * @author Richard Davey <rich@photonstorm.com>
  34436. * @copyright 2019 Photon Storm Ltd.
  34437. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34438. */
  34439. /**
  34440. * Returns a Random element from the array.
  34441. *
  34442. * @function Phaser.Utils.Array.GetRandom
  34443. * @since 3.0.0
  34444. *
  34445. * @param {array} array - The array to select the random entry from.
  34446. * @param {integer} [startIndex=0] - An optional start index.
  34447. * @param {integer} [length=array.length] - An optional length, the total number of elements (from the startIndex) to choose from.
  34448. *
  34449. * @return {*} A random element from the array, or `null` if no element could be found in the range given.
  34450. */
  34451. var GetRandom = function (array, startIndex, length)
  34452. {
  34453. if (startIndex === undefined) { startIndex = 0; }
  34454. if (length === undefined) { length = array.length; }
  34455. var randomIndex = startIndex + Math.floor(Math.random() * length);
  34456. return (array[randomIndex] === undefined) ? null : array[randomIndex];
  34457. };
  34458. module.exports = GetRandom;
  34459. /***/ }),
  34460. /* 173 */
  34461. /***/ (function(module, exports) {
  34462. /**
  34463. * @author Richard Davey <rich@photonstorm.com>
  34464. * @copyright 2019 Photon Storm Ltd.
  34465. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34466. */
  34467. /**
  34468. * Checks if an array can be used as a matrix.
  34469. *
  34470. * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) have the same length. There must be at least two rows:
  34471. *
  34472. * ```
  34473. * [
  34474. * [ 1, 1, 1, 1, 1, 1 ],
  34475. * [ 2, 0, 0, 0, 0, 4 ],
  34476. * [ 2, 0, 1, 2, 0, 4 ],
  34477. * [ 2, 0, 3, 4, 0, 4 ],
  34478. * [ 2, 0, 0, 0, 0, 4 ],
  34479. * [ 3, 3, 3, 3, 3, 3 ]
  34480. * ]
  34481. * ```
  34482. *
  34483. * @function Phaser.Utils.Array.Matrix.CheckMatrix
  34484. * @since 3.0.0
  34485. *
  34486. * @param {array} matrix - The array to check.
  34487. *
  34488. * @return {boolean} `true` if the given `matrix` array is a valid matrix.
  34489. */
  34490. var CheckMatrix = function (matrix)
  34491. {
  34492. if (!Array.isArray(matrix) || matrix.length < 2 || !Array.isArray(matrix[0]))
  34493. {
  34494. return false;
  34495. }
  34496. // How long is the first row?
  34497. var size = matrix[0].length;
  34498. // Validate the rest of the rows are the same length
  34499. for (var i = 1; i < matrix.length; i++)
  34500. {
  34501. if (matrix[i].length !== size)
  34502. {
  34503. return false;
  34504. }
  34505. }
  34506. return true;
  34507. };
  34508. module.exports = CheckMatrix;
  34509. /***/ }),
  34510. /* 174 */
  34511. /***/ (function(module, exports, __webpack_require__) {
  34512. /**
  34513. * @author Richard Davey <rich@photonstorm.com>
  34514. * @copyright 2019 Photon Storm Ltd.
  34515. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34516. */
  34517. /**
  34518. * @namespace Phaser.Utils.Array
  34519. */
  34520. module.exports = {
  34521. Matrix: __webpack_require__(900),
  34522. Add: __webpack_require__(893),
  34523. AddAt: __webpack_require__(892),
  34524. BringToTop: __webpack_require__(891),
  34525. CountAllMatching: __webpack_require__(890),
  34526. Each: __webpack_require__(889),
  34527. EachInRange: __webpack_require__(888),
  34528. FindClosestInSorted: __webpack_require__(434),
  34529. GetAll: __webpack_require__(887),
  34530. GetFirst: __webpack_require__(886),
  34531. GetRandom: __webpack_require__(172),
  34532. MoveDown: __webpack_require__(885),
  34533. MoveTo: __webpack_require__(884),
  34534. MoveUp: __webpack_require__(883),
  34535. NumberArray: __webpack_require__(882),
  34536. NumberArrayStep: __webpack_require__(881),
  34537. QuickSelect: __webpack_require__(317),
  34538. Range: __webpack_require__(316),
  34539. Remove: __webpack_require__(177),
  34540. RemoveAt: __webpack_require__(880),
  34541. RemoveBetween: __webpack_require__(879),
  34542. RemoveRandomElement: __webpack_require__(878),
  34543. Replace: __webpack_require__(877),
  34544. RotateLeft: __webpack_require__(418),
  34545. RotateRight: __webpack_require__(417),
  34546. SafeRange: __webpack_require__(68),
  34547. SendToBack: __webpack_require__(876),
  34548. SetAll: __webpack_require__(875),
  34549. Shuffle: __webpack_require__(132),
  34550. SpliceOne: __webpack_require__(97),
  34551. StableSort: __webpack_require__(118),
  34552. Swap: __webpack_require__(874)
  34553. };
  34554. /***/ }),
  34555. /* 175 */
  34556. /***/ (function(module, exports, __webpack_require__) {
  34557. /**
  34558. * @author Richard Davey <rich@photonstorm.com>
  34559. * @copyright 2019 Photon Storm Ltd.
  34560. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34561. */
  34562. var Class = __webpack_require__(0);
  34563. var Frame = __webpack_require__(121);
  34564. var TextureSource = __webpack_require__(320);
  34565. var TEXTURE_MISSING_ERROR = 'Texture.frame missing: ';
  34566. /**
  34567. * @classdesc
  34568. * A Texture consists of a source, usually an Image from the Cache, and a collection of Frames.
  34569. * The Frames represent the different areas of the Texture. For example a texture atlas
  34570. * may have many Frames, one for each element within the atlas. Where-as a single image would have
  34571. * just one frame, that encompasses the whole image.
  34572. *
  34573. * Textures are managed by the global TextureManager. This is a singleton class that is
  34574. * responsible for creating and delivering Textures and their corresponding Frames to Game Objects.
  34575. *
  34576. * Sprites and other Game Objects get the texture data they need from the TextureManager.
  34577. *
  34578. * @class Texture
  34579. * @memberof Phaser.Textures
  34580. * @constructor
  34581. * @since 3.0.0
  34582. *
  34583. * @param {Phaser.Textures.TextureManager} manager - A reference to the Texture Manager this Texture belongs to.
  34584. * @param {string} key - The unique string-based key of this Texture.
  34585. * @param {(HTMLImageElement|HTMLCanvasElement|HTMLImageElement[]|HTMLCanvasElement[])} source - An array of sources that are used to create the texture. Usually Images, but can also be a Canvas.
  34586. * @param {number} [width] - The width of the Texture. This is optional and automatically derived from the source images.
  34587. * @param {number} [height] - The height of the Texture. This is optional and automatically derived from the source images.
  34588. */
  34589. var Texture = new Class({
  34590. initialize:
  34591. function Texture (manager, key, source, width, height)
  34592. {
  34593. if (!Array.isArray(source))
  34594. {
  34595. source = [ source ];
  34596. }
  34597. /**
  34598. * A reference to the Texture Manager this Texture belongs to.
  34599. *
  34600. * @name Phaser.Textures.Texture#manager
  34601. * @type {Phaser.Textures.TextureManager}
  34602. * @since 3.0.0
  34603. */
  34604. this.manager = manager;
  34605. /**
  34606. * The unique string-based key of this Texture.
  34607. *
  34608. * @name Phaser.Textures.Texture#key
  34609. * @type {string}
  34610. * @since 3.0.0
  34611. */
  34612. this.key = key;
  34613. /**
  34614. * An array of TextureSource instances.
  34615. * These are unique to this Texture and contain the actual Image (or Canvas) data.
  34616. *
  34617. * @name Phaser.Textures.Texture#source
  34618. * @type {Phaser.Textures.TextureSource[]}
  34619. * @since 3.0.0
  34620. */
  34621. this.source = [];
  34622. /**
  34623. * An array of TextureSource data instances.
  34624. * Used to store additional data images, such as normal maps or specular maps.
  34625. *
  34626. * @name Phaser.Textures.Texture#dataSource
  34627. * @type {array}
  34628. * @since 3.0.0
  34629. */
  34630. this.dataSource = [];
  34631. /**
  34632. * A key-value object pair associating the unique Frame keys with the Frames objects.
  34633. *
  34634. * @name Phaser.Textures.Texture#frames
  34635. * @type {object}
  34636. * @since 3.0.0
  34637. */
  34638. this.frames = {};
  34639. /**
  34640. * Any additional data that was set in the source JSON (if any),
  34641. * or any extra data you'd like to store relating to this texture
  34642. *
  34643. * @name Phaser.Textures.Texture#customData
  34644. * @type {object}
  34645. * @since 3.0.0
  34646. */
  34647. this.customData = {};
  34648. /**
  34649. * The name of the first frame of the Texture.
  34650. *
  34651. * @name Phaser.Textures.Texture#firstFrame
  34652. * @type {string}
  34653. * @since 3.0.0
  34654. */
  34655. this.firstFrame = '__BASE';
  34656. /**
  34657. * The total number of Frames in this Texture.
  34658. *
  34659. * @name Phaser.Textures.Texture#frameTotal
  34660. * @type {integer}
  34661. * @default 0
  34662. * @since 3.0.0
  34663. */
  34664. this.frameTotal = 0;
  34665. // Load the Sources
  34666. for (var i = 0; i < source.length; i++)
  34667. {
  34668. this.source.push(new TextureSource(this, source[i], width, height));
  34669. }
  34670. },
  34671. /**
  34672. * Adds a new Frame to this Texture.
  34673. *
  34674. * A Frame is a rectangular region of a TextureSource with a unique index or string-based key.
  34675. *
  34676. * @method Phaser.Textures.Texture#add
  34677. * @since 3.0.0
  34678. *
  34679. * @param {(integer|string)} name - The name of this Frame. The name is unique within the Texture.
  34680. * @param {integer} sourceIndex - The index of the TextureSource that this Frame is a part of.
  34681. * @param {number} x - The x coordinate of the top-left of this Frame.
  34682. * @param {number} y - The y coordinate of the top-left of this Frame.
  34683. * @param {number} width - The width of this Frame.
  34684. * @param {number} height - The height of this Frame.
  34685. *
  34686. * @return {Phaser.Textures.Frame} The Frame that was added to this Texture.
  34687. */
  34688. add: function (name, sourceIndex, x, y, width, height)
  34689. {
  34690. var frame = new Frame(this, name, sourceIndex, x, y, width, height);
  34691. this.frames[name] = frame;
  34692. // Set the first frame of the Texture (other than __BASE)
  34693. // This is used to ensure we don't spam the display with entire
  34694. // atlases of sprite sheets, but instead just the first frame of them
  34695. // should the dev incorrectly specify the frame index
  34696. if (this.frameTotal === 1)
  34697. {
  34698. this.firstFrame = name;
  34699. }
  34700. this.frameTotal++;
  34701. return frame;
  34702. },
  34703. /**
  34704. * Checks to see if a Frame matching the given key exists within this Texture.
  34705. *
  34706. * @method Phaser.Textures.Texture#has
  34707. * @since 3.0.0
  34708. *
  34709. * @param {string} name - The key of the Frame to check for.
  34710. *
  34711. * @return {boolean} True if a Frame with the matching key exists in this Texture.
  34712. */
  34713. has: function (name)
  34714. {
  34715. return (this.frames[name]);
  34716. },
  34717. /**
  34718. * Gets a Frame from this Texture based on either the key or the index of the Frame.
  34719. *
  34720. * In a Texture Atlas Frames are typically referenced by a key.
  34721. * In a Sprite Sheet Frames are referenced by an index.
  34722. * Passing no value for the name returns the base texture.
  34723. *
  34724. * @method Phaser.Textures.Texture#get
  34725. * @since 3.0.0
  34726. *
  34727. * @param {(string|integer)} [name] - The string-based name, or integer based index, of the Frame to get from this Texture.
  34728. *
  34729. * @return {Phaser.Textures.Frame} The Texture Frame.
  34730. */
  34731. get: function (name)
  34732. {
  34733. // null, undefined, empty string, zero
  34734. if (!name)
  34735. {
  34736. name = this.firstFrame;
  34737. }
  34738. var frame = this.frames[name];
  34739. if (!frame)
  34740. {
  34741. console.warn(TEXTURE_MISSING_ERROR + name);
  34742. frame = this.frames[this.firstFrame];
  34743. }
  34744. return frame;
  34745. },
  34746. /**
  34747. * Takes the given TextureSource and returns the index of it within this Texture.
  34748. * If it's not in this Texture, it returns -1.
  34749. * Unless this Texture has multiple TextureSources, such as with a multi-atlas, this
  34750. * method will always return zero or -1.
  34751. *
  34752. * @method Phaser.Textures.Texture#getTextureSourceIndex
  34753. * @since 3.0.0
  34754. *
  34755. * @param {Phaser.Textures.TextureSource} source - The TextureSource to check.
  34756. *
  34757. * @return {integer} The index of the TextureSource within this Texture, or -1 if not in this Texture.
  34758. */
  34759. getTextureSourceIndex: function (source)
  34760. {
  34761. for (var i = 0; i < this.source.length; i++)
  34762. {
  34763. if (this.source[i] === source)
  34764. {
  34765. return i;
  34766. }
  34767. }
  34768. return -1;
  34769. },
  34770. /**
  34771. * Returns an array of all the Frames in the given TextureSource.
  34772. *
  34773. * @method Phaser.Textures.Texture#getFramesFromTextureSource
  34774. * @since 3.0.0
  34775. *
  34776. * @param {integer} sourceIndex - The index of the TextureSource to get the Frames from.
  34777. * @param {boolean} [includeBase=false] - Include the `__BASE` Frame in the output array?
  34778. *
  34779. * @return {Phaser.Textures.Frame[]} An array of Texture Frames.
  34780. */
  34781. getFramesFromTextureSource: function (sourceIndex, includeBase)
  34782. {
  34783. if (includeBase === undefined) { includeBase = false; }
  34784. var out = [];
  34785. for (var frameName in this.frames)
  34786. {
  34787. if (frameName === '__BASE' && !includeBase)
  34788. {
  34789. continue;
  34790. }
  34791. var frame = this.frames[frameName];
  34792. if (frame.sourceIndex === sourceIndex)
  34793. {
  34794. out.push(frame);
  34795. }
  34796. }
  34797. return out;
  34798. },
  34799. /**
  34800. * Returns an array with all of the names of the Frames in this Texture.
  34801. *
  34802. * Useful if you want to randomly assign a Frame to a Game Object, as you can
  34803. * pick a random element from the returned array.
  34804. *
  34805. * @method Phaser.Textures.Texture#getFrameNames
  34806. * @since 3.0.0
  34807. *
  34808. * @param {boolean} [includeBase=false] - Include the `__BASE` Frame in the output array?
  34809. *
  34810. * @return {string[]} An array of all Frame names in this Texture.
  34811. */
  34812. getFrameNames: function (includeBase)
  34813. {
  34814. if (includeBase === undefined) { includeBase = false; }
  34815. var out = Object.keys(this.frames);
  34816. if (!includeBase)
  34817. {
  34818. var idx = out.indexOf('__BASE');
  34819. if (idx !== -1)
  34820. {
  34821. out.splice(idx, 1);
  34822. }
  34823. }
  34824. return out;
  34825. },
  34826. /**
  34827. * Given a Frame name, return the source image it uses to render with.
  34828. *
  34829. * This will return the actual DOM Image or Canvas element.
  34830. *
  34831. * @method Phaser.Textures.Texture#getSourceImage
  34832. * @since 3.0.0
  34833. *
  34834. * @param {(string|integer)} [name] - The string-based name, or integer based index, of the Frame to get from this Texture.
  34835. *
  34836. * @return {(HTMLImageElement|HTMLCanvasElement|Phaser.GameObjects.RenderTexture)} The DOM Image, Canvas Element or Render Texture.
  34837. */
  34838. getSourceImage: function (name)
  34839. {
  34840. if (name === undefined || name === null || this.frameTotal === 1)
  34841. {
  34842. name = '__BASE';
  34843. }
  34844. var frame = this.frames[name];
  34845. if (frame)
  34846. {
  34847. return frame.source.image;
  34848. }
  34849. else
  34850. {
  34851. console.warn(TEXTURE_MISSING_ERROR + name);
  34852. return this.frames['__BASE'].source.image;
  34853. }
  34854. },
  34855. /**
  34856. * Given a Frame name, return the data source image it uses to render with.
  34857. * You can use this to get the normal map for an image for example.
  34858. *
  34859. * This will return the actual DOM Image.
  34860. *
  34861. * @method Phaser.Textures.Texture#getDataSourceImage
  34862. * @since 3.7.0
  34863. *
  34864. * @param {(string|integer)} [name] - The string-based name, or integer based index, of the Frame to get from this Texture.
  34865. *
  34866. * @return {(HTMLImageElement|HTMLCanvasElement)} The DOM Image or Canvas Element.
  34867. */
  34868. getDataSourceImage: function (name)
  34869. {
  34870. if (name === undefined || name === null || this.frameTotal === 1)
  34871. {
  34872. name = '__BASE';
  34873. }
  34874. var frame = this.frames[name];
  34875. var idx;
  34876. if (!frame)
  34877. {
  34878. console.warn(TEXTURE_MISSING_ERROR + name);
  34879. idx = this.frames['__BASE'].sourceIndex;
  34880. }
  34881. else
  34882. {
  34883. idx = frame.sourceIndex;
  34884. }
  34885. return this.dataSource[idx].image;
  34886. },
  34887. /**
  34888. * Adds a data source image to this Texture.
  34889. *
  34890. * An example of a data source image would be a normal map, where all of the Frames for this Texture
  34891. * equally apply to the normal map.
  34892. *
  34893. * @method Phaser.Textures.Texture#setDataSource
  34894. * @since 3.0.0
  34895. *
  34896. * @param {(HTMLImageElement|HTMLCanvasElement|HTMLImageElement[]|HTMLCanvasElement[])} data - The source image.
  34897. */
  34898. setDataSource: function (data)
  34899. {
  34900. if (!Array.isArray(data))
  34901. {
  34902. data = [ data ];
  34903. }
  34904. for (var i = 0; i < data.length; i++)
  34905. {
  34906. var source = this.source[i];
  34907. this.dataSource.push(new TextureSource(this, data[i], source.width, source.height));
  34908. }
  34909. },
  34910. /**
  34911. * Sets the Filter Mode for this Texture.
  34912. *
  34913. * The mode can be either Linear, the default, or Nearest.
  34914. *
  34915. * For pixel-art you should use Nearest.
  34916. *
  34917. * The mode applies to the entire Texture, not just a specific Frame of it.
  34918. *
  34919. * @method Phaser.Textures.Texture#setFilter
  34920. * @since 3.0.0
  34921. *
  34922. * @param {Phaser.Textures.FilterMode} filterMode - The Filter Mode.
  34923. */
  34924. setFilter: function (filterMode)
  34925. {
  34926. var i;
  34927. for (i = 0; i < this.source.length; i++)
  34928. {
  34929. this.source[i].setFilter(filterMode);
  34930. }
  34931. for (i = 0; i < this.dataSource.length; i++)
  34932. {
  34933. this.dataSource[i].setFilter(filterMode);
  34934. }
  34935. },
  34936. /**
  34937. * Destroys this Texture and releases references to its sources and frames.
  34938. *
  34939. * @method Phaser.Textures.Texture#destroy
  34940. * @since 3.0.0
  34941. */
  34942. destroy: function ()
  34943. {
  34944. var i;
  34945. for (i = 0; i < this.source.length; i++)
  34946. {
  34947. this.source[i].destroy();
  34948. }
  34949. for (i = 0; i < this.dataSource.length; i++)
  34950. {
  34951. this.dataSource[i].destroy();
  34952. }
  34953. for (var frameName in this.frames)
  34954. {
  34955. var frame = this.frames[frameName];
  34956. frame.destroy();
  34957. }
  34958. this.source = [];
  34959. this.dataSource = [];
  34960. this.frames = {};
  34961. this.manager = null;
  34962. }
  34963. });
  34964. module.exports = Texture;
  34965. /***/ }),
  34966. /* 176 */
  34967. /***/ (function(module, exports, __webpack_require__) {
  34968. /**
  34969. * @author Richard Davey <rich@photonstorm.com>
  34970. * @copyright 2019 Photon Storm Ltd.
  34971. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34972. */
  34973. var Class = __webpack_require__(0);
  34974. var CONST = __webpack_require__(124);
  34975. var DefaultPlugins = __webpack_require__(181);
  34976. var Events = __webpack_require__(16);
  34977. var GetPhysicsPlugins = __webpack_require__(935);
  34978. var GetScenePlugins = __webpack_require__(934);
  34979. var NOOP = __webpack_require__(1);
  34980. var Settings = __webpack_require__(329);
  34981. /**
  34982. * @classdesc
  34983. * The Scene Systems class.
  34984. *
  34985. * This class is available from within a Scene under the property `sys`.
  34986. * It is responsible for managing all of the plugins a Scene has running, including the display list, and
  34987. * handling the update step and renderer. It also contains references to global systems belonging to Game.
  34988. *
  34989. * @class Systems
  34990. * @memberof Phaser.Scenes
  34991. * @constructor
  34992. * @since 3.0.0
  34993. *
  34994. * @param {Phaser.Scene} scene - The Scene that owns this Systems instance.
  34995. * @param {(string|Phaser.Scenes.Settings.Config)} config - Scene specific configuration settings.
  34996. */
  34997. var Systems = new Class({
  34998. initialize:
  34999. function Systems (scene, config)
  35000. {
  35001. /**
  35002. * A reference to the Scene that these Systems belong to.
  35003. *
  35004. * @name Phaser.Scenes.Systems#scene
  35005. * @type {Phaser.Scene}
  35006. * @since 3.0.0
  35007. */
  35008. this.scene = scene;
  35009. /**
  35010. * A reference to the Phaser Game instance.
  35011. *
  35012. * @name Phaser.Scenes.Systems#game
  35013. * @type {Phaser.Game}
  35014. * @since 3.0.0
  35015. */
  35016. this.game;
  35017. if (false)
  35018. {}
  35019. /**
  35020. * The Scene Configuration object, as passed in when creating the Scene.
  35021. *
  35022. * @name Phaser.Scenes.Systems#config
  35023. * @type {(string|Phaser.Scenes.Settings.Config)}
  35024. * @since 3.0.0
  35025. */
  35026. this.config = config;
  35027. /**
  35028. * The Scene Settings. This is the parsed output based on the Scene configuration.
  35029. *
  35030. * @name Phaser.Scenes.Systems#settings
  35031. * @type {Phaser.Scenes.Settings.Object}
  35032. * @since 3.0.0
  35033. */
  35034. this.settings = Settings.create(config);
  35035. /**
  35036. * A handy reference to the Scene canvas / context.
  35037. *
  35038. * @name Phaser.Scenes.Systems#canvas
  35039. * @type {HTMLCanvasElement}
  35040. * @since 3.0.0
  35041. */
  35042. this.canvas;
  35043. /**
  35044. * A reference to the Canvas Rendering Context being used by the renderer.
  35045. *
  35046. * @name Phaser.Scenes.Systems#context
  35047. * @type {CanvasRenderingContext2D}
  35048. * @since 3.0.0
  35049. */
  35050. this.context;
  35051. // Global Systems - these are single-instance global managers that belong to Game
  35052. /**
  35053. * A reference to the global Animations Manager.
  35054. *
  35055. * In the default set-up you can access this from within a Scene via the `this.anims` property.
  35056. *
  35057. * @name Phaser.Scenes.Systems#anims
  35058. * @type {Phaser.Animations.AnimationManager}
  35059. * @since 3.0.0
  35060. */
  35061. this.anims;
  35062. /**
  35063. * A reference to the global Cache. The Cache stores all files bought in to Phaser via
  35064. * the Loader, with the exception of images. Images are stored in the Texture Manager.
  35065. *
  35066. * In the default set-up you can access this from within a Scene via the `this.cache` property.
  35067. *
  35068. * @name Phaser.Scenes.Systems#cache
  35069. * @type {Phaser.Cache.CacheManager}
  35070. * @since 3.0.0
  35071. */
  35072. this.cache;
  35073. /**
  35074. * A reference to the global Plugins Manager.
  35075. *
  35076. * In the default set-up you can access this from within a Scene via the `this.plugins` property.
  35077. *
  35078. * @name Phaser.Scenes.Systems#plugins
  35079. * @type {Phaser.Plugins.PluginManager}
  35080. * @since 3.0.0
  35081. */
  35082. this.plugins;
  35083. /**
  35084. * A reference to the global registry. This is a game-wide instance of the Data Manager, allowing
  35085. * you to exchange data between Scenes via a universal and shared point.
  35086. *
  35087. * In the default set-up you can access this from within a Scene via the `this.registry` property.
  35088. *
  35089. * @name Phaser.Scenes.Systems#registry
  35090. * @type {Phaser.Data.DataManager}
  35091. * @since 3.0.0
  35092. */
  35093. this.registry;
  35094. /**
  35095. * A reference to the global Scale Manager.
  35096. *
  35097. * In the default set-up you can access this from within a Scene via the `this.scale` property.
  35098. *
  35099. * @name Phaser.Scenes.Systems#scale
  35100. * @type {Phaser.Scale.ScaleManager}
  35101. * @since 3.15.0
  35102. */
  35103. this.scale;
  35104. /**
  35105. * A reference to the global Sound Manager.
  35106. *
  35107. * In the default set-up you can access this from within a Scene via the `this.sound` property.
  35108. *
  35109. * @name Phaser.Scenes.Systems#sound
  35110. * @type {Phaser.Sound.BaseSoundManager}
  35111. * @since 3.0.0
  35112. */
  35113. this.sound;
  35114. /**
  35115. * A reference to the global Texture Manager.
  35116. *
  35117. * In the default set-up you can access this from within a Scene via the `this.textures` property.
  35118. *
  35119. * @name Phaser.Scenes.Systems#textures
  35120. * @type {Phaser.Textures.TextureManager}
  35121. * @since 3.0.0
  35122. */
  35123. this.textures;
  35124. // Core Plugins - these are non-optional Scene plugins, needed by lots of the other systems
  35125. /**
  35126. * A reference to the Scene's Game Object Factory.
  35127. *
  35128. * Use this to quickly and easily create new Game Object's.
  35129. *
  35130. * In the default set-up you can access this from within a Scene via the `this.add` property.
  35131. *
  35132. * @name Phaser.Scenes.Systems#add
  35133. * @type {Phaser.GameObjects.GameObjectFactory}
  35134. * @since 3.0.0
  35135. */
  35136. this.add;
  35137. /**
  35138. * A reference to the Scene's Camera Manager.
  35139. *
  35140. * Use this to manipulate and create Cameras for this specific Scene.
  35141. *
  35142. * In the default set-up you can access this from within a Scene via the `this.cameras` property.
  35143. *
  35144. * @name Phaser.Scenes.Systems#cameras
  35145. * @type {Phaser.Cameras.Scene2D.CameraManager}
  35146. * @since 3.0.0
  35147. */
  35148. this.cameras;
  35149. /**
  35150. * A reference to the Scene's Display List.
  35151. *
  35152. * Use this to organize the children contained in the display list.
  35153. *
  35154. * In the default set-up you can access this from within a Scene via the `this.children` property.
  35155. *
  35156. * @name Phaser.Scenes.Systems#displayList
  35157. * @type {Phaser.GameObjects.DisplayList}
  35158. * @since 3.0.0
  35159. */
  35160. this.displayList;
  35161. /**
  35162. * A reference to the Scene's Event Manager.
  35163. *
  35164. * Use this to listen for Scene specific events, such as `pause` and `shutdown`.
  35165. *
  35166. * In the default set-up you can access this from within a Scene via the `this.events` property.
  35167. *
  35168. * @name Phaser.Scenes.Systems#events
  35169. * @type {Phaser.Events.EventEmitter}
  35170. * @since 3.0.0
  35171. */
  35172. this.events;
  35173. /**
  35174. * A reference to the Scene's Game Object Creator.
  35175. *
  35176. * Use this to quickly and easily create new Game Object's. The difference between this and the
  35177. * Game Object Factory, is that the Creator just creates and returns Game Object instances, it
  35178. * doesn't then add them to the Display List or Update List.
  35179. *
  35180. * In the default set-up you can access this from within a Scene via the `this.make` property.
  35181. *
  35182. * @name Phaser.Scenes.Systems#make
  35183. * @type {Phaser.GameObjects.GameObjectCreator}
  35184. * @since 3.0.0
  35185. */
  35186. this.make;
  35187. /**
  35188. * A reference to the Scene Manager Plugin.
  35189. *
  35190. * Use this to manipulate both this and other Scene's in your game, for example to launch a parallel Scene,
  35191. * or pause or resume a Scene, or switch from this Scene to another.
  35192. *
  35193. * In the default set-up you can access this from within a Scene via the `this.scene` property.
  35194. *
  35195. * @name Phaser.Scenes.Systems#scenePlugin
  35196. * @type {Phaser.Scenes.ScenePlugin}
  35197. * @since 3.0.0
  35198. */
  35199. this.scenePlugin;
  35200. /**
  35201. * A reference to the Scene's Update List.
  35202. *
  35203. * Use this to organize the children contained in the update list.
  35204. *
  35205. * The Update List is responsible for managing children that need their `preUpdate` methods called,
  35206. * in order to process so internal components, such as Sprites with Animations.
  35207. *
  35208. * In the default set-up there is no reference to this from within the Scene itself.
  35209. *
  35210. * @name Phaser.Scenes.Systems#updateList
  35211. * @type {Phaser.GameObjects.UpdateList}
  35212. * @since 3.0.0
  35213. */
  35214. this.updateList;
  35215. /**
  35216. * The Scene Update function.
  35217. *
  35218. * This starts out as NOOP during init, preload and create, and at the end of create
  35219. * it swaps to be whatever the Scene.update function is.
  35220. *
  35221. * @name Phaser.Scenes.Systems#sceneUpdate
  35222. * @type {function}
  35223. * @private
  35224. * @since 3.10.0
  35225. */
  35226. this.sceneUpdate = NOOP;
  35227. },
  35228. /**
  35229. * This method is called only once by the Scene Manager when the Scene is instantiated.
  35230. * It is responsible for setting up all of the Scene plugins and references.
  35231. * It should never be called directly.
  35232. *
  35233. * @method Phaser.Scenes.Systems#init
  35234. * @protected
  35235. * @fires Phaser.Scenes.Events#BOOT
  35236. * @since 3.0.0
  35237. *
  35238. * @param {Phaser.Game} game - A reference to the Phaser Game instance.
  35239. */
  35240. init: function (game)
  35241. {
  35242. this.settings.status = CONST.INIT;
  35243. // This will get replaced by the SceneManager with the actual update function, if it exists, once create is over.
  35244. this.sceneUpdate = NOOP;
  35245. this.game = game;
  35246. this.canvas = game.canvas;
  35247. this.context = game.context;
  35248. var pluginManager = game.plugins;
  35249. this.plugins = pluginManager;
  35250. pluginManager.addToScene(this, DefaultPlugins.Global, [ DefaultPlugins.CoreScene, GetScenePlugins(this), GetPhysicsPlugins(this) ]);
  35251. this.events.emit(Events.BOOT, this);
  35252. this.settings.isBooted = true;
  35253. },
  35254. /**
  35255. * Called by a plugin, it tells the System to install the plugin locally.
  35256. *
  35257. * @method Phaser.Scenes.Systems#install
  35258. * @private
  35259. * @since 3.0.0
  35260. *
  35261. * @param {array} plugin - An array of plugins to install into this Scene.
  35262. */
  35263. install: function (plugin)
  35264. {
  35265. if (!Array.isArray(plugin))
  35266. {
  35267. plugin = [ plugin ];
  35268. }
  35269. this.plugins.installLocal(this, plugin);
  35270. },
  35271. /**
  35272. * A single game step. Called automatically by the Scene Manager as a result of a Request Animation
  35273. * Frame or Set Timeout call to the main Game instance.
  35274. *
  35275. * @method Phaser.Scenes.Systems#step
  35276. * @fires Phaser.Scenes.Events#PRE_UPDATE
  35277. * @fires Phaser.Scenes.Events#_UPDATE
  35278. * @fires Phaser.Scenes.Events#POST_UPDATE
  35279. * @since 3.0.0
  35280. *
  35281. * @param {number} time - The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now().
  35282. * @param {number} delta - The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class.
  35283. */
  35284. step: function (time, delta)
  35285. {
  35286. this.events.emit(Events.PRE_UPDATE, time, delta);
  35287. this.events.emit(Events.UPDATE, time, delta);
  35288. this.sceneUpdate.call(this.scene, time, delta);
  35289. this.events.emit(Events.POST_UPDATE, time, delta);
  35290. },
  35291. /**
  35292. * Called automatically by the Scene Manager.
  35293. * Instructs the Scene to render itself via its Camera Manager to the renderer given.
  35294. *
  35295. * @method Phaser.Scenes.Systems#render
  35296. * @fires Phaser.Scenes.Events#RENDER
  35297. * @since 3.0.0
  35298. *
  35299. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The renderer that invoked the render call.
  35300. */
  35301. render: function (renderer)
  35302. {
  35303. var displayList = this.displayList;
  35304. displayList.depthSort();
  35305. this.cameras.render(renderer, displayList);
  35306. this.events.emit(Events.RENDER, renderer);
  35307. },
  35308. /**
  35309. * Force a sort of the display list on the next render.
  35310. *
  35311. * @method Phaser.Scenes.Systems#queueDepthSort
  35312. * @since 3.0.0
  35313. */
  35314. queueDepthSort: function ()
  35315. {
  35316. this.displayList.queueDepthSort();
  35317. },
  35318. /**
  35319. * Immediately sorts the display list if the flag is set.
  35320. *
  35321. * @method Phaser.Scenes.Systems#depthSort
  35322. * @since 3.0.0
  35323. */
  35324. depthSort: function ()
  35325. {
  35326. this.displayList.depthSort();
  35327. },
  35328. /**
  35329. * Pause this Scene.
  35330. * A paused Scene still renders, it just doesn't run ANY of its update handlers or systems.
  35331. *
  35332. * @method Phaser.Scenes.Systems#pause
  35333. * @fires Phaser.Scenes.Events#PAUSE
  35334. * @since 3.0.0
  35335. *
  35336. * @param {object} [data] - A data object that will be passed in the 'pause' event.
  35337. *
  35338. * @return {Phaser.Scenes.Systems} This Systems object.
  35339. */
  35340. pause: function (data)
  35341. {
  35342. if (this.settings.active)
  35343. {
  35344. this.settings.status = CONST.PAUSED;
  35345. this.settings.active = false;
  35346. this.events.emit(Events.PAUSE, this, data);
  35347. }
  35348. return this;
  35349. },
  35350. /**
  35351. * Resume this Scene from a paused state.
  35352. *
  35353. * @method Phaser.Scenes.Systems#resume
  35354. * @fires Phaser.Scenes.Events#RESUME
  35355. * @since 3.0.0
  35356. *
  35357. * @param {object} [data] - A data object that will be passed in the 'resume' event.
  35358. *
  35359. * @return {Phaser.Scenes.Systems} This Systems object.
  35360. */
  35361. resume: function (data)
  35362. {
  35363. if (!this.settings.active)
  35364. {
  35365. this.settings.status = CONST.RUNNING;
  35366. this.settings.active = true;
  35367. this.events.emit(Events.RESUME, this, data);
  35368. }
  35369. return this;
  35370. },
  35371. /**
  35372. * Send this Scene to sleep.
  35373. *
  35374. * A sleeping Scene doesn't run it's update step or render anything, but it also isn't shut down
  35375. * or have any of its systems or children removed, meaning it can be re-activated at any point and
  35376. * will carry on from where it left off. It also keeps everything in memory and events and callbacks
  35377. * from other Scenes may still invoke changes within it, so be careful what is left active.
  35378. *
  35379. * @method Phaser.Scenes.Systems#sleep
  35380. * @fires Phaser.Scenes.Events#SLEEP
  35381. * @since 3.0.0
  35382. *
  35383. * @param {object} [data] - A data object that will be passed in the 'sleep' event.
  35384. *
  35385. * @return {Phaser.Scenes.Systems} This Systems object.
  35386. */
  35387. sleep: function (data)
  35388. {
  35389. this.settings.status = CONST.SLEEPING;
  35390. this.settings.active = false;
  35391. this.settings.visible = false;
  35392. this.events.emit(Events.SLEEP, this, data);
  35393. return this;
  35394. },
  35395. /**
  35396. * Wake-up this Scene if it was previously asleep.
  35397. *
  35398. * @method Phaser.Scenes.Systems#wake
  35399. * @fires Phaser.Scenes.Events#WAKE
  35400. * @since 3.0.0
  35401. *
  35402. * @param {object} [data] - A data object that will be passed in the 'wake' event.
  35403. *
  35404. * @return {Phaser.Scenes.Systems} This Systems object.
  35405. */
  35406. wake: function (data)
  35407. {
  35408. var settings = this.settings;
  35409. settings.status = CONST.RUNNING;
  35410. settings.active = true;
  35411. settings.visible = true;
  35412. this.events.emit(Events.WAKE, this, data);
  35413. if (settings.isTransition)
  35414. {
  35415. this.events.emit(Events.TRANSITION_WAKE, settings.transitionFrom, settings.transitionDuration);
  35416. }
  35417. return this;
  35418. },
  35419. /**
  35420. * Is this Scene sleeping?
  35421. *
  35422. * @method Phaser.Scenes.Systems#isSleeping
  35423. * @since 3.0.0
  35424. *
  35425. * @return {boolean} `true` if this Scene is asleep, otherwise `false`.
  35426. */
  35427. isSleeping: function ()
  35428. {
  35429. return (this.settings.status === CONST.SLEEPING);
  35430. },
  35431. /**
  35432. * Is this Scene active?
  35433. *
  35434. * @method Phaser.Scenes.Systems#isActive
  35435. * @since 3.0.0
  35436. *
  35437. * @return {boolean} `true` if this Scene is active, otherwise `false`.
  35438. */
  35439. isActive: function ()
  35440. {
  35441. return (this.settings.status === CONST.RUNNING);
  35442. },
  35443. /**
  35444. * Is this Scene paused?
  35445. *
  35446. * @method Phaser.Scenes.Systems#isPaused
  35447. * @since 3.13.0
  35448. *
  35449. * @return {boolean} `true` if this Scene is paused, otherwise `false`.
  35450. */
  35451. isPaused: function ()
  35452. {
  35453. return (this.settings.status === CONST.PAUSED);
  35454. },
  35455. /**
  35456. * Is this Scene currently transitioning out to, or in from another Scene?
  35457. *
  35458. * @method Phaser.Scenes.Systems#isTransitioning
  35459. * @since 3.5.0
  35460. *
  35461. * @return {boolean} `true` if this Scene is currently transitioning, otherwise `false`.
  35462. */
  35463. isTransitioning: function ()
  35464. {
  35465. return (this.settings.isTransition || this.scenePlugin._target !== null);
  35466. },
  35467. /**
  35468. * Is this Scene currently transitioning out from itself to another Scene?
  35469. *
  35470. * @method Phaser.Scenes.Systems#isTransitionOut
  35471. * @since 3.5.0
  35472. *
  35473. * @return {boolean} `true` if this Scene is in transition to another Scene, otherwise `false`.
  35474. */
  35475. isTransitionOut: function ()
  35476. {
  35477. return (this.scenePlugin._target !== null && this.scenePlugin._duration > 0);
  35478. },
  35479. /**
  35480. * Is this Scene currently transitioning in from another Scene?
  35481. *
  35482. * @method Phaser.Scenes.Systems#isTransitionIn
  35483. * @since 3.5.0
  35484. *
  35485. * @return {boolean} `true` if this Scene is transitioning in from another Scene, otherwise `false`.
  35486. */
  35487. isTransitionIn: function ()
  35488. {
  35489. return (this.settings.isTransition);
  35490. },
  35491. /**
  35492. * Is this Scene visible and rendering?
  35493. *
  35494. * @method Phaser.Scenes.Systems#isVisible
  35495. * @since 3.0.0
  35496. *
  35497. * @return {boolean} `true` if this Scene is visible, otherwise `false`.
  35498. */
  35499. isVisible: function ()
  35500. {
  35501. return this.settings.visible;
  35502. },
  35503. /**
  35504. * Sets the visible state of this Scene.
  35505. * An invisible Scene will not render, but will still process updates.
  35506. *
  35507. * @method Phaser.Scenes.Systems#setVisible
  35508. * @since 3.0.0
  35509. *
  35510. * @param {boolean} value - `true` to render this Scene, otherwise `false`.
  35511. *
  35512. * @return {Phaser.Scenes.Systems} This Systems object.
  35513. */
  35514. setVisible: function (value)
  35515. {
  35516. this.settings.visible = value;
  35517. return this;
  35518. },
  35519. /**
  35520. * Set the active state of this Scene.
  35521. *
  35522. * An active Scene will run its core update loop.
  35523. *
  35524. * @method Phaser.Scenes.Systems#setActive
  35525. * @since 3.0.0
  35526. *
  35527. * @param {boolean} value - If `true` the Scene will be resumed, if previously paused. If `false` it will be paused.
  35528. * @param {object} [data] - A data object that will be passed in the 'resume' or 'pause' events.
  35529. *
  35530. * @return {Phaser.Scenes.Systems} This Systems object.
  35531. */
  35532. setActive: function (value, data)
  35533. {
  35534. if (value)
  35535. {
  35536. return this.resume(data);
  35537. }
  35538. else
  35539. {
  35540. return this.pause(data);
  35541. }
  35542. },
  35543. /**
  35544. * Start this Scene running and rendering.
  35545. * Called automatically by the SceneManager.
  35546. *
  35547. * @method Phaser.Scenes.Systems#start
  35548. * @fires Phaser.Scenes.Events#START
  35549. * @fires Phaser.Scenes.Events#READY
  35550. * @since 3.0.0
  35551. *
  35552. * @param {object} data - Optional data object that may have been passed to this Scene from another.
  35553. */
  35554. start: function (data)
  35555. {
  35556. if (data)
  35557. {
  35558. this.settings.data = data;
  35559. }
  35560. this.settings.status = CONST.START;
  35561. this.settings.active = true;
  35562. this.settings.visible = true;
  35563. // For plugins to listen out for
  35564. this.events.emit(Events.START, this);
  35565. // For user-land code to listen out for
  35566. this.events.emit(Events.READY, this, data);
  35567. },
  35568. /**
  35569. * Shutdown this Scene and send a shutdown event to all of its systems.
  35570. * A Scene that has been shutdown will not run its update loop or render, but it does
  35571. * not destroy any of its plugins or references. It is put into hibernation for later use.
  35572. * If you don't ever plan to use this Scene again, then it should be destroyed instead
  35573. * to free-up resources.
  35574. *
  35575. * @method Phaser.Scenes.Systems#shutdown
  35576. * @fires Phaser.Scenes.Events#SHUTDOWN
  35577. * @since 3.0.0
  35578. *
  35579. * @param {object} [data] - A data object that will be passed in the 'shutdown' event.
  35580. */
  35581. shutdown: function (data)
  35582. {
  35583. this.events.off(Events.TRANSITION_INIT);
  35584. this.events.off(Events.TRANSITION_START);
  35585. this.events.off(Events.TRANSITION_COMPLETE);
  35586. this.events.off(Events.TRANSITION_OUT);
  35587. this.settings.status = CONST.SHUTDOWN;
  35588. this.settings.active = false;
  35589. this.settings.visible = false;
  35590. this.events.emit(Events.SHUTDOWN, this, data);
  35591. },
  35592. /**
  35593. * Destroy this Scene and send a destroy event all of its systems.
  35594. * A destroyed Scene cannot be restarted.
  35595. * You should not call this directly, instead use `SceneManager.remove`.
  35596. *
  35597. * @method Phaser.Scenes.Systems#destroy
  35598. * @private
  35599. * @fires Phaser.Scenes.Events#DESTROY
  35600. * @since 3.0.0
  35601. */
  35602. destroy: function ()
  35603. {
  35604. this.settings.status = CONST.DESTROYED;
  35605. this.settings.active = false;
  35606. this.settings.visible = false;
  35607. this.events.emit(Events.DESTROY, this);
  35608. this.events.removeAllListeners();
  35609. var props = [ 'scene', 'game', 'anims', 'cache', 'plugins', 'registry', 'sound', 'textures', 'add', 'camera', 'displayList', 'events', 'make', 'scenePlugin', 'updateList' ];
  35610. for (var i = 0; i < props.length; i++)
  35611. {
  35612. this[props[i]] = null;
  35613. }
  35614. }
  35615. });
  35616. module.exports = Systems;
  35617. /***/ }),
  35618. /* 177 */
  35619. /***/ (function(module, exports, __webpack_require__) {
  35620. /**
  35621. * @author Richard Davey <rich@photonstorm.com>
  35622. * @copyright 2019 Photon Storm Ltd.
  35623. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35624. */
  35625. var SpliceOne = __webpack_require__(97);
  35626. /**
  35627. * Removes the given item, or array of items, from the array.
  35628. *
  35629. * The array is modified in-place.
  35630. *
  35631. * You can optionally specify a callback to be invoked for each item successfully removed from the array.
  35632. *
  35633. * @function Phaser.Utils.Array.Remove
  35634. * @since 3.4.0
  35635. *
  35636. * @param {array} array - The array to be modified.
  35637. * @param {*|Array.<*>} item - The item, or array of items, to be removed from the array.
  35638. * @param {function} [callback] - A callback to be invoked for each item successfully removed from the array.
  35639. * @param {object} [context] - The context in which the callback is invoked.
  35640. *
  35641. * @return {*|Array.<*>} The item, or array of items, that were successfully removed from the array.
  35642. */
  35643. var Remove = function (array, item, callback, context)
  35644. {
  35645. if (context === undefined) { context = array; }
  35646. var index;
  35647. // Fast path to avoid array mutation and iteration
  35648. if (!Array.isArray(item))
  35649. {
  35650. index = array.indexOf(item);
  35651. if (index !== -1)
  35652. {
  35653. SpliceOne(array, index);
  35654. if (callback)
  35655. {
  35656. callback.call(context, item);
  35657. }
  35658. return item;
  35659. }
  35660. else
  35661. {
  35662. return null;
  35663. }
  35664. }
  35665. // If we got this far, we have an array of items to remove
  35666. var itemLength = item.length - 1;
  35667. while (itemLength >= 0)
  35668. {
  35669. var entry = item[itemLength];
  35670. index = array.indexOf(entry);
  35671. if (index !== -1)
  35672. {
  35673. SpliceOne(array, index);
  35674. if (callback)
  35675. {
  35676. callback.call(context, entry);
  35677. }
  35678. }
  35679. else
  35680. {
  35681. // Item wasn't found in the array, so remove it from our return results
  35682. item.pop();
  35683. }
  35684. itemLength--;
  35685. }
  35686. return item;
  35687. };
  35688. module.exports = Remove;
  35689. /***/ }),
  35690. /* 178 */
  35691. /***/ (function(module, exports, __webpack_require__) {
  35692. /**
  35693. * @author Richard Davey <rich@photonstorm.com>
  35694. * @copyright 2019 Photon Storm Ltd.
  35695. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35696. */
  35697. var CONST = {
  35698. CENTER: __webpack_require__(349),
  35699. ORIENTATION: __webpack_require__(348),
  35700. SCALE_MODE: __webpack_require__(347),
  35701. ZOOM: __webpack_require__(346)
  35702. };
  35703. module.exports = CONST;
  35704. /***/ }),
  35705. /* 179 */
  35706. /***/ (function(module, exports) {
  35707. /**
  35708. * @author Richard Davey <rich@photonstorm.com>
  35709. * @copyright 2019 Photon Storm Ltd.
  35710. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35711. */
  35712. /**
  35713. * Adds the given element to the DOM. If a parent is provided the element is added as a child of the parent, providing it was able to access it.
  35714. * If no parent was given it falls back to using `document.body`.
  35715. *
  35716. * @function Phaser.DOM.AddToDOM
  35717. * @since 3.0.0
  35718. *
  35719. * @param {HTMLElement} element - The element to be added to the DOM. Usually a Canvas object.
  35720. * @param {(string|HTMLElement)} [parent] - The parent in which to add the element. Can be a string which is passed to `getElementById` or an actual DOM object.
  35721. *
  35722. * @return {HTMLElement} The element that was added to the DOM.
  35723. */
  35724. var AddToDOM = function (element, parent)
  35725. {
  35726. var target;
  35727. if (parent)
  35728. {
  35729. if (typeof parent === 'string')
  35730. {
  35731. // Hopefully an element ID
  35732. target = document.getElementById(parent);
  35733. }
  35734. else if (typeof parent === 'object' && parent.nodeType === 1)
  35735. {
  35736. // Quick test for a HTMLElement
  35737. target = parent;
  35738. }
  35739. }
  35740. else if (element.parentElement)
  35741. {
  35742. return element;
  35743. }
  35744. // Fallback, covers an invalid ID and a non HTMLElement object
  35745. if (!target)
  35746. {
  35747. target = document.body;
  35748. }
  35749. target.appendChild(element);
  35750. return element;
  35751. };
  35752. module.exports = AddToDOM;
  35753. /***/ }),
  35754. /* 180 */
  35755. /***/ (function(module, exports, __webpack_require__) {
  35756. /**
  35757. * @author Richard Davey <rich@photonstorm.com>
  35758. * @copyright 2019 Photon Storm Ltd.
  35759. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35760. */
  35761. var Rectangle = __webpack_require__(10);
  35762. // points is an array of Point-like objects,
  35763. // either 2 dimensional arrays, or objects with public x/y properties:
  35764. // var points = [
  35765. // [100, 200],
  35766. // [200, 400],
  35767. // { x: 30, y: 60 }
  35768. // ]
  35769. /**
  35770. * Constructs new Rectangle or repositions and resizes an existing Rectangle so that all of the given points are on or within its bounds.
  35771. *
  35772. * @function Phaser.Geom.Rectangle.FromPoints
  35773. * @since 3.0.0
  35774. *
  35775. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  35776. *
  35777. * @param {array} points - An array of points (either arrays with two elements corresponding to the X and Y coordinate or an object with public `x` and `y` properties) which should be surrounded by the Rectangle.
  35778. * @param {Phaser.Geom.Rectangle} [out] - Optional Rectangle to adjust.
  35779. *
  35780. * @return {Phaser.Geom.Rectangle} The adjusted `out` Rectangle, or a new Rectangle if none was provided.
  35781. */
  35782. var FromPoints = function (points, out)
  35783. {
  35784. if (out === undefined) { out = new Rectangle(); }
  35785. if (points.length === 0)
  35786. {
  35787. return out;
  35788. }
  35789. var minX = Number.MAX_VALUE;
  35790. var minY = Number.MAX_VALUE;
  35791. var maxX = Number.MIN_SAFE_INTEGER;
  35792. var maxY = Number.MIN_SAFE_INTEGER;
  35793. var p;
  35794. var px;
  35795. var py;
  35796. for (var i = 0; i < points.length; i++)
  35797. {
  35798. p = points[i];
  35799. if (Array.isArray(p))
  35800. {
  35801. px = p[0];
  35802. py = p[1];
  35803. }
  35804. else
  35805. {
  35806. px = p.x;
  35807. py = p.y;
  35808. }
  35809. minX = Math.min(minX, px);
  35810. minY = Math.min(minY, py);
  35811. maxX = Math.max(maxX, px);
  35812. maxY = Math.max(maxY, py);
  35813. }
  35814. out.x = minX;
  35815. out.y = minY;
  35816. out.width = maxX - minX;
  35817. out.height = maxY - minY;
  35818. return out;
  35819. };
  35820. module.exports = FromPoints;
  35821. /***/ }),
  35822. /* 181 */
  35823. /***/ (function(module, exports, __webpack_require__) {
  35824. /**
  35825. * @author Richard Davey <rich@photonstorm.com>
  35826. * @copyright 2019 Photon Storm Ltd.
  35827. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35828. */
  35829. /**
  35830. * @typedef {object} Phaser.Plugins.DefaultPlugins
  35831. *
  35832. * @property {array} Global - These are the Global Managers that are created by the Phaser.Game instance.
  35833. * @property {array} CoreScene - These are the core plugins that are installed into every Scene.Systems instance, no matter what.
  35834. * @property {array} DefaultScene - These plugins are created in Scene.Systems in addition to the CoreScenePlugins.
  35835. */
  35836. var DefaultPlugins = {
  35837. /**
  35838. * These are the Global Managers that are created by the Phaser.Game instance.
  35839. * They are referenced from Scene.Systems so that plugins can use them.
  35840. *
  35841. * @name Phaser.Plugins.Global
  35842. * @type {array}
  35843. * @since 3.0.0
  35844. */
  35845. Global: [
  35846. 'game',
  35847. 'anims',
  35848. 'cache',
  35849. 'plugins',
  35850. 'registry',
  35851. 'scale',
  35852. 'sound',
  35853. 'textures'
  35854. ],
  35855. /**
  35856. * These are the core plugins that are installed into every Scene.Systems instance, no matter what.
  35857. * They are optionally exposed in the Scene as well (see the InjectionMap for details)
  35858. *
  35859. * They are created in the order in which they appear in this array and EventEmitter is always first.
  35860. *
  35861. * @name Phaser.Plugins.CoreScene
  35862. * @type {array}
  35863. * @since 3.0.0
  35864. */
  35865. CoreScene: [
  35866. 'EventEmitter',
  35867. 'CameraManager',
  35868. 'GameObjectCreator',
  35869. 'GameObjectFactory',
  35870. 'ScenePlugin',
  35871. 'DisplayList',
  35872. 'UpdateList'
  35873. ],
  35874. /**
  35875. * These plugins are created in Scene.Systems in addition to the CoreScenePlugins.
  35876. *
  35877. * You can elect not to have these plugins by either creating a DefaultPlugins object as part
  35878. * of the Game Config, by creating a Plugins object as part of a Scene Config, or by modifying this array
  35879. * and building your own bundle.
  35880. *
  35881. * They are optionally exposed in the Scene as well (see the InjectionMap for details)
  35882. *
  35883. * They are always created in the order in which they appear in the array.
  35884. *
  35885. * @name Phaser.Plugins.DefaultScene
  35886. * @type {array}
  35887. * @since 3.0.0
  35888. */
  35889. DefaultScene: [
  35890. 'Clock',
  35891. 'DataManagerPlugin',
  35892. 'InputPlugin',
  35893. 'Loader',
  35894. 'TweenManager',
  35895. 'LightsPlugin'
  35896. ]
  35897. };
  35898. if (false)
  35899. {}
  35900. if (false)
  35901. {}
  35902. module.exports = DefaultPlugins;
  35903. /***/ }),
  35904. /* 182 */
  35905. /***/ (function(module, exports, __webpack_require__) {
  35906. /**
  35907. * @author Richard Davey <rich@photonstorm.com>
  35908. * @copyright 2019 Photon Storm Ltd.
  35909. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35910. */
  35911. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  35912. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  35913. var Class = __webpack_require__(0);
  35914. /**
  35915. * @classdesc
  35916. * A representation of a vector in 3D space.
  35917. *
  35918. * A three-component vector.
  35919. *
  35920. * @class Vector3
  35921. * @memberof Phaser.Math
  35922. * @constructor
  35923. * @since 3.0.0
  35924. *
  35925. * @param {number} [x] - The x component.
  35926. * @param {number} [y] - The y component.
  35927. * @param {number} [z] - The z component.
  35928. */
  35929. var Vector3 = new Class({
  35930. initialize:
  35931. function Vector3 (x, y, z)
  35932. {
  35933. /**
  35934. * The x component of this Vector.
  35935. *
  35936. * @name Phaser.Math.Vector3#x
  35937. * @type {number}
  35938. * @default 0
  35939. * @since 3.0.0
  35940. */
  35941. this.x = 0;
  35942. /**
  35943. * The y component of this Vector.
  35944. *
  35945. * @name Phaser.Math.Vector3#y
  35946. * @type {number}
  35947. * @default 0
  35948. * @since 3.0.0
  35949. */
  35950. this.y = 0;
  35951. /**
  35952. * The z component of this Vector.
  35953. *
  35954. * @name Phaser.Math.Vector3#z
  35955. * @type {number}
  35956. * @default 0
  35957. * @since 3.0.0
  35958. */
  35959. this.z = 0;
  35960. if (typeof x === 'object')
  35961. {
  35962. this.x = x.x || 0;
  35963. this.y = x.y || 0;
  35964. this.z = x.z || 0;
  35965. }
  35966. else
  35967. {
  35968. this.x = x || 0;
  35969. this.y = y || 0;
  35970. this.z = z || 0;
  35971. }
  35972. },
  35973. /**
  35974. * Set this Vector to point up.
  35975. *
  35976. * Sets the y component of the vector to 1, and the others to 0.
  35977. *
  35978. * @method Phaser.Math.Vector3#up
  35979. * @since 3.0.0
  35980. *
  35981. * @return {Phaser.Math.Vector3} This Vector3.
  35982. */
  35983. up: function ()
  35984. {
  35985. this.x = 0;
  35986. this.y = 1;
  35987. this.z = 0;
  35988. return this;
  35989. },
  35990. /**
  35991. * Make a clone of this Vector3.
  35992. *
  35993. * @method Phaser.Math.Vector3#clone
  35994. * @since 3.0.0
  35995. *
  35996. * @return {Phaser.Math.Vector3} A new Vector3 object containing this Vectors values.
  35997. */
  35998. clone: function ()
  35999. {
  36000. return new Vector3(this.x, this.y, this.z);
  36001. },
  36002. /**
  36003. * Calculate the cross (vector) product of two given Vectors.
  36004. *
  36005. * @method Phaser.Math.Vector3#crossVectors
  36006. * @since 3.0.0
  36007. *
  36008. * @param {Phaser.Math.Vector3} a - The first Vector to multiply.
  36009. * @param {Phaser.Math.Vector3} b - The second Vector to multiply.
  36010. *
  36011. * @return {Phaser.Math.Vector3} This Vector3.
  36012. */
  36013. crossVectors: function (a, b)
  36014. {
  36015. var ax = a.x;
  36016. var ay = a.y;
  36017. var az = a.z;
  36018. var bx = b.x;
  36019. var by = b.y;
  36020. var bz = b.z;
  36021. this.x = ay * bz - az * by;
  36022. this.y = az * bx - ax * bz;
  36023. this.z = ax * by - ay * bx;
  36024. return this;
  36025. },
  36026. /**
  36027. * Check whether this Vector is equal to a given Vector.
  36028. *
  36029. * Performs a strict equality check against each Vector's components.
  36030. *
  36031. * @method Phaser.Math.Vector3#equals
  36032. * @since 3.0.0
  36033. *
  36034. * @param {Phaser.Math.Vector3} v - The Vector3 to compare against.
  36035. *
  36036. * @return {boolean} True if the two vectors strictly match, otherwise false.
  36037. */
  36038. equals: function (v)
  36039. {
  36040. return ((this.x === v.x) && (this.y === v.y) && (this.z === v.z));
  36041. },
  36042. /**
  36043. * Copy the components of a given Vector into this Vector.
  36044. *
  36045. * @method Phaser.Math.Vector3#copy
  36046. * @since 3.0.0
  36047. *
  36048. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} src - The Vector to copy the components from.
  36049. *
  36050. * @return {Phaser.Math.Vector3} This Vector3.
  36051. */
  36052. copy: function (src)
  36053. {
  36054. this.x = src.x;
  36055. this.y = src.y;
  36056. this.z = src.z || 0;
  36057. return this;
  36058. },
  36059. /**
  36060. * Set the `x`, `y`, and `z` components of this Vector to the given `x`, `y`, and `z` values.
  36061. *
  36062. * @method Phaser.Math.Vector3#set
  36063. * @since 3.0.0
  36064. *
  36065. * @param {(number|object)} x - The x value to set for this Vector, or an object containing x, y and z components.
  36066. * @param {number} [y] - The y value to set for this Vector.
  36067. * @param {number} [z] - The z value to set for this Vector.
  36068. *
  36069. * @return {Phaser.Math.Vector3} This Vector3.
  36070. */
  36071. set: function (x, y, z)
  36072. {
  36073. if (typeof x === 'object')
  36074. {
  36075. this.x = x.x || 0;
  36076. this.y = x.y || 0;
  36077. this.z = x.z || 0;
  36078. }
  36079. else
  36080. {
  36081. this.x = x || 0;
  36082. this.y = y || 0;
  36083. this.z = z || 0;
  36084. }
  36085. return this;
  36086. },
  36087. /**
  36088. * Add a given Vector to this Vector. Addition is component-wise.
  36089. *
  36090. * @method Phaser.Math.Vector3#add
  36091. * @since 3.0.0
  36092. *
  36093. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to add to this Vector.
  36094. *
  36095. * @return {Phaser.Math.Vector3} This Vector3.
  36096. */
  36097. add: function (v)
  36098. {
  36099. this.x += v.x;
  36100. this.y += v.y;
  36101. this.z += v.z || 0;
  36102. return this;
  36103. },
  36104. /**
  36105. * Subtract the given Vector from this Vector. Subtraction is component-wise.
  36106. *
  36107. * @method Phaser.Math.Vector3#subtract
  36108. * @since 3.0.0
  36109. *
  36110. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to subtract from this Vector.
  36111. *
  36112. * @return {Phaser.Math.Vector3} This Vector3.
  36113. */
  36114. subtract: function (v)
  36115. {
  36116. this.x -= v.x;
  36117. this.y -= v.y;
  36118. this.z -= v.z || 0;
  36119. return this;
  36120. },
  36121. /**
  36122. * Perform a component-wise multiplication between this Vector and the given Vector.
  36123. *
  36124. * Multiplies this Vector by the given Vector.
  36125. *
  36126. * @method Phaser.Math.Vector3#multiply
  36127. * @since 3.0.0
  36128. *
  36129. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to multiply this Vector by.
  36130. *
  36131. * @return {Phaser.Math.Vector3} This Vector3.
  36132. */
  36133. multiply: function (v)
  36134. {
  36135. this.x *= v.x;
  36136. this.y *= v.y;
  36137. this.z *= v.z || 1;
  36138. return this;
  36139. },
  36140. /**
  36141. * Scale this Vector by the given value.
  36142. *
  36143. * @method Phaser.Math.Vector3#scale
  36144. * @since 3.0.0
  36145. *
  36146. * @param {number} scale - The value to scale this Vector by.
  36147. *
  36148. * @return {Phaser.Math.Vector3} This Vector3.
  36149. */
  36150. scale: function (scale)
  36151. {
  36152. if (isFinite(scale))
  36153. {
  36154. this.x *= scale;
  36155. this.y *= scale;
  36156. this.z *= scale;
  36157. }
  36158. else
  36159. {
  36160. this.x = 0;
  36161. this.y = 0;
  36162. this.z = 0;
  36163. }
  36164. return this;
  36165. },
  36166. /**
  36167. * Perform a component-wise division between this Vector and the given Vector.
  36168. *
  36169. * Divides this Vector by the given Vector.
  36170. *
  36171. * @method Phaser.Math.Vector3#divide
  36172. * @since 3.0.0
  36173. *
  36174. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to divide this Vector by.
  36175. *
  36176. * @return {Phaser.Math.Vector3} This Vector3.
  36177. */
  36178. divide: function (v)
  36179. {
  36180. this.x /= v.x;
  36181. this.y /= v.y;
  36182. this.z /= v.z || 1;
  36183. return this;
  36184. },
  36185. /**
  36186. * Negate the `x`, `y` and `z` components of this Vector.
  36187. *
  36188. * @method Phaser.Math.Vector3#negate
  36189. * @since 3.0.0
  36190. *
  36191. * @return {Phaser.Math.Vector3} This Vector3.
  36192. */
  36193. negate: function ()
  36194. {
  36195. this.x = -this.x;
  36196. this.y = -this.y;
  36197. this.z = -this.z;
  36198. return this;
  36199. },
  36200. /**
  36201. * Calculate the distance between this Vector and the given Vector.
  36202. *
  36203. * @method Phaser.Math.Vector3#distance
  36204. * @since 3.0.0
  36205. *
  36206. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to calculate the distance to.
  36207. *
  36208. * @return {number} The distance from this Vector to the given Vector.
  36209. */
  36210. distance: function (v)
  36211. {
  36212. var dx = v.x - this.x;
  36213. var dy = v.y - this.y;
  36214. var dz = v.z - this.z || 0;
  36215. return Math.sqrt(dx * dx + dy * dy + dz * dz);
  36216. },
  36217. /**
  36218. * Calculate the distance between this Vector and the given Vector, squared.
  36219. *
  36220. * @method Phaser.Math.Vector3#distanceSq
  36221. * @since 3.0.0
  36222. *
  36223. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to calculate the distance to.
  36224. *
  36225. * @return {number} The distance from this Vector to the given Vector, squared.
  36226. */
  36227. distanceSq: function (v)
  36228. {
  36229. var dx = v.x - this.x;
  36230. var dy = v.y - this.y;
  36231. var dz = v.z - this.z || 0;
  36232. return dx * dx + dy * dy + dz * dz;
  36233. },
  36234. /**
  36235. * Calculate the length (or magnitude) of this Vector.
  36236. *
  36237. * @method Phaser.Math.Vector3#length
  36238. * @since 3.0.0
  36239. *
  36240. * @return {number} The length of this Vector.
  36241. */
  36242. length: function ()
  36243. {
  36244. var x = this.x;
  36245. var y = this.y;
  36246. var z = this.z;
  36247. return Math.sqrt(x * x + y * y + z * z);
  36248. },
  36249. /**
  36250. * Calculate the length of this Vector squared.
  36251. *
  36252. * @method Phaser.Math.Vector3#lengthSq
  36253. * @since 3.0.0
  36254. *
  36255. * @return {number} The length of this Vector, squared.
  36256. */
  36257. lengthSq: function ()
  36258. {
  36259. var x = this.x;
  36260. var y = this.y;
  36261. var z = this.z;
  36262. return x * x + y * y + z * z;
  36263. },
  36264. /**
  36265. * Normalize this Vector.
  36266. *
  36267. * Makes the vector a unit length vector (magnitude of 1) in the same direction.
  36268. *
  36269. * @method Phaser.Math.Vector3#normalize
  36270. * @since 3.0.0
  36271. *
  36272. * @return {Phaser.Math.Vector3} This Vector3.
  36273. */
  36274. normalize: function ()
  36275. {
  36276. var x = this.x;
  36277. var y = this.y;
  36278. var z = this.z;
  36279. var len = x * x + y * y + z * z;
  36280. if (len > 0)
  36281. {
  36282. len = 1 / Math.sqrt(len);
  36283. this.x = x * len;
  36284. this.y = y * len;
  36285. this.z = z * len;
  36286. }
  36287. return this;
  36288. },
  36289. /**
  36290. * Calculate the dot product of this Vector and the given Vector.
  36291. *
  36292. * @method Phaser.Math.Vector3#dot
  36293. * @since 3.0.0
  36294. *
  36295. * @param {Phaser.Math.Vector3} v - The Vector3 to dot product with this Vector3.
  36296. *
  36297. * @return {number} The dot product of this Vector and `v`.
  36298. */
  36299. dot: function (v)
  36300. {
  36301. return this.x * v.x + this.y * v.y + this.z * v.z;
  36302. },
  36303. /**
  36304. * Calculate the cross (vector) product of this Vector (which will be modified) and the given Vector.
  36305. *
  36306. * @method Phaser.Math.Vector3#cross
  36307. * @since 3.0.0
  36308. *
  36309. * @param {Phaser.Math.Vector3} v - The Vector to cross product with.
  36310. *
  36311. * @return {Phaser.Math.Vector3} This Vector3.
  36312. */
  36313. cross: function (v)
  36314. {
  36315. var ax = this.x;
  36316. var ay = this.y;
  36317. var az = this.z;
  36318. var bx = v.x;
  36319. var by = v.y;
  36320. var bz = v.z;
  36321. this.x = ay * bz - az * by;
  36322. this.y = az * bx - ax * bz;
  36323. this.z = ax * by - ay * bx;
  36324. return this;
  36325. },
  36326. /**
  36327. * Linearly interpolate between this Vector and the given Vector.
  36328. *
  36329. * Interpolates this Vector towards the given Vector.
  36330. *
  36331. * @method Phaser.Math.Vector3#lerp
  36332. * @since 3.0.0
  36333. *
  36334. * @param {Phaser.Math.Vector3} v - The Vector3 to interpolate towards.
  36335. * @param {number} [t=0] - The interpolation percentage, between 0 and 1.
  36336. *
  36337. * @return {Phaser.Math.Vector3} This Vector3.
  36338. */
  36339. lerp: function (v, t)
  36340. {
  36341. if (t === undefined) { t = 0; }
  36342. var ax = this.x;
  36343. var ay = this.y;
  36344. var az = this.z;
  36345. this.x = ax + t * (v.x - ax);
  36346. this.y = ay + t * (v.y - ay);
  36347. this.z = az + t * (v.z - az);
  36348. return this;
  36349. },
  36350. /**
  36351. * Transform this Vector with the given Matrix.
  36352. *
  36353. * @method Phaser.Math.Vector3#transformMat3
  36354. * @since 3.0.0
  36355. *
  36356. * @param {Phaser.Math.Matrix3} mat - The Matrix3 to transform this Vector3 with.
  36357. *
  36358. * @return {Phaser.Math.Vector3} This Vector3.
  36359. */
  36360. transformMat3: function (mat)
  36361. {
  36362. var x = this.x;
  36363. var y = this.y;
  36364. var z = this.z;
  36365. var m = mat.val;
  36366. this.x = x * m[0] + y * m[3] + z * m[6];
  36367. this.y = x * m[1] + y * m[4] + z * m[7];
  36368. this.z = x * m[2] + y * m[5] + z * m[8];
  36369. return this;
  36370. },
  36371. /**
  36372. * Transform this Vector with the given Matrix.
  36373. *
  36374. * @method Phaser.Math.Vector3#transformMat4
  36375. * @since 3.0.0
  36376. *
  36377. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to transform this Vector3 with.
  36378. *
  36379. * @return {Phaser.Math.Vector3} This Vector3.
  36380. */
  36381. transformMat4: function (mat)
  36382. {
  36383. var x = this.x;
  36384. var y = this.y;
  36385. var z = this.z;
  36386. var m = mat.val;
  36387. this.x = m[0] * x + m[4] * y + m[8] * z + m[12];
  36388. this.y = m[1] * x + m[5] * y + m[9] * z + m[13];
  36389. this.z = m[2] * x + m[6] * y + m[10] * z + m[14];
  36390. return this;
  36391. },
  36392. /**
  36393. * Transforms the coordinates of this Vector3 with the given Matrix4.
  36394. *
  36395. * @method Phaser.Math.Vector3#transformCoordinates
  36396. * @since 3.0.0
  36397. *
  36398. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to transform this Vector3 with.
  36399. *
  36400. * @return {Phaser.Math.Vector3} This Vector3.
  36401. */
  36402. transformCoordinates: function (mat)
  36403. {
  36404. var x = this.x;
  36405. var y = this.y;
  36406. var z = this.z;
  36407. var m = mat.val;
  36408. var tx = (x * m[0]) + (y * m[4]) + (z * m[8]) + m[12];
  36409. var ty = (x * m[1]) + (y * m[5]) + (z * m[9]) + m[13];
  36410. var tz = (x * m[2]) + (y * m[6]) + (z * m[10]) + m[14];
  36411. var tw = (x * m[3]) + (y * m[7]) + (z * m[11]) + m[15];
  36412. this.x = tx / tw;
  36413. this.y = ty / tw;
  36414. this.z = tz / tw;
  36415. return this;
  36416. },
  36417. /**
  36418. * Transform this Vector with the given Quaternion.
  36419. *
  36420. * @method Phaser.Math.Vector3#transformQuat
  36421. * @since 3.0.0
  36422. *
  36423. * @param {Phaser.Math.Quaternion} q - The Quaternion to transform this Vector with.
  36424. *
  36425. * @return {Phaser.Math.Vector3} This Vector3.
  36426. */
  36427. transformQuat: function (q)
  36428. {
  36429. // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations
  36430. var x = this.x;
  36431. var y = this.y;
  36432. var z = this.z;
  36433. var qx = q.x;
  36434. var qy = q.y;
  36435. var qz = q.z;
  36436. var qw = q.w;
  36437. // calculate quat * vec
  36438. var ix = qw * x + qy * z - qz * y;
  36439. var iy = qw * y + qz * x - qx * z;
  36440. var iz = qw * z + qx * y - qy * x;
  36441. var iw = -qx * x - qy * y - qz * z;
  36442. // calculate result * inverse quat
  36443. this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
  36444. this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
  36445. this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
  36446. return this;
  36447. },
  36448. /**
  36449. * Multiplies this Vector3 by the specified matrix, applying a W divide. This is useful for projection,
  36450. * e.g. unprojecting a 2D point into 3D space.
  36451. *
  36452. * @method Phaser.Math.Vector3#project
  36453. * @since 3.0.0
  36454. *
  36455. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to multiply this Vector3 with.
  36456. *
  36457. * @return {Phaser.Math.Vector3} This Vector3.
  36458. */
  36459. project: function (mat)
  36460. {
  36461. var x = this.x;
  36462. var y = this.y;
  36463. var z = this.z;
  36464. var m = mat.val;
  36465. var a00 = m[0];
  36466. var a01 = m[1];
  36467. var a02 = m[2];
  36468. var a03 = m[3];
  36469. var a10 = m[4];
  36470. var a11 = m[5];
  36471. var a12 = m[6];
  36472. var a13 = m[7];
  36473. var a20 = m[8];
  36474. var a21 = m[9];
  36475. var a22 = m[10];
  36476. var a23 = m[11];
  36477. var a30 = m[12];
  36478. var a31 = m[13];
  36479. var a32 = m[14];
  36480. var a33 = m[15];
  36481. var lw = 1 / (x * a03 + y * a13 + z * a23 + a33);
  36482. this.x = (x * a00 + y * a10 + z * a20 + a30) * lw;
  36483. this.y = (x * a01 + y * a11 + z * a21 + a31) * lw;
  36484. this.z = (x * a02 + y * a12 + z * a22 + a32) * lw;
  36485. return this;
  36486. },
  36487. /**
  36488. * Unproject this point from 2D space to 3D space.
  36489. * The point should have its x and y properties set to
  36490. * 2D screen space, and the z either at 0 (near plane)
  36491. * or 1 (far plane). The provided matrix is assumed to already
  36492. * be combined, i.e. projection * view * model.
  36493. *
  36494. * After this operation, this vector's (x, y, z) components will
  36495. * represent the unprojected 3D coordinate.
  36496. *
  36497. * @method Phaser.Math.Vector3#unproject
  36498. * @since 3.0.0
  36499. *
  36500. * @param {Phaser.Math.Vector4} viewport - Screen x, y, width and height in pixels.
  36501. * @param {Phaser.Math.Matrix4} invProjectionView - Combined projection and view matrix.
  36502. *
  36503. * @return {Phaser.Math.Vector3} This Vector3.
  36504. */
  36505. unproject: function (viewport, invProjectionView)
  36506. {
  36507. var viewX = viewport.x;
  36508. var viewY = viewport.y;
  36509. var viewWidth = viewport.z;
  36510. var viewHeight = viewport.w;
  36511. var x = this.x - viewX;
  36512. var y = (viewHeight - this.y - 1) - viewY;
  36513. var z = this.z;
  36514. this.x = (2 * x) / viewWidth - 1;
  36515. this.y = (2 * y) / viewHeight - 1;
  36516. this.z = 2 * z - 1;
  36517. return this.project(invProjectionView);
  36518. },
  36519. /**
  36520. * Make this Vector the zero vector (0, 0, 0).
  36521. *
  36522. * @method Phaser.Math.Vector3#reset
  36523. * @since 3.0.0
  36524. *
  36525. * @return {Phaser.Math.Vector3} This Vector3.
  36526. */
  36527. reset: function ()
  36528. {
  36529. this.x = 0;
  36530. this.y = 0;
  36531. this.z = 0;
  36532. return this;
  36533. }
  36534. });
  36535. /**
  36536. * A static zero Vector3 for use by reference.
  36537. *
  36538. * This constant is meant for comparison operations and should not be modified directly.
  36539. *
  36540. * @constant
  36541. * @name Phaser.Math.Vector3.ZERO
  36542. * @type {Phaser.Math.Vector3}
  36543. * @since 3.16.0
  36544. */
  36545. Vector3.ZERO = new Vector3();
  36546. /**
  36547. * A static right Vector3 for use by reference.
  36548. *
  36549. * This constant is meant for comparison operations and should not be modified directly.
  36550. *
  36551. * @constant
  36552. * @name Phaser.Math.Vector3.RIGHT
  36553. * @type {Phaser.Math.Vector3}
  36554. * @since 3.16.0
  36555. */
  36556. Vector3.RIGHT = new Vector3(1, 0, 0);
  36557. /**
  36558. * A static left Vector3 for use by reference.
  36559. *
  36560. * This constant is meant for comparison operations and should not be modified directly.
  36561. *
  36562. * @constant
  36563. * @name Phaser.Math.Vector3.LEFT
  36564. * @type {Phaser.Math.Vector3}
  36565. * @since 3.16.0
  36566. */
  36567. Vector3.LEFT = new Vector3(-1, 0, 0);
  36568. /**
  36569. * A static up Vector3 for use by reference.
  36570. *
  36571. * This constant is meant for comparison operations and should not be modified directly.
  36572. *
  36573. * @constant
  36574. * @name Phaser.Math.Vector3.UP
  36575. * @type {Phaser.Math.Vector3}
  36576. * @since 3.16.0
  36577. */
  36578. Vector3.UP = new Vector3(0, -1, 0);
  36579. /**
  36580. * A static down Vector3 for use by reference.
  36581. *
  36582. * This constant is meant for comparison operations and should not be modified directly.
  36583. *
  36584. * @constant
  36585. * @name Phaser.Math.Vector3.DOWN
  36586. * @type {Phaser.Math.Vector3}
  36587. * @since 3.16.0
  36588. */
  36589. Vector3.DOWN = new Vector3(0, 1, 0);
  36590. /**
  36591. * A static forward Vector3 for use by reference.
  36592. *
  36593. * This constant is meant for comparison operations and should not be modified directly.
  36594. *
  36595. * @constant
  36596. * @name Phaser.Math.Vector3.FORWARD
  36597. * @type {Phaser.Math.Vector3}
  36598. * @since 3.16.0
  36599. */
  36600. Vector3.FORWARD = new Vector3(0, 0, 1);
  36601. /**
  36602. * A static back Vector3 for use by reference.
  36603. *
  36604. * This constant is meant for comparison operations and should not be modified directly.
  36605. *
  36606. * @constant
  36607. * @name Phaser.Math.Vector3.BACK
  36608. * @type {Phaser.Math.Vector3}
  36609. * @since 3.16.0
  36610. */
  36611. Vector3.BACK = new Vector3(0, 0, -1);
  36612. /**
  36613. * A static one Vector3 for use by reference.
  36614. *
  36615. * This constant is meant for comparison operations and should not be modified directly.
  36616. *
  36617. * @constant
  36618. * @name Phaser.Math.Vector3.ONE
  36619. * @type {Phaser.Math.Vector3}
  36620. * @since 3.16.0
  36621. */
  36622. Vector3.ONE = new Vector3(1, 1, 1);
  36623. module.exports = Vector3;
  36624. /***/ }),
  36625. /* 183 */
  36626. /***/ (function(module, exports, __webpack_require__) {
  36627. /**
  36628. * @author Richard Davey <rich@photonstorm.com>
  36629. * @copyright 2019 Photon Storm Ltd.
  36630. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  36631. */
  36632. var CONST = __webpack_require__(20);
  36633. /**
  36634. * Convert the given angle in radians, to the equivalent angle in degrees.
  36635. *
  36636. * @function Phaser.Math.RadToDeg
  36637. * @since 3.0.0
  36638. *
  36639. * @param {number} radians - The angle in radians to convert ot degrees.
  36640. *
  36641. * @return {integer} The given angle converted to degrees.
  36642. */
  36643. var RadToDeg = function (radians)
  36644. {
  36645. return radians * CONST.RAD_TO_DEG;
  36646. };
  36647. module.exports = RadToDeg;
  36648. /***/ }),
  36649. /* 184 */
  36650. /***/ (function(module, exports) {
  36651. /**
  36652. * @author Richard Davey <rich@photonstorm.com>
  36653. * @copyright 2019 Photon Storm Ltd.
  36654. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  36655. */
  36656. /**
  36657. * Compute a random integer between the `min` and `max` values, inclusive.
  36658. *
  36659. * @function Phaser.Math.Between
  36660. * @since 3.0.0
  36661. *
  36662. * @param {integer} min - The minimum value.
  36663. * @param {integer} max - The maximum value.
  36664. *
  36665. * @return {integer} The random integer.
  36666. */
  36667. var Between = function (min, max)
  36668. {
  36669. return Math.floor(Math.random() * (max - min + 1) + min);
  36670. };
  36671. module.exports = Between;
  36672. /***/ }),
  36673. /* 185 */
  36674. /***/ (function(module, exports) {
  36675. /**
  36676. * @author Richard Davey <rich@photonstorm.com>
  36677. * @copyright 2019 Photon Storm Ltd.
  36678. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  36679. */
  36680. /**
  36681. * Calculates a Catmull-Rom value.
  36682. *
  36683. * @function Phaser.Math.CatmullRom
  36684. * @since 3.0.0
  36685. *
  36686. * @param {number} t - [description]
  36687. * @param {number} p0 - [description]
  36688. * @param {number} p1 - [description]
  36689. * @param {number} p2 - [description]
  36690. * @param {number} p3 - [description]
  36691. *
  36692. * @return {number} The Catmull-Rom value.
  36693. */
  36694. var CatmullRom = function (t, p0, p1, p2, p3)
  36695. {
  36696. var v0 = (p2 - p0) * 0.5;
  36697. var v1 = (p3 - p1) * 0.5;
  36698. var t2 = t * t;
  36699. var t3 = t * t2;
  36700. return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
  36701. };
  36702. module.exports = CatmullRom;
  36703. /***/ }),
  36704. /* 186 */
  36705. /***/ (function(module, exports) {
  36706. /**
  36707. * @author Richard Davey <rich@photonstorm.com>
  36708. * @copyright 2019 Photon Storm Ltd.
  36709. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  36710. */
  36711. /**
  36712. * Check whether the given values are fuzzily equal.
  36713. *
  36714. * Two numbers are fuzzily equal if their difference is less than `epsilon`.
  36715. *
  36716. * @function Phaser.Math.Fuzzy.Equal
  36717. * @since 3.0.0
  36718. *
  36719. * @param {number} a - The first value.
  36720. * @param {number} b - The second value.
  36721. * @param {number} [epsilon=0.0001] - The epsilon.
  36722. *
  36723. * @return {boolean} `true` if the values are fuzzily equal, otherwise `false`.
  36724. */
  36725. var Equal = function (a, b, epsilon)
  36726. {
  36727. if (epsilon === undefined) { epsilon = 0.0001; }
  36728. return Math.abs(a - b) < epsilon;
  36729. };
  36730. module.exports = Equal;
  36731. /***/ }),
  36732. /* 187 */
  36733. /***/ (function(module, exports, __webpack_require__) {
  36734. /**
  36735. * @author Richard Davey <rich@photonstorm.com>
  36736. * @copyright 2019 Photon Storm Ltd.
  36737. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  36738. */
  36739. var OS = __webpack_require__(99);
  36740. var Browser = __webpack_require__(128);
  36741. var CanvasPool = __webpack_require__(24);
  36742. /**
  36743. * Determines the features of the browser running this Phaser Game instance.
  36744. * These values are read-only and populated during the boot sequence of the game.
  36745. * They are then referenced by internal game systems and are available for you to access
  36746. * via `this.sys.game.device.features` from within any Scene.
  36747. *
  36748. * @typedef {object} Phaser.Device.Features
  36749. * @since 3.0.0
  36750. *
  36751. * @property {?boolean} canvasBitBltShift - True if canvas supports a 'copy' bitblt onto itself when the source and destination regions overlap.
  36752. * @property {boolean} canvas - Is canvas available?
  36753. * @property {boolean} file - Is file available?
  36754. * @property {boolean} fileSystem - Is fileSystem available?
  36755. * @property {boolean} getUserMedia - Does the device support the getUserMedia API?
  36756. * @property {boolean} littleEndian - Is the device big or little endian? (only detected if the browser supports TypedArrays)
  36757. * @property {boolean} localStorage - Is localStorage available?
  36758. * @property {boolean} pointerLock - Is Pointer Lock available?
  36759. * @property {boolean} support32bit - Does the device context support 32bit pixel manipulation using array buffer views?
  36760. * @property {boolean} vibration - Does the device support the Vibration API?
  36761. * @property {boolean} webGL - Is webGL available?
  36762. * @property {boolean} worker - Is worker available?
  36763. */
  36764. var Features = {
  36765. canvas: false,
  36766. canvasBitBltShift: null,
  36767. file: false,
  36768. fileSystem: false,
  36769. getUserMedia: true,
  36770. littleEndian: false,
  36771. localStorage: false,
  36772. pointerLock: false,
  36773. support32bit: false,
  36774. vibration: false,
  36775. webGL: false,
  36776. worker: false
  36777. };
  36778. // Check Little or Big Endian system.
  36779. // @author Matt DesLauriers (@mattdesl)
  36780. function checkIsLittleEndian ()
  36781. {
  36782. var a = new ArrayBuffer(4);
  36783. var b = new Uint8Array(a);
  36784. var c = new Uint32Array(a);
  36785. b[0] = 0xa1;
  36786. b[1] = 0xb2;
  36787. b[2] = 0xc3;
  36788. b[3] = 0xd4;
  36789. if (c[0] === 0xd4c3b2a1)
  36790. {
  36791. return true;
  36792. }
  36793. if (c[0] === 0xa1b2c3d4)
  36794. {
  36795. return false;
  36796. }
  36797. else
  36798. {
  36799. // Could not determine endianness
  36800. return null;
  36801. }
  36802. }
  36803. function init ()
  36804. {
  36805. Features.canvas = !!window['CanvasRenderingContext2D'] || OS.cocoonJS;
  36806. try
  36807. {
  36808. Features.localStorage = !!localStorage.getItem;
  36809. }
  36810. catch (error)
  36811. {
  36812. Features.localStorage = false;
  36813. }
  36814. Features.file = !!window['File'] && !!window['FileReader'] && !!window['FileList'] && !!window['Blob'];
  36815. Features.fileSystem = !!window['requestFileSystem'];
  36816. var isUint8 = false;
  36817. var testWebGL = function ()
  36818. {
  36819. if (window['WebGLRenderingContext'])
  36820. {
  36821. try
  36822. {
  36823. var canvas = CanvasPool.createWebGL(this);
  36824. if (OS.cocoonJS)
  36825. {
  36826. canvas.screencanvas = false;
  36827. }
  36828. var ctx = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
  36829. var canvas2D = CanvasPool.create2D(this);
  36830. var ctx2D = canvas2D.getContext('2d');
  36831. // Can't be done on a webgl context
  36832. var image = ctx2D.createImageData(1, 1);
  36833. // Test to see if ImageData uses CanvasPixelArray or Uint8ClampedArray.
  36834. // @author Matt DesLauriers (@mattdesl)
  36835. isUint8 = image.data instanceof Uint8ClampedArray;
  36836. CanvasPool.remove(canvas);
  36837. CanvasPool.remove(canvas2D);
  36838. return !!ctx;
  36839. }
  36840. catch (e)
  36841. {
  36842. return false;
  36843. }
  36844. }
  36845. return false;
  36846. };
  36847. Features.webGL = testWebGL();
  36848. Features.worker = !!window['Worker'];
  36849. Features.pointerLock = 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document;
  36850. navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.oGetUserMedia;
  36851. window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
  36852. Features.getUserMedia = Features.getUserMedia && !!navigator.getUserMedia && !!window.URL;
  36853. // Older versions of firefox (< 21) apparently claim support but user media does not actually work
  36854. if (Browser.firefox && Browser.firefoxVersion < 21)
  36855. {
  36856. Features.getUserMedia = false;
  36857. }
  36858. // Excludes iOS versions as they generally wrap UIWebView (eg. Safari WebKit) and it
  36859. // is safer to not try and use the fast copy-over method.
  36860. if (!OS.iOS && (Browser.ie || Browser.firefox || Browser.chrome))
  36861. {
  36862. Features.canvasBitBltShift = true;
  36863. }
  36864. // Known not to work
  36865. if (Browser.safari || Browser.mobileSafari)
  36866. {
  36867. Features.canvasBitBltShift = false;
  36868. }
  36869. navigator.vibrate = navigator.vibrate || navigator.webkitVibrate || navigator.mozVibrate || navigator.msVibrate;
  36870. if (navigator.vibrate)
  36871. {
  36872. Features.vibration = true;
  36873. }
  36874. if (typeof ArrayBuffer !== 'undefined' && typeof Uint8Array !== 'undefined' && typeof Uint32Array !== 'undefined')
  36875. {
  36876. Features.littleEndian = checkIsLittleEndian();
  36877. }
  36878. Features.support32bit = (
  36879. typeof ArrayBuffer !== 'undefined' &&
  36880. typeof Uint8ClampedArray !== 'undefined' &&
  36881. typeof Int32Array !== 'undefined' &&
  36882. Features.littleEndian !== null &&
  36883. isUint8
  36884. );
  36885. return Features;
  36886. }
  36887. module.exports = init();
  36888. /***/ }),
  36889. /* 188 */
  36890. /***/ (function(module, exports, __webpack_require__) {
  36891. /**
  36892. * @author Richard Davey <rich@photonstorm.com>
  36893. * @copyright 2019 Photon Storm Ltd.
  36894. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  36895. */
  36896. var Back = __webpack_require__(402);
  36897. var Bounce = __webpack_require__(401);
  36898. var Circular = __webpack_require__(400);
  36899. var Cubic = __webpack_require__(399);
  36900. var Elastic = __webpack_require__(398);
  36901. var Expo = __webpack_require__(397);
  36902. var Linear = __webpack_require__(396);
  36903. var Quadratic = __webpack_require__(395);
  36904. var Quartic = __webpack_require__(394);
  36905. var Quintic = __webpack_require__(393);
  36906. var Sine = __webpack_require__(392);
  36907. var Stepped = __webpack_require__(391);
  36908. // EaseMap
  36909. module.exports = {
  36910. Power0: Linear,
  36911. Power1: Quadratic.Out,
  36912. Power2: Cubic.Out,
  36913. Power3: Quartic.Out,
  36914. Power4: Quintic.Out,
  36915. Linear: Linear,
  36916. Quad: Quadratic.Out,
  36917. Cubic: Cubic.Out,
  36918. Quart: Quartic.Out,
  36919. Quint: Quintic.Out,
  36920. Sine: Sine.Out,
  36921. Expo: Expo.Out,
  36922. Circ: Circular.Out,
  36923. Elastic: Elastic.Out,
  36924. Back: Back.Out,
  36925. Bounce: Bounce.Out,
  36926. Stepped: Stepped,
  36927. 'Quad.easeIn': Quadratic.In,
  36928. 'Cubic.easeIn': Cubic.In,
  36929. 'Quart.easeIn': Quartic.In,
  36930. 'Quint.easeIn': Quintic.In,
  36931. 'Sine.easeIn': Sine.In,
  36932. 'Expo.easeIn': Expo.In,
  36933. 'Circ.easeIn': Circular.In,
  36934. 'Elastic.easeIn': Elastic.In,
  36935. 'Back.easeIn': Back.In,
  36936. 'Bounce.easeIn': Bounce.In,
  36937. 'Quad.easeOut': Quadratic.Out,
  36938. 'Cubic.easeOut': Cubic.Out,
  36939. 'Quart.easeOut': Quartic.Out,
  36940. 'Quint.easeOut': Quintic.Out,
  36941. 'Sine.easeOut': Sine.Out,
  36942. 'Expo.easeOut': Expo.Out,
  36943. 'Circ.easeOut': Circular.Out,
  36944. 'Elastic.easeOut': Elastic.Out,
  36945. 'Back.easeOut': Back.Out,
  36946. 'Bounce.easeOut': Bounce.Out,
  36947. 'Quad.easeInOut': Quadratic.InOut,
  36948. 'Cubic.easeInOut': Cubic.InOut,
  36949. 'Quart.easeInOut': Quartic.InOut,
  36950. 'Quint.easeInOut': Quintic.InOut,
  36951. 'Sine.easeInOut': Sine.InOut,
  36952. 'Expo.easeInOut': Expo.InOut,
  36953. 'Circ.easeInOut': Circular.InOut,
  36954. 'Elastic.easeInOut': Elastic.InOut,
  36955. 'Back.easeInOut': Back.InOut,
  36956. 'Bounce.easeInOut': Bounce.InOut
  36957. };
  36958. /***/ }),
  36959. /* 189 */
  36960. /***/ (function(module, exports) {
  36961. /**
  36962. * @author Richard Davey <rich@photonstorm.com>
  36963. * @copyright 2019 Photon Storm Ltd.
  36964. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  36965. */
  36966. // Centers this Rectangle so that the center coordinates match the given x and y values.
  36967. /**
  36968. * Moves the top-left corner of a Rectangle so that its center is at the given coordinates.
  36969. *
  36970. * @function Phaser.Geom.Rectangle.CenterOn
  36971. * @since 3.0.0
  36972. *
  36973. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  36974. *
  36975. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to be centered.
  36976. * @param {number} x - The X coordinate of the Rectangle's center.
  36977. * @param {number} y - The Y coordinate of the Rectangle's center.
  36978. *
  36979. * @return {Phaser.Geom.Rectangle} The centered rectangle.
  36980. */
  36981. var CenterOn = function (rect, x, y)
  36982. {
  36983. rect.x = x - (rect.width / 2);
  36984. rect.y = y - (rect.height / 2);
  36985. return rect;
  36986. };
  36987. module.exports = CenterOn;
  36988. /***/ }),
  36989. /* 190 */
  36990. /***/ (function(module, exports, __webpack_require__) {
  36991. /**
  36992. * @author Richard Davey <rich@photonstorm.com>
  36993. * @copyright 2019 Photon Storm Ltd.
  36994. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  36995. */
  36996. var GetColor = __webpack_require__(191);
  36997. /**
  36998. * Converts an HSV (hue, saturation and value) color value to RGB.
  36999. * Conversion formula from http://en.wikipedia.org/wiki/HSL_color_space.
  37000. * Assumes HSV values are contained in the set [0, 1].
  37001. * Based on code by Michael Jackson (https://github.com/mjijackson)
  37002. *
  37003. * @function Phaser.Display.Color.HSVToRGB
  37004. * @since 3.0.0
  37005. *
  37006. * @param {number} h - The hue, in the range 0 - 1. This is the base color.
  37007. * @param {number} s - The saturation, in the range 0 - 1. This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white.
  37008. * @param {number} v - The value, in the range 0 - 1. This controls how dark the color is. Where 1 is as bright as possible and 0 is black.
  37009. * @param {(ColorObject|Phaser.Display.Color)} [out] - A Color object to store the results in. If not given a new ColorObject will be created.
  37010. *
  37011. * @return {(ColorObject|Phaser.Display.Color)} An object with the red, green and blue values set in the r, g and b properties.
  37012. */
  37013. var HSVToRGB = function (h, s, v, out)
  37014. {
  37015. if (s === undefined) { s = 1; }
  37016. if (v === undefined) { v = 1; }
  37017. var i = Math.floor(h * 6);
  37018. var f = h * 6 - i;
  37019. var p = Math.floor((v * (1 - s)) * 255);
  37020. var q = Math.floor((v * (1 - f * s)) * 255);
  37021. var t = Math.floor((v * (1 - (1 - f) * s)) * 255);
  37022. v = Math.floor(v *= 255);
  37023. var r = v;
  37024. var g = v;
  37025. var b = v;
  37026. var c = i % 6;
  37027. if (c === 0)
  37028. {
  37029. g = t;
  37030. b = p;
  37031. }
  37032. else if (c === 1)
  37033. {
  37034. r = q;
  37035. b = p;
  37036. }
  37037. else if (c === 2)
  37038. {
  37039. r = p;
  37040. b = t;
  37041. }
  37042. else if (c === 3)
  37043. {
  37044. r = p;
  37045. g = q;
  37046. }
  37047. else if (c === 4)
  37048. {
  37049. r = t;
  37050. g = p;
  37051. }
  37052. else if (c === 5)
  37053. {
  37054. g = p;
  37055. b = q;
  37056. }
  37057. if (!out)
  37058. {
  37059. return { r: r, g: g, b: b, color: GetColor(r, g, b) };
  37060. }
  37061. else if (out.setTo)
  37062. {
  37063. return out.setTo(r, g, b, out.alpha, false);
  37064. }
  37065. else
  37066. {
  37067. out.r = r;
  37068. out.g = g;
  37069. out.b = b;
  37070. out.color = GetColor(r, g, b);
  37071. return out;
  37072. }
  37073. };
  37074. module.exports = HSVToRGB;
  37075. /***/ }),
  37076. /* 191 */
  37077. /***/ (function(module, exports) {
  37078. /**
  37079. * @author Richard Davey <rich@photonstorm.com>
  37080. * @copyright 2019 Photon Storm Ltd.
  37081. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37082. */
  37083. /**
  37084. * Given 3 separate color values this will return an integer representation of it.
  37085. *
  37086. * @function Phaser.Display.Color.GetColor
  37087. * @since 3.0.0
  37088. *
  37089. * @param {integer} red - The red color value. A number between 0 and 255.
  37090. * @param {integer} green - The green color value. A number between 0 and 255.
  37091. * @param {integer} blue - The blue color value. A number between 0 and 255.
  37092. *
  37093. * @return {number} The combined color value.
  37094. */
  37095. var GetColor = function (red, green, blue)
  37096. {
  37097. return red << 16 | green << 8 | blue;
  37098. };
  37099. module.exports = GetColor;
  37100. /***/ }),
  37101. /* 192 */
  37102. /***/ (function(module, exports, __webpack_require__) {
  37103. /**
  37104. * @author Richard Davey <rich@photonstorm.com>
  37105. * @copyright 2019 Photon Storm Ltd.
  37106. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37107. */
  37108. var HexStringToColor = __webpack_require__(410);
  37109. var IntegerToColor = __webpack_require__(407);
  37110. var ObjectToColor = __webpack_require__(405);
  37111. var RGBStringToColor = __webpack_require__(404);
  37112. /**
  37113. * Converts the given source color value into an instance of a Color class.
  37114. * The value can be either a string, prefixed with `rgb` or a hex string, a number or an Object.
  37115. *
  37116. * @function Phaser.Display.Color.ValueToColor
  37117. * @since 3.0.0
  37118. *
  37119. * @param {(string|number|InputColorObject)} input - The source color value to convert.
  37120. *
  37121. * @return {Phaser.Display.Color} A Color object.
  37122. */
  37123. var ValueToColor = function (input)
  37124. {
  37125. var t = typeof input;
  37126. switch (t)
  37127. {
  37128. case 'string':
  37129. if (input.substr(0, 3).toLowerCase() === 'rgb')
  37130. {
  37131. return RGBStringToColor(input);
  37132. }
  37133. else
  37134. {
  37135. return HexStringToColor(input);
  37136. }
  37137. case 'number':
  37138. return IntegerToColor(input);
  37139. case 'object':
  37140. return ObjectToColor(input);
  37141. }
  37142. };
  37143. module.exports = ValueToColor;
  37144. /***/ }),
  37145. /* 193 */
  37146. /***/ (function(module, exports) {
  37147. /**
  37148. * @author Richard Davey <rich@photonstorm.com>
  37149. * @copyright 2019 Photon Storm Ltd.
  37150. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37151. */
  37152. /**
  37153. * Takes the given string and pads it out, to the length required, using the character
  37154. * specified. For example if you need a string to be 6 characters long, you can call:
  37155. *
  37156. * `pad('bob', 6, '-', 2)`
  37157. *
  37158. * This would return: `bob---` as it has padded it out to 6 characters, using the `-` on the right.
  37159. *
  37160. * You can also use it to pad numbers (they are always returned as strings):
  37161. *
  37162. * `pad(512, 6, '0', 1)`
  37163. *
  37164. * Would return: `000512` with the string padded to the left.
  37165. *
  37166. * If you don't specify a direction it'll pad to both sides:
  37167. *
  37168. * `pad('c64', 7, '*')`
  37169. *
  37170. * Would return: `**c64**`
  37171. *
  37172. * @function Phaser.Utils.String.Pad
  37173. * @since 3.0.0
  37174. *
  37175. * @param {string} str - The target string. `toString()` will be called on the string, which means you can also pass in common data types like numbers.
  37176. * @param {integer} [len=0] - The number of characters to be added.
  37177. * @param {string} [pad=" "] - The string to pad it out with (defaults to a space).
  37178. * @param {integer} [dir=3] - The direction dir = 1 (left), 2 (right), 3 (both).
  37179. *
  37180. * @return {string} The padded string.
  37181. */
  37182. var Pad = function (str, len, pad, dir)
  37183. {
  37184. if (len === undefined) { len = 0; }
  37185. if (pad === undefined) { pad = ' '; }
  37186. if (dir === undefined) { dir = 3; }
  37187. str = str.toString();
  37188. var padlen = 0;
  37189. if (len + 1 >= str.length)
  37190. {
  37191. switch (dir)
  37192. {
  37193. case 1:
  37194. str = new Array(len + 1 - str.length).join(pad) + str;
  37195. break;
  37196. case 3:
  37197. var right = Math.ceil((padlen = len - str.length) / 2);
  37198. var left = padlen - right;
  37199. str = new Array(left + 1).join(pad) + str + new Array(right + 1).join(pad);
  37200. break;
  37201. default:
  37202. str = str + new Array(len + 1 - str.length).join(pad);
  37203. break;
  37204. }
  37205. }
  37206. return str;
  37207. };
  37208. module.exports = Pad;
  37209. /***/ }),
  37210. /* 194 */
  37211. /***/ (function(module, exports, __webpack_require__) {
  37212. /**
  37213. * @author Richard Davey <rich@photonstorm.com>
  37214. * @copyright 2019 Photon Storm Ltd.
  37215. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37216. */
  37217. var Class = __webpack_require__(0);
  37218. /**
  37219. * @callback EachMapCallback<E>
  37220. *
  37221. * @param {string} key - The key of the Map entry.
  37222. * @param {E} entry - The value of the Map entry.
  37223. *
  37224. * @return {?boolean} The callback result.
  37225. */
  37226. /**
  37227. * @classdesc
  37228. * The keys of a Map can be arbitrary values.
  37229. *
  37230. * ```javascript
  37231. * var map = new Map([
  37232. * [ 1, 'one' ],
  37233. * [ 2, 'two' ],
  37234. * [ 3, 'three' ]
  37235. * ]);
  37236. * ```
  37237. *
  37238. * @class Map
  37239. * @memberof Phaser.Structs
  37240. * @constructor
  37241. * @since 3.0.0
  37242. *
  37243. * @generic K
  37244. * @generic V
  37245. * @genericUse {V[]} - [elements]
  37246. *
  37247. * @param {Array.<*>} elements - An optional array of key-value pairs to populate this Map with.
  37248. */
  37249. var Map = new Class({
  37250. initialize:
  37251. function Map (elements)
  37252. {
  37253. /**
  37254. * The entries in this Map.
  37255. *
  37256. * @genericUse {Object.<string, V>} - [$type]
  37257. *
  37258. * @name Phaser.Structs.Map#entries
  37259. * @type {Object.<string, *>}
  37260. * @default {}
  37261. * @since 3.0.0
  37262. */
  37263. this.entries = {};
  37264. /**
  37265. * The number of key / value pairs in this Map.
  37266. *
  37267. * @name Phaser.Structs.Map#size
  37268. * @type {number}
  37269. * @default 0
  37270. * @since 3.0.0
  37271. */
  37272. this.size = 0;
  37273. if (Array.isArray(elements))
  37274. {
  37275. for (var i = 0; i < elements.length; i++)
  37276. {
  37277. this.set(elements[i][0], elements[i][1]);
  37278. }
  37279. }
  37280. },
  37281. /**
  37282. * Adds an element with a specified `key` and `value` to this Map.
  37283. * If the `key` already exists, the value will be replaced.
  37284. *
  37285. * @method Phaser.Structs.Map#set
  37286. * @since 3.0.0
  37287. *
  37288. * @genericUse {K} - [key]
  37289. * @genericUse {V} - [value]
  37290. * @genericUse {Phaser.Structs.Map.<K, V>} - [$return]
  37291. *
  37292. * @param {string} key - The key of the element to be added to this Map.
  37293. * @param {*} value - The value of the element to be added to this Map.
  37294. *
  37295. * @return {Phaser.Structs.Map} This Map object.
  37296. */
  37297. set: function (key, value)
  37298. {
  37299. if (!this.has(key))
  37300. {
  37301. this.size++;
  37302. }
  37303. this.entries[key] = value;
  37304. return this;
  37305. },
  37306. /**
  37307. * Returns the value associated to the `key`, or `undefined` if there is none.
  37308. *
  37309. * @method Phaser.Structs.Map#get
  37310. * @since 3.0.0
  37311. *
  37312. * @genericUse {K} - [key]
  37313. * @genericUse {V} - [$return]
  37314. *
  37315. * @param {string} key - The key of the element to return from the `Map` object.
  37316. *
  37317. * @return {*} The element associated with the specified key or `undefined` if the key can't be found in this Map object.
  37318. */
  37319. get: function (key)
  37320. {
  37321. if (this.has(key))
  37322. {
  37323. return this.entries[key];
  37324. }
  37325. },
  37326. /**
  37327. * Returns an `Array` of all the values stored in this Map.
  37328. *
  37329. * @method Phaser.Structs.Map#getArray
  37330. * @since 3.0.0
  37331. *
  37332. * @genericUse {V[]} - [$return]
  37333. *
  37334. * @return {Array.<*>} An array of the values stored in this Map.
  37335. */
  37336. getArray: function ()
  37337. {
  37338. var output = [];
  37339. var entries = this.entries;
  37340. for (var key in entries)
  37341. {
  37342. output.push(entries[key]);
  37343. }
  37344. return output;
  37345. },
  37346. /**
  37347. * Returns a boolean indicating whether an element with the specified key exists or not.
  37348. *
  37349. * @method Phaser.Structs.Map#has
  37350. * @since 3.0.0
  37351. *
  37352. * @genericUse {K} - [key]
  37353. *
  37354. * @param {string} key - The key of the element to test for presence of in this Map.
  37355. *
  37356. * @return {boolean} Returns `true` if an element with the specified key exists in this Map, otherwise `false`.
  37357. */
  37358. has: function (key)
  37359. {
  37360. return (this.entries.hasOwnProperty(key));
  37361. },
  37362. /**
  37363. * Delete the specified element from this Map.
  37364. *
  37365. * @method Phaser.Structs.Map#delete
  37366. * @since 3.0.0
  37367. *
  37368. * @genericUse {K} - [key]
  37369. * @genericUse {Phaser.Structs.Map.<K, V>} - [$return]
  37370. *
  37371. * @param {string} key - The key of the element to delete from this Map.
  37372. *
  37373. * @return {Phaser.Structs.Map} This Map object.
  37374. */
  37375. delete: function (key)
  37376. {
  37377. if (this.has(key))
  37378. {
  37379. delete this.entries[key];
  37380. this.size--;
  37381. }
  37382. return this;
  37383. },
  37384. /**
  37385. * Delete all entries from this Map.
  37386. *
  37387. * @method Phaser.Structs.Map#clear
  37388. * @since 3.0.0
  37389. *
  37390. * @genericUse {Phaser.Structs.Map.<K, V>} - [$return]
  37391. *
  37392. * @return {Phaser.Structs.Map} This Map object.
  37393. */
  37394. clear: function ()
  37395. {
  37396. Object.keys(this.entries).forEach(function (prop)
  37397. {
  37398. delete this.entries[prop];
  37399. }, this);
  37400. this.size = 0;
  37401. return this;
  37402. },
  37403. /**
  37404. * Returns all entries keys in this Map.
  37405. *
  37406. * @method Phaser.Structs.Map#keys
  37407. * @since 3.0.0
  37408. *
  37409. * @genericUse {K[]} - [$return]
  37410. *
  37411. * @return {string[]} Array containing entries' keys.
  37412. */
  37413. keys: function ()
  37414. {
  37415. return Object.keys(this.entries);
  37416. },
  37417. /**
  37418. * Returns an `Array` of all entries.
  37419. *
  37420. * @method Phaser.Structs.Map#values
  37421. * @since 3.0.0
  37422. *
  37423. * @genericUse {V[]} - [$return]
  37424. *
  37425. * @return {Array.<*>} An `Array` of entries.
  37426. */
  37427. values: function ()
  37428. {
  37429. var output = [];
  37430. var entries = this.entries;
  37431. for (var key in entries)
  37432. {
  37433. output.push(entries[key]);
  37434. }
  37435. return output;
  37436. },
  37437. /**
  37438. * Dumps the contents of this Map to the console via `console.group`.
  37439. *
  37440. * @method Phaser.Structs.Map#dump
  37441. * @since 3.0.0
  37442. */
  37443. dump: function ()
  37444. {
  37445. var entries = this.entries;
  37446. // eslint-disable-next-line no-console
  37447. console.group('Map');
  37448. for (var key in entries)
  37449. {
  37450. console.log(key, entries[key]);
  37451. }
  37452. // eslint-disable-next-line no-console
  37453. console.groupEnd();
  37454. },
  37455. /**
  37456. * Passes all entries in this Map to the given callback.
  37457. *
  37458. * @method Phaser.Structs.Map#each
  37459. * @since 3.0.0
  37460. *
  37461. * @genericUse {EachMapCallback.<V>} - [callback]
  37462. * @genericUse {Phaser.Structs.Map.<K, V>} - [$return]
  37463. *
  37464. * @param {EachMapCallback} callback - The callback which will receive the keys and entries held in this Map.
  37465. *
  37466. * @return {Phaser.Structs.Map} This Map object.
  37467. */
  37468. each: function (callback)
  37469. {
  37470. var entries = this.entries;
  37471. for (var key in entries)
  37472. {
  37473. if (callback(key, entries[key]) === false)
  37474. {
  37475. break;
  37476. }
  37477. }
  37478. return this;
  37479. },
  37480. /**
  37481. * Returns `true` if the value exists within this Map. Otherwise, returns `false`.
  37482. *
  37483. * @method Phaser.Structs.Map#contains
  37484. * @since 3.0.0
  37485. *
  37486. * @genericUse {V} - [value]
  37487. *
  37488. * @param {*} value - The value to search for.
  37489. *
  37490. * @return {boolean} `true` if the value is found, otherwise `false`.
  37491. */
  37492. contains: function (value)
  37493. {
  37494. var entries = this.entries;
  37495. for (var key in entries)
  37496. {
  37497. if (entries[key] === value)
  37498. {
  37499. return true;
  37500. }
  37501. }
  37502. return false;
  37503. },
  37504. /**
  37505. * Merges all new keys from the given Map into this one.
  37506. * If it encounters a key that already exists it will be skipped unless override is set to `true`.
  37507. *
  37508. * @method Phaser.Structs.Map#merge
  37509. * @since 3.0.0
  37510. *
  37511. * @genericUse {Phaser.Structs.Map.<K, V>} - [map,$return]
  37512. *
  37513. * @param {Phaser.Structs.Map} map - The Map to merge in to this Map.
  37514. * @param {boolean} [override=false] - Set to `true` to replace values in this Map with those from the source map, or `false` to skip them.
  37515. *
  37516. * @return {Phaser.Structs.Map} This Map object.
  37517. */
  37518. merge: function (map, override)
  37519. {
  37520. if (override === undefined) { override = false; }
  37521. var local = this.entries;
  37522. var source = map.entries;
  37523. for (var key in source)
  37524. {
  37525. if (local.hasOwnProperty(key) && override)
  37526. {
  37527. local[key] = source[key];
  37528. }
  37529. else
  37530. {
  37531. this.set(key, source[key]);
  37532. }
  37533. }
  37534. return this;
  37535. }
  37536. });
  37537. module.exports = Map;
  37538. /***/ }),
  37539. /* 195 */
  37540. /***/ (function(module, exports) {
  37541. /**
  37542. * @author Richard Davey <rich@photonstorm.com>
  37543. * @copyright 2019 Photon Storm Ltd.
  37544. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37545. */
  37546. /**
  37547. * Calculate a smooth interpolation percentage of `x` between `min` and `max`.
  37548. *
  37549. * The function receives the number `x` as an argument and returns 0 if `x` is less than or equal to the left edge,
  37550. * 1 if `x` is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial,
  37551. * between 0 and 1 otherwise.
  37552. *
  37553. * @function Phaser.Math.SmoothStep
  37554. * @since 3.0.0
  37555. * @see {@link https://en.wikipedia.org/wiki/Smoothstep}
  37556. *
  37557. * @param {number} x - The input value.
  37558. * @param {number} min - The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'.
  37559. * @param {number} max - The maximum value, also known as the 'right edge', assumed greater than the 'left edge'.
  37560. *
  37561. * @return {number} The percentage of interpolation, between 0 and 1.
  37562. */
  37563. var SmoothStep = function (x, min, max)
  37564. {
  37565. if (x <= min)
  37566. {
  37567. return 0;
  37568. }
  37569. if (x >= max)
  37570. {
  37571. return 1;
  37572. }
  37573. x = (x - min) / (max - min);
  37574. return x * x * (3 - 2 * x);
  37575. };
  37576. module.exports = SmoothStep;
  37577. /***/ }),
  37578. /* 196 */
  37579. /***/ (function(module, exports) {
  37580. /**
  37581. * @author Richard Davey <rich@photonstorm.com>
  37582. * @copyright 2019 Photon Storm Ltd.
  37583. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37584. */
  37585. /**
  37586. * Calculate a smoother interpolation percentage of `x` between `min` and `max`.
  37587. *
  37588. * The function receives the number `x` as an argument and returns 0 if `x` is less than or equal to the left edge,
  37589. * 1 if `x` is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial,
  37590. * between 0 and 1 otherwise.
  37591. *
  37592. * Produces an even smoother interpolation than {@link Phaser.Math.SmoothStep}.
  37593. *
  37594. * @function Phaser.Math.SmootherStep
  37595. * @since 3.0.0
  37596. * @see {@link https://en.wikipedia.org/wiki/Smoothstep#Variations}
  37597. *
  37598. * @param {number} x - The input value.
  37599. * @param {number} min - The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'.
  37600. * @param {number} max - The maximum value, also known as the 'right edge', assumed greater than the 'left edge'.
  37601. *
  37602. * @return {number} The percentage of interpolation, between 0 and 1.
  37603. */
  37604. var SmootherStep = function (x, min, max)
  37605. {
  37606. x = Math.max(0, Math.min(1, (x - min) / (max - min)));
  37607. return x * x * x * (x * (x * 6 - 15) + 10);
  37608. };
  37609. module.exports = SmootherStep;
  37610. /***/ }),
  37611. /* 197 */
  37612. /***/ (function(module, exports) {
  37613. /**
  37614. * @author Richard Davey <rich@photonstorm.com>
  37615. * @copyright 2019 Photon Storm Ltd.
  37616. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37617. */
  37618. /**
  37619. * Rotate a `point` around `x` and `y` by the given `angle` and `distance`.
  37620. *
  37621. * @function Phaser.Math.RotateAroundDistance
  37622. * @since 3.0.0
  37623. *
  37624. * @param {(Phaser.Geom.Point|object)} point - The point to be rotated.
  37625. * @param {number} x - The horizontal coordinate to rotate around.
  37626. * @param {number} y - The vertical coordinate to rotate around.
  37627. * @param {number} angle - The angle of rotation in radians.
  37628. * @param {number} distance - The distance from (x, y) to place the point at.
  37629. *
  37630. * @return {Phaser.Geom.Point} The given point.
  37631. */
  37632. var RotateAroundDistance = function (point, x, y, angle, distance)
  37633. {
  37634. var t = angle + Math.atan2(point.y - y, point.x - x);
  37635. point.x = x + (distance * Math.cos(t));
  37636. point.y = y + (distance * Math.sin(t));
  37637. return point;
  37638. };
  37639. module.exports = RotateAroundDistance;
  37640. /***/ }),
  37641. /* 198 */
  37642. /***/ (function(module, exports, __webpack_require__) {
  37643. /**
  37644. * @author Richard Davey <rich@photonstorm.com>
  37645. * @copyright 2019 Photon Storm Ltd.
  37646. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37647. */
  37648. var Point = __webpack_require__(6);
  37649. /**
  37650. * [description]
  37651. *
  37652. * @function Phaser.Geom.Triangle.Random
  37653. * @since 3.0.0
  37654. *
  37655. * @generic {Phaser.Geom.Point} O - [out,$return]
  37656. *
  37657. * @param {Phaser.Geom.Triangle} triangle - [description]
  37658. * @param {Phaser.Geom.Point} [out] - [description]
  37659. *
  37660. * @return {Phaser.Geom.Point} [description]
  37661. */
  37662. var Random = function (triangle, out)
  37663. {
  37664. if (out === undefined) { out = new Point(); }
  37665. // Basis vectors
  37666. var ux = triangle.x2 - triangle.x1;
  37667. var uy = triangle.y2 - triangle.y1;
  37668. var vx = triangle.x3 - triangle.x1;
  37669. var vy = triangle.y3 - triangle.y1;
  37670. // Random point within the unit square
  37671. var r = Math.random();
  37672. var s = Math.random();
  37673. // Point outside the triangle? Remap it.
  37674. if (r + s >= 1)
  37675. {
  37676. r = 1 - r;
  37677. s = 1 - s;
  37678. }
  37679. out.x = triangle.x1 + ((ux * r) + (vx * s));
  37680. out.y = triangle.y1 + ((uy * r) + (vy * s));
  37681. return out;
  37682. };
  37683. module.exports = Random;
  37684. /***/ }),
  37685. /* 199 */
  37686. /***/ (function(module, exports, __webpack_require__) {
  37687. /**
  37688. * @author Richard Davey <rich@photonstorm.com>
  37689. * @copyright 2019 Photon Storm Ltd.
  37690. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37691. */
  37692. var Point = __webpack_require__(6);
  37693. /**
  37694. * Returns a uniformly distributed random point from anywhere within the given Ellipse.
  37695. *
  37696. * @function Phaser.Geom.Ellipse.Random
  37697. * @since 3.0.0
  37698. *
  37699. * @generic {Phaser.Geom.Point} O - [out,$return]
  37700. *
  37701. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get a random point from.
  37702. * @param {(Phaser.Geom.Point|object)} [out] - A Point or point-like object to set the random `x` and `y` values in.
  37703. *
  37704. * @return {(Phaser.Geom.Point|object)} A Point object with the random values set in the `x` and `y` properties.
  37705. */
  37706. var Random = function (ellipse, out)
  37707. {
  37708. if (out === undefined) { out = new Point(); }
  37709. var p = Math.random() * Math.PI * 2;
  37710. var s = Math.sqrt(Math.random());
  37711. out.x = ellipse.x + ((s * Math.cos(p)) * ellipse.width / 2);
  37712. out.y = ellipse.y + ((s * Math.sin(p)) * ellipse.height / 2);
  37713. return out;
  37714. };
  37715. module.exports = Random;
  37716. /***/ }),
  37717. /* 200 */
  37718. /***/ (function(module, exports) {
  37719. /**
  37720. * @author Richard Davey <rich@photonstorm.com>
  37721. * @copyright 2019 Photon Storm Ltd.
  37722. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37723. */
  37724. /**
  37725. * Provides methods used for setting the WebGL rendering pipeline of a Game Object.
  37726. *
  37727. * @name Phaser.GameObjects.Components.Pipeline
  37728. * @webglOnly
  37729. * @since 3.0.0
  37730. */
  37731. var Pipeline = {
  37732. /**
  37733. * The initial WebGL pipeline of this Game Object.
  37734. *
  37735. * @name Phaser.GameObjects.Components.Pipeline#defaultPipeline
  37736. * @type {Phaser.Renderer.WebGL.WebGLPipeline}
  37737. * @default null
  37738. * @webglOnly
  37739. * @since 3.0.0
  37740. */
  37741. defaultPipeline: null,
  37742. /**
  37743. * The current WebGL pipeline of this Game Object.
  37744. *
  37745. * @name Phaser.GameObjects.Components.Pipeline#pipeline
  37746. * @type {Phaser.Renderer.WebGL.WebGLPipeline}
  37747. * @default null
  37748. * @webglOnly
  37749. * @since 3.0.0
  37750. */
  37751. pipeline: null,
  37752. /**
  37753. * Sets the initial WebGL Pipeline of this Game Object.
  37754. * This should only be called during the instantiation of the Game Object.
  37755. *
  37756. * @method Phaser.GameObjects.Components.Pipeline#initPipeline
  37757. * @webglOnly
  37758. * @since 3.0.0
  37759. *
  37760. * @param {string} [pipelineName=TextureTintPipeline] - The name of the pipeline to set on this Game Object. Defaults to the Texture Tint Pipeline.
  37761. *
  37762. * @return {boolean} `true` if the pipeline was set successfully, otherwise `false`.
  37763. */
  37764. initPipeline: function (pipelineName)
  37765. {
  37766. if (pipelineName === undefined) { pipelineName = 'TextureTintPipeline'; }
  37767. var renderer = this.scene.sys.game.renderer;
  37768. if (renderer && renderer.gl && renderer.hasPipeline(pipelineName))
  37769. {
  37770. this.defaultPipeline = renderer.getPipeline(pipelineName);
  37771. this.pipeline = this.defaultPipeline;
  37772. return true;
  37773. }
  37774. return false;
  37775. },
  37776. /**
  37777. * Sets the active WebGL Pipeline of this Game Object.
  37778. *
  37779. * @method Phaser.GameObjects.Components.Pipeline#setPipeline
  37780. * @webglOnly
  37781. * @since 3.0.0
  37782. *
  37783. * @param {string} pipelineName - The name of the pipeline to set on this Game Object.
  37784. *
  37785. * @return {this} This Game Object instance.
  37786. */
  37787. setPipeline: function (pipelineName)
  37788. {
  37789. var renderer = this.scene.sys.game.renderer;
  37790. if (renderer && renderer.gl && renderer.hasPipeline(pipelineName))
  37791. {
  37792. this.pipeline = renderer.getPipeline(pipelineName);
  37793. }
  37794. return this;
  37795. },
  37796. /**
  37797. * Resets the WebGL Pipeline of this Game Object back to the default it was created with.
  37798. *
  37799. * @method Phaser.GameObjects.Components.Pipeline#resetPipeline
  37800. * @webglOnly
  37801. * @since 3.0.0
  37802. *
  37803. * @return {boolean} `true` if the pipeline was set successfully, otherwise `false`.
  37804. */
  37805. resetPipeline: function ()
  37806. {
  37807. this.pipeline = this.defaultPipeline;
  37808. return (this.pipeline !== null);
  37809. },
  37810. /**
  37811. * Gets the name of the WebGL Pipeline this Game Object is currently using.
  37812. *
  37813. * @method Phaser.GameObjects.Components.Pipeline#getPipelineName
  37814. * @webglOnly
  37815. * @since 3.0.0
  37816. *
  37817. * @return {string} The string-based name of the pipeline being used by this Game Object.
  37818. */
  37819. getPipelineName: function ()
  37820. {
  37821. return this.pipeline.name;
  37822. }
  37823. };
  37824. module.exports = Pipeline;
  37825. /***/ }),
  37826. /* 201 */
  37827. /***/ (function(module, exports, __webpack_require__) {
  37828. /**
  37829. * @author Richard Davey <rich@photonstorm.com>
  37830. * @copyright 2019 Photon Storm Ltd.
  37831. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37832. */
  37833. var Point = __webpack_require__(6);
  37834. /**
  37835. * Returns a random point within a Rectangle.
  37836. *
  37837. * @function Phaser.Geom.Rectangle.Random
  37838. * @since 3.0.0
  37839. *
  37840. * @generic {Phaser.Geom.Point} O - [out,$return]
  37841. *
  37842. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to return a point from.
  37843. * @param {Phaser.Geom.Point} out - The object to update with the point's coordinates.
  37844. *
  37845. * @return {Phaser.Geom.Point} The modified `out` object, or a new Point if none was provided.
  37846. */
  37847. var Random = function (rect, out)
  37848. {
  37849. if (out === undefined) { out = new Point(); }
  37850. out.x = rect.x + (Math.random() * rect.width);
  37851. out.y = rect.y + (Math.random() * rect.height);
  37852. return out;
  37853. };
  37854. module.exports = Random;
  37855. /***/ }),
  37856. /* 202 */
  37857. /***/ (function(module, exports, __webpack_require__) {
  37858. /**
  37859. * @author Richard Davey <rich@photonstorm.com>
  37860. * @copyright 2019 Photon Storm Ltd.
  37861. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37862. */
  37863. var Point = __webpack_require__(6);
  37864. /**
  37865. * Returns a random point on a given Line.
  37866. *
  37867. * @function Phaser.Geom.Line.Random
  37868. * @since 3.0.0
  37869. *
  37870. * @generic {Phaser.Geom.Point} O - [out,$return]
  37871. *
  37872. * @param {Phaser.Geom.Line} line - The Line to calculate the random Point on.
  37873. * @param {(Phaser.Geom.Point|object)} [out] - An instance of a Point to be modified.
  37874. *
  37875. * @return {(Phaser.Geom.Point|object)} A random Point on the Line.
  37876. */
  37877. var Random = function (line, out)
  37878. {
  37879. if (out === undefined) { out = new Point(); }
  37880. var t = Math.random();
  37881. out.x = line.x1 + t * (line.x2 - line.x1);
  37882. out.y = line.y1 + t * (line.y2 - line.y1);
  37883. return out;
  37884. };
  37885. module.exports = Random;
  37886. /***/ }),
  37887. /* 203 */
  37888. /***/ (function(module, exports, __webpack_require__) {
  37889. /**
  37890. * @author Richard Davey <rich@photonstorm.com>
  37891. * @copyright 2019 Photon Storm Ltd.
  37892. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37893. */
  37894. var Length = __webpack_require__(58);
  37895. var Point = __webpack_require__(6);
  37896. /**
  37897. * Get a number of points along a line's length.
  37898. *
  37899. * Provide a `quantity` to get an exact number of points along the line.
  37900. *
  37901. * Provide a `stepRate` to ensure a specific distance between each point on the line. Set `quantity` to `0` when
  37902. * providing a `stepRate`.
  37903. *
  37904. * @function Phaser.Geom.Line.GetPoints
  37905. * @since 3.0.0
  37906. *
  37907. * @generic {Phaser.Geom.Point[]} O - [out,$return]
  37908. *
  37909. * @param {Phaser.Geom.Line} line - The line.
  37910. * @param {integer} quantity - The number of points to place on the line. Set to `0` to use `stepRate` instead.
  37911. * @param {number} [stepRate] - The distance between each point on the line. When set, `quantity` is implied and should be set to `0`.
  37912. * @param {(array|Phaser.Geom.Point[])} [out] - An optional array of Points, or point-like objects, to store the coordinates of the points on the line.
  37913. *
  37914. * @return {(array|Phaser.Geom.Point[])} An array of Points, or point-like objects, containing the coordinates of the points on the line.
  37915. */
  37916. var GetPoints = function (line, quantity, stepRate, out)
  37917. {
  37918. if (out === undefined) { out = []; }
  37919. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  37920. if (!quantity)
  37921. {
  37922. quantity = Length(line) / stepRate;
  37923. }
  37924. var x1 = line.x1;
  37925. var y1 = line.y1;
  37926. var x2 = line.x2;
  37927. var y2 = line.y2;
  37928. for (var i = 0; i < quantity; i++)
  37929. {
  37930. var position = i / quantity;
  37931. var x = x1 + (x2 - x1) * position;
  37932. var y = y1 + (y2 - y1) * position;
  37933. out.push(new Point(x, y));
  37934. }
  37935. return out;
  37936. };
  37937. module.exports = GetPoints;
  37938. /***/ }),
  37939. /* 204 */
  37940. /***/ (function(module, exports, __webpack_require__) {
  37941. /**
  37942. * @author Richard Davey <rich@photonstorm.com>
  37943. * @copyright 2019 Photon Storm Ltd.
  37944. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37945. */
  37946. var Perimeter = __webpack_require__(135);
  37947. var Point = __webpack_require__(6);
  37948. /**
  37949. * Position is a value between 0 and 1 where 0 = the top-left of the rectangle and 0.5 = the bottom right.
  37950. *
  37951. * @function Phaser.Geom.Rectangle.GetPoint
  37952. * @since 3.0.0
  37953. *
  37954. * @generic {Phaser.Geom.Point} O - [out,$return]
  37955. *
  37956. * @param {Phaser.Geom.Rectangle} rectangle - [description]
  37957. * @param {number} position - [description]
  37958. * @param {(Phaser.Geom.Point|object)} [out] - [description]
  37959. *
  37960. * @return {Phaser.Geom.Point} [description]
  37961. */
  37962. var GetPoint = function (rectangle, position, out)
  37963. {
  37964. if (out === undefined) { out = new Point(); }
  37965. if (position <= 0 || position >= 1)
  37966. {
  37967. out.x = rectangle.x;
  37968. out.y = rectangle.y;
  37969. return out;
  37970. }
  37971. var p = Perimeter(rectangle) * position;
  37972. if (position > 0.5)
  37973. {
  37974. p -= (rectangle.width + rectangle.height);
  37975. if (p <= rectangle.width)
  37976. {
  37977. // Face 3
  37978. out.x = rectangle.right - p;
  37979. out.y = rectangle.bottom;
  37980. }
  37981. else
  37982. {
  37983. // Face 4
  37984. out.x = rectangle.x;
  37985. out.y = rectangle.bottom - (p - rectangle.width);
  37986. }
  37987. }
  37988. else if (p <= rectangle.width)
  37989. {
  37990. // Face 1
  37991. out.x = rectangle.x + p;
  37992. out.y = rectangle.y;
  37993. }
  37994. else
  37995. {
  37996. // Face 2
  37997. out.x = rectangle.right;
  37998. out.y = rectangle.y + (p - rectangle.width);
  37999. }
  38000. return out;
  38001. };
  38002. module.exports = GetPoint;
  38003. /***/ }),
  38004. /* 205 */
  38005. /***/ (function(module, exports, __webpack_require__) {
  38006. /**
  38007. * @author Richard Davey <rich@photonstorm.com>
  38008. * @copyright 2019 Photon Storm Ltd.
  38009. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  38010. */
  38011. var Clamp = __webpack_require__(23);
  38012. var Class = __webpack_require__(0);
  38013. var EventEmitter = __webpack_require__(11);
  38014. var Events = __webpack_require__(136);
  38015. var FindClosestInSorted = __webpack_require__(434);
  38016. var Frame = __webpack_require__(433);
  38017. var GetValue = __webpack_require__(4);
  38018. /**
  38019. * @classdesc
  38020. * A Frame based Animation.
  38021. *
  38022. * This consists of a key, some default values (like the frame rate) and a bunch of Frame objects.
  38023. *
  38024. * The Animation Manager creates these. Game Objects don't own an instance of these directly.
  38025. * Game Objects have the Animation Component, which are like playheads to global Animations (these objects)
  38026. * So multiple Game Objects can have playheads all pointing to this one Animation instance.
  38027. *
  38028. * @class Animation
  38029. * @memberof Phaser.Animations
  38030. * @extends Phaser.Events.EventEmitter
  38031. * @constructor
  38032. * @since 3.0.0
  38033. *
  38034. * @param {Phaser.Animations.AnimationManager} manager - A reference to the global Animation Manager
  38035. * @param {string} key - The unique identifying string for this animation.
  38036. * @param {Phaser.Animations.Types.Animation} config - The Animation configuration.
  38037. */
  38038. var Animation = new Class({
  38039. Extends: EventEmitter,
  38040. initialize:
  38041. function Animation (manager, key, config)
  38042. {
  38043. EventEmitter.call(this);
  38044. /**
  38045. * A reference to the global Animation Manager.
  38046. *
  38047. * @name Phaser.Animations.Animation#manager
  38048. * @type {Phaser.Animations.AnimationManager}
  38049. * @since 3.0.0
  38050. */
  38051. this.manager = manager;
  38052. /**
  38053. * The unique identifying string for this animation.
  38054. *
  38055. * @name Phaser.Animations.Animation#key
  38056. * @type {string}
  38057. * @since 3.0.0
  38058. */
  38059. this.key = key;
  38060. /**
  38061. * A frame based animation (as opposed to a bone based animation)
  38062. *
  38063. * @name Phaser.Animations.Animation#type
  38064. * @type {string}
  38065. * @default frame
  38066. * @since 3.0.0
  38067. */
  38068. this.type = 'frame';
  38069. /**
  38070. * Extract all the frame data into the frames array.
  38071. *
  38072. * @name Phaser.Animations.Animation#frames
  38073. * @type {Phaser.Animations.AnimationFrame[]}
  38074. * @since 3.0.0
  38075. */
  38076. this.frames = this.getFrames(
  38077. manager.textureManager,
  38078. GetValue(config, 'frames', []),
  38079. GetValue(config, 'defaultTextureKey', null)
  38080. );
  38081. /**
  38082. * The frame rate of playback in frames per second (default 24 if duration is null)
  38083. *
  38084. * @name Phaser.Animations.Animation#frameRate
  38085. * @type {integer}
  38086. * @default 24
  38087. * @since 3.0.0
  38088. */
  38089. this.frameRate = GetValue(config, 'frameRate', null);
  38090. /**
  38091. * How long the animation should play for, in milliseconds.
  38092. * If the `frameRate` property has been set then it overrides this value,
  38093. * otherwise the `frameRate` is derived from `duration`.
  38094. *
  38095. * @name Phaser.Animations.Animation#duration
  38096. * @type {integer}
  38097. * @since 3.0.0
  38098. */
  38099. this.duration = GetValue(config, 'duration', null);
  38100. if (this.duration === null && this.frameRate === null)
  38101. {
  38102. // No duration or frameRate given, use default frameRate of 24fps
  38103. this.frameRate = 24;
  38104. this.duration = (this.frameRate / this.frames.length) * 1000;
  38105. }
  38106. else if (this.duration && this.frameRate === null)
  38107. {
  38108. // Duration given but no frameRate, so set the frameRate based on duration
  38109. // I.e. 12 frames in the animation, duration = 4000 ms
  38110. // So frameRate is 12 / (4000 / 1000) = 3 fps
  38111. this.frameRate = this.frames.length / (this.duration / 1000);
  38112. }
  38113. else
  38114. {
  38115. // frameRate given, derive duration from it (even if duration also specified)
  38116. // I.e. 15 frames in the animation, frameRate = 30 fps
  38117. // So duration is 15 / 30 = 0.5 * 1000 (half a second, or 500ms)
  38118. this.duration = (this.frames.length / this.frameRate) * 1000;
  38119. }
  38120. /**
  38121. * How many ms per frame, not including frame specific modifiers.
  38122. *
  38123. * @name Phaser.Animations.Animation#msPerFrame
  38124. * @type {integer}
  38125. * @since 3.0.0
  38126. */
  38127. this.msPerFrame = 1000 / this.frameRate;
  38128. /**
  38129. * Skip frames if the time lags, or always advanced anyway?
  38130. *
  38131. * @name Phaser.Animations.Animation#skipMissedFrames
  38132. * @type {boolean}
  38133. * @default false
  38134. * @since 3.0.0
  38135. */
  38136. this.skipMissedFrames = GetValue(config, 'skipMissedFrames', true);
  38137. /**
  38138. * The delay in ms before the playback will begin.
  38139. *
  38140. * @name Phaser.Animations.Animation#delay
  38141. * @type {integer}
  38142. * @default 0
  38143. * @since 3.0.0
  38144. */
  38145. this.delay = GetValue(config, 'delay', 0);
  38146. /**
  38147. * Number of times to repeat the animation. Set to -1 to repeat forever.
  38148. *
  38149. * @name Phaser.Animations.Animation#repeat
  38150. * @type {integer}
  38151. * @default 0
  38152. * @since 3.0.0
  38153. */
  38154. this.repeat = GetValue(config, 'repeat', 0);
  38155. /**
  38156. * The delay in ms before the a repeat play starts.
  38157. *
  38158. * @name Phaser.Animations.Animation#repeatDelay
  38159. * @type {integer}
  38160. * @default 0
  38161. * @since 3.0.0
  38162. */
  38163. this.repeatDelay = GetValue(config, 'repeatDelay', 0);
  38164. /**
  38165. * Should the animation yoyo (reverse back down to the start) before repeating?
  38166. *
  38167. * @name Phaser.Animations.Animation#yoyo
  38168. * @type {boolean}
  38169. * @default false
  38170. * @since 3.0.0
  38171. */
  38172. this.yoyo = GetValue(config, 'yoyo', false);
  38173. /**
  38174. * Should the GameObject's `visible` property be set to `true` when the animation starts to play?
  38175. *
  38176. * @name Phaser.Animations.Animation#showOnStart
  38177. * @type {boolean}
  38178. * @default false
  38179. * @since 3.0.0
  38180. */
  38181. this.showOnStart = GetValue(config, 'showOnStart', false);
  38182. /**
  38183. * Should the GameObject's `visible` property be set to `false` when the animation finishes?
  38184. *
  38185. * @name Phaser.Animations.Animation#hideOnComplete
  38186. * @type {boolean}
  38187. * @default false
  38188. * @since 3.0.0
  38189. */
  38190. this.hideOnComplete = GetValue(config, 'hideOnComplete', false);
  38191. /**
  38192. * Global pause. All Game Objects using this Animation instance are impacted by this property.
  38193. *
  38194. * @name Phaser.Animations.Animation#paused
  38195. * @type {boolean}
  38196. * @default false
  38197. * @since 3.0.0
  38198. */
  38199. this.paused = false;
  38200. this.manager.on(Events.PAUSE_ALL, this.pause, this);
  38201. this.manager.on(Events.RESUME_ALL, this.resume, this);
  38202. },
  38203. /**
  38204. * Add frames to the end of the animation.
  38205. *
  38206. * @method Phaser.Animations.Animation#addFrame
  38207. * @since 3.0.0
  38208. *
  38209. * @param {(string|Phaser.Animations.Types.AnimationFrame[])} config - [description]
  38210. *
  38211. * @return {Phaser.Animations.Animation} This Animation object.
  38212. */
  38213. addFrame: function (config)
  38214. {
  38215. return this.addFrameAt(this.frames.length, config);
  38216. },
  38217. /**
  38218. * Add frame/s into the animation.
  38219. *
  38220. * @method Phaser.Animations.Animation#addFrameAt
  38221. * @since 3.0.0
  38222. *
  38223. * @param {integer} index - The index to insert the frame at within the animation.
  38224. * @param {(string|Phaser.Animations.Types.AnimationFrame[])} config - [description]
  38225. *
  38226. * @return {Phaser.Animations.Animation} This Animation object.
  38227. */
  38228. addFrameAt: function (index, config)
  38229. {
  38230. var newFrames = this.getFrames(this.manager.textureManager, config);
  38231. if (newFrames.length > 0)
  38232. {
  38233. if (index === 0)
  38234. {
  38235. this.frames = newFrames.concat(this.frames);
  38236. }
  38237. else if (index === this.frames.length)
  38238. {
  38239. this.frames = this.frames.concat(newFrames);
  38240. }
  38241. else
  38242. {
  38243. var pre = this.frames.slice(0, index);
  38244. var post = this.frames.slice(index);
  38245. this.frames = pre.concat(newFrames, post);
  38246. }
  38247. this.updateFrameSequence();
  38248. }
  38249. return this;
  38250. },
  38251. /**
  38252. * Check if the given frame index is valid.
  38253. *
  38254. * @method Phaser.Animations.Animation#checkFrame
  38255. * @since 3.0.0
  38256. *
  38257. * @param {integer} index - The index to be checked.
  38258. *
  38259. * @return {boolean} `true` if the index is valid, otherwise `false`.
  38260. */
  38261. checkFrame: function (index)
  38262. {
  38263. return (index >= 0 && index < this.frames.length);
  38264. },
  38265. /**
  38266. * [description]
  38267. *
  38268. * @method Phaser.Animations.Animation#completeAnimation
  38269. * @protected
  38270. * @since 3.0.0
  38271. *
  38272. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  38273. */
  38274. completeAnimation: function (component)
  38275. {
  38276. if (this.hideOnComplete)
  38277. {
  38278. component.parent.visible = false;
  38279. }
  38280. component.stop();
  38281. },
  38282. /**
  38283. * [description]
  38284. *
  38285. * @method Phaser.Animations.Animation#getFirstTick
  38286. * @protected
  38287. * @since 3.0.0
  38288. *
  38289. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  38290. * @param {boolean} [includeDelay=true] - [description]
  38291. */
  38292. getFirstTick: function (component, includeDelay)
  38293. {
  38294. if (includeDelay === undefined) { includeDelay = true; }
  38295. // When is the first update due?
  38296. component.accumulator = 0;
  38297. component.nextTick = component.msPerFrame + component.currentFrame.duration;
  38298. if (includeDelay)
  38299. {
  38300. component.nextTick += component._delay;
  38301. }
  38302. },
  38303. /**
  38304. * Returns the AnimationFrame at the provided index
  38305. *
  38306. * @method Phaser.Animations.Animation#getFrameAt
  38307. * @protected
  38308. * @since 3.0.0
  38309. *
  38310. * @param {integer} index - The index in the AnimationFrame array
  38311. *
  38312. * @return {Phaser.Animations.AnimationFrame} The frame at the index provided from the animation sequence
  38313. */
  38314. getFrameAt: function (index)
  38315. {
  38316. return this.frames[index];
  38317. },
  38318. /**
  38319. * [description]
  38320. *
  38321. * @method Phaser.Animations.Animation#getFrames
  38322. * @since 3.0.0
  38323. *
  38324. * @param {Phaser.Textures.TextureManager} textureManager - [description]
  38325. * @param {(string|Phaser.Animations.Types.AnimationFrame[])} frames - [description]
  38326. * @param {string} [defaultTextureKey] - [description]
  38327. *
  38328. * @return {Phaser.Animations.AnimationFrame[]} [description]
  38329. */
  38330. getFrames: function (textureManager, frames, defaultTextureKey)
  38331. {
  38332. var out = [];
  38333. var prev;
  38334. var animationFrame;
  38335. var index = 1;
  38336. var i;
  38337. var textureKey;
  38338. // if frames is a string, we'll get all the frames from the texture manager as if it's a sprite sheet
  38339. if (typeof frames === 'string')
  38340. {
  38341. textureKey = frames;
  38342. var texture = textureManager.get(textureKey);
  38343. var frameKeys = texture.getFrameNames();
  38344. frames = [];
  38345. frameKeys.forEach(function (idx, value)
  38346. {
  38347. frames.push({ key: textureKey, frame: value });
  38348. });
  38349. }
  38350. if (!Array.isArray(frames) || frames.length === 0)
  38351. {
  38352. return out;
  38353. }
  38354. for (i = 0; i < frames.length; i++)
  38355. {
  38356. var item = frames[i];
  38357. var key = GetValue(item, 'key', defaultTextureKey);
  38358. if (!key)
  38359. {
  38360. continue;
  38361. }
  38362. // Could be an integer or a string
  38363. var frame = GetValue(item, 'frame', 0);
  38364. // The actual texture frame
  38365. var textureFrame = textureManager.getFrame(key, frame);
  38366. animationFrame = new Frame(key, frame, index, textureFrame);
  38367. animationFrame.duration = GetValue(item, 'duration', 0);
  38368. animationFrame.isFirst = (!prev);
  38369. // The previously created animationFrame
  38370. if (prev)
  38371. {
  38372. prev.nextFrame = animationFrame;
  38373. animationFrame.prevFrame = prev;
  38374. }
  38375. out.push(animationFrame);
  38376. prev = animationFrame;
  38377. index++;
  38378. }
  38379. if (out.length > 0)
  38380. {
  38381. animationFrame.isLast = true;
  38382. // Link them end-to-end, so they loop
  38383. animationFrame.nextFrame = out[0];
  38384. out[0].prevFrame = animationFrame;
  38385. // Generate the progress data
  38386. var slice = 1 / (out.length - 1);
  38387. for (i = 0; i < out.length; i++)
  38388. {
  38389. out[i].progress = i * slice;
  38390. }
  38391. }
  38392. return out;
  38393. },
  38394. /**
  38395. * [description]
  38396. *
  38397. * @method Phaser.Animations.Animation#getNextTick
  38398. * @since 3.0.0
  38399. *
  38400. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  38401. */
  38402. getNextTick: function (component)
  38403. {
  38404. // accumulator += delta * _timeScale
  38405. // after a large delta surge (perf issue for example) we need to adjust for it here
  38406. // When is the next update due?
  38407. component.accumulator -= component.nextTick;
  38408. component.nextTick = component.msPerFrame + component.currentFrame.duration;
  38409. },
  38410. /**
  38411. * Loads the Animation values into the Animation Component.
  38412. *
  38413. * @method Phaser.Animations.Animation#load
  38414. * @private
  38415. * @since 3.0.0
  38416. *
  38417. * @param {Phaser.GameObjects.Components.Animation} component - The Animation Component to load values into.
  38418. * @param {integer} startFrame - The start frame of the animation to load.
  38419. */
  38420. load: function (component, startFrame)
  38421. {
  38422. if (startFrame >= this.frames.length)
  38423. {
  38424. startFrame = 0;
  38425. }
  38426. if (component.currentAnim !== this)
  38427. {
  38428. component.currentAnim = this;
  38429. component.frameRate = this.frameRate;
  38430. component.duration = this.duration;
  38431. component.msPerFrame = this.msPerFrame;
  38432. component.skipMissedFrames = this.skipMissedFrames;
  38433. component._delay = this.delay;
  38434. component._repeat = this.repeat;
  38435. component._repeatDelay = this.repeatDelay;
  38436. component._yoyo = this.yoyo;
  38437. }
  38438. var frame = this.frames[startFrame];
  38439. if (startFrame === 0 && !component.forward)
  38440. {
  38441. frame = this.getLastFrame();
  38442. }
  38443. component.updateFrame(frame);
  38444. },
  38445. /**
  38446. * Returns the frame closest to the given progress value between 0 and 1.
  38447. *
  38448. * @method Phaser.Animations.Animation#getFrameByProgress
  38449. * @since 3.4.0
  38450. *
  38451. * @param {number} value - A value between 0 and 1.
  38452. *
  38453. * @return {Phaser.Animations.AnimationFrame} The frame closest to the given progress value.
  38454. */
  38455. getFrameByProgress: function (value)
  38456. {
  38457. value = Clamp(value, 0, 1);
  38458. return FindClosestInSorted(value, this.frames, 'progress');
  38459. },
  38460. /**
  38461. * Advance the animation frame.
  38462. *
  38463. * @method Phaser.Animations.Animation#nextFrame
  38464. * @since 3.0.0
  38465. *
  38466. * @param {Phaser.GameObjects.Components.Animation} component - The Animation Component to advance.
  38467. */
  38468. nextFrame: function (component)
  38469. {
  38470. var frame = component.currentFrame;
  38471. // TODO: Add frame skip support
  38472. if (frame.isLast)
  38473. {
  38474. // We're at the end of the animation
  38475. // Yoyo? (happens before repeat)
  38476. if (component._yoyo)
  38477. {
  38478. this.handleYoyoFrame(component, false);
  38479. }
  38480. else if (component.repeatCounter > 0)
  38481. {
  38482. // Repeat (happens before complete)
  38483. if (component._reverse && component.forward)
  38484. {
  38485. component.forward = false;
  38486. }
  38487. else
  38488. {
  38489. this.repeatAnimation(component);
  38490. }
  38491. }
  38492. else
  38493. {
  38494. this.completeAnimation(component);
  38495. }
  38496. }
  38497. else
  38498. {
  38499. this.updateAndGetNextTick(component, frame.nextFrame);
  38500. }
  38501. },
  38502. /**
  38503. * Handle the yoyo functionality in nextFrame and previousFrame methods.
  38504. *
  38505. * @method Phaser.Animations.Animation#handleYoyoFrame
  38506. * @private
  38507. * @since 3.12.0
  38508. *
  38509. * @param {Phaser.GameObjects.Components.Animation} component - The Animation Component to advance.
  38510. * @param {boolean} isReverse - Is animation in reverse mode? (Default: false)
  38511. */
  38512. handleYoyoFrame: function (component, isReverse)
  38513. {
  38514. if (!isReverse) { isReverse = false; }
  38515. if (component._reverse === !isReverse && component.repeatCounter > 0)
  38516. {
  38517. component.forward = isReverse;
  38518. this.repeatAnimation(component);
  38519. return;
  38520. }
  38521. if (component._reverse !== isReverse && component.repeatCounter === 0)
  38522. {
  38523. this.completeAnimation(component);
  38524. return;
  38525. }
  38526. component.forward = isReverse;
  38527. var frame = (isReverse) ? component.currentFrame.nextFrame : component.currentFrame.prevFrame;
  38528. this.updateAndGetNextTick(component, frame);
  38529. },
  38530. /**
  38531. * Returns the animation last frame.
  38532. *
  38533. * @method Phaser.Animations.Animation#getLastFrame
  38534. * @since 3.12.0
  38535. *
  38536. * @return {Phaser.Animations.AnimationFrame} component - The Animation Last Frame.
  38537. */
  38538. getLastFrame: function ()
  38539. {
  38540. return this.frames[this.frames.length - 1];
  38541. },
  38542. /**
  38543. * [description]
  38544. *
  38545. * @method Phaser.Animations.Animation#previousFrame
  38546. * @since 3.0.0
  38547. *
  38548. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  38549. */
  38550. previousFrame: function (component)
  38551. {
  38552. var frame = component.currentFrame;
  38553. // TODO: Add frame skip support
  38554. if (frame.isFirst)
  38555. {
  38556. // We're at the start of the animation
  38557. if (component._yoyo)
  38558. {
  38559. this.handleYoyoFrame(component, true);
  38560. }
  38561. else if (component.repeatCounter > 0)
  38562. {
  38563. if (component._reverse && !component.forward)
  38564. {
  38565. component.currentFrame = this.getLastFrame();
  38566. this.repeatAnimation(component);
  38567. }
  38568. else
  38569. {
  38570. // Repeat (happens before complete)
  38571. component.forward = true;
  38572. this.repeatAnimation(component);
  38573. }
  38574. }
  38575. else
  38576. {
  38577. this.completeAnimation(component);
  38578. }
  38579. }
  38580. else
  38581. {
  38582. this.updateAndGetNextTick(component, frame.prevFrame);
  38583. }
  38584. },
  38585. /**
  38586. * Update Frame and Wait next tick.
  38587. *
  38588. * @method Phaser.Animations.Animation#updateAndGetNextTick
  38589. * @private
  38590. * @since 3.12.0
  38591. *
  38592. * @param {Phaser.Animations.AnimationFrame} frame - An Animation frame.
  38593. */
  38594. updateAndGetNextTick: function (component, frame)
  38595. {
  38596. component.updateFrame(frame);
  38597. this.getNextTick(component);
  38598. },
  38599. /**
  38600. * [description]
  38601. *
  38602. * @method Phaser.Animations.Animation#removeFrame
  38603. * @since 3.0.0
  38604. *
  38605. * @param {Phaser.Animations.AnimationFrame} frame - [description]
  38606. *
  38607. * @return {Phaser.Animations.Animation} This Animation object.
  38608. */
  38609. removeFrame: function (frame)
  38610. {
  38611. var index = this.frames.indexOf(frame);
  38612. if (index !== -1)
  38613. {
  38614. this.removeFrameAt(index);
  38615. }
  38616. return this;
  38617. },
  38618. /**
  38619. * Removes a frame from the AnimationFrame array at the provided index
  38620. * and updates the animation accordingly.
  38621. *
  38622. * @method Phaser.Animations.Animation#removeFrameAt
  38623. * @since 3.0.0
  38624. *
  38625. * @param {integer} index - The index in the AnimationFrame array
  38626. *
  38627. * @return {Phaser.Animations.Animation} This Animation object.
  38628. */
  38629. removeFrameAt: function (index)
  38630. {
  38631. this.frames.splice(index, 1);
  38632. this.updateFrameSequence();
  38633. return this;
  38634. },
  38635. /**
  38636. * [description]
  38637. *
  38638. * @method Phaser.Animations.Animation#repeatAnimation
  38639. * @fires Phaser.Animations.Events#ANIMATION_REPEAT
  38640. * @fires Phaser.Animations.Events#SPRITE_ANIMATION_REPEAT
  38641. * @fires Phaser.Animations.Events#SPRITE_ANIMATION_KEY_REPEAT
  38642. * @since 3.0.0
  38643. *
  38644. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  38645. */
  38646. repeatAnimation: function (component)
  38647. {
  38648. if (component._pendingStop === 2)
  38649. {
  38650. return this.completeAnimation(component);
  38651. }
  38652. if (component._repeatDelay > 0 && component.pendingRepeat === false)
  38653. {
  38654. component.pendingRepeat = true;
  38655. component.accumulator -= component.nextTick;
  38656. component.nextTick += component._repeatDelay;
  38657. }
  38658. else
  38659. {
  38660. component.repeatCounter--;
  38661. component.updateFrame(component.currentFrame[(component.forward) ? 'nextFrame' : 'prevFrame']);
  38662. if (component.isPlaying)
  38663. {
  38664. this.getNextTick(component);
  38665. component.pendingRepeat = false;
  38666. var frame = component.currentFrame;
  38667. var parent = component.parent;
  38668. this.emit(Events.ANIMATION_REPEAT, this, frame);
  38669. parent.emit(Events.SPRITE_ANIMATION_KEY_REPEAT + this.key, this, frame, component.repeatCounter, parent);
  38670. parent.emit(Events.SPRITE_ANIMATION_REPEAT, this, frame, component.repeatCounter, parent);
  38671. }
  38672. }
  38673. },
  38674. /**
  38675. * Sets the texture frame the animation uses for rendering.
  38676. *
  38677. * @method Phaser.Animations.Animation#setFrame
  38678. * @since 3.0.0
  38679. *
  38680. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  38681. */
  38682. setFrame: function (component)
  38683. {
  38684. // Work out which frame should be set next on the child, and set it
  38685. if (component.forward)
  38686. {
  38687. this.nextFrame(component);
  38688. }
  38689. else
  38690. {
  38691. this.previousFrame(component);
  38692. }
  38693. },
  38694. /**
  38695. * Converts the animation data to JSON.
  38696. *
  38697. * @method Phaser.Animations.Animation#toJSON
  38698. * @since 3.0.0
  38699. *
  38700. * @return {Phaser.Animations.Types.JSONAnimation} [description]
  38701. */
  38702. toJSON: function ()
  38703. {
  38704. var output = {
  38705. key: this.key,
  38706. type: this.type,
  38707. frames: [],
  38708. frameRate: this.frameRate,
  38709. duration: this.duration,
  38710. skipMissedFrames: this.skipMissedFrames,
  38711. delay: this.delay,
  38712. repeat: this.repeat,
  38713. repeatDelay: this.repeatDelay,
  38714. yoyo: this.yoyo,
  38715. showOnStart: this.showOnStart,
  38716. hideOnComplete: this.hideOnComplete
  38717. };
  38718. this.frames.forEach(function (frame)
  38719. {
  38720. output.frames.push(frame.toJSON());
  38721. });
  38722. return output;
  38723. },
  38724. /**
  38725. * [description]
  38726. *
  38727. * @method Phaser.Animations.Animation#updateFrameSequence
  38728. * @since 3.0.0
  38729. *
  38730. * @return {Phaser.Animations.Animation} This Animation object.
  38731. */
  38732. updateFrameSequence: function ()
  38733. {
  38734. var len = this.frames.length;
  38735. var slice = 1 / (len - 1);
  38736. for (var i = 0; i < len; i++)
  38737. {
  38738. var frame = this.frames[i];
  38739. frame.index = i + 1;
  38740. frame.isFirst = false;
  38741. frame.isLast = false;
  38742. frame.progress = i * slice;
  38743. if (i === 0)
  38744. {
  38745. frame.isFirst = true;
  38746. frame.isLast = (len === 1);
  38747. frame.prevFrame = this.frames[len - 1];
  38748. frame.nextFrame = this.frames[i + 1];
  38749. }
  38750. else if (i === len - 1)
  38751. {
  38752. frame.isLast = true;
  38753. frame.prevFrame = this.frames[len - 2];
  38754. frame.nextFrame = this.frames[0];
  38755. }
  38756. else if (len > 1)
  38757. {
  38758. frame.prevFrame = this.frames[i - 1];
  38759. frame.nextFrame = this.frames[i + 1];
  38760. }
  38761. }
  38762. return this;
  38763. },
  38764. /**
  38765. * [description]
  38766. *
  38767. * @method Phaser.Animations.Animation#pause
  38768. * @since 3.0.0
  38769. *
  38770. * @return {Phaser.Animations.Animation} This Animation object.
  38771. */
  38772. pause: function ()
  38773. {
  38774. this.paused = true;
  38775. return this;
  38776. },
  38777. /**
  38778. * [description]
  38779. *
  38780. * @method Phaser.Animations.Animation#resume
  38781. * @since 3.0.0
  38782. *
  38783. * @return {Phaser.Animations.Animation} This Animation object.
  38784. */
  38785. resume: function ()
  38786. {
  38787. this.paused = false;
  38788. return this;
  38789. },
  38790. /**
  38791. * [description]
  38792. *
  38793. * @method Phaser.Animations.Animation#destroy
  38794. * @since 3.0.0
  38795. */
  38796. destroy: function ()
  38797. {
  38798. this.removeAllListeners();
  38799. this.manager.off(Events.PAUSE_ALL, this.pause, this);
  38800. this.manager.off(Events.RESUME_ALL, this.resume, this);
  38801. this.manager.remove(this.key);
  38802. for (var i = 0; i < this.frames.length; i++)
  38803. {
  38804. this.frames[i].destroy();
  38805. }
  38806. this.frames = [];
  38807. this.manager = null;
  38808. }
  38809. });
  38810. module.exports = Animation;
  38811. /***/ }),
  38812. /* 206 */
  38813. /***/ (function(module, exports, __webpack_require__) {
  38814. /**
  38815. * @author Richard Davey <rich@photonstorm.com>
  38816. * @copyright 2019 Photon Storm Ltd.
  38817. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  38818. */
  38819. var Point = __webpack_require__(6);
  38820. /**
  38821. * Returns a uniformly distributed random point from anywhere within the given Circle.
  38822. *
  38823. * @function Phaser.Geom.Circle.Random
  38824. * @since 3.0.0
  38825. *
  38826. * @generic {Phaser.Geom.Point} O - [out,$return]
  38827. *
  38828. * @param {Phaser.Geom.Circle} circle - The Circle to get a random point from.
  38829. * @param {(Phaser.Geom.Point|object)} [out] - A Point or point-like object to set the random `x` and `y` values in.
  38830. *
  38831. * @return {(Phaser.Geom.Point|object)} A Point object with the random values set in the `x` and `y` properties.
  38832. */
  38833. var Random = function (circle, out)
  38834. {
  38835. if (out === undefined) { out = new Point(); }
  38836. var t = 2 * Math.PI * Math.random();
  38837. var u = Math.random() + Math.random();
  38838. var r = (u > 1) ? 2 - u : u;
  38839. var x = r * Math.cos(t);
  38840. var y = r * Math.sin(t);
  38841. out.x = circle.x + (x * circle.radius);
  38842. out.y = circle.y + (y * circle.radius);
  38843. return out;
  38844. };
  38845. module.exports = Random;
  38846. /***/ }),
  38847. /* 207 */
  38848. /***/ (function(module, exports, __webpack_require__) {
  38849. /**
  38850. * @author Richard Davey <rich@photonstorm.com>
  38851. * @copyright 2019 Photon Storm Ltd.
  38852. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  38853. */
  38854. var Point = __webpack_require__(6);
  38855. /**
  38856. * Returns a Point object containing the coordinates of a point on the circumference of the Circle based on the given angle.
  38857. *
  38858. * @function Phaser.Geom.Circle.CircumferencePoint
  38859. * @since 3.0.0
  38860. *
  38861. * @generic {Phaser.Geom.Point} O - [out,$return]
  38862. *
  38863. * @param {Phaser.Geom.Circle} circle - The Circle to get the circumference point on.
  38864. * @param {number} angle - The angle from the center of the Circle to the circumference to return the point from. Given in radians.
  38865. * @param {(Phaser.Geom.Point|object)} [out] - A Point, or point-like object, to store the results in. If not given a Point will be created.
  38866. *
  38867. * @return {(Phaser.Geom.Point|object)} A Point object where the `x` and `y` properties are the point on the circumference.
  38868. */
  38869. var CircumferencePoint = function (circle, angle, out)
  38870. {
  38871. if (out === undefined) { out = new Point(); }
  38872. out.x = circle.x + (circle.radius * Math.cos(angle));
  38873. out.y = circle.y + (circle.radius * Math.sin(angle));
  38874. return out;
  38875. };
  38876. module.exports = CircumferencePoint;
  38877. /***/ }),
  38878. /* 208 */
  38879. /***/ (function(module, exports) {
  38880. /**
  38881. * @author Richard Davey <rich@photonstorm.com>
  38882. * @copyright 2019 Photon Storm Ltd.
  38883. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  38884. */
  38885. var ALIGN_CONST = {
  38886. /**
  38887. * A constant representing a top-left alignment or position.
  38888. * @constant
  38889. * @name Phaser.Display.Align.TOP_LEFT
  38890. * @since 3.0.0
  38891. * @type {integer}
  38892. */
  38893. TOP_LEFT: 0,
  38894. /**
  38895. * A constant representing a top-center alignment or position.
  38896. * @constant
  38897. * @name Phaser.Display.Align.TOP_CENTER
  38898. * @since 3.0.0
  38899. * @type {integer}
  38900. */
  38901. TOP_CENTER: 1,
  38902. /**
  38903. * A constant representing a top-right alignment or position.
  38904. * @constant
  38905. * @name Phaser.Display.Align.TOP_RIGHT
  38906. * @since 3.0.0
  38907. * @type {integer}
  38908. */
  38909. TOP_RIGHT: 2,
  38910. /**
  38911. * A constant representing a left-top alignment or position.
  38912. * @constant
  38913. * @name Phaser.Display.Align.LEFT_TOP
  38914. * @since 3.0.0
  38915. * @type {integer}
  38916. */
  38917. LEFT_TOP: 3,
  38918. /**
  38919. * A constant representing a left-center alignment or position.
  38920. * @constant
  38921. * @name Phaser.Display.Align.LEFT_CENTER
  38922. * @since 3.0.0
  38923. * @type {integer}
  38924. */
  38925. LEFT_CENTER: 4,
  38926. /**
  38927. * A constant representing a left-bottom alignment or position.
  38928. * @constant
  38929. * @name Phaser.Display.Align.LEFT_BOTTOM
  38930. * @since 3.0.0
  38931. * @type {integer}
  38932. */
  38933. LEFT_BOTTOM: 5,
  38934. /**
  38935. * A constant representing a center alignment or position.
  38936. * @constant
  38937. * @name Phaser.Display.Align.CENTER
  38938. * @since 3.0.0
  38939. * @type {integer}
  38940. */
  38941. CENTER: 6,
  38942. /**
  38943. * A constant representing a right-top alignment or position.
  38944. * @constant
  38945. * @name Phaser.Display.Align.RIGHT_TOP
  38946. * @since 3.0.0
  38947. * @type {integer}
  38948. */
  38949. RIGHT_TOP: 7,
  38950. /**
  38951. * A constant representing a right-center alignment or position.
  38952. * @constant
  38953. * @name Phaser.Display.Align.RIGHT_CENTER
  38954. * @since 3.0.0
  38955. * @type {integer}
  38956. */
  38957. RIGHT_CENTER: 8,
  38958. /**
  38959. * A constant representing a right-bottom alignment or position.
  38960. * @constant
  38961. * @name Phaser.Display.Align.RIGHT_BOTTOM
  38962. * @since 3.0.0
  38963. * @type {integer}
  38964. */
  38965. RIGHT_BOTTOM: 9,
  38966. /**
  38967. * A constant representing a bottom-left alignment or position.
  38968. * @constant
  38969. * @name Phaser.Display.Align.BOTTOM_LEFT
  38970. * @since 3.0.0
  38971. * @type {integer}
  38972. */
  38973. BOTTOM_LEFT: 10,
  38974. /**
  38975. * A constant representing a bottom-center alignment or position.
  38976. * @constant
  38977. * @name Phaser.Display.Align.BOTTOM_CENTER
  38978. * @since 3.0.0
  38979. * @type {integer}
  38980. */
  38981. BOTTOM_CENTER: 11,
  38982. /**
  38983. * A constant representing a bottom-right alignment or position.
  38984. * @constant
  38985. * @name Phaser.Display.Align.BOTTOM_RIGHT
  38986. * @since 3.0.0
  38987. * @type {integer}
  38988. */
  38989. BOTTOM_RIGHT: 12
  38990. };
  38991. module.exports = ALIGN_CONST;
  38992. /***/ }),
  38993. /* 209 */
  38994. /***/ (function(module, exports, __webpack_require__) {
  38995. /**
  38996. * The `Matter.Constraint` module contains methods for creating and manipulating constraints.
  38997. * Constraints are used for specifying that a fixed distance must be maintained between two bodies (or a body and a fixed world-space position).
  38998. * The stiffness of constraints can be modified to create springs or elastic.
  38999. *
  39000. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  39001. *
  39002. * @class Constraint
  39003. */
  39004. var Constraint = {};
  39005. module.exports = Constraint;
  39006. var Vertices = __webpack_require__(82);
  39007. var Vector = __webpack_require__(87);
  39008. var Sleeping = __webpack_require__(238);
  39009. var Bounds = __webpack_require__(86);
  39010. var Axes = __webpack_require__(546);
  39011. var Common = __webpack_require__(36);
  39012. (function() {
  39013. Constraint._warming = 0.4;
  39014. Constraint._torqueDampen = 1;
  39015. Constraint._minLength = 0.000001;
  39016. /**
  39017. * Creates a new constraint.
  39018. * All properties have default values, and many are pre-calculated automatically based on other properties.
  39019. * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` value (e.g. `0.7` or above).
  39020. * If the constraint is unstable, try lowering the `stiffness` value and / or increasing `engine.constraintIterations`.
  39021. * For compound bodies, constraints must be applied to the parent body (not one of its parts).
  39022. * See the properties section below for detailed information on what you can pass via the `options` object.
  39023. * @method create
  39024. * @param {} options
  39025. * @return {constraint} constraint
  39026. */
  39027. Constraint.create = function(options) {
  39028. var constraint = options;
  39029. // if bodies defined but no points, use body centre
  39030. if (constraint.bodyA && !constraint.pointA)
  39031. constraint.pointA = { x: 0, y: 0 };
  39032. if (constraint.bodyB && !constraint.pointB)
  39033. constraint.pointB = { x: 0, y: 0 };
  39034. // calculate static length using initial world space points
  39035. var initialPointA = constraint.bodyA ? Vector.add(constraint.bodyA.position, constraint.pointA) : constraint.pointA,
  39036. initialPointB = constraint.bodyB ? Vector.add(constraint.bodyB.position, constraint.pointB) : constraint.pointB,
  39037. length = Vector.magnitude(Vector.sub(initialPointA, initialPointB));
  39038. constraint.length = typeof constraint.length !== 'undefined' ? constraint.length : length;
  39039. // option defaults
  39040. constraint.id = constraint.id || Common.nextId();
  39041. constraint.label = constraint.label || 'Constraint';
  39042. constraint.type = 'constraint';
  39043. constraint.stiffness = constraint.stiffness || (constraint.length > 0 ? 1 : 0.7);
  39044. constraint.damping = constraint.damping || 0;
  39045. constraint.angularStiffness = constraint.angularStiffness || 0;
  39046. constraint.angleA = constraint.bodyA ? constraint.bodyA.angle : constraint.angleA;
  39047. constraint.angleB = constraint.bodyB ? constraint.bodyB.angle : constraint.angleB;
  39048. constraint.plugin = {};
  39049. // render
  39050. var render = {
  39051. visible: true,
  39052. lineWidth: 2,
  39053. strokeStyle: '#ffffff',
  39054. type: 'line',
  39055. anchors: true
  39056. };
  39057. if (constraint.length === 0 && constraint.stiffness > 0.1) {
  39058. render.type = 'pin';
  39059. render.anchors = false;
  39060. } else if (constraint.stiffness < 0.9) {
  39061. render.type = 'spring';
  39062. }
  39063. constraint.render = Common.extend(render, constraint.render);
  39064. return constraint;
  39065. };
  39066. /**
  39067. * Prepares for solving by constraint warming.
  39068. * @private
  39069. * @method preSolveAll
  39070. * @param {body[]} bodies
  39071. */
  39072. Constraint.preSolveAll = function(bodies) {
  39073. for (var i = 0; i < bodies.length; i += 1) {
  39074. var body = bodies[i],
  39075. impulse = body.constraintImpulse;
  39076. if (body.isStatic || (impulse.x === 0 && impulse.y === 0 && impulse.angle === 0)) {
  39077. continue;
  39078. }
  39079. body.position.x += impulse.x;
  39080. body.position.y += impulse.y;
  39081. body.angle += impulse.angle;
  39082. }
  39083. };
  39084. /**
  39085. * Solves all constraints in a list of collisions.
  39086. * @private
  39087. * @method solveAll
  39088. * @param {constraint[]} constraints
  39089. * @param {number} timeScale
  39090. */
  39091. Constraint.solveAll = function(constraints, timeScale) {
  39092. // Solve fixed constraints first.
  39093. for (var i = 0; i < constraints.length; i += 1) {
  39094. var constraint = constraints[i],
  39095. fixedA = !constraint.bodyA || (constraint.bodyA && constraint.bodyA.isStatic),
  39096. fixedB = !constraint.bodyB || (constraint.bodyB && constraint.bodyB.isStatic);
  39097. if (fixedA || fixedB) {
  39098. Constraint.solve(constraints[i], timeScale);
  39099. }
  39100. }
  39101. // Solve free constraints last.
  39102. for (i = 0; i < constraints.length; i += 1) {
  39103. constraint = constraints[i];
  39104. fixedA = !constraint.bodyA || (constraint.bodyA && constraint.bodyA.isStatic);
  39105. fixedB = !constraint.bodyB || (constraint.bodyB && constraint.bodyB.isStatic);
  39106. if (!fixedA && !fixedB) {
  39107. Constraint.solve(constraints[i], timeScale);
  39108. }
  39109. }
  39110. };
  39111. /**
  39112. * Solves a distance constraint with Gauss-Siedel method.
  39113. * @private
  39114. * @method solve
  39115. * @param {constraint} constraint
  39116. * @param {number} timeScale
  39117. */
  39118. Constraint.solve = function(constraint, timeScale) {
  39119. var bodyA = constraint.bodyA,
  39120. bodyB = constraint.bodyB,
  39121. pointA = constraint.pointA,
  39122. pointB = constraint.pointB;
  39123. if (!bodyA && !bodyB)
  39124. return;
  39125. // update reference angle
  39126. if (bodyA && !bodyA.isStatic) {
  39127. Vector.rotate(pointA, bodyA.angle - constraint.angleA, pointA);
  39128. constraint.angleA = bodyA.angle;
  39129. }
  39130. // update reference angle
  39131. if (bodyB && !bodyB.isStatic) {
  39132. Vector.rotate(pointB, bodyB.angle - constraint.angleB, pointB);
  39133. constraint.angleB = bodyB.angle;
  39134. }
  39135. var pointAWorld = pointA,
  39136. pointBWorld = pointB;
  39137. if (bodyA) pointAWorld = Vector.add(bodyA.position, pointA);
  39138. if (bodyB) pointBWorld = Vector.add(bodyB.position, pointB);
  39139. if (!pointAWorld || !pointBWorld)
  39140. return;
  39141. var delta = Vector.sub(pointAWorld, pointBWorld),
  39142. currentLength = Vector.magnitude(delta);
  39143. // prevent singularity
  39144. if (currentLength < Constraint._minLength) {
  39145. currentLength = Constraint._minLength;
  39146. }
  39147. // solve distance constraint with Gauss-Siedel method
  39148. var difference = (currentLength - constraint.length) / currentLength,
  39149. stiffness = constraint.stiffness < 1 ? constraint.stiffness * timeScale : constraint.stiffness,
  39150. force = Vector.mult(delta, difference * stiffness),
  39151. massTotal = (bodyA ? bodyA.inverseMass : 0) + (bodyB ? bodyB.inverseMass : 0),
  39152. inertiaTotal = (bodyA ? bodyA.inverseInertia : 0) + (bodyB ? bodyB.inverseInertia : 0),
  39153. resistanceTotal = massTotal + inertiaTotal,
  39154. torque,
  39155. share,
  39156. normal,
  39157. normalVelocity,
  39158. relativeVelocity;
  39159. if (constraint.damping) {
  39160. var zero = Vector.create();
  39161. normal = Vector.div(delta, currentLength);
  39162. relativeVelocity = Vector.sub(
  39163. bodyB && Vector.sub(bodyB.position, bodyB.positionPrev) || zero,
  39164. bodyA && Vector.sub(bodyA.position, bodyA.positionPrev) || zero
  39165. );
  39166. normalVelocity = Vector.dot(normal, relativeVelocity);
  39167. }
  39168. if (bodyA && !bodyA.isStatic) {
  39169. share = bodyA.inverseMass / massTotal;
  39170. // keep track of applied impulses for post solving
  39171. bodyA.constraintImpulse.x -= force.x * share;
  39172. bodyA.constraintImpulse.y -= force.y * share;
  39173. // apply forces
  39174. bodyA.position.x -= force.x * share;
  39175. bodyA.position.y -= force.y * share;
  39176. // apply damping
  39177. if (constraint.damping) {
  39178. bodyA.positionPrev.x -= constraint.damping * normal.x * normalVelocity * share;
  39179. bodyA.positionPrev.y -= constraint.damping * normal.y * normalVelocity * share;
  39180. }
  39181. // apply torque
  39182. torque = (Vector.cross(pointA, force) / resistanceTotal) * Constraint._torqueDampen * bodyA.inverseInertia * (1 - constraint.angularStiffness);
  39183. bodyA.constraintImpulse.angle -= torque;
  39184. bodyA.angle -= torque;
  39185. }
  39186. if (bodyB && !bodyB.isStatic) {
  39187. share = bodyB.inverseMass / massTotal;
  39188. // keep track of applied impulses for post solving
  39189. bodyB.constraintImpulse.x += force.x * share;
  39190. bodyB.constraintImpulse.y += force.y * share;
  39191. // apply forces
  39192. bodyB.position.x += force.x * share;
  39193. bodyB.position.y += force.y * share;
  39194. // apply damping
  39195. if (constraint.damping) {
  39196. bodyB.positionPrev.x += constraint.damping * normal.x * normalVelocity * share;
  39197. bodyB.positionPrev.y += constraint.damping * normal.y * normalVelocity * share;
  39198. }
  39199. // apply torque
  39200. torque = (Vector.cross(pointB, force) / resistanceTotal) * Constraint._torqueDampen * bodyB.inverseInertia * (1 - constraint.angularStiffness);
  39201. bodyB.constraintImpulse.angle += torque;
  39202. bodyB.angle += torque;
  39203. }
  39204. };
  39205. /**
  39206. * Performs body updates required after solving constraints.
  39207. * @private
  39208. * @method postSolveAll
  39209. * @param {body[]} bodies
  39210. */
  39211. Constraint.postSolveAll = function(bodies) {
  39212. for (var i = 0; i < bodies.length; i++) {
  39213. var body = bodies[i],
  39214. impulse = body.constraintImpulse;
  39215. if (body.isStatic || (impulse.x === 0 && impulse.y === 0 && impulse.angle === 0)) {
  39216. continue;
  39217. }
  39218. Sleeping.set(body, false);
  39219. // update geometry and reset
  39220. for (var j = 0; j < body.parts.length; j++) {
  39221. var part = body.parts[j];
  39222. Vertices.translate(part.vertices, impulse);
  39223. if (j > 0) {
  39224. part.position.x += impulse.x;
  39225. part.position.y += impulse.y;
  39226. }
  39227. if (impulse.angle !== 0) {
  39228. Vertices.rotate(part.vertices, impulse.angle, body.position);
  39229. Axes.rotate(part.axes, impulse.angle);
  39230. if (j > 0) {
  39231. Vector.rotateAbout(part.position, impulse.angle, body.position, part.position);
  39232. }
  39233. }
  39234. Bounds.update(part.bounds, part.vertices, body.velocity);
  39235. }
  39236. // dampen the cached impulse for warming next step
  39237. impulse.angle *= Constraint._warming;
  39238. impulse.x *= Constraint._warming;
  39239. impulse.y *= Constraint._warming;
  39240. }
  39241. };
  39242. /*
  39243. *
  39244. * Properties Documentation
  39245. *
  39246. */
  39247. /**
  39248. * An integer `Number` uniquely identifying number generated in `Composite.create` by `Common.nextId`.
  39249. *
  39250. * @property id
  39251. * @type number
  39252. */
  39253. /**
  39254. * A `String` denoting the type of object.
  39255. *
  39256. * @property type
  39257. * @type string
  39258. * @default "constraint"
  39259. * @readOnly
  39260. */
  39261. /**
  39262. * An arbitrary `String` name to help the user identify and manage bodies.
  39263. *
  39264. * @property label
  39265. * @type string
  39266. * @default "Constraint"
  39267. */
  39268. /**
  39269. * An `Object` that defines the rendering properties to be consumed by the module `Matter.Render`.
  39270. *
  39271. * @property render
  39272. * @type object
  39273. */
  39274. /**
  39275. * A flag that indicates if the constraint should be rendered.
  39276. *
  39277. * @property render.visible
  39278. * @type boolean
  39279. * @default true
  39280. */
  39281. /**
  39282. * A `Number` that defines the line width to use when rendering the constraint outline.
  39283. * A value of `0` means no outline will be rendered.
  39284. *
  39285. * @property render.lineWidth
  39286. * @type number
  39287. * @default 2
  39288. */
  39289. /**
  39290. * A `String` that defines the stroke style to use when rendering the constraint outline.
  39291. * It is the same as when using a canvas, so it accepts CSS style property values.
  39292. *
  39293. * @property render.strokeStyle
  39294. * @type string
  39295. * @default a random colour
  39296. */
  39297. /**
  39298. * A `String` that defines the constraint rendering type.
  39299. * The possible values are 'line', 'pin', 'spring'.
  39300. * An appropriate render type will be automatically chosen unless one is given in options.
  39301. *
  39302. * @property render.type
  39303. * @type string
  39304. * @default 'line'
  39305. */
  39306. /**
  39307. * A `Boolean` that defines if the constraint's anchor points should be rendered.
  39308. *
  39309. * @property render.anchors
  39310. * @type boolean
  39311. * @default true
  39312. */
  39313. /**
  39314. * The first possible `Body` that this constraint is attached to.
  39315. *
  39316. * @property bodyA
  39317. * @type body
  39318. * @default null
  39319. */
  39320. /**
  39321. * The second possible `Body` that this constraint is attached to.
  39322. *
  39323. * @property bodyB
  39324. * @type body
  39325. * @default null
  39326. */
  39327. /**
  39328. * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyA` if defined, otherwise a world-space position.
  39329. *
  39330. * @property pointA
  39331. * @type vector
  39332. * @default { x: 0, y: 0 }
  39333. */
  39334. /**
  39335. * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyB` if defined, otherwise a world-space position.
  39336. *
  39337. * @property pointB
  39338. * @type vector
  39339. * @default { x: 0, y: 0 }
  39340. */
  39341. /**
  39342. * A `Number` that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`.
  39343. * A value of `1` means the constraint should be very stiff.
  39344. * A value of `0.2` means the constraint acts like a soft spring.
  39345. *
  39346. * @property stiffness
  39347. * @type number
  39348. * @default 1
  39349. */
  39350. /**
  39351. * A `Number` that specifies the damping of the constraint,
  39352. * i.e. the amount of resistance applied to each body based on their velocities to limit the amount of oscillation.
  39353. * Damping will only be apparent when the constraint also has a very low `stiffness`.
  39354. * A value of `0.1` means the constraint will apply heavy damping, resulting in little to no oscillation.
  39355. * A value of `0` means the constraint will apply no damping.
  39356. *
  39357. * @property damping
  39358. * @type number
  39359. * @default 0
  39360. */
  39361. /**
  39362. * A `Number` that specifies the target resting length of the constraint.
  39363. * It is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`.
  39364. *
  39365. * @property length
  39366. * @type number
  39367. */
  39368. /**
  39369. * An object reserved for storing plugin-specific properties.
  39370. *
  39371. * @property plugin
  39372. * @type {}
  39373. */
  39374. })();
  39375. /***/ }),
  39376. /* 210 */
  39377. /***/ (function(module, exports, __webpack_require__) {
  39378. /**
  39379. * The `Matter.Events` module contains methods to fire and listen to events on other objects.
  39380. *
  39381. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  39382. *
  39383. * @class Events
  39384. */
  39385. var Events = {};
  39386. module.exports = Events;
  39387. var Common = __webpack_require__(36);
  39388. (function() {
  39389. /**
  39390. * Subscribes a callback function to the given object's `eventName`.
  39391. * @method on
  39392. * @param {} object
  39393. * @param {string} eventNames
  39394. * @param {function} callback
  39395. */
  39396. Events.on = function(object, eventNames, callback) {
  39397. var names = eventNames.split(' '),
  39398. name;
  39399. for (var i = 0; i < names.length; i++) {
  39400. name = names[i];
  39401. object.events = object.events || {};
  39402. object.events[name] = object.events[name] || [];
  39403. object.events[name].push(callback);
  39404. }
  39405. return callback;
  39406. };
  39407. /**
  39408. * Removes the given event callback. If no callback, clears all callbacks in `eventNames`. If no `eventNames`, clears all events.
  39409. * @method off
  39410. * @param {} object
  39411. * @param {string} eventNames
  39412. * @param {function} callback
  39413. */
  39414. Events.off = function(object, eventNames, callback) {
  39415. if (!eventNames) {
  39416. object.events = {};
  39417. return;
  39418. }
  39419. // handle Events.off(object, callback)
  39420. if (typeof eventNames === 'function') {
  39421. callback = eventNames;
  39422. eventNames = Common.keys(object.events).join(' ');
  39423. }
  39424. var names = eventNames.split(' ');
  39425. for (var i = 0; i < names.length; i++) {
  39426. var callbacks = object.events[names[i]],
  39427. newCallbacks = [];
  39428. if (callback && callbacks) {
  39429. for (var j = 0; j < callbacks.length; j++) {
  39430. if (callbacks[j] !== callback)
  39431. newCallbacks.push(callbacks[j]);
  39432. }
  39433. }
  39434. object.events[names[i]] = newCallbacks;
  39435. }
  39436. };
  39437. /**
  39438. * Fires all the callbacks subscribed to the given object's `eventName`, in the order they subscribed, if any.
  39439. * @method trigger
  39440. * @param {} object
  39441. * @param {string} eventNames
  39442. * @param {} event
  39443. */
  39444. Events.trigger = function(object, eventNames, event) {
  39445. var names,
  39446. name,
  39447. callbacks,
  39448. eventClone;
  39449. var events = object.events;
  39450. if (events && Common.keys(events).length > 0) {
  39451. if (!event)
  39452. event = {};
  39453. names = eventNames.split(' ');
  39454. for (var i = 0; i < names.length; i++) {
  39455. name = names[i];
  39456. callbacks = events[name];
  39457. if (callbacks) {
  39458. eventClone = Common.clone(event, false);
  39459. eventClone.name = name;
  39460. eventClone.source = object;
  39461. for (var j = 0; j < callbacks.length; j++) {
  39462. callbacks[j].apply(object, [eventClone]);
  39463. }
  39464. }
  39465. }
  39466. }
  39467. };
  39468. })();
  39469. /***/ }),
  39470. /* 211 */
  39471. /***/ (function(module, exports, __webpack_require__) {
  39472. /**
  39473. * @author Richard Davey <rich@photonstorm.com>
  39474. * @author Felipe Alfonso <@bitnenfer>
  39475. * @copyright 2019 Photon Storm Ltd.
  39476. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  39477. */
  39478. var Class = __webpack_require__(0);
  39479. var Earcut = __webpack_require__(71);
  39480. var GetFastValue = __webpack_require__(2);
  39481. var ModelViewProjection = __webpack_require__(1041);
  39482. var ShaderSourceFS = __webpack_require__(1040);
  39483. var ShaderSourceVS = __webpack_require__(1039);
  39484. var TransformMatrix = __webpack_require__(41);
  39485. var Utils = __webpack_require__(9);
  39486. var WebGLPipeline = __webpack_require__(212);
  39487. /**
  39488. * @classdesc
  39489. * TextureTintPipeline implements the rendering infrastructure
  39490. * for displaying textured objects
  39491. * The config properties are:
  39492. * - game: Current game instance.
  39493. * - renderer: Current WebGL renderer.
  39494. * - topology: This indicates how the primitives are rendered. The default value is GL_TRIANGLES.
  39495. * Here is the full list of rendering primitives (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants).
  39496. * - vertShader: Source for vertex shader as a string.
  39497. * - fragShader: Source for fragment shader as a string.
  39498. * - vertexCapacity: The amount of vertices that shall be allocated
  39499. * - vertexSize: The size of a single vertex in bytes.
  39500. *
  39501. * @class TextureTintPipeline
  39502. * @extends Phaser.Renderer.WebGL.WebGLPipeline
  39503. * @memberof Phaser.Renderer.WebGL.Pipelines
  39504. * @constructor
  39505. * @since 3.0.0
  39506. *
  39507. * @param {object} config - The configuration options for this Texture Tint Pipeline, as described above.
  39508. */
  39509. var TextureTintPipeline = new Class({
  39510. Extends: WebGLPipeline,
  39511. Mixins: [
  39512. ModelViewProjection
  39513. ],
  39514. initialize:
  39515. function TextureTintPipeline (config)
  39516. {
  39517. var rendererConfig = config.renderer.config;
  39518. // Vertex Size = attribute size added together (2 + 2 + 1 + 4)
  39519. WebGLPipeline.call(this, {
  39520. game: config.game,
  39521. renderer: config.renderer,
  39522. gl: config.renderer.gl,
  39523. topology: GetFastValue(config, 'topology', config.renderer.gl.TRIANGLES),
  39524. vertShader: GetFastValue(config, 'vertShader', ShaderSourceVS),
  39525. fragShader: GetFastValue(config, 'fragShader', ShaderSourceFS),
  39526. vertexCapacity: GetFastValue(config, 'vertexCapacity', 6 * rendererConfig.batchSize),
  39527. vertexSize: GetFastValue(config, 'vertexSize', Float32Array.BYTES_PER_ELEMENT * 5 + Uint8Array.BYTES_PER_ELEMENT * 4),
  39528. attributes: [
  39529. {
  39530. name: 'inPosition',
  39531. size: 2,
  39532. type: config.renderer.gl.FLOAT,
  39533. normalized: false,
  39534. offset: 0
  39535. },
  39536. {
  39537. name: 'inTexCoord',
  39538. size: 2,
  39539. type: config.renderer.gl.FLOAT,
  39540. normalized: false,
  39541. offset: Float32Array.BYTES_PER_ELEMENT * 2
  39542. },
  39543. {
  39544. name: 'inTintEffect',
  39545. size: 1,
  39546. type: config.renderer.gl.FLOAT,
  39547. normalized: false,
  39548. offset: Float32Array.BYTES_PER_ELEMENT * 4
  39549. },
  39550. {
  39551. name: 'inTint',
  39552. size: 4,
  39553. type: config.renderer.gl.UNSIGNED_BYTE,
  39554. normalized: true,
  39555. offset: Float32Array.BYTES_PER_ELEMENT * 5
  39556. }
  39557. ]
  39558. });
  39559. /**
  39560. * Float32 view of the array buffer containing the pipeline's vertices.
  39561. *
  39562. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#vertexViewF32
  39563. * @type {Float32Array}
  39564. * @since 3.0.0
  39565. */
  39566. this.vertexViewF32 = new Float32Array(this.vertexData);
  39567. /**
  39568. * Uint32 view of the array buffer containing the pipeline's vertices.
  39569. *
  39570. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#vertexViewU32
  39571. * @type {Uint32Array}
  39572. * @since 3.0.0
  39573. */
  39574. this.vertexViewU32 = new Uint32Array(this.vertexData);
  39575. /**
  39576. * Size of the batch.
  39577. *
  39578. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#maxQuads
  39579. * @type {integer}
  39580. * @since 3.0.0
  39581. */
  39582. this.maxQuads = rendererConfig.batchSize;
  39583. /**
  39584. * Collection of batch information
  39585. *
  39586. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batches
  39587. * @type {array}
  39588. * @since 3.1.0
  39589. */
  39590. this.batches = [];
  39591. /**
  39592. * A temporary Transform Matrix, re-used internally during batching.
  39593. *
  39594. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#_tempMatrix1
  39595. * @private
  39596. * @type {Phaser.GameObjects.Components.TransformMatrix}
  39597. * @since 3.11.0
  39598. */
  39599. this._tempMatrix1 = new TransformMatrix();
  39600. /**
  39601. * A temporary Transform Matrix, re-used internally during batching.
  39602. *
  39603. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#_tempMatrix2
  39604. * @private
  39605. * @type {Phaser.GameObjects.Components.TransformMatrix}
  39606. * @since 3.11.0
  39607. */
  39608. this._tempMatrix2 = new TransformMatrix();
  39609. /**
  39610. * A temporary Transform Matrix, re-used internally during batching.
  39611. *
  39612. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#_tempMatrix3
  39613. * @private
  39614. * @type {Phaser.GameObjects.Components.TransformMatrix}
  39615. * @since 3.11.0
  39616. */
  39617. this._tempMatrix3 = new TransformMatrix();
  39618. /**
  39619. * A temporary Transform Matrix, re-used internally during batching.
  39620. *
  39621. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#_tempMatrix4
  39622. * @private
  39623. * @type {Phaser.GameObjects.Components.TransformMatrix}
  39624. * @since 3.11.0
  39625. */
  39626. this._tempMatrix4 = new TransformMatrix();
  39627. /**
  39628. * Used internally to draw stroked triangles.
  39629. *
  39630. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#tempTriangle
  39631. * @type {array}
  39632. * @private
  39633. * @since 3.12.0
  39634. */
  39635. this.tempTriangle = [
  39636. { x: 0, y: 0, width: 0 },
  39637. { x: 0, y: 0, width: 0 },
  39638. { x: 0, y: 0, width: 0 },
  39639. { x: 0, y: 0, width: 0 }
  39640. ];
  39641. /**
  39642. * The tint effect to be applied by the shader in the next geometry draw:
  39643. *
  39644. * 0 = texture multiplied by color
  39645. * 1 = solid color + texture alpha
  39646. * 2 = solid color, no texture
  39647. * 3 = solid texture, no color
  39648. *
  39649. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#tintEffect
  39650. * @type {number}
  39651. * @private
  39652. * @since 3.12.0
  39653. */
  39654. this.tintEffect = 2;
  39655. /**
  39656. * Cached stroke tint.
  39657. *
  39658. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#strokeTint
  39659. * @type {object}
  39660. * @private
  39661. * @since 3.12.0
  39662. */
  39663. this.strokeTint = { TL: 0, TR: 0, BL: 0, BR: 0 };
  39664. /**
  39665. * Cached fill tint.
  39666. *
  39667. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#fillTint
  39668. * @type {object}
  39669. * @private
  39670. * @since 3.12.0
  39671. */
  39672. this.fillTint = { TL: 0, TR: 0, BL: 0, BR: 0 };
  39673. /**
  39674. * Internal texture frame reference.
  39675. *
  39676. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#currentFrame
  39677. * @type {Phaser.Textures.Frame}
  39678. * @private
  39679. * @since 3.12.0
  39680. */
  39681. this.currentFrame = { u0: 0, v0: 0, u1: 1, v1: 1 };
  39682. /**
  39683. * Internal path quad cache.
  39684. *
  39685. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#firstQuad
  39686. * @type {array}
  39687. * @private
  39688. * @since 3.12.0
  39689. */
  39690. this.firstQuad = [ 0, 0, 0, 0, 0 ];
  39691. /**
  39692. * Internal path quad cache.
  39693. *
  39694. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#prevQuad
  39695. * @type {array}
  39696. * @private
  39697. * @since 3.12.0
  39698. */
  39699. this.prevQuad = [ 0, 0, 0, 0, 0 ];
  39700. /**
  39701. * Used internally for triangulating a polygon.
  39702. *
  39703. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#polygonCache
  39704. * @type {array}
  39705. * @private
  39706. * @since 3.12.0
  39707. */
  39708. this.polygonCache = [];
  39709. this.mvpInit();
  39710. },
  39711. /**
  39712. * Called every time the pipeline needs to be used.
  39713. * It binds all necessary resources.
  39714. *
  39715. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#onBind
  39716. * @since 3.0.0
  39717. *
  39718. * @return {this} This WebGLPipeline instance.
  39719. */
  39720. onBind: function ()
  39721. {
  39722. WebGLPipeline.prototype.onBind.call(this);
  39723. this.mvpUpdate();
  39724. return this;
  39725. },
  39726. /**
  39727. * Resizes this pipeline and updates the projection.
  39728. *
  39729. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#resize
  39730. * @since 3.0.0
  39731. *
  39732. * @param {number} width - The new width.
  39733. * @param {number} height - The new height.
  39734. * @param {number} resolution - The resolution.
  39735. *
  39736. * @return {this} This WebGLPipeline instance.
  39737. */
  39738. resize: function (width, height, resolution)
  39739. {
  39740. WebGLPipeline.prototype.resize.call(this, width, height, resolution);
  39741. this.projOrtho(0, this.width, this.height, 0, -1000.0, 1000.0);
  39742. return this;
  39743. },
  39744. /**
  39745. * Assigns a texture to the current batch. If a different texture is already set it creates a new batch object.
  39746. *
  39747. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#setTexture2D
  39748. * @since 3.1.0
  39749. *
  39750. * @param {WebGLTexture} [texture] - WebGLTexture that will be assigned to the current batch. If not given uses blankTexture.
  39751. * @param {integer} [unit=0] - Texture unit to which the texture needs to be bound.
  39752. *
  39753. * @return {Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline} This pipeline instance.
  39754. */
  39755. setTexture2D: function (texture, unit)
  39756. {
  39757. if (texture === undefined) { texture = this.renderer.blankTexture.glTexture; }
  39758. if (unit === undefined) { unit = 0; }
  39759. if (this.requireTextureBatch(texture, unit))
  39760. {
  39761. this.pushBatch(texture, unit);
  39762. }
  39763. return this;
  39764. },
  39765. /**
  39766. * Checks if the current batch has the same texture and texture unit, or if we need to create a new batch.
  39767. *
  39768. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#requireTextureBatch
  39769. * @since 3.16.0
  39770. *
  39771. * @param {WebGLTexture} texture - WebGLTexture that will be assigned to the current batch. If not given uses blankTexture.
  39772. * @param {integer} unit - Texture unit to which the texture needs to be bound.
  39773. *
  39774. * @return {boolean} `true` if the pipeline needs to create a new batch, otherwise `false`.
  39775. */
  39776. requireTextureBatch: function (texture, unit)
  39777. {
  39778. var batches = this.batches;
  39779. var batchLength = batches.length;
  39780. if (batchLength > 0)
  39781. {
  39782. // If Texture Unit specified, we get the texture from the textures array, otherwise we use the texture property
  39783. var currentTexture = (unit > 0) ? batches[batchLength - 1].textures[unit - 1] : batches[batchLength - 1].texture;
  39784. return !(currentTexture === texture);
  39785. }
  39786. return true;
  39787. },
  39788. /**
  39789. * Creates a new batch object and pushes it to a batch array.
  39790. * The batch object contains information relevant to the current
  39791. * vertex batch like the offset in the vertex buffer, vertex count and
  39792. * the textures used by that batch.
  39793. *
  39794. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#pushBatch
  39795. * @since 3.1.0
  39796. *
  39797. * @param {WebGLTexture} texture - Optional WebGLTexture that will be assigned to the created batch.
  39798. * @param {integer} unit - Texture unit to which the texture needs to be bound.
  39799. */
  39800. pushBatch: function (texture, unit)
  39801. {
  39802. if (unit === 0)
  39803. {
  39804. this.batches.push({
  39805. first: this.vertexCount,
  39806. texture: texture,
  39807. textures: []
  39808. });
  39809. }
  39810. else
  39811. {
  39812. var textures = [];
  39813. textures[unit - 1] = texture;
  39814. this.batches.push({
  39815. first: this.vertexCount,
  39816. texture: null,
  39817. textures: textures
  39818. });
  39819. }
  39820. },
  39821. /**
  39822. * Uploads the vertex data and emits a draw call for the current batch of vertices.
  39823. *
  39824. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#flush
  39825. * @since 3.0.0
  39826. *
  39827. * @return {this} This WebGLPipeline instance.
  39828. */
  39829. flush: function ()
  39830. {
  39831. if (this.flushLocked)
  39832. {
  39833. return this;
  39834. }
  39835. this.flushLocked = true;
  39836. var gl = this.gl;
  39837. var vertexCount = this.vertexCount;
  39838. var topology = this.topology;
  39839. var vertexSize = this.vertexSize;
  39840. var renderer = this.renderer;
  39841. var batches = this.batches;
  39842. var batchCount = batches.length;
  39843. var batchVertexCount = 0;
  39844. var batch = null;
  39845. var batchNext;
  39846. var textureIndex;
  39847. var nTexture;
  39848. if (batchCount === 0 || vertexCount === 0)
  39849. {
  39850. this.flushLocked = false;
  39851. return this;
  39852. }
  39853. gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bytes.subarray(0, vertexCount * vertexSize));
  39854. // Process the TEXTURE BATCHES
  39855. for (var index = 0; index < batchCount - 1; index++)
  39856. {
  39857. batch = batches[index];
  39858. batchNext = batches[index + 1];
  39859. // Multi-texture check (for non-zero texture units)
  39860. if (batch.textures.length > 0)
  39861. {
  39862. for (textureIndex = 0; textureIndex < batch.textures.length; ++textureIndex)
  39863. {
  39864. nTexture = batch.textures[textureIndex];
  39865. if (nTexture)
  39866. {
  39867. renderer.setTexture2D(nTexture, 1 + textureIndex, false);
  39868. }
  39869. }
  39870. gl.activeTexture(gl.TEXTURE0);
  39871. }
  39872. batchVertexCount = batchNext.first - batch.first;
  39873. // Bail out if texture property is null (i.e. if a texture unit > 0)
  39874. if (batch.texture === null || batchVertexCount <= 0)
  39875. {
  39876. continue;
  39877. }
  39878. renderer.setTexture2D(batch.texture, 0, false);
  39879. gl.drawArrays(topology, batch.first, batchVertexCount);
  39880. }
  39881. // Left over data
  39882. batch = batches[batchCount - 1];
  39883. // Multi-texture check (for non-zero texture units)
  39884. if (batch.textures.length > 0)
  39885. {
  39886. for (textureIndex = 0; textureIndex < batch.textures.length; ++textureIndex)
  39887. {
  39888. nTexture = batch.textures[textureIndex];
  39889. if (nTexture)
  39890. {
  39891. renderer.setTexture2D(nTexture, 1 + textureIndex, false);
  39892. }
  39893. }
  39894. gl.activeTexture(gl.TEXTURE0);
  39895. }
  39896. batchVertexCount = vertexCount - batch.first;
  39897. if (batch.texture && batchVertexCount > 0)
  39898. {
  39899. renderer.setTexture2D(batch.texture, 0, false);
  39900. gl.drawArrays(topology, batch.first, batchVertexCount);
  39901. }
  39902. this.vertexCount = 0;
  39903. batches.length = 0;
  39904. this.flushLocked = false;
  39905. return this;
  39906. },
  39907. /**
  39908. * Takes a Sprite Game Object, or any object that extends it, and adds it to the batch.
  39909. *
  39910. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchSprite
  39911. * @since 3.0.0
  39912. *
  39913. * @param {(Phaser.GameObjects.Image|Phaser.GameObjects.Sprite)} sprite - The texture based Game Object to add to the batch.
  39914. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to use for the rendering transform.
  39915. * @param {Phaser.GameObjects.Components.TransformMatrix} [parentTransformMatrix] - The transform matrix of the parent container, if set.
  39916. */
  39917. batchSprite: function (sprite, camera, parentTransformMatrix)
  39918. {
  39919. // Will cause a flush if there are batchSize entries already
  39920. this.renderer.setPipeline(this);
  39921. var camMatrix = this._tempMatrix1;
  39922. var spriteMatrix = this._tempMatrix2;
  39923. var calcMatrix = this._tempMatrix3;
  39924. var frame = sprite.frame;
  39925. var texture = frame.glTexture;
  39926. var u0 = frame.u0;
  39927. var v0 = frame.v0;
  39928. var u1 = frame.u1;
  39929. var v1 = frame.v1;
  39930. var frameX = frame.x;
  39931. var frameY = frame.y;
  39932. var frameWidth = frame.cutWidth;
  39933. var frameHeight = frame.cutHeight;
  39934. var x = -sprite.displayOriginX + frameX;
  39935. var y = -sprite.displayOriginY + frameY;
  39936. if (sprite.isCropped)
  39937. {
  39938. var crop = sprite._crop;
  39939. if (crop.flipX !== sprite.flipX || crop.flipY !== sprite.flipY)
  39940. {
  39941. frame.updateCropUVs(crop, sprite.flipX, sprite.flipY);
  39942. }
  39943. u0 = crop.u0;
  39944. v0 = crop.v0;
  39945. u1 = crop.u1;
  39946. v1 = crop.v1;
  39947. frameWidth = crop.width;
  39948. frameHeight = crop.height;
  39949. frameX = crop.x;
  39950. frameY = crop.y;
  39951. x = -sprite.displayOriginX + frameX;
  39952. y = -sprite.displayOriginY + frameY;
  39953. }
  39954. if (sprite.flipX)
  39955. {
  39956. x += frameWidth;
  39957. frameWidth *= -1;
  39958. }
  39959. if (sprite.flipY)
  39960. {
  39961. y += frameHeight;
  39962. frameHeight *= -1;
  39963. }
  39964. var xw = x + frameWidth;
  39965. var yh = y + frameHeight;
  39966. spriteMatrix.applyITRS(sprite.x, sprite.y, sprite.rotation, sprite.scaleX, sprite.scaleY);
  39967. camMatrix.copyFrom(camera.matrix);
  39968. if (parentTransformMatrix)
  39969. {
  39970. // Multiply the camera by the parent matrix
  39971. camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * sprite.scrollFactorX, -camera.scrollY * sprite.scrollFactorY);
  39972. // Undo the camera scroll
  39973. spriteMatrix.e = sprite.x;
  39974. spriteMatrix.f = sprite.y;
  39975. // Multiply by the Sprite matrix, store result in calcMatrix
  39976. camMatrix.multiply(spriteMatrix, calcMatrix);
  39977. }
  39978. else
  39979. {
  39980. spriteMatrix.e -= camera.scrollX * sprite.scrollFactorX;
  39981. spriteMatrix.f -= camera.scrollY * sprite.scrollFactorY;
  39982. // Multiply by the Sprite matrix, store result in calcMatrix
  39983. camMatrix.multiply(spriteMatrix, calcMatrix);
  39984. }
  39985. var tx0 = calcMatrix.getX(x, y);
  39986. var ty0 = calcMatrix.getY(x, y);
  39987. var tx1 = calcMatrix.getX(x, yh);
  39988. var ty1 = calcMatrix.getY(x, yh);
  39989. var tx2 = calcMatrix.getX(xw, yh);
  39990. var ty2 = calcMatrix.getY(xw, yh);
  39991. var tx3 = calcMatrix.getX(xw, y);
  39992. var ty3 = calcMatrix.getY(xw, y);
  39993. var tintTL = Utils.getTintAppendFloatAlpha(sprite._tintTL, camera.alpha * sprite._alphaTL);
  39994. var tintTR = Utils.getTintAppendFloatAlpha(sprite._tintTR, camera.alpha * sprite._alphaTR);
  39995. var tintBL = Utils.getTintAppendFloatAlpha(sprite._tintBL, camera.alpha * sprite._alphaBL);
  39996. var tintBR = Utils.getTintAppendFloatAlpha(sprite._tintBR, camera.alpha * sprite._alphaBR);
  39997. if (camera.roundPixels)
  39998. {
  39999. tx0 = Math.round(tx0);
  40000. ty0 = Math.round(ty0);
  40001. tx1 = Math.round(tx1);
  40002. ty1 = Math.round(ty1);
  40003. tx2 = Math.round(tx2);
  40004. ty2 = Math.round(ty2);
  40005. tx3 = Math.round(tx3);
  40006. ty3 = Math.round(ty3);
  40007. }
  40008. this.setTexture2D(texture, 0);
  40009. var tintEffect = (sprite._isTinted && sprite.tintFill);
  40010. this.batchQuad(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, 0);
  40011. },
  40012. /**
  40013. * Adds the vertices data into the batch and flushes if full.
  40014. *
  40015. * Assumes 6 vertices in the following arrangement:
  40016. *
  40017. * ```
  40018. * 0----3
  40019. * |\ B|
  40020. * | \ |
  40021. * | \ |
  40022. * | A \|
  40023. * | \
  40024. * 1----2
  40025. * ```
  40026. *
  40027. * Where tx0/ty0 = 0, tx1/ty1 = 1, tx2/ty2 = 2 and tx3/ty3 = 3
  40028. *
  40029. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchQuad
  40030. * @since 3.12.0
  40031. *
  40032. * @param {number} x0 - The top-left x position.
  40033. * @param {number} y0 - The top-left y position.
  40034. * @param {number} x1 - The bottom-left x position.
  40035. * @param {number} y1 - The bottom-left y position.
  40036. * @param {number} x2 - The bottom-right x position.
  40037. * @param {number} y2 - The bottom-right y position.
  40038. * @param {number} x3 - The top-right x position.
  40039. * @param {number} y3 - The top-right y position.
  40040. * @param {number} u0 - UV u0 value.
  40041. * @param {number} v0 - UV v0 value.
  40042. * @param {number} u1 - UV u1 value.
  40043. * @param {number} v1 - UV v1 value.
  40044. * @param {number} tintTL - The top-left tint color value.
  40045. * @param {number} tintTR - The top-right tint color value.
  40046. * @param {number} tintBL - The bottom-left tint color value.
  40047. * @param {number} tintBR - The bottom-right tint color value.
  40048. * @param {(number|boolean)} tintEffect - The tint effect for the shader to use.
  40049. * @param {WebGLTexture} [texture] - WebGLTexture that will be assigned to the current batch if a flush occurs.
  40050. * @param {integer} [unit=0] - Texture unit to which the texture needs to be bound.
  40051. *
  40052. * @return {boolean} `true` if this method caused the batch to flush, otherwise `false`.
  40053. */
  40054. batchQuad: function (x0, y0, x1, y1, x2, y2, x3, y3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, unit)
  40055. {
  40056. var hasFlushed = false;
  40057. if (this.vertexCount + 6 > this.vertexCapacity)
  40058. {
  40059. this.flush();
  40060. hasFlushed = true;
  40061. this.setTexture2D(texture, unit);
  40062. }
  40063. var vertexViewF32 = this.vertexViewF32;
  40064. var vertexViewU32 = this.vertexViewU32;
  40065. var vertexOffset = (this.vertexCount * this.vertexComponentCount) - 1;
  40066. vertexViewF32[++vertexOffset] = x0;
  40067. vertexViewF32[++vertexOffset] = y0;
  40068. vertexViewF32[++vertexOffset] = u0;
  40069. vertexViewF32[++vertexOffset] = v0;
  40070. vertexViewF32[++vertexOffset] = tintEffect;
  40071. vertexViewU32[++vertexOffset] = tintTL;
  40072. vertexViewF32[++vertexOffset] = x1;
  40073. vertexViewF32[++vertexOffset] = y1;
  40074. vertexViewF32[++vertexOffset] = u0;
  40075. vertexViewF32[++vertexOffset] = v1;
  40076. vertexViewF32[++vertexOffset] = tintEffect;
  40077. vertexViewU32[++vertexOffset] = tintBL;
  40078. vertexViewF32[++vertexOffset] = x2;
  40079. vertexViewF32[++vertexOffset] = y2;
  40080. vertexViewF32[++vertexOffset] = u1;
  40081. vertexViewF32[++vertexOffset] = v1;
  40082. vertexViewF32[++vertexOffset] = tintEffect;
  40083. vertexViewU32[++vertexOffset] = tintBR;
  40084. vertexViewF32[++vertexOffset] = x0;
  40085. vertexViewF32[++vertexOffset] = y0;
  40086. vertexViewF32[++vertexOffset] = u0;
  40087. vertexViewF32[++vertexOffset] = v0;
  40088. vertexViewF32[++vertexOffset] = tintEffect;
  40089. vertexViewU32[++vertexOffset] = tintTL;
  40090. vertexViewF32[++vertexOffset] = x2;
  40091. vertexViewF32[++vertexOffset] = y2;
  40092. vertexViewF32[++vertexOffset] = u1;
  40093. vertexViewF32[++vertexOffset] = v1;
  40094. vertexViewF32[++vertexOffset] = tintEffect;
  40095. vertexViewU32[++vertexOffset] = tintBR;
  40096. vertexViewF32[++vertexOffset] = x3;
  40097. vertexViewF32[++vertexOffset] = y3;
  40098. vertexViewF32[++vertexOffset] = u1;
  40099. vertexViewF32[++vertexOffset] = v0;
  40100. vertexViewF32[++vertexOffset] = tintEffect;
  40101. vertexViewU32[++vertexOffset] = tintTR;
  40102. this.vertexCount += 6;
  40103. return hasFlushed;
  40104. },
  40105. /**
  40106. * Adds the vertices data into the batch and flushes if full.
  40107. *
  40108. * Assumes 3 vertices in the following arrangement:
  40109. *
  40110. * ```
  40111. * 0
  40112. * |\
  40113. * | \
  40114. * | \
  40115. * | \
  40116. * | \
  40117. * 1-----2
  40118. * ```
  40119. *
  40120. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchTri
  40121. * @since 3.12.0
  40122. *
  40123. * @param {number} x1 - The bottom-left x position.
  40124. * @param {number} y1 - The bottom-left y position.
  40125. * @param {number} x2 - The bottom-right x position.
  40126. * @param {number} y2 - The bottom-right y position.
  40127. * @param {number} x3 - The top-right x position.
  40128. * @param {number} y3 - The top-right y position.
  40129. * @param {number} u0 - UV u0 value.
  40130. * @param {number} v0 - UV v0 value.
  40131. * @param {number} u1 - UV u1 value.
  40132. * @param {number} v1 - UV v1 value.
  40133. * @param {number} tintTL - The top-left tint color value.
  40134. * @param {number} tintTR - The top-right tint color value.
  40135. * @param {number} tintBL - The bottom-left tint color value.
  40136. * @param {(number|boolean)} tintEffect - The tint effect for the shader to use.
  40137. * @param {WebGLTexture} [texture] - WebGLTexture that will be assigned to the current batch if a flush occurs.
  40138. * @param {integer} [unit=0] - Texture unit to which the texture needs to be bound.
  40139. *
  40140. * @return {boolean} `true` if this method caused the batch to flush, otherwise `false`.
  40141. */
  40142. batchTri: function (x1, y1, x2, y2, x3, y3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintEffect, texture, unit)
  40143. {
  40144. var hasFlushed = false;
  40145. if (this.vertexCount + 3 > this.vertexCapacity)
  40146. {
  40147. this.flush();
  40148. this.setTexture2D(texture, unit);
  40149. hasFlushed = true;
  40150. }
  40151. var vertexViewF32 = this.vertexViewF32;
  40152. var vertexViewU32 = this.vertexViewU32;
  40153. var vertexOffset = (this.vertexCount * this.vertexComponentCount) - 1;
  40154. vertexViewF32[++vertexOffset] = x1;
  40155. vertexViewF32[++vertexOffset] = y1;
  40156. vertexViewF32[++vertexOffset] = u0;
  40157. vertexViewF32[++vertexOffset] = v0;
  40158. vertexViewF32[++vertexOffset] = tintEffect;
  40159. vertexViewU32[++vertexOffset] = tintTL;
  40160. vertexViewF32[++vertexOffset] = x2;
  40161. vertexViewF32[++vertexOffset] = y2;
  40162. vertexViewF32[++vertexOffset] = u0;
  40163. vertexViewF32[++vertexOffset] = v1;
  40164. vertexViewF32[++vertexOffset] = tintEffect;
  40165. vertexViewU32[++vertexOffset] = tintTR;
  40166. vertexViewF32[++vertexOffset] = x3;
  40167. vertexViewF32[++vertexOffset] = y3;
  40168. vertexViewF32[++vertexOffset] = u1;
  40169. vertexViewF32[++vertexOffset] = v1;
  40170. vertexViewF32[++vertexOffset] = tintEffect;
  40171. vertexViewU32[++vertexOffset] = tintBL;
  40172. this.vertexCount += 3;
  40173. return hasFlushed;
  40174. },
  40175. /**
  40176. * Generic function for batching a textured quad using argument values instead of a Game Object.
  40177. *
  40178. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchTexture
  40179. * @since 3.0.0
  40180. *
  40181. * @param {Phaser.GameObjects.GameObject} gameObject - Source GameObject.
  40182. * @param {WebGLTexture} texture - Raw WebGLTexture associated with the quad.
  40183. * @param {integer} textureWidth - Real texture width.
  40184. * @param {integer} textureHeight - Real texture height.
  40185. * @param {number} srcX - X coordinate of the quad.
  40186. * @param {number} srcY - Y coordinate of the quad.
  40187. * @param {number} srcWidth - Width of the quad.
  40188. * @param {number} srcHeight - Height of the quad.
  40189. * @param {number} scaleX - X component of scale.
  40190. * @param {number} scaleY - Y component of scale.
  40191. * @param {number} rotation - Rotation of the quad.
  40192. * @param {boolean} flipX - Indicates if the quad is horizontally flipped.
  40193. * @param {boolean} flipY - Indicates if the quad is vertically flipped.
  40194. * @param {number} scrollFactorX - By which factor is the quad affected by the camera horizontal scroll.
  40195. * @param {number} scrollFactorY - By which factor is the quad effected by the camera vertical scroll.
  40196. * @param {number} displayOriginX - Horizontal origin in pixels.
  40197. * @param {number} displayOriginY - Vertical origin in pixels.
  40198. * @param {number} frameX - X coordinate of the texture frame.
  40199. * @param {number} frameY - Y coordinate of the texture frame.
  40200. * @param {number} frameWidth - Width of the texture frame.
  40201. * @param {number} frameHeight - Height of the texture frame.
  40202. * @param {integer} tintTL - Tint for top left.
  40203. * @param {integer} tintTR - Tint for top right.
  40204. * @param {integer} tintBL - Tint for bottom left.
  40205. * @param {integer} tintBR - Tint for bottom right.
  40206. * @param {number} tintEffect - The tint effect.
  40207. * @param {number} uOffset - Horizontal offset on texture coordinate.
  40208. * @param {number} vOffset - Vertical offset on texture coordinate.
  40209. * @param {Phaser.Cameras.Scene2D.Camera} camera - Current used camera.
  40210. * @param {Phaser.GameObjects.Components.TransformMatrix} parentTransformMatrix - Parent container.
  40211. * @param {boolean} [skipFlip=false] - Skip the renderTexture check.
  40212. */
  40213. batchTexture: function (
  40214. gameObject,
  40215. texture,
  40216. textureWidth, textureHeight,
  40217. srcX, srcY,
  40218. srcWidth, srcHeight,
  40219. scaleX, scaleY,
  40220. rotation,
  40221. flipX, flipY,
  40222. scrollFactorX, scrollFactorY,
  40223. displayOriginX, displayOriginY,
  40224. frameX, frameY, frameWidth, frameHeight,
  40225. tintTL, tintTR, tintBL, tintBR, tintEffect,
  40226. uOffset, vOffset,
  40227. camera,
  40228. parentTransformMatrix,
  40229. skipFlip)
  40230. {
  40231. this.renderer.setPipeline(this, gameObject);
  40232. var camMatrix = this._tempMatrix1;
  40233. var spriteMatrix = this._tempMatrix2;
  40234. var calcMatrix = this._tempMatrix3;
  40235. var u0 = (frameX / textureWidth) + uOffset;
  40236. var v0 = (frameY / textureHeight) + vOffset;
  40237. var u1 = (frameX + frameWidth) / textureWidth + uOffset;
  40238. var v1 = (frameY + frameHeight) / textureHeight + vOffset;
  40239. var width = srcWidth;
  40240. var height = srcHeight;
  40241. var x = -displayOriginX;
  40242. var y = -displayOriginY;
  40243. if (gameObject.isCropped)
  40244. {
  40245. var crop = gameObject._crop;
  40246. width = crop.width;
  40247. height = crop.height;
  40248. srcWidth = crop.width;
  40249. srcHeight = crop.height;
  40250. frameX = crop.x;
  40251. frameY = crop.y;
  40252. var ox = frameX;
  40253. var oy = frameY;
  40254. if (flipX)
  40255. {
  40256. ox = (frameWidth - crop.x - crop.width);
  40257. }
  40258. if (flipY && !texture.isRenderTexture)
  40259. {
  40260. oy = (frameHeight - crop.y - crop.height);
  40261. }
  40262. u0 = (ox / textureWidth) + uOffset;
  40263. v0 = (oy / textureHeight) + vOffset;
  40264. u1 = (ox + crop.width) / textureWidth + uOffset;
  40265. v1 = (oy + crop.height) / textureHeight + vOffset;
  40266. x = -displayOriginX + frameX;
  40267. y = -displayOriginY + frameY;
  40268. }
  40269. // Invert the flipY if this is a RenderTexture
  40270. flipY = flipY ^ (!skipFlip && texture.isRenderTexture ? 1 : 0);
  40271. if (flipX)
  40272. {
  40273. width *= -1;
  40274. x += srcWidth;
  40275. }
  40276. if (flipY)
  40277. {
  40278. height *= -1;
  40279. y += srcHeight;
  40280. }
  40281. var xw = x + width;
  40282. var yh = y + height;
  40283. spriteMatrix.applyITRS(srcX, srcY, rotation, scaleX, scaleY);
  40284. camMatrix.copyFrom(camera.matrix);
  40285. if (parentTransformMatrix)
  40286. {
  40287. // Multiply the camera by the parent matrix
  40288. camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * scrollFactorX, -camera.scrollY * scrollFactorY);
  40289. // Undo the camera scroll
  40290. spriteMatrix.e = srcX;
  40291. spriteMatrix.f = srcY;
  40292. // Multiply by the Sprite matrix, store result in calcMatrix
  40293. camMatrix.multiply(spriteMatrix, calcMatrix);
  40294. }
  40295. else
  40296. {
  40297. spriteMatrix.e -= camera.scrollX * scrollFactorX;
  40298. spriteMatrix.f -= camera.scrollY * scrollFactorY;
  40299. // Multiply by the Sprite matrix, store result in calcMatrix
  40300. camMatrix.multiply(spriteMatrix, calcMatrix);
  40301. }
  40302. var tx0 = calcMatrix.getX(x, y);
  40303. var ty0 = calcMatrix.getY(x, y);
  40304. var tx1 = calcMatrix.getX(x, yh);
  40305. var ty1 = calcMatrix.getY(x, yh);
  40306. var tx2 = calcMatrix.getX(xw, yh);
  40307. var ty2 = calcMatrix.getY(xw, yh);
  40308. var tx3 = calcMatrix.getX(xw, y);
  40309. var ty3 = calcMatrix.getY(xw, y);
  40310. if (camera.roundPixels)
  40311. {
  40312. tx0 = Math.round(tx0);
  40313. ty0 = Math.round(ty0);
  40314. tx1 = Math.round(tx1);
  40315. ty1 = Math.round(ty1);
  40316. tx2 = Math.round(tx2);
  40317. ty2 = Math.round(ty2);
  40318. tx3 = Math.round(tx3);
  40319. ty3 = Math.round(ty3);
  40320. }
  40321. this.setTexture2D(texture, 0);
  40322. this.batchQuad(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, 0);
  40323. },
  40324. /**
  40325. * Adds a Texture Frame into the batch for rendering.
  40326. *
  40327. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchTextureFrame
  40328. * @since 3.12.0
  40329. *
  40330. * @param {Phaser.Textures.Frame} frame - The Texture Frame to be rendered.
  40331. * @param {number} x - The horizontal position to render the texture at.
  40332. * @param {number} y - The vertical position to render the texture at.
  40333. * @param {number} tint - The tint color.
  40334. * @param {number} alpha - The alpha value.
  40335. * @param {Phaser.GameObjects.Components.TransformMatrix} transformMatrix - The Transform Matrix to use for the texture.
  40336. * @param {Phaser.GameObjects.Components.TransformMatrix} [parentTransformMatrix] - A parent Transform Matrix.
  40337. */
  40338. batchTextureFrame: function (
  40339. frame,
  40340. x, y,
  40341. tint, alpha,
  40342. transformMatrix,
  40343. parentTransformMatrix
  40344. )
  40345. {
  40346. this.renderer.setPipeline(this);
  40347. var spriteMatrix = this._tempMatrix1.copyFrom(transformMatrix);
  40348. var calcMatrix = this._tempMatrix2;
  40349. var xw = x + frame.width;
  40350. var yh = y + frame.height;
  40351. if (parentTransformMatrix)
  40352. {
  40353. spriteMatrix.multiply(parentTransformMatrix, calcMatrix);
  40354. }
  40355. else
  40356. {
  40357. calcMatrix = spriteMatrix;
  40358. }
  40359. var tx0 = calcMatrix.getX(x, y);
  40360. var ty0 = calcMatrix.getY(x, y);
  40361. var tx1 = calcMatrix.getX(x, yh);
  40362. var ty1 = calcMatrix.getY(x, yh);
  40363. var tx2 = calcMatrix.getX(xw, yh);
  40364. var ty2 = calcMatrix.getY(xw, yh);
  40365. var tx3 = calcMatrix.getX(xw, y);
  40366. var ty3 = calcMatrix.getY(xw, y);
  40367. this.setTexture2D(frame.glTexture, 0);
  40368. tint = Utils.getTintAppendFloatAlpha(tint, alpha);
  40369. this.batchQuad(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, frame.u0, frame.v0, frame.u1, frame.v1, tint, tint, tint, tint, 0, frame.glTexture, 0);
  40370. },
  40371. /**
  40372. * Pushes a filled rectangle into the vertex batch.
  40373. * Rectangle has no transform values and isn't transformed into the local space.
  40374. * Used for directly batching untransformed rectangles, such as Camera background colors.
  40375. *
  40376. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#drawFillRect
  40377. * @since 3.12.0
  40378. *
  40379. * @param {number} x - Horizontal top left coordinate of the rectangle.
  40380. * @param {number} y - Vertical top left coordinate of the rectangle.
  40381. * @param {number} width - Width of the rectangle.
  40382. * @param {number} height - Height of the rectangle.
  40383. * @param {number} color - Color of the rectangle to draw.
  40384. * @param {number} alpha - Alpha value of the rectangle to draw.
  40385. */
  40386. drawFillRect: function (x, y, width, height, color, alpha)
  40387. {
  40388. var xw = x + width;
  40389. var yh = y + height;
  40390. this.setTexture2D();
  40391. var tint = Utils.getTintAppendFloatAlphaAndSwap(color, alpha);
  40392. this.batchQuad(x, y, x, yh, xw, yh, xw, y, 0, 0, 1, 1, tint, tint, tint, tint, 2);
  40393. },
  40394. /**
  40395. * Pushes a filled rectangle into the vertex batch.
  40396. * Rectangle factors in the given transform matrices before adding to the batch.
  40397. *
  40398. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchFillRect
  40399. * @since 3.12.0
  40400. *
  40401. * @param {number} x - Horizontal top left coordinate of the rectangle.
  40402. * @param {number} y - Vertical top left coordinate of the rectangle.
  40403. * @param {number} width - Width of the rectangle.
  40404. * @param {number} height - Height of the rectangle.
  40405. * @param {Phaser.GameObjects.Components.TransformMatrix} currentMatrix - The current transform.
  40406. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - The parent transform.
  40407. */
  40408. batchFillRect: function (x, y, width, height, currentMatrix, parentMatrix)
  40409. {
  40410. this.renderer.setPipeline(this);
  40411. var calcMatrix = this._tempMatrix3;
  40412. // Multiply and store result in calcMatrix, only if the parentMatrix is set, otherwise we'll use whatever values are already in the calcMatrix
  40413. if (parentMatrix)
  40414. {
  40415. parentMatrix.multiply(currentMatrix, calcMatrix);
  40416. }
  40417. var xw = x + width;
  40418. var yh = y + height;
  40419. var x0 = calcMatrix.getX(x, y);
  40420. var y0 = calcMatrix.getY(x, y);
  40421. var x1 = calcMatrix.getX(x, yh);
  40422. var y1 = calcMatrix.getY(x, yh);
  40423. var x2 = calcMatrix.getX(xw, yh);
  40424. var y2 = calcMatrix.getY(xw, yh);
  40425. var x3 = calcMatrix.getX(xw, y);
  40426. var y3 = calcMatrix.getY(xw, y);
  40427. var frame = this.currentFrame;
  40428. var u0 = frame.u0;
  40429. var v0 = frame.v0;
  40430. var u1 = frame.u1;
  40431. var v1 = frame.v1;
  40432. this.batchQuad(x0, y0, x1, y1, x2, y2, x3, y3, u0, v0, u1, v1, this.fillTint.TL, this.fillTint.TR, this.fillTint.BL, this.fillTint.BR, this.tintEffect);
  40433. },
  40434. /**
  40435. * Pushes a filled triangle into the vertex batch.
  40436. * Triangle factors in the given transform matrices before adding to the batch.
  40437. *
  40438. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchFillTriangle
  40439. * @since 3.12.0
  40440. *
  40441. * @param {number} x0 - Point 0 x coordinate.
  40442. * @param {number} y0 - Point 0 y coordinate.
  40443. * @param {number} x1 - Point 1 x coordinate.
  40444. * @param {number} y1 - Point 1 y coordinate.
  40445. * @param {number} x2 - Point 2 x coordinate.
  40446. * @param {number} y2 - Point 2 y coordinate.
  40447. * @param {Phaser.GameObjects.Components.TransformMatrix} currentMatrix - The current transform.
  40448. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - The parent transform.
  40449. */
  40450. batchFillTriangle: function (x0, y0, x1, y1, x2, y2, currentMatrix, parentMatrix)
  40451. {
  40452. this.renderer.setPipeline(this);
  40453. var calcMatrix = this._tempMatrix3;
  40454. // Multiply and store result in calcMatrix, only if the parentMatrix is set, otherwise we'll use whatever values are already in the calcMatrix
  40455. if (parentMatrix)
  40456. {
  40457. parentMatrix.multiply(currentMatrix, calcMatrix);
  40458. }
  40459. var tx0 = calcMatrix.getX(x0, y0);
  40460. var ty0 = calcMatrix.getY(x0, y0);
  40461. var tx1 = calcMatrix.getX(x1, y1);
  40462. var ty1 = calcMatrix.getY(x1, y1);
  40463. var tx2 = calcMatrix.getX(x2, y2);
  40464. var ty2 = calcMatrix.getY(x2, y2);
  40465. var frame = this.currentFrame;
  40466. var u0 = frame.u0;
  40467. var v0 = frame.v0;
  40468. var u1 = frame.u1;
  40469. var v1 = frame.v1;
  40470. this.batchTri(tx0, ty0, tx1, ty1, tx2, ty2, u0, v0, u1, v1, this.fillTint.TL, this.fillTint.TR, this.fillTint.BL, this.tintEffect);
  40471. },
  40472. /**
  40473. * Pushes a stroked triangle into the vertex batch.
  40474. * Triangle factors in the given transform matrices before adding to the batch.
  40475. * The triangle is created from 3 lines and drawn using the `batchStrokePath` method.
  40476. *
  40477. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchStrokeTriangle
  40478. * @since 3.12.0
  40479. *
  40480. * @param {number} x0 - Point 0 x coordinate.
  40481. * @param {number} y0 - Point 0 y coordinate.
  40482. * @param {number} x1 - Point 1 x coordinate.
  40483. * @param {number} y1 - Point 1 y coordinate.
  40484. * @param {number} x2 - Point 2 x coordinate.
  40485. * @param {number} y2 - Point 2 y coordinate.
  40486. * @param {number} lineWidth - The width of the line in pixels.
  40487. * @param {Phaser.GameObjects.Components.TransformMatrix} currentMatrix - The current transform.
  40488. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - The parent transform.
  40489. */
  40490. batchStrokeTriangle: function (x0, y0, x1, y1, x2, y2, lineWidth, currentMatrix, parentMatrix)
  40491. {
  40492. var tempTriangle = this.tempTriangle;
  40493. tempTriangle[0].x = x0;
  40494. tempTriangle[0].y = y0;
  40495. tempTriangle[0].width = lineWidth;
  40496. tempTriangle[1].x = x1;
  40497. tempTriangle[1].y = y1;
  40498. tempTriangle[1].width = lineWidth;
  40499. tempTriangle[2].x = x2;
  40500. tempTriangle[2].y = y2;
  40501. tempTriangle[2].width = lineWidth;
  40502. tempTriangle[3].x = x0;
  40503. tempTriangle[3].y = y0;
  40504. tempTriangle[3].width = lineWidth;
  40505. this.batchStrokePath(tempTriangle, lineWidth, false, currentMatrix, parentMatrix);
  40506. },
  40507. /**
  40508. * Adds the given path to the vertex batch for rendering.
  40509. *
  40510. * It works by taking the array of path data and then passing it through Earcut, which
  40511. * creates a list of polygons. Each polygon is then added to the batch.
  40512. *
  40513. * The path is always automatically closed because it's filled.
  40514. *
  40515. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchFillPath
  40516. * @since 3.12.0
  40517. *
  40518. * @param {array} path - Collection of points that represent the path.
  40519. * @param {Phaser.GameObjects.Components.TransformMatrix} currentMatrix - The current transform.
  40520. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - The parent transform.
  40521. */
  40522. batchFillPath: function (path, currentMatrix, parentMatrix)
  40523. {
  40524. this.renderer.setPipeline(this);
  40525. var calcMatrix = this._tempMatrix3;
  40526. // Multiply and store result in calcMatrix, only if the parentMatrix is set, otherwise we'll use whatever values are already in the calcMatrix
  40527. if (parentMatrix)
  40528. {
  40529. parentMatrix.multiply(currentMatrix, calcMatrix);
  40530. }
  40531. var length = path.length;
  40532. var polygonCache = this.polygonCache;
  40533. var polygonIndexArray;
  40534. var point;
  40535. var tintTL = this.fillTint.TL;
  40536. var tintTR = this.fillTint.TR;
  40537. var tintBL = this.fillTint.BL;
  40538. var tintEffect = this.tintEffect;
  40539. for (var pathIndex = 0; pathIndex < length; ++pathIndex)
  40540. {
  40541. point = path[pathIndex];
  40542. polygonCache.push(point.x, point.y);
  40543. }
  40544. polygonIndexArray = Earcut(polygonCache);
  40545. length = polygonIndexArray.length;
  40546. var frame = this.currentFrame;
  40547. for (var index = 0; index < length; index += 3)
  40548. {
  40549. var p0 = polygonIndexArray[index + 0] * 2;
  40550. var p1 = polygonIndexArray[index + 1] * 2;
  40551. var p2 = polygonIndexArray[index + 2] * 2;
  40552. var x0 = polygonCache[p0 + 0];
  40553. var y0 = polygonCache[p0 + 1];
  40554. var x1 = polygonCache[p1 + 0];
  40555. var y1 = polygonCache[p1 + 1];
  40556. var x2 = polygonCache[p2 + 0];
  40557. var y2 = polygonCache[p2 + 1];
  40558. var tx0 = calcMatrix.getX(x0, y0);
  40559. var ty0 = calcMatrix.getY(x0, y0);
  40560. var tx1 = calcMatrix.getX(x1, y1);
  40561. var ty1 = calcMatrix.getY(x1, y1);
  40562. var tx2 = calcMatrix.getX(x2, y2);
  40563. var ty2 = calcMatrix.getY(x2, y2);
  40564. var u0 = frame.u0;
  40565. var v0 = frame.v0;
  40566. var u1 = frame.u1;
  40567. var v1 = frame.v1;
  40568. this.batchTri(tx0, ty0, tx1, ty1, tx2, ty2, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintEffect);
  40569. }
  40570. polygonCache.length = 0;
  40571. },
  40572. /**
  40573. * Adds the given path to the vertex batch for rendering.
  40574. *
  40575. * It works by taking the array of path data and calling `batchLine` for each section
  40576. * of the path.
  40577. *
  40578. * The path is optionally closed at the end.
  40579. *
  40580. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchStrokePath
  40581. * @since 3.12.0
  40582. *
  40583. * @param {array} path - Collection of points that represent the path.
  40584. * @param {number} lineWidth - The width of the line segments in pixels.
  40585. * @param {boolean} pathOpen - Indicates if the path should be closed or left open.
  40586. * @param {Phaser.GameObjects.Components.TransformMatrix} currentMatrix - The current transform.
  40587. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - The parent transform.
  40588. */
  40589. batchStrokePath: function (path, lineWidth, pathOpen, currentMatrix, parentMatrix)
  40590. {
  40591. this.renderer.setPipeline(this);
  40592. // Reset the closePath booleans
  40593. this.prevQuad[4] = 0;
  40594. this.firstQuad[4] = 0;
  40595. var pathLength = path.length - 1;
  40596. for (var pathIndex = 0; pathIndex < pathLength; pathIndex++)
  40597. {
  40598. var point0 = path[pathIndex];
  40599. var point1 = path[pathIndex + 1];
  40600. this.batchLine(
  40601. point0.x,
  40602. point0.y,
  40603. point1.x,
  40604. point1.y,
  40605. point0.width / 2,
  40606. point1.width / 2,
  40607. lineWidth,
  40608. pathIndex,
  40609. !pathOpen && (pathIndex === pathLength - 1),
  40610. currentMatrix,
  40611. parentMatrix
  40612. );
  40613. }
  40614. },
  40615. /**
  40616. * Creates a quad and adds it to the vertex batch based on the given line values.
  40617. *
  40618. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchLine
  40619. * @since 3.12.0
  40620. *
  40621. * @param {number} ax - X coordinate to the start of the line
  40622. * @param {number} ay - Y coordinate to the start of the line
  40623. * @param {number} bx - X coordinate to the end of the line
  40624. * @param {number} by - Y coordinate to the end of the line
  40625. * @param {number} aLineWidth - Width of the start of the line
  40626. * @param {number} bLineWidth - Width of the end of the line
  40627. * @param {Float32Array} currentMatrix - Parent matrix, generally used by containers
  40628. */
  40629. batchLine: function (ax, ay, bx, by, aLineWidth, bLineWidth, lineWidth, index, closePath, currentMatrix, parentMatrix)
  40630. {
  40631. this.renderer.setPipeline(this);
  40632. var calcMatrix = this._tempMatrix3;
  40633. // Multiply and store result in calcMatrix, only if the parentMatrix is set, otherwise we'll use whatever values are already in the calcMatrix
  40634. if (parentMatrix)
  40635. {
  40636. parentMatrix.multiply(currentMatrix, calcMatrix);
  40637. }
  40638. var dx = bx - ax;
  40639. var dy = by - ay;
  40640. var len = Math.sqrt(dx * dx + dy * dy);
  40641. var al0 = aLineWidth * (by - ay) / len;
  40642. var al1 = aLineWidth * (ax - bx) / len;
  40643. var bl0 = bLineWidth * (by - ay) / len;
  40644. var bl1 = bLineWidth * (ax - bx) / len;
  40645. var lx0 = bx - bl0;
  40646. var ly0 = by - bl1;
  40647. var lx1 = ax - al0;
  40648. var ly1 = ay - al1;
  40649. var lx2 = bx + bl0;
  40650. var ly2 = by + bl1;
  40651. var lx3 = ax + al0;
  40652. var ly3 = ay + al1;
  40653. // tx0 = bottom right
  40654. var brX = calcMatrix.getX(lx0, ly0);
  40655. var brY = calcMatrix.getY(lx0, ly0);
  40656. // tx1 = bottom left
  40657. var blX = calcMatrix.getX(lx1, ly1);
  40658. var blY = calcMatrix.getY(lx1, ly1);
  40659. // tx2 = top right
  40660. var trX = calcMatrix.getX(lx2, ly2);
  40661. var trY = calcMatrix.getY(lx2, ly2);
  40662. // tx3 = top left
  40663. var tlX = calcMatrix.getX(lx3, ly3);
  40664. var tlY = calcMatrix.getY(lx3, ly3);
  40665. var tint = this.strokeTint;
  40666. var tintEffect = this.tintEffect;
  40667. var tintTL = tint.TL;
  40668. var tintTR = tint.TR;
  40669. var tintBL = tint.BL;
  40670. var tintBR = tint.BR;
  40671. var frame = this.currentFrame;
  40672. var u0 = frame.u0;
  40673. var v0 = frame.v0;
  40674. var u1 = frame.u1;
  40675. var v1 = frame.v1;
  40676. // TL, BL, BR, TR
  40677. this.batchQuad(tlX, tlY, blX, blY, brX, brY, trX, trY, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect);
  40678. if (lineWidth <= 2)
  40679. {
  40680. // No point doing a linejoin if the line isn't thick enough
  40681. return;
  40682. }
  40683. var prev = this.prevQuad;
  40684. var first = this.firstQuad;
  40685. if (index > 0 && prev[4])
  40686. {
  40687. this.batchQuad(tlX, tlY, blX, blY, prev[0], prev[1], prev[2], prev[3], u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect);
  40688. }
  40689. else
  40690. {
  40691. first[0] = tlX;
  40692. first[1] = tlY;
  40693. first[2] = blX;
  40694. first[3] = blY;
  40695. first[4] = 1;
  40696. }
  40697. if (closePath && first[4])
  40698. {
  40699. // Add a join for the final path segment
  40700. this.batchQuad(brX, brY, trX, trY, first[0], first[1], first[2], first[3], u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect);
  40701. }
  40702. else
  40703. {
  40704. // Store it
  40705. prev[0] = brX;
  40706. prev[1] = brY;
  40707. prev[2] = trX;
  40708. prev[3] = trY;
  40709. prev[4] = 1;
  40710. }
  40711. }
  40712. });
  40713. module.exports = TextureTintPipeline;
  40714. /***/ }),
  40715. /* 212 */
  40716. /***/ (function(module, exports, __webpack_require__) {
  40717. /**
  40718. * @author Richard Davey <rich@photonstorm.com>
  40719. * @author Felipe Alfonso <@bitnenfer>
  40720. * @copyright 2019 Photon Storm Ltd.
  40721. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  40722. */
  40723. var Class = __webpack_require__(0);
  40724. var Utils = __webpack_require__(9);
  40725. /**
  40726. * @classdesc
  40727. * WebGLPipeline is a class that describes the way elements will be rendererd
  40728. * in WebGL, specially focused on batching vertices (batching is not provided).
  40729. * Pipelines are mostly used for describing 2D rendering passes but it's
  40730. * flexible enough to be used for any type of rendering including 3D.
  40731. * Internally WebGLPipeline will handle things like compiling shaders,
  40732. * creating vertex buffers, assigning primitive topology and binding
  40733. * vertex attributes.
  40734. *
  40735. * The config properties are:
  40736. * - game: Current game instance.
  40737. * - renderer: Current WebGL renderer.
  40738. * - gl: Current WebGL context.
  40739. * - topology: This indicates how the primitives are rendered. The default value is GL_TRIANGLES.
  40740. * Here is the full list of rendering primitives (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants).
  40741. * - vertShader: Source for vertex shader as a string.
  40742. * - fragShader: Source for fragment shader as a string.
  40743. * - vertexCapacity: The amount of vertices that shall be allocated
  40744. * - vertexSize: The size of a single vertex in bytes.
  40745. * - vertices: An optional buffer of vertices
  40746. * - attributes: An array describing the vertex attributes
  40747. *
  40748. * The vertex attributes properties are:
  40749. * - name : String - Name of the attribute in the vertex shader
  40750. * - size : integer - How many components describe the attribute. For ex: vec3 = size of 3, float = size of 1
  40751. * - type : GLenum - WebGL type (gl.BYTE, gl.SHORT, gl.UNSIGNED_BYTE, gl.UNSIGNED_SHORT, gl.FLOAT)
  40752. * - normalized : boolean - Is the attribute normalized
  40753. * - offset : integer - The offset in bytes to the current attribute in the vertex. Equivalent to offsetof(vertex, attrib) in C
  40754. * Here you can find more information of how to describe an attribute:
  40755. * - https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer
  40756. *
  40757. * @class WebGLPipeline
  40758. * @memberof Phaser.Renderer.WebGL
  40759. * @constructor
  40760. * @since 3.0.0
  40761. *
  40762. * @param {object} config - The configuration object for this WebGL Pipeline, as described above.
  40763. */
  40764. var WebGLPipeline = new Class({
  40765. initialize:
  40766. function WebGLPipeline (config)
  40767. {
  40768. /**
  40769. * Name of the Pipeline. Used for identifying
  40770. *
  40771. * @name Phaser.Renderer.WebGL.WebGLPipeline#name
  40772. * @type {string}
  40773. * @since 3.0.0
  40774. */
  40775. this.name = 'WebGLPipeline';
  40776. /**
  40777. * The Game which owns this WebGL Pipeline.
  40778. *
  40779. * @name Phaser.Renderer.WebGL.WebGLPipeline#game
  40780. * @type {Phaser.Game}
  40781. * @since 3.0.0
  40782. */
  40783. this.game = config.game;
  40784. /**
  40785. * The canvas which this WebGL Pipeline renders to.
  40786. *
  40787. * @name Phaser.Renderer.WebGL.WebGLPipeline#view
  40788. * @type {HTMLCanvasElement}
  40789. * @since 3.0.0
  40790. */
  40791. this.view = config.game.canvas;
  40792. /**
  40793. * Used to store the current game resolution
  40794. *
  40795. * @name Phaser.Renderer.WebGL.WebGLPipeline#resolution
  40796. * @type {number}
  40797. * @since 3.0.0
  40798. */
  40799. this.resolution = 1;
  40800. /**
  40801. * Width of the current viewport
  40802. *
  40803. * @name Phaser.Renderer.WebGL.WebGLPipeline#width
  40804. * @type {number}
  40805. * @since 3.0.0
  40806. */
  40807. this.width = 0;
  40808. /**
  40809. * Height of the current viewport
  40810. *
  40811. * @name Phaser.Renderer.WebGL.WebGLPipeline#height
  40812. * @type {number}
  40813. * @since 3.0.0
  40814. */
  40815. this.height = 0;
  40816. /**
  40817. * The WebGL context this WebGL Pipeline uses.
  40818. *
  40819. * @name Phaser.Renderer.WebGL.WebGLPipeline#gl
  40820. * @type {WebGLRenderingContext}
  40821. * @since 3.0.0
  40822. */
  40823. this.gl = config.gl;
  40824. /**
  40825. * How many vertices have been fed to the current pipeline.
  40826. *
  40827. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexCount
  40828. * @type {number}
  40829. * @default 0
  40830. * @since 3.0.0
  40831. */
  40832. this.vertexCount = 0;
  40833. /**
  40834. * The limit of vertices that the pipeline can hold
  40835. *
  40836. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexCapacity
  40837. * @type {integer}
  40838. * @since 3.0.0
  40839. */
  40840. this.vertexCapacity = config.vertexCapacity;
  40841. /**
  40842. * The WebGL Renderer which owns this WebGL Pipeline.
  40843. *
  40844. * @name Phaser.Renderer.WebGL.WebGLPipeline#renderer
  40845. * @type {Phaser.Renderer.WebGL.WebGLRenderer}
  40846. * @since 3.0.0
  40847. */
  40848. this.renderer = config.renderer;
  40849. /**
  40850. * Raw byte buffer of vertices.
  40851. *
  40852. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexData
  40853. * @type {ArrayBuffer}
  40854. * @since 3.0.0
  40855. */
  40856. this.vertexData = (config.vertices ? config.vertices : new ArrayBuffer(config.vertexCapacity * config.vertexSize));
  40857. /**
  40858. * The handle to a WebGL vertex buffer object.
  40859. *
  40860. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexBuffer
  40861. * @type {WebGLBuffer}
  40862. * @since 3.0.0
  40863. */
  40864. this.vertexBuffer = this.renderer.createVertexBuffer((config.vertices ? config.vertices : this.vertexData.byteLength), this.gl.STREAM_DRAW);
  40865. /**
  40866. * The handle to a WebGL program
  40867. *
  40868. * @name Phaser.Renderer.WebGL.WebGLPipeline#program
  40869. * @type {WebGLProgram}
  40870. * @since 3.0.0
  40871. */
  40872. this.program = this.renderer.createProgram(config.vertShader, config.fragShader);
  40873. /**
  40874. * Array of objects that describe the vertex attributes
  40875. *
  40876. * @name Phaser.Renderer.WebGL.WebGLPipeline#attributes
  40877. * @type {object}
  40878. * @since 3.0.0
  40879. */
  40880. this.attributes = config.attributes;
  40881. /**
  40882. * The size in bytes of the vertex
  40883. *
  40884. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexSize
  40885. * @type {integer}
  40886. * @since 3.0.0
  40887. */
  40888. this.vertexSize = config.vertexSize;
  40889. /**
  40890. * The primitive topology which the pipeline will use to submit draw calls
  40891. *
  40892. * @name Phaser.Renderer.WebGL.WebGLPipeline#topology
  40893. * @type {integer}
  40894. * @since 3.0.0
  40895. */
  40896. this.topology = config.topology;
  40897. /**
  40898. * Uint8 view to the vertex raw buffer. Used for uploading vertex buffer resources
  40899. * to the GPU.
  40900. *
  40901. * @name Phaser.Renderer.WebGL.WebGLPipeline#bytes
  40902. * @type {Uint8Array}
  40903. * @since 3.0.0
  40904. */
  40905. this.bytes = new Uint8Array(this.vertexData);
  40906. /**
  40907. * This will store the amount of components of 32 bit length
  40908. *
  40909. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexComponentCount
  40910. * @type {integer}
  40911. * @since 3.0.0
  40912. */
  40913. this.vertexComponentCount = Utils.getComponentCount(config.attributes, this.gl);
  40914. /**
  40915. * Indicates if the current pipeline is flushing the contents to the GPU.
  40916. * When the variable is set the flush function will be locked.
  40917. *
  40918. * @name Phaser.Renderer.WebGL.WebGLPipeline#flushLocked
  40919. * @type {boolean}
  40920. * @since 3.1.0
  40921. */
  40922. this.flushLocked = false;
  40923. /**
  40924. * Indicates if the current pipeline is active or not for this frame only.
  40925. * Reset in the onRender method.
  40926. *
  40927. * @name Phaser.Renderer.WebGL.WebGLPipeline#active
  40928. * @type {boolean}
  40929. * @since 3.10.0
  40930. */
  40931. this.active = false;
  40932. },
  40933. /**
  40934. * Called when the Game has fully booted and the Renderer has finished setting up.
  40935. *
  40936. * By this stage all Game level systems are now in place and you can perform any final
  40937. * tasks that the pipeline may need that relied on game systems such as the Texture Manager.
  40938. *
  40939. * @method Phaser.Renderer.WebGL.WebGLPipeline#boot
  40940. * @since 3.11.0
  40941. */
  40942. boot: function ()
  40943. {
  40944. },
  40945. /**
  40946. * Adds a description of vertex attribute to the pipeline
  40947. *
  40948. * @method Phaser.Renderer.WebGL.WebGLPipeline#addAttribute
  40949. * @since 3.2.0
  40950. *
  40951. * @param {string} name - Name of the vertex attribute
  40952. * @param {integer} size - Vertex component size
  40953. * @param {integer} type - Type of the attribute
  40954. * @param {boolean} normalized - Is the value normalized to a range
  40955. * @param {integer} offset - Byte offset to the beginning of the first element in the vertex
  40956. *
  40957. * @return {this} This WebGLPipeline instance.
  40958. */
  40959. addAttribute: function (name, size, type, normalized, offset)
  40960. {
  40961. this.attributes.push({
  40962. name: name,
  40963. size: size,
  40964. type: this.renderer.glFormats[type],
  40965. normalized: normalized,
  40966. offset: offset
  40967. });
  40968. return this;
  40969. },
  40970. /**
  40971. * Check if the current batch of vertices is full.
  40972. *
  40973. * @method Phaser.Renderer.WebGL.WebGLPipeline#shouldFlush
  40974. * @since 3.0.0
  40975. *
  40976. * @return {boolean} `true` if the current batch should be flushed, otherwise `false`.
  40977. */
  40978. shouldFlush: function ()
  40979. {
  40980. return (this.vertexCount >= this.vertexCapacity);
  40981. },
  40982. /**
  40983. * Resizes the properties used to describe the viewport
  40984. *
  40985. * @method Phaser.Renderer.WebGL.WebGLPipeline#resize
  40986. * @since 3.0.0
  40987. *
  40988. * @param {number} width - The new width of this WebGL Pipeline.
  40989. * @param {number} height - The new height of this WebGL Pipeline.
  40990. * @param {number} resolution - The resolution this WebGL Pipeline should be resized to.
  40991. *
  40992. * @return {this} This WebGLPipeline instance.
  40993. */
  40994. resize: function (width, height, resolution)
  40995. {
  40996. this.width = width * resolution;
  40997. this.height = height * resolution;
  40998. this.resolution = resolution;
  40999. return this;
  41000. },
  41001. /**
  41002. * Binds the pipeline resources, including programs, vertex buffers and binds attributes
  41003. *
  41004. * @method Phaser.Renderer.WebGL.WebGLPipeline#bind
  41005. * @since 3.0.0
  41006. *
  41007. * @return {this} This WebGLPipeline instance.
  41008. */
  41009. bind: function ()
  41010. {
  41011. var gl = this.gl;
  41012. var vertexBuffer = this.vertexBuffer;
  41013. var attributes = this.attributes;
  41014. var program = this.program;
  41015. var renderer = this.renderer;
  41016. var vertexSize = this.vertexSize;
  41017. renderer.setProgram(program);
  41018. renderer.setVertexBuffer(vertexBuffer);
  41019. for (var index = 0; index < attributes.length; ++index)
  41020. {
  41021. var element = attributes[index];
  41022. var location = gl.getAttribLocation(program, element.name);
  41023. if (location >= 0)
  41024. {
  41025. gl.enableVertexAttribArray(location);
  41026. gl.vertexAttribPointer(location, element.size, element.type, element.normalized, vertexSize, element.offset);
  41027. }
  41028. else
  41029. {
  41030. gl.disableVertexAttribArray(location);
  41031. }
  41032. }
  41033. return this;
  41034. },
  41035. /**
  41036. * Set whenever this WebGL Pipeline is bound to a WebGL Renderer.
  41037. *
  41038. * This method is called every time the WebGL Pipeline is attempted to be bound, even if it already is the current pipeline.
  41039. *
  41040. * @method Phaser.Renderer.WebGL.WebGLPipeline#onBind
  41041. * @since 3.0.0
  41042. *
  41043. * @return {this} This WebGLPipeline instance.
  41044. */
  41045. onBind: function ()
  41046. {
  41047. // This is for updating uniform data it's called on each bind attempt.
  41048. return this;
  41049. },
  41050. /**
  41051. * Called before each frame is rendered, but after the canvas has been cleared.
  41052. *
  41053. * @method Phaser.Renderer.WebGL.WebGLPipeline#onPreRender
  41054. * @since 3.0.0
  41055. *
  41056. * @return {this} This WebGLPipeline instance.
  41057. */
  41058. onPreRender: function ()
  41059. {
  41060. // called once every frame
  41061. return this;
  41062. },
  41063. /**
  41064. * Called before a Scene's Camera is rendered.
  41065. *
  41066. * @method Phaser.Renderer.WebGL.WebGLPipeline#onRender
  41067. * @since 3.0.0
  41068. *
  41069. * @param {Phaser.Scene} scene - The Scene being rendered.
  41070. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Scene Camera being rendered with.
  41071. *
  41072. * @return {this} This WebGLPipeline instance.
  41073. */
  41074. onRender: function ()
  41075. {
  41076. // called for each camera
  41077. return this;
  41078. },
  41079. /**
  41080. * Called after each frame has been completely rendered and snapshots have been taken.
  41081. *
  41082. * @method Phaser.Renderer.WebGL.WebGLPipeline#onPostRender
  41083. * @since 3.0.0
  41084. *
  41085. * @return {this} This WebGLPipeline instance.
  41086. */
  41087. onPostRender: function ()
  41088. {
  41089. // called once every frame
  41090. return this;
  41091. },
  41092. /**
  41093. * Uploads the vertex data and emits a draw call
  41094. * for the current batch of vertices.
  41095. *
  41096. * @method Phaser.Renderer.WebGL.WebGLPipeline#flush
  41097. * @since 3.0.0
  41098. *
  41099. * @return {this} This WebGLPipeline instance.
  41100. */
  41101. flush: function ()
  41102. {
  41103. if (this.flushLocked) { return this; }
  41104. this.flushLocked = true;
  41105. var gl = this.gl;
  41106. var vertexCount = this.vertexCount;
  41107. var topology = this.topology;
  41108. var vertexSize = this.vertexSize;
  41109. if (vertexCount === 0)
  41110. {
  41111. this.flushLocked = false;
  41112. return;
  41113. }
  41114. gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bytes.subarray(0, vertexCount * vertexSize));
  41115. gl.drawArrays(topology, 0, vertexCount);
  41116. this.vertexCount = 0;
  41117. this.flushLocked = false;
  41118. return this;
  41119. },
  41120. /**
  41121. * Removes all object references in this WebGL Pipeline and removes its program from the WebGL context.
  41122. *
  41123. * @method Phaser.Renderer.WebGL.WebGLPipeline#destroy
  41124. * @since 3.0.0
  41125. *
  41126. * @return {this} This WebGLPipeline instance.
  41127. */
  41128. destroy: function ()
  41129. {
  41130. var gl = this.gl;
  41131. gl.deleteProgram(this.program);
  41132. gl.deleteBuffer(this.vertexBuffer);
  41133. delete this.program;
  41134. delete this.vertexBuffer;
  41135. delete this.gl;
  41136. return this;
  41137. },
  41138. /**
  41139. * Set a uniform value of the current pipeline program.
  41140. *
  41141. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat1
  41142. * @since 3.2.0
  41143. *
  41144. * @param {string} name - The name of the uniform to look-up and modify.
  41145. * @param {number} x - The new value of the `float` uniform.
  41146. *
  41147. * @return {this} This WebGLPipeline instance.
  41148. */
  41149. setFloat1: function (name, x)
  41150. {
  41151. this.renderer.setFloat1(this.program, name, x);
  41152. return this;
  41153. },
  41154. /**
  41155. * Set a uniform value of the current pipeline program.
  41156. *
  41157. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat2
  41158. * @since 3.2.0
  41159. *
  41160. * @param {string} name - The name of the uniform to look-up and modify.
  41161. * @param {number} x - The new X component of the `vec2` uniform.
  41162. * @param {number} y - The new Y component of the `vec2` uniform.
  41163. *
  41164. * @return {this} This WebGLPipeline instance.
  41165. */
  41166. setFloat2: function (name, x, y)
  41167. {
  41168. this.renderer.setFloat2(this.program, name, x, y);
  41169. return this;
  41170. },
  41171. /**
  41172. * Set a uniform value of the current pipeline program.
  41173. *
  41174. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat3
  41175. * @since 3.2.0
  41176. *
  41177. * @param {string} name - The name of the uniform to look-up and modify.
  41178. * @param {number} x - The new X component of the `vec3` uniform.
  41179. * @param {number} y - The new Y component of the `vec3` uniform.
  41180. * @param {number} z - The new Z component of the `vec3` uniform.
  41181. *
  41182. * @return {this} This WebGLPipeline instance.
  41183. */
  41184. setFloat3: function (name, x, y, z)
  41185. {
  41186. this.renderer.setFloat3(this.program, name, x, y, z);
  41187. return this;
  41188. },
  41189. /**
  41190. * Set a uniform value of the current pipeline program.
  41191. *
  41192. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat4
  41193. * @since 3.2.0
  41194. *
  41195. * @param {string} name - The name of the uniform to look-up and modify.
  41196. * @param {number} x - X component of the uniform
  41197. * @param {number} y - Y component of the uniform
  41198. * @param {number} z - Z component of the uniform
  41199. * @param {number} w - W component of the uniform
  41200. *
  41201. * @return {this} This WebGLPipeline instance.
  41202. */
  41203. setFloat4: function (name, x, y, z, w)
  41204. {
  41205. this.renderer.setFloat4(this.program, name, x, y, z, w);
  41206. return this;
  41207. },
  41208. /**
  41209. * Set a uniform value of the current pipeline program.
  41210. *
  41211. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat1v
  41212. * @since 3.13.0
  41213. *
  41214. * @param {string} name - The name of the uniform to look-up and modify.
  41215. * @param {Float32Array} arr - The new value to be used for the uniform variable.
  41216. *
  41217. * @return {this} This WebGLPipeline instance.
  41218. */
  41219. setFloat1v: function (name, arr)
  41220. {
  41221. this.renderer.setFloat1v(this.program, name, arr);
  41222. return this;
  41223. },
  41224. /**
  41225. * Set a uniform value of the current pipeline program.
  41226. *
  41227. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat2v
  41228. * @since 3.13.0
  41229. *
  41230. * @param {string} name - The name of the uniform to look-up and modify.
  41231. * @param {Float32Array} arr - The new value to be used for the uniform variable.
  41232. *
  41233. * @return {this} This WebGLPipeline instance.
  41234. */
  41235. setFloat2v: function (name, arr)
  41236. {
  41237. this.renderer.setFloat2v(this.program, name, arr);
  41238. return this;
  41239. },
  41240. /**
  41241. * Set a uniform value of the current pipeline program.
  41242. *
  41243. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat3v
  41244. * @since 3.13.0
  41245. *
  41246. * @param {string} name - The name of the uniform to look-up and modify.
  41247. * @param {Float32Array} arr - The new value to be used for the uniform variable.
  41248. *
  41249. * @return {this} This WebGLPipeline instance.
  41250. */
  41251. setFloat3v: function (name, arr)
  41252. {
  41253. this.renderer.setFloat3v(this.program, name, arr);
  41254. return this;
  41255. },
  41256. /**
  41257. * Set a uniform value of the current pipeline program.
  41258. *
  41259. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat4v
  41260. * @since 3.13.0
  41261. *
  41262. * @param {string} name - The name of the uniform to look-up and modify.
  41263. * @param {Float32Array} arr - The new value to be used for the uniform variable.
  41264. *
  41265. * @return {this} This WebGLPipeline instance.
  41266. */
  41267. setFloat4v: function (name, arr)
  41268. {
  41269. this.renderer.setFloat4v(this.program, name, arr);
  41270. return this;
  41271. },
  41272. /**
  41273. * Set a uniform value of the current pipeline program.
  41274. *
  41275. * @method Phaser.Renderer.WebGL.WebGLPipeline#setInt1
  41276. * @since 3.2.0
  41277. *
  41278. * @param {string} name - The name of the uniform to look-up and modify.
  41279. * @param {integer} x - The new value of the `int` uniform.
  41280. *
  41281. * @return {this} This WebGLPipeline instance.
  41282. */
  41283. setInt1: function (name, x)
  41284. {
  41285. this.renderer.setInt1(this.program, name, x);
  41286. return this;
  41287. },
  41288. /**
  41289. * Set a uniform value of the current pipeline program.
  41290. *
  41291. * @method Phaser.Renderer.WebGL.WebGLPipeline#setInt2
  41292. * @since 3.2.0
  41293. *
  41294. * @param {string} name - The name of the uniform to look-up and modify.
  41295. * @param {integer} x - The new X component of the `ivec2` uniform.
  41296. * @param {integer} y - The new Y component of the `ivec2` uniform.
  41297. *
  41298. * @return {this} This WebGLPipeline instance.
  41299. */
  41300. setInt2: function (name, x, y)
  41301. {
  41302. this.renderer.setInt2(this.program, name, x, y);
  41303. return this;
  41304. },
  41305. /**
  41306. * Set a uniform value of the current pipeline program.
  41307. *
  41308. * @method Phaser.Renderer.WebGL.WebGLPipeline#setInt3
  41309. * @since 3.2.0
  41310. *
  41311. * @param {string} name - The name of the uniform to look-up and modify.
  41312. * @param {integer} x - The new X component of the `ivec3` uniform.
  41313. * @param {integer} y - The new Y component of the `ivec3` uniform.
  41314. * @param {integer} z - The new Z component of the `ivec3` uniform.
  41315. *
  41316. * @return {this} This WebGLPipeline instance.
  41317. */
  41318. setInt3: function (name, x, y, z)
  41319. {
  41320. this.renderer.setInt3(this.program, name, x, y, z);
  41321. return this;
  41322. },
  41323. /**
  41324. * Set a uniform value of the current pipeline program.
  41325. *
  41326. * @method Phaser.Renderer.WebGL.WebGLPipeline#setInt4
  41327. * @since 3.2.0
  41328. *
  41329. * @param {string} name - The name of the uniform to look-up and modify.
  41330. * @param {integer} x - X component of the uniform
  41331. * @param {integer} y - Y component of the uniform
  41332. * @param {integer} z - Z component of the uniform
  41333. * @param {integer} w - W component of the uniform
  41334. *
  41335. * @return {this} This WebGLPipeline instance.
  41336. */
  41337. setInt4: function (name, x, y, z, w)
  41338. {
  41339. this.renderer.setInt4(this.program, name, x, y, z, w);
  41340. return this;
  41341. },
  41342. /**
  41343. * Set a uniform value of the current pipeline program.
  41344. *
  41345. * @method Phaser.Renderer.WebGL.WebGLPipeline#setMatrix2
  41346. * @since 3.2.0
  41347. *
  41348. * @param {string} name - The name of the uniform to look-up and modify.
  41349. * @param {boolean} transpose - Whether to transpose the matrix. Should be `false`.
  41350. * @param {Float32Array} matrix - The new values for the `mat2` uniform.
  41351. *
  41352. * @return {this} This WebGLPipeline instance.
  41353. */
  41354. setMatrix2: function (name, transpose, matrix)
  41355. {
  41356. this.renderer.setMatrix2(this.program, name, transpose, matrix);
  41357. return this;
  41358. },
  41359. /**
  41360. * Set a uniform value of the current pipeline program.
  41361. *
  41362. * @method Phaser.Renderer.WebGL.WebGLPipeline#setMatrix3
  41363. * @since 3.2.0
  41364. *
  41365. * @param {string} name - The name of the uniform to look-up and modify.
  41366. * @param {boolean} transpose - Whether to transpose the matrix. Should be `false`.
  41367. * @param {Float32Array} matrix - The new values for the `mat3` uniform.
  41368. *
  41369. * @return {this} This WebGLPipeline instance.
  41370. */
  41371. setMatrix3: function (name, transpose, matrix)
  41372. {
  41373. this.renderer.setMatrix3(this.program, name, transpose, matrix);
  41374. return this;
  41375. },
  41376. /**
  41377. * Set a uniform value of the current pipeline program.
  41378. *
  41379. * @method Phaser.Renderer.WebGL.WebGLPipeline#setMatrix4
  41380. * @since 3.2.0
  41381. *
  41382. * @param {string} name - The name of the uniform to look-up and modify.
  41383. * @param {boolean} transpose - Should the matrix be transpose
  41384. * @param {Float32Array} matrix - Matrix data
  41385. *
  41386. * @return {this} This WebGLPipeline instance.
  41387. */
  41388. setMatrix4: function (name, transpose, matrix)
  41389. {
  41390. this.renderer.setMatrix4(this.program, name, transpose, matrix);
  41391. return this;
  41392. }
  41393. });
  41394. module.exports = WebGLPipeline;
  41395. /***/ }),
  41396. /* 213 */
  41397. /***/ (function(module, exports, __webpack_require__) {
  41398. /**
  41399. * @author Richard Davey <rich@photonstorm.com>
  41400. * @copyright 2019 Photon Storm Ltd.
  41401. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  41402. */
  41403. var Wrap = __webpack_require__(57);
  41404. /**
  41405. * Wrap an angle in degrees.
  41406. *
  41407. * Wraps the angle to a value in the range of -180 to 180.
  41408. *
  41409. * @function Phaser.Math.Angle.WrapDegrees
  41410. * @since 3.0.0
  41411. *
  41412. * @param {number} angle - The angle to wrap, in degrees.
  41413. *
  41414. * @return {number} The wrapped angle, in degrees.
  41415. */
  41416. var WrapDegrees = function (angle)
  41417. {
  41418. return Wrap(angle, -180, 180);
  41419. };
  41420. module.exports = WrapDegrees;
  41421. /***/ }),
  41422. /* 214 */
  41423. /***/ (function(module, exports, __webpack_require__) {
  41424. /**
  41425. * @author Richard Davey <rich@photonstorm.com>
  41426. * @copyright 2019 Photon Storm Ltd.
  41427. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  41428. */
  41429. var MathWrap = __webpack_require__(57);
  41430. /**
  41431. * Wrap an angle.
  41432. *
  41433. * Wraps the angle to a value in the range of -PI to PI.
  41434. *
  41435. * @function Phaser.Math.Angle.Wrap
  41436. * @since 3.0.0
  41437. *
  41438. * @param {number} angle - The angle to wrap, in radians.
  41439. *
  41440. * @return {number} The wrapped angle, in radians.
  41441. */
  41442. var Wrap = function (angle)
  41443. {
  41444. return MathWrap(angle, -Math.PI, Math.PI);
  41445. };
  41446. module.exports = Wrap;
  41447. /***/ }),
  41448. /* 215 */
  41449. /***/ (function(module, exports) {
  41450. var g;
  41451. // This works in non-strict mode
  41452. g = (function() {
  41453. return this;
  41454. })();
  41455. try {
  41456. // This works if eval is allowed (see CSP)
  41457. g = g || Function("return this")() || (1, eval)("this");
  41458. } catch (e) {
  41459. // This works if the window reference is available
  41460. if (typeof window === "object") g = window;
  41461. }
  41462. // g can still be undefined, but nothing to do about it...
  41463. // We return undefined, instead of nothing here, so it's
  41464. // easier to handle this case. if(!global) { ...}
  41465. module.exports = g;
  41466. /***/ }),
  41467. /* 216 */
  41468. /***/ (function(module, exports, __webpack_require__) {
  41469. /**
  41470. * @author Richard Davey <rich@photonstorm.com>
  41471. * @copyright 2019 Photon Storm Ltd.
  41472. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  41473. */
  41474. /**
  41475. * @namespace Phaser.Tweens.Events
  41476. */
  41477. module.exports = {
  41478. TIMELINE_COMPLETE: __webpack_require__(475),
  41479. TIMELINE_LOOP: __webpack_require__(474),
  41480. TIMELINE_PAUSE: __webpack_require__(473),
  41481. TIMELINE_RESUME: __webpack_require__(472),
  41482. TIMELINE_START: __webpack_require__(471),
  41483. TIMELINE_UPDATE: __webpack_require__(470)
  41484. };
  41485. /***/ }),
  41486. /* 217 */
  41487. /***/ (function(module, exports, __webpack_require__) {
  41488. /**
  41489. * @author Richard Davey <rich@photonstorm.com>
  41490. * @copyright 2019 Photon Storm Ltd.
  41491. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  41492. */
  41493. var Class = __webpack_require__(0);
  41494. var EventEmitter = __webpack_require__(11);
  41495. var Events = __webpack_require__(216);
  41496. var TweenBuilder = __webpack_require__(104);
  41497. var TWEEN_CONST = __webpack_require__(89);
  41498. /**
  41499. * @classdesc
  41500. * A Timeline combines multiple Tweens into one. Its overall behavior is otherwise similar to a single Tween.
  41501. *
  41502. * The Timeline updates all of its Tweens simultaneously. Its methods allow you to easily build a sequence of Tweens (each one starting after the previous one) or run multiple Tweens at once during given parts of the Timeline.
  41503. *
  41504. * @class Timeline
  41505. * @memberof Phaser.Tweens
  41506. * @extends Phaser.Events.EventEmitter
  41507. * @constructor
  41508. * @since 3.0.0
  41509. *
  41510. * @param {Phaser.Tweens.TweenManager} manager - The Tween Manager which owns this Timeline.
  41511. */
  41512. var Timeline = new Class({
  41513. Extends: EventEmitter,
  41514. initialize:
  41515. function Timeline (manager)
  41516. {
  41517. EventEmitter.call(this);
  41518. /**
  41519. * The Tween Manager which owns this Timeline.
  41520. *
  41521. * @name Phaser.Tweens.Timeline#manager
  41522. * @type {Phaser.Tweens.TweenManager}
  41523. * @since 3.0.0
  41524. */
  41525. this.manager = manager;
  41526. /**
  41527. * A constant value which allows this Timeline to be easily identified as one.
  41528. *
  41529. * @name Phaser.Tweens.Timeline#isTimeline
  41530. * @type {boolean}
  41531. * @default true
  41532. * @since 3.0.0
  41533. */
  41534. this.isTimeline = true;
  41535. /**
  41536. * An array of Tween objects, each containing a unique property and target being tweened.
  41537. *
  41538. * @name Phaser.Tweens.Timeline#data
  41539. * @type {array}
  41540. * @default []
  41541. * @since 3.0.0
  41542. */
  41543. this.data = [];
  41544. /**
  41545. * data array doesn't usually change, so we can cache the length
  41546. *
  41547. * @name Phaser.Tweens.Timeline#totalData
  41548. * @type {number}
  41549. * @default 0
  41550. * @since 3.0.0
  41551. */
  41552. this.totalData = 0;
  41553. /**
  41554. * If true then duration, delay, etc values are all frame totals.
  41555. *
  41556. * @name Phaser.Tweens.Timeline#useFrames
  41557. * @type {boolean}
  41558. * @default false
  41559. * @since 3.0.0
  41560. */
  41561. this.useFrames = false;
  41562. /**
  41563. * Scales the time applied to this Tween. A value of 1 runs in real-time. A value of 0.5 runs 50% slower, and so on.
  41564. * Value isn't used when calculating total duration of the tween, it's a run-time delta adjustment only.
  41565. *
  41566. * @name Phaser.Tweens.Timeline#timeScale
  41567. * @type {number}
  41568. * @default 1
  41569. * @since 3.0.0
  41570. */
  41571. this.timeScale = 1;
  41572. /**
  41573. * Loop this tween? Can be -1 for an infinite loop, or an integer.
  41574. * When enabled it will play through ALL TweenDatas again (use TweenData.repeat to loop a single TD)
  41575. *
  41576. * @name Phaser.Tweens.Timeline#loop
  41577. * @type {number}
  41578. * @default 0
  41579. * @since 3.0.0
  41580. */
  41581. this.loop = 0;
  41582. /**
  41583. * Time in ms/frames before the tween loops.
  41584. *
  41585. * @name Phaser.Tweens.Timeline#loopDelay
  41586. * @type {number}
  41587. * @default 0
  41588. * @since 3.0.0
  41589. */
  41590. this.loopDelay = 0;
  41591. /**
  41592. * How many loops are left to run?
  41593. *
  41594. * @name Phaser.Tweens.Timeline#loopCounter
  41595. * @type {number}
  41596. * @default 0
  41597. * @since 3.0.0
  41598. */
  41599. this.loopCounter = 0;
  41600. /**
  41601. * Time in ms/frames before the 'onComplete' event fires. This never fires if loop = true (as it never completes)
  41602. *
  41603. * @name Phaser.Tweens.Timeline#completeDelay
  41604. * @type {number}
  41605. * @default 0
  41606. * @since 3.0.0
  41607. */
  41608. this.completeDelay = 0;
  41609. /**
  41610. * Countdown timer (used by loopDelay and completeDelay)
  41611. *
  41612. * @name Phaser.Tweens.Timeline#countdown
  41613. * @type {number}
  41614. * @default 0
  41615. * @since 3.0.0
  41616. */
  41617. this.countdown = 0;
  41618. /**
  41619. * The current state of the tween
  41620. *
  41621. * @name Phaser.Tweens.Timeline#state
  41622. * @type {integer}
  41623. * @since 3.0.0
  41624. */
  41625. this.state = TWEEN_CONST.PENDING_ADD;
  41626. /**
  41627. * The state of the tween when it was paused (used by Resume)
  41628. *
  41629. * @name Phaser.Tweens.Timeline#_pausedState
  41630. * @type {integer}
  41631. * @private
  41632. * @since 3.0.0
  41633. */
  41634. this._pausedState = TWEEN_CONST.PENDING_ADD;
  41635. /**
  41636. * Does the Tween start off paused? (if so it needs to be started with Tween.play)
  41637. *
  41638. * @name Phaser.Tweens.Timeline#paused
  41639. * @type {boolean}
  41640. * @default false
  41641. * @since 3.0.0
  41642. */
  41643. this.paused = false;
  41644. /**
  41645. * Elapsed time in ms/frames of this run through the Tween.
  41646. *
  41647. * @name Phaser.Tweens.Timeline#elapsed
  41648. * @type {number}
  41649. * @default 0
  41650. * @since 3.0.0
  41651. */
  41652. this.elapsed = 0;
  41653. /**
  41654. * Total elapsed time in ms/frames of the entire Tween, including looping.
  41655. *
  41656. * @name Phaser.Tweens.Timeline#totalElapsed
  41657. * @type {number}
  41658. * @default 0
  41659. * @since 3.0.0
  41660. */
  41661. this.totalElapsed = 0;
  41662. /**
  41663. * Time in ms/frames for the whole Tween to play through once, excluding loop amounts and loop delays.
  41664. *
  41665. * @name Phaser.Tweens.Timeline#duration
  41666. * @type {number}
  41667. * @default 0
  41668. * @since 3.0.0
  41669. */
  41670. this.duration = 0;
  41671. /**
  41672. * Value between 0 and 1. The amount through the Tween, excluding loops.
  41673. *
  41674. * @name Phaser.Tweens.Timeline#progress
  41675. * @type {number}
  41676. * @default 0
  41677. * @since 3.0.0
  41678. */
  41679. this.progress = 0;
  41680. /**
  41681. * Time in ms/frames for all Tweens to complete (including looping)
  41682. *
  41683. * @name Phaser.Tweens.Timeline#totalDuration
  41684. * @type {number}
  41685. * @default 0
  41686. * @since 3.0.0
  41687. */
  41688. this.totalDuration = 0;
  41689. /**
  41690. * Value between 0 and 1. The amount through the entire Tween, including looping.
  41691. *
  41692. * @name Phaser.Tweens.Timeline#totalProgress
  41693. * @type {number}
  41694. * @default 0
  41695. * @since 3.0.0
  41696. */
  41697. this.totalProgress = 0;
  41698. this.callbacks = {
  41699. onComplete: null,
  41700. onLoop: null,
  41701. onStart: null,
  41702. onUpdate: null,
  41703. onYoyo: null
  41704. };
  41705. this.callbackScope;
  41706. },
  41707. /**
  41708. * Sets the value of the time scale applied to this Timeline. A value of 1 runs in real-time. A value of 0.5 runs 50% slower, and so on.
  41709. * Value isn't used when calculating total duration of the tween, it's a run-time delta adjustment only.
  41710. *
  41711. * @method Phaser.Tweens.Timeline#setTimeScale
  41712. * @since 3.0.0
  41713. *
  41714. * @param {number} value - The time scale value to set.
  41715. *
  41716. * @return {Phaser.Tweens.Timeline} This Timeline object.
  41717. */
  41718. setTimeScale: function (value)
  41719. {
  41720. this.timeScale = value;
  41721. return this;
  41722. },
  41723. /**
  41724. * Gets the value of the time scale applied to this Timeline. A value of 1 runs in real-time. A value of 0.5 runs 50% slower, and so on.
  41725. *
  41726. * @method Phaser.Tweens.Timeline#getTimeScale
  41727. * @since 3.0.0
  41728. *
  41729. * @return {number} The value of the time scale applied to this Tween.
  41730. */
  41731. getTimeScale: function ()
  41732. {
  41733. return this.timeScale;
  41734. },
  41735. /**
  41736. * Check whether or not the Timeline is playing.
  41737. *
  41738. * @method Phaser.Tweens.Timeline#isPlaying
  41739. * @since 3.0.0
  41740. *
  41741. * @return {boolean} `true` if this Timeline is active, otherwise `false`.
  41742. */
  41743. isPlaying: function ()
  41744. {
  41745. return (this.state === TWEEN_CONST.ACTIVE);
  41746. },
  41747. /**
  41748. * [description]
  41749. *
  41750. * @method Phaser.Tweens.Timeline#add
  41751. * @since 3.0.0
  41752. *
  41753. * @param {object} config - [description]
  41754. *
  41755. * @return {Phaser.Tweens.Timeline} This Timeline object.
  41756. */
  41757. add: function (config)
  41758. {
  41759. return this.queue(TweenBuilder(this, config));
  41760. },
  41761. /**
  41762. * [description]
  41763. *
  41764. * @method Phaser.Tweens.Timeline#queue
  41765. * @since 3.0.0
  41766. *
  41767. * @param {Phaser.Tweens.Tween} tween - [description]
  41768. *
  41769. * @return {Phaser.Tweens.Timeline} This Timeline object.
  41770. */
  41771. queue: function (tween)
  41772. {
  41773. if (!this.isPlaying())
  41774. {
  41775. tween.parent = this;
  41776. tween.parentIsTimeline = true;
  41777. this.data.push(tween);
  41778. this.totalData = this.data.length;
  41779. }
  41780. return this;
  41781. },
  41782. /**
  41783. * [description]
  41784. *
  41785. * @method Phaser.Tweens.Timeline#hasOffset
  41786. * @since 3.0.0
  41787. *
  41788. * @param {Phaser.Tweens.Tween} tween - [description]
  41789. *
  41790. * @return {boolean} [description]
  41791. */
  41792. hasOffset: function (tween)
  41793. {
  41794. return (tween.offset !== null);
  41795. },
  41796. /**
  41797. * Checks whether the offset value is a number or a directive that is relative to previous tweens.
  41798. *
  41799. * @method Phaser.Tweens.Timeline#isOffsetAbsolute
  41800. * @since 3.0.0
  41801. *
  41802. * @param {number} value - The offset value to be evaluated
  41803. *
  41804. * @return {boolean} True if the result is a number, false if it is a directive like " -= 1000"
  41805. */
  41806. isOffsetAbsolute: function (value)
  41807. {
  41808. return (typeof(value) === 'number');
  41809. },
  41810. /**
  41811. * Checks if the offset is a relative value rather than an absolute one. If the value is just a number, this returns false.
  41812. *
  41813. * @method Phaser.Tweens.Timeline#isOffsetRelative
  41814. * @since 3.0.0
  41815. *
  41816. * @param {string} value - The offset value to be evaluated
  41817. *
  41818. * @return {boolean} Returns true if the value is relative, i.e " -= 1000". If false, the offset is absolute.
  41819. */
  41820. isOffsetRelative: function (value)
  41821. {
  41822. var t = typeof(value);
  41823. if (t === 'string')
  41824. {
  41825. var op = value[0];
  41826. if (op === '-' || op === '+')
  41827. {
  41828. return true;
  41829. }
  41830. }
  41831. return false;
  41832. },
  41833. /**
  41834. * Parses the relative offset value, returning a positive or negative number.
  41835. *
  41836. * @method Phaser.Tweens.Timeline#getRelativeOffset
  41837. * @since 3.0.0
  41838. *
  41839. * @param {string} value - The relative offset, in the format of '-=500', for example. The first character determines whether it will be a positive or negative number. Spacing matters here.
  41840. * @param {number} base - The value to use as the offset.
  41841. *
  41842. * @return {number} The returned number value.
  41843. */
  41844. getRelativeOffset: function (value, base)
  41845. {
  41846. var op = value[0];
  41847. var num = parseFloat(value.substr(2));
  41848. var result = base;
  41849. switch (op)
  41850. {
  41851. case '+':
  41852. result += num;
  41853. break;
  41854. case '-':
  41855. result -= num;
  41856. break;
  41857. }
  41858. // Cannot ever be < 0
  41859. return Math.max(0, result);
  41860. },
  41861. /**
  41862. * Calculates the total duration of the timeline. Computes all tween's durations and returns the full duration of the timeline. The resulting number is stored in the timeline, not as a return value.
  41863. *
  41864. * @method Phaser.Tweens.Timeline#calcDuration
  41865. * @since 3.0.0
  41866. */
  41867. calcDuration: function ()
  41868. {
  41869. var prevEnd = 0;
  41870. var totalDuration = 0;
  41871. var offsetDuration = 0;
  41872. for (var i = 0; i < this.totalData; i++)
  41873. {
  41874. var tween = this.data[i];
  41875. tween.init();
  41876. if (this.hasOffset(tween))
  41877. {
  41878. if (this.isOffsetAbsolute(tween.offset))
  41879. {
  41880. // An actual number, so it defines the start point from the beginning of the timeline
  41881. tween.calculatedOffset = tween.offset;
  41882. if (tween.offset === 0)
  41883. {
  41884. offsetDuration = 0;
  41885. }
  41886. }
  41887. else if (this.isOffsetRelative(tween.offset))
  41888. {
  41889. // A relative offset (i.e. '-=1000', so starts at 'offset' ms relative to the PREVIOUS Tweens ending time)
  41890. tween.calculatedOffset = this.getRelativeOffset(tween.offset, prevEnd);
  41891. }
  41892. }
  41893. else
  41894. {
  41895. // Sequential
  41896. tween.calculatedOffset = offsetDuration;
  41897. }
  41898. prevEnd = tween.totalDuration + tween.calculatedOffset;
  41899. totalDuration += tween.totalDuration;
  41900. offsetDuration += tween.totalDuration;
  41901. }
  41902. // Excludes loop values
  41903. this.duration = totalDuration;
  41904. this.loopCounter = (this.loop === -1) ? 999999999999 : this.loop;
  41905. if (this.loopCounter > 0)
  41906. {
  41907. this.totalDuration = this.duration + this.completeDelay + ((this.duration + this.loopDelay) * this.loopCounter);
  41908. }
  41909. else
  41910. {
  41911. this.totalDuration = this.duration + this.completeDelay;
  41912. }
  41913. },
  41914. /**
  41915. * Initializes the timeline, which means all Tweens get their init() called, and the total duration will be computed. Returns a boolean indicating whether the timeline is auto-started or not.
  41916. *
  41917. * @method Phaser.Tweens.Timeline#init
  41918. * @since 3.0.0
  41919. *
  41920. * @return {boolean} Returns true if the timeline is started. False if it is paused.
  41921. */
  41922. init: function ()
  41923. {
  41924. this.calcDuration();
  41925. this.progress = 0;
  41926. this.totalProgress = 0;
  41927. if (this.paused)
  41928. {
  41929. this.state = TWEEN_CONST.PAUSED;
  41930. return false;
  41931. }
  41932. else
  41933. {
  41934. return true;
  41935. }
  41936. },
  41937. /**
  41938. * Resets all of the timeline's tweens back to their initial states. The boolean parameter indicates whether tweens that are looping should reset as well, or not.
  41939. *
  41940. * @method Phaser.Tweens.Timeline#resetTweens
  41941. * @since 3.0.0
  41942. *
  41943. * @param {boolean} resetFromLoop - If true, resets all looping tweens to their initial values.
  41944. */
  41945. resetTweens: function (resetFromLoop)
  41946. {
  41947. for (var i = 0; i < this.totalData; i++)
  41948. {
  41949. var tween = this.data[i];
  41950. tween.play(resetFromLoop);
  41951. }
  41952. },
  41953. /**
  41954. * Sets a callback for the Timeline.
  41955. *
  41956. * @method Phaser.Tweens.Timeline#setCallback
  41957. * @since 3.0.0
  41958. *
  41959. * @param {string} type - The internal type of callback to set.
  41960. * @param {function} callback - Timeline allows multiple tweens to be linked together to create a streaming sequence.
  41961. * @param {array} [params] - The parameters to pass to the callback.
  41962. * @param {object} [scope] - The context scope of the callback.
  41963. *
  41964. * @return {Phaser.Tweens.Timeline} This Timeline object.
  41965. */
  41966. setCallback: function (type, callback, params, scope)
  41967. {
  41968. if (Timeline.TYPES.indexOf(type) !== -1)
  41969. {
  41970. this.callbacks[type] = { func: callback, scope: scope, params: params };
  41971. }
  41972. return this;
  41973. },
  41974. /**
  41975. * Delegates #makeActive to the Tween manager.
  41976. *
  41977. * @method Phaser.Tweens.Timeline#makeActive
  41978. * @since 3.3.0
  41979. *
  41980. * @param {Phaser.Tweens.Tween} tween - The tween object to make active.
  41981. *
  41982. * @return {Phaser.Tweens.TweenManager} The Timeline's Tween Manager object.
  41983. */
  41984. makeActive: function (tween)
  41985. {
  41986. return this.manager.makeActive(tween);
  41987. },
  41988. /**
  41989. * Starts playing the timeline.
  41990. *
  41991. * @method Phaser.Tweens.Timeline#play
  41992. * @fires Phaser.Tweens.Events#TIMELINE_START
  41993. * @since 3.0.0
  41994. */
  41995. play: function ()
  41996. {
  41997. if (this.state === TWEEN_CONST.ACTIVE)
  41998. {
  41999. return;
  42000. }
  42001. if (this.paused)
  42002. {
  42003. this.paused = false;
  42004. this.manager.makeActive(this);
  42005. return;
  42006. }
  42007. else
  42008. {
  42009. this.resetTweens(false);
  42010. this.state = TWEEN_CONST.ACTIVE;
  42011. }
  42012. var onStart = this.callbacks.onStart;
  42013. if (onStart)
  42014. {
  42015. onStart.func.apply(onStart.scope, onStart.params);
  42016. }
  42017. this.emit(Events.TIMELINE_START, this);
  42018. },
  42019. /**
  42020. * [description]
  42021. *
  42022. * @method Phaser.Tweens.Timeline#nextState
  42023. * @fires Phaser.Tweens.Events#TIMELINE_COMPLETE
  42024. * @fires Phaser.Tweens.Events#TIMELINE_LOOP
  42025. * @since 3.0.0
  42026. */
  42027. nextState: function ()
  42028. {
  42029. if (this.loopCounter > 0)
  42030. {
  42031. // Reset the elapsed time
  42032. // TODO: Probably ought to be set to the remainder from elapsed - duration
  42033. // as the tweens nearly always over-run by a few ms due to rAf
  42034. this.elapsed = 0;
  42035. this.progress = 0;
  42036. this.loopCounter--;
  42037. var onLoop = this.callbacks.onLoop;
  42038. if (onLoop)
  42039. {
  42040. onLoop.func.apply(onLoop.scope, onLoop.params);
  42041. }
  42042. this.emit(Events.TIMELINE_LOOP, this, this.loopCounter);
  42043. this.resetTweens(true);
  42044. if (this.loopDelay > 0)
  42045. {
  42046. this.countdown = this.loopDelay;
  42047. this.state = TWEEN_CONST.LOOP_DELAY;
  42048. }
  42049. else
  42050. {
  42051. this.state = TWEEN_CONST.ACTIVE;
  42052. }
  42053. }
  42054. else if (this.completeDelay > 0)
  42055. {
  42056. this.countdown = this.completeDelay;
  42057. this.state = TWEEN_CONST.COMPLETE_DELAY;
  42058. }
  42059. else
  42060. {
  42061. this.state = TWEEN_CONST.PENDING_REMOVE;
  42062. var onComplete = this.callbacks.onComplete;
  42063. if (onComplete)
  42064. {
  42065. onComplete.func.apply(onComplete.scope, onComplete.params);
  42066. }
  42067. this.emit(Events.TIMELINE_COMPLETE, this);
  42068. }
  42069. },
  42070. /**
  42071. * Returns 'true' if this Timeline has finished and should be removed from the Tween Manager.
  42072. * Otherwise, returns false.
  42073. *
  42074. * @method Phaser.Tweens.Timeline#update
  42075. * @fires Phaser.Tweens.Events#TIMELINE_COMPLETE
  42076. * @fires Phaser.Tweens.Events#TIMELINE_UPDATE
  42077. * @since 3.0.0
  42078. *
  42079. * @param {number} timestamp - [description]
  42080. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  42081. *
  42082. * @return {boolean} Returns `true` if this Timeline has finished and should be removed from the Tween Manager.
  42083. */
  42084. update: function (timestamp, delta)
  42085. {
  42086. if (this.state === TWEEN_CONST.PAUSED)
  42087. {
  42088. return;
  42089. }
  42090. var rawDelta = delta;
  42091. if (this.useFrames)
  42092. {
  42093. delta = 1 * this.manager.timeScale;
  42094. }
  42095. delta *= this.timeScale;
  42096. this.elapsed += delta;
  42097. this.progress = Math.min(this.elapsed / this.duration, 1);
  42098. this.totalElapsed += delta;
  42099. this.totalProgress = Math.min(this.totalElapsed / this.totalDuration, 1);
  42100. switch (this.state)
  42101. {
  42102. case TWEEN_CONST.ACTIVE:
  42103. var stillRunning = this.totalData;
  42104. for (var i = 0; i < this.totalData; i++)
  42105. {
  42106. var tween = this.data[i];
  42107. if (tween.update(timestamp, rawDelta))
  42108. {
  42109. stillRunning--;
  42110. }
  42111. }
  42112. var onUpdate = this.callbacks.onUpdate;
  42113. if (onUpdate)
  42114. {
  42115. onUpdate.func.apply(onUpdate.scope, onUpdate.params);
  42116. }
  42117. this.emit(Events.TIMELINE_UPDATE, this);
  42118. // Anything still running? If not, we're done
  42119. if (stillRunning === 0)
  42120. {
  42121. this.nextState();
  42122. }
  42123. break;
  42124. case TWEEN_CONST.LOOP_DELAY:
  42125. this.countdown -= delta;
  42126. if (this.countdown <= 0)
  42127. {
  42128. this.state = TWEEN_CONST.ACTIVE;
  42129. }
  42130. break;
  42131. case TWEEN_CONST.COMPLETE_DELAY:
  42132. this.countdown -= delta;
  42133. if (this.countdown <= 0)
  42134. {
  42135. this.state = TWEEN_CONST.PENDING_REMOVE;
  42136. var onComplete = this.callbacks.onComplete;
  42137. if (onComplete)
  42138. {
  42139. onComplete.func.apply(onComplete.scope, onComplete.params);
  42140. }
  42141. this.emit(Events.TIMELINE_COMPLETE, this);
  42142. }
  42143. break;
  42144. }
  42145. return (this.state === TWEEN_CONST.PENDING_REMOVE);
  42146. },
  42147. /**
  42148. * Stops the Tween immediately, whatever stage of progress it is at and flags it for removal by the TweenManager.
  42149. *
  42150. * @method Phaser.Tweens.Timeline#stop
  42151. * @since 3.0.0
  42152. */
  42153. stop: function ()
  42154. {
  42155. this.state = TWEEN_CONST.PENDING_REMOVE;
  42156. },
  42157. /**
  42158. * Pauses the timeline, retaining its internal state.
  42159. *
  42160. * @method Phaser.Tweens.Timeline#pause
  42161. * @fires Phaser.Tweens.Events#TIMELINE_PAUSE
  42162. * @since 3.0.0
  42163. *
  42164. * @return {Phaser.Tweens.Timeline} This Timeline object.
  42165. */
  42166. pause: function ()
  42167. {
  42168. if (this.state === TWEEN_CONST.PAUSED)
  42169. {
  42170. return;
  42171. }
  42172. this.paused = true;
  42173. this._pausedState = this.state;
  42174. this.state = TWEEN_CONST.PAUSED;
  42175. this.emit(Events.TIMELINE_PAUSE, this);
  42176. return this;
  42177. },
  42178. /**
  42179. * Resumes the timeline from where it was when it was paused.
  42180. *
  42181. * @method Phaser.Tweens.Timeline#resume
  42182. * @fires Phaser.Tweens.Events#TIMELINE_RESUME
  42183. * @since 3.0.0
  42184. *
  42185. * @return {Phaser.Tweens.Timeline} This Timeline object.
  42186. */
  42187. resume: function ()
  42188. {
  42189. if (this.state === TWEEN_CONST.PAUSED)
  42190. {
  42191. this.paused = false;
  42192. this.state = this._pausedState;
  42193. }
  42194. this.emit(Events.TIMELINE_RESUME, this);
  42195. return this;
  42196. },
  42197. /**
  42198. * Checks if any of the tweens has the target as the object they are operating on. Retuns false if no tweens operate on the target object.
  42199. *
  42200. * @method Phaser.Tweens.Timeline#hasTarget
  42201. * @since 3.0.0
  42202. *
  42203. * @param {object} target - The target to check all tweens against.
  42204. *
  42205. * @return {boolean} True if there at least a single tween that operates on the target object. False otherwise.
  42206. */
  42207. hasTarget: function (target)
  42208. {
  42209. for (var i = 0; i < this.data.length; i++)
  42210. {
  42211. if (this.data[i].hasTarget(target))
  42212. {
  42213. return true;
  42214. }
  42215. }
  42216. return false;
  42217. },
  42218. /**
  42219. * Stops all the Tweens in the Timeline immediately, whatever stage of progress they are at and flags them for removal by the TweenManager.
  42220. *
  42221. * @method Phaser.Tweens.Timeline#destroy
  42222. * @since 3.0.0
  42223. */
  42224. destroy: function ()
  42225. {
  42226. for (var i = 0; i < this.data.length; i++)
  42227. {
  42228. this.data[i].stop();
  42229. }
  42230. }
  42231. });
  42232. Timeline.TYPES = [ 'onStart', 'onUpdate', 'onLoop', 'onComplete', 'onYoyo' ];
  42233. module.exports = Timeline;
  42234. /***/ }),
  42235. /* 218 */
  42236. /***/ (function(module, exports, __webpack_require__) {
  42237. /**
  42238. * @author Richard Davey <rich@photonstorm.com>
  42239. * @copyright 2019 Photon Storm Ltd.
  42240. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  42241. */
  42242. var Clone = __webpack_require__(70);
  42243. var Defaults = __webpack_require__(141);
  42244. var GetAdvancedValue = __webpack_require__(12);
  42245. var GetBoolean = __webpack_require__(90);
  42246. var GetEaseFunction = __webpack_require__(92);
  42247. var GetNewValue = __webpack_require__(105);
  42248. var GetTargets = __webpack_require__(143);
  42249. var GetTweens = __webpack_require__(220);
  42250. var GetValue = __webpack_require__(4);
  42251. var Timeline = __webpack_require__(217);
  42252. var TweenBuilder = __webpack_require__(104);
  42253. /**
  42254. * Builds a Timeline of Tweens based on a configuration object.
  42255. *
  42256. * The configuration object (`config`) can have the following properties:
  42257. *
  42258. * `tweens` - an array of tween configuration objects to create and add into the new Timeline, as described by `TweenBuilder`. If this doesn't exist or is empty, the Timeline will start off paused and none of the other configuration settings will be read. If it's a function, it will be called and its return value will be used as the array.
  42259. * `targets` - an array (or function which returns one) of default targets to which to apply the Timeline. Each individual Tween configuration can override this value.
  42260. * `totalDuration` - if specified, each Tween in the Timeline will get an equal portion of this duration, usually in milliseconds, by default. Each individual Tween configuration can override the Tween's duration.
  42261. * `duration` - if `totalDuration` is not specified, the default duration, usually in milliseconds, of each Tween which will be created. Each individual Tween configuration can override the Tween's duration.
  42262. * `delay`, `easeParams`, `ease`, `hold`, `repeat`, `repeatDelay`, `yoyo`, `flipX`, `flipY` - the default settings for each Tween which will be created, as specified by `TweenBuilder`. Each individual Tween configuration can override any of these values.
  42263. * `completeDelay` - if specified, the time to wait, usually in milliseconds, before the Timeline completes.
  42264. * `loop` - how many times the Timeline should loop, or -1 to loop indefinitely.
  42265. * `loopDelay` - the time, usually in milliseconds, between each loop
  42266. * `paused` - if `true`, the Timeline will start paused
  42267. * `useFrames` - if `true`, all duration in the Timeline will be in frames instead of milliseconds
  42268. * `callbackScope` - the default scope (`this` value) to use for each callback registered by the Timeline Builder. If not specified, the Timeline itself will be used.
  42269. * `onStart` - if specified, the `onStart` callback for the Timeline, called every time it starts playing
  42270. * `onStartScope` - the scope (`this` value) to use for the `onStart` callback. If not specified, the `callbackScope` will be used.
  42271. * `onStartParams` - additional arguments to pass to the `onStart` callback. The Timeline will always be the first argument.
  42272. * `onUpdate` - if specified, the `onUpdate` callback for the Timeline, called every frame it's active, regardless of its Tweens
  42273. * `onUpdateScope` - the scope (`this` value) to use for the `onUpdate` callback. If not specified, the `callbackScope` will be used.
  42274. * `onUpdateParams` - additional arguments to pass to the `onUpdate` callback. The Timeline will always be the first argument.
  42275. * `onLoop` - if specified, the `onLoop` callback for the Timeline, called every time it loops
  42276. * `onLoopScope` - the scope (`this` value) to use for the `onLoop` callback. If not specified, the `callbackScope` will be used.
  42277. * `onLoopParams` - additional arguments to pass to the `onLoop` callback. The Timeline will always be the first argument.
  42278. * `onYoyo` - if specified, the `onYoyo` callback for the Timeline, called every time it yoyos
  42279. * `onYoyoScope` - the scope (`this` value) to use for the `onYoyo` callback. If not specified, the `callbackScope` will be used.
  42280. * `onYoyoParams` - additional arguments to pass to the `onYoyo` callback. The first argument will always be `null`, while the Timeline will always be the second argument.
  42281. * `onComplete` - if specified, the `onComplete` callback for the Timeline, called after it completes
  42282. * `onCompleteScope` - the scope (`this` value) to use for the `onComplete` callback. If not specified, the `callbackScope` will be used.
  42283. * `onCompleteParams` - additional arguments to pass to the `onComplete` callback. The Timeline will always be the first argument.
  42284. *
  42285. * @function Phaser.Tweens.Builders.TimelineBuilder
  42286. * @since 3.0.0
  42287. *
  42288. * @param {Phaser.Tweens.TweenManager} manager - The Tween Manager to which the Timeline will belong.
  42289. * @param {object} config - The configuration object for the Timeline, as described above.
  42290. *
  42291. * @return {Phaser.Tweens.Timeline} The created Timeline.
  42292. */
  42293. var TimelineBuilder = function (manager, config)
  42294. {
  42295. var timeline = new Timeline(manager);
  42296. var tweens = GetTweens(config);
  42297. if (tweens.length === 0)
  42298. {
  42299. timeline.paused = true;
  42300. return timeline;
  42301. }
  42302. var defaults = Clone(Defaults);
  42303. defaults.targets = GetTargets(config);
  42304. // totalDuration: If specified each tween in the Timeline is given an equal portion of the totalDuration
  42305. var totalDuration = GetAdvancedValue(config, 'totalDuration', 0);
  42306. if (totalDuration > 0)
  42307. {
  42308. defaults.duration = Math.floor(totalDuration / tweens.length);
  42309. }
  42310. else
  42311. {
  42312. defaults.duration = GetNewValue(config, 'duration', defaults.duration);
  42313. }
  42314. defaults.delay = GetNewValue(config, 'delay', defaults.delay);
  42315. defaults.easeParams = GetValue(config, 'easeParams', defaults.easeParams);
  42316. defaults.ease = GetEaseFunction(GetValue(config, 'ease', defaults.ease), defaults.easeParams);
  42317. defaults.hold = GetNewValue(config, 'hold', defaults.hold);
  42318. defaults.repeat = GetNewValue(config, 'repeat', defaults.repeat);
  42319. defaults.repeatDelay = GetNewValue(config, 'repeatDelay', defaults.repeatDelay);
  42320. defaults.yoyo = GetBoolean(config, 'yoyo', defaults.yoyo);
  42321. defaults.flipX = GetBoolean(config, 'flipX', defaults.flipX);
  42322. defaults.flipY = GetBoolean(config, 'flipY', defaults.flipY);
  42323. // Create the Tweens
  42324. for (var i = 0; i < tweens.length; i++)
  42325. {
  42326. timeline.queue(TweenBuilder(timeline, tweens[i], defaults));
  42327. }
  42328. timeline.completeDelay = GetAdvancedValue(config, 'completeDelay', 0);
  42329. timeline.loop = Math.round(GetAdvancedValue(config, 'loop', 0));
  42330. timeline.loopDelay = Math.round(GetAdvancedValue(config, 'loopDelay', 0));
  42331. timeline.paused = GetBoolean(config, 'paused', false);
  42332. timeline.useFrames = GetBoolean(config, 'useFrames', false);
  42333. // Callbacks
  42334. var scope = GetValue(config, 'callbackScope', timeline);
  42335. var timelineArray = [ timeline ];
  42336. var onStart = GetValue(config, 'onStart', false);
  42337. // The Start of the Timeline
  42338. if (onStart)
  42339. {
  42340. var onStartScope = GetValue(config, 'onStartScope', scope);
  42341. var onStartParams = GetValue(config, 'onStartParams', []);
  42342. timeline.setCallback('onStart', onStart, timelineArray.concat(onStartParams), onStartScope);
  42343. }
  42344. var onUpdate = GetValue(config, 'onUpdate', false);
  42345. // Every time the Timeline updates (regardless which Tweens are running)
  42346. if (onUpdate)
  42347. {
  42348. var onUpdateScope = GetValue(config, 'onUpdateScope', scope);
  42349. var onUpdateParams = GetValue(config, 'onUpdateParams', []);
  42350. timeline.setCallback('onUpdate', onUpdate, timelineArray.concat(onUpdateParams), onUpdateScope);
  42351. }
  42352. var onLoop = GetValue(config, 'onLoop', false);
  42353. // Called when the whole Timeline loops
  42354. if (onLoop)
  42355. {
  42356. var onLoopScope = GetValue(config, 'onLoopScope', scope);
  42357. var onLoopParams = GetValue(config, 'onLoopParams', []);
  42358. timeline.setCallback('onLoop', onLoop, timelineArray.concat(onLoopParams), onLoopScope);
  42359. }
  42360. var onYoyo = GetValue(config, 'onYoyo', false);
  42361. // Called when a Timeline yoyos
  42362. if (onYoyo)
  42363. {
  42364. var onYoyoScope = GetValue(config, 'onYoyoScope', scope);
  42365. var onYoyoParams = GetValue(config, 'onYoyoParams', []);
  42366. timeline.setCallback('onYoyo', onYoyo, timelineArray.concat(null, onYoyoParams), onYoyoScope);
  42367. }
  42368. var onComplete = GetValue(config, 'onComplete', false);
  42369. // Called when the Timeline completes, after the completeDelay, etc.
  42370. if (onComplete)
  42371. {
  42372. var onCompleteScope = GetValue(config, 'onCompleteScope', scope);
  42373. var onCompleteParams = GetValue(config, 'onCompleteParams', []);
  42374. timeline.setCallback('onComplete', onComplete, timelineArray.concat(onCompleteParams), onCompleteScope);
  42375. }
  42376. return timeline;
  42377. };
  42378. module.exports = TimelineBuilder;
  42379. /***/ }),
  42380. /* 219 */
  42381. /***/ (function(module, exports, __webpack_require__) {
  42382. /**
  42383. * @author Richard Davey <rich@photonstorm.com>
  42384. * @copyright 2019 Photon Storm Ltd.
  42385. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  42386. */
  42387. var Defaults = __webpack_require__(141);
  42388. var GetAdvancedValue = __webpack_require__(12);
  42389. var GetBoolean = __webpack_require__(90);
  42390. var GetEaseFunction = __webpack_require__(92);
  42391. var GetNewValue = __webpack_require__(105);
  42392. var GetValue = __webpack_require__(4);
  42393. var GetValueOp = __webpack_require__(142);
  42394. var Tween = __webpack_require__(140);
  42395. var TweenData = __webpack_require__(139);
  42396. /**
  42397. * [description]
  42398. *
  42399. * @function Phaser.Tweens.Builders.NumberTweenBuilder
  42400. * @since 3.0.0
  42401. *
  42402. * @param {(Phaser.Tweens.TweenManager|Phaser.Tweens.Timeline)} parent - [description]
  42403. * @param {object} config - [description]
  42404. * @param {Phaser.Tweens.TweenConfigDefaults} defaults - [description]
  42405. *
  42406. * @return {Phaser.Tweens.Tween} [description]
  42407. */
  42408. var NumberTweenBuilder = function (parent, config, defaults)
  42409. {
  42410. if (defaults === undefined)
  42411. {
  42412. defaults = Defaults;
  42413. }
  42414. // var tween = this.tweens.addCounter({
  42415. // from: 100,
  42416. // to: 200,
  42417. // ... (normal tween properties)
  42418. // })
  42419. //
  42420. // Then use it in your game via:
  42421. //
  42422. // tween.getValue()
  42423. var from = GetValue(config, 'from', 0);
  42424. var to = GetValue(config, 'to', 1);
  42425. var targets = [ { value: from } ];
  42426. var delay = GetNewValue(config, 'delay', defaults.delay);
  42427. var duration = GetNewValue(config, 'duration', defaults.duration);
  42428. var easeParams = GetValue(config, 'easeParams', defaults.easeParams);
  42429. var ease = GetEaseFunction(GetValue(config, 'ease', defaults.ease), easeParams);
  42430. var hold = GetNewValue(config, 'hold', defaults.hold);
  42431. var repeat = GetNewValue(config, 'repeat', defaults.repeat);
  42432. var repeatDelay = GetNewValue(config, 'repeatDelay', defaults.repeatDelay);
  42433. var yoyo = GetBoolean(config, 'yoyo', defaults.yoyo);
  42434. var data = [];
  42435. var ops = GetValueOp('value', to);
  42436. var tweenData = TweenData(
  42437. targets[0],
  42438. 'value',
  42439. ops.getEnd,
  42440. ops.getStart,
  42441. ease,
  42442. delay,
  42443. duration,
  42444. yoyo,
  42445. hold,
  42446. repeat,
  42447. repeatDelay,
  42448. false,
  42449. false
  42450. );
  42451. tweenData.start = from;
  42452. tweenData.current = from;
  42453. tweenData.to = to;
  42454. data.push(tweenData);
  42455. var tween = new Tween(parent, data, targets);
  42456. tween.offset = GetAdvancedValue(config, 'offset', null);
  42457. tween.completeDelay = GetAdvancedValue(config, 'completeDelay', 0);
  42458. tween.loop = Math.round(GetAdvancedValue(config, 'loop', 0));
  42459. tween.loopDelay = Math.round(GetAdvancedValue(config, 'loopDelay', 0));
  42460. tween.paused = GetBoolean(config, 'paused', false);
  42461. tween.useFrames = GetBoolean(config, 'useFrames', false);
  42462. // Set the Callbacks
  42463. var scope = GetValue(config, 'callbackScope', tween);
  42464. // Callback parameters: 0 = a reference to the Tween itself, 1 = the target/s of the Tween, ... your own params
  42465. var tweenArray = [ tween, null ];
  42466. var callbacks = Tween.TYPES;
  42467. for (var i = 0; i < callbacks.length; i++)
  42468. {
  42469. var type = callbacks[i];
  42470. var callback = GetValue(config, type, false);
  42471. if (callback)
  42472. {
  42473. var callbackScope = GetValue(config, type + 'Scope', scope);
  42474. var callbackParams = GetValue(config, type + 'Params', []);
  42475. // The null is reset to be the Tween target
  42476. tween.setCallback(type, callback, tweenArray.concat(callbackParams), callbackScope);
  42477. }
  42478. }
  42479. return tween;
  42480. };
  42481. module.exports = NumberTweenBuilder;
  42482. /***/ }),
  42483. /* 220 */
  42484. /***/ (function(module, exports, __webpack_require__) {
  42485. /**
  42486. * @author Richard Davey <rich@photonstorm.com>
  42487. * @copyright 2019 Photon Storm Ltd.
  42488. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  42489. */
  42490. var GetValue = __webpack_require__(4);
  42491. /**
  42492. * Returns an array of all tweens in the given config
  42493. *
  42494. * @function Phaser.Tweens.Builders.GetTweens
  42495. * @since 3.0.0
  42496. *
  42497. * @param {object} config - [description]
  42498. *
  42499. * @return {array} [description]
  42500. */
  42501. var GetTweens = function (config)
  42502. {
  42503. var tweens = GetValue(config, 'tweens', null);
  42504. if (tweens === null)
  42505. {
  42506. return [];
  42507. }
  42508. else if (typeof tweens === 'function')
  42509. {
  42510. tweens = tweens.call();
  42511. }
  42512. if (!Array.isArray(tweens))
  42513. {
  42514. tweens = [ tweens ];
  42515. }
  42516. return tweens;
  42517. };
  42518. module.exports = GetTweens;
  42519. /***/ }),
  42520. /* 221 */
  42521. /***/ (function(module, exports, __webpack_require__) {
  42522. /**
  42523. * @author Richard Davey <rich@photonstorm.com>
  42524. * @copyright 2019 Photon Storm Ltd.
  42525. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  42526. */
  42527. var RESERVED = __webpack_require__(476);
  42528. /**
  42529. * [description]
  42530. *
  42531. * @function Phaser.Tweens.Builders.GetProps
  42532. * @since 3.0.0
  42533. *
  42534. * @param {object} config - The configuration object of the tween to get the target(s) from.
  42535. *
  42536. * @return {array} An array of all the targets the tween is operating on.
  42537. */
  42538. var GetProps = function (config)
  42539. {
  42540. var key;
  42541. var keys = [];
  42542. // First see if we have a props object
  42543. if (config.hasOwnProperty('props'))
  42544. {
  42545. for (key in config.props)
  42546. {
  42547. // Skip any property that starts with an underscore
  42548. if (key.substr(0, 1) !== '_')
  42549. {
  42550. keys.push({ key: key, value: config.props[key] });
  42551. }
  42552. }
  42553. }
  42554. else
  42555. {
  42556. for (key in config)
  42557. {
  42558. // Skip any property that is in the ReservedProps list or that starts with an underscore
  42559. if (RESERVED.indexOf(key) === -1 && key.substr(0, 1) !== '_')
  42560. {
  42561. keys.push({ key: key, value: config[key] });
  42562. }
  42563. }
  42564. }
  42565. return keys;
  42566. };
  42567. module.exports = GetProps;
  42568. /***/ }),
  42569. /* 222 */
  42570. /***/ (function(module, exports, __webpack_require__) {
  42571. /**
  42572. * @author Richard Davey <rich@photonstorm.com>
  42573. * @copyright 2019 Photon Storm Ltd.
  42574. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  42575. */
  42576. var Class = __webpack_require__(0);
  42577. var GetFastValue = __webpack_require__(2);
  42578. /**
  42579. * @typedef {object} TimerEventConfig
  42580. *
  42581. * @property {number} [delay=0] - The delay after which the Timer Event should fire, in milliseconds.
  42582. * @property {number} [repeat=0] - The total number of times the Timer Event will repeat before finishing.
  42583. * @property {boolean} [loop=false] - `true` if the Timer Event should repeat indefinitely.
  42584. * @property {function} [callback] - The callback which will be called when the Timer Event fires.
  42585. * @property {*} [callbackScope] - The scope (`this` object) with which to invoke the `callback`.
  42586. * @property {Array.<*>} [args] - Additional arguments to be passed to the `callback`.
  42587. * @property {number} [timeScale=1] - The scale of the elapsed time.
  42588. * @property {number} [startAt=1] - The initial elapsed time in milliseconds. Useful if you want a long duration with repeat, but for the first loop to fire quickly.
  42589. * @property {boolean} [paused=false] - `true` if the Timer Event should be paused.
  42590. */
  42591. /**
  42592. * @classdesc
  42593. * A Timer Event represents a delayed function call. It's managed by a Scene's {@link Clock} and will call its function after a set amount of time has passed. The Timer Event can optionally repeat - i.e. call its function multiple times before finishing, or loop indefinitely.
  42594. *
  42595. * Because it's managed by a Clock, a Timer Event is based on game time, will be affected by its Clock's time scale, and will pause if its Clock pauses.
  42596. *
  42597. * @class TimerEvent
  42598. * @memberof Phaser.Time
  42599. * @constructor
  42600. * @since 3.0.0
  42601. *
  42602. * @param {TimerEventConfig} config - The configuration for the Timer Event, including its delay and callback.
  42603. */
  42604. var TimerEvent = new Class({
  42605. initialize:
  42606. function TimerEvent (config)
  42607. {
  42608. /**
  42609. * The delay in ms at which this TimerEvent fires.
  42610. *
  42611. * @name Phaser.Time.TimerEvent#delay
  42612. * @type {number}
  42613. * @default 0
  42614. * @readonly
  42615. * @since 3.0.0
  42616. */
  42617. this.delay = 0;
  42618. /**
  42619. * The total number of times this TimerEvent will repeat before finishing.
  42620. *
  42621. * @name Phaser.Time.TimerEvent#repeat
  42622. * @type {number}
  42623. * @default 0
  42624. * @readonly
  42625. * @since 3.0.0
  42626. */
  42627. this.repeat = 0;
  42628. /**
  42629. * If repeating this contains the current repeat count.
  42630. *
  42631. * @name Phaser.Time.TimerEvent#repeatCount
  42632. * @type {number}
  42633. * @default 0
  42634. * @since 3.0.0
  42635. */
  42636. this.repeatCount = 0;
  42637. /**
  42638. * True if this TimerEvent loops, otherwise false.
  42639. *
  42640. * @name Phaser.Time.TimerEvent#loop
  42641. * @type {boolean}
  42642. * @default false
  42643. * @readonly
  42644. * @since 3.0.0
  42645. */
  42646. this.loop = false;
  42647. /**
  42648. * The callback that will be called when the TimerEvent occurs.
  42649. *
  42650. * @name Phaser.Time.TimerEvent#callback
  42651. * @type {function}
  42652. * @since 3.0.0
  42653. */
  42654. this.callback;
  42655. /**
  42656. * The scope in which the callback will be called.
  42657. *
  42658. * @name Phaser.Time.TimerEvent#callbackScope
  42659. * @type {object}
  42660. * @since 3.0.0
  42661. */
  42662. this.callbackScope;
  42663. /**
  42664. * Additional arguments to be passed to the callback.
  42665. *
  42666. * @name Phaser.Time.TimerEvent#args
  42667. * @type {array}
  42668. * @since 3.0.0
  42669. */
  42670. this.args;
  42671. /**
  42672. * Scale the time causing this TimerEvent to update.
  42673. *
  42674. * @name Phaser.Time.TimerEvent#timeScale
  42675. * @type {number}
  42676. * @default 1
  42677. * @since 3.0.0
  42678. */
  42679. this.timeScale = 1;
  42680. /**
  42681. * Start this many MS into the elapsed (useful if you want a long duration with repeat, but for the first loop to fire quickly)
  42682. *
  42683. * @name Phaser.Time.TimerEvent#startAt
  42684. * @type {number}
  42685. * @default 0
  42686. * @since 3.0.0
  42687. */
  42688. this.startAt = 0;
  42689. /**
  42690. * The time in milliseconds which has elapsed since the Timer Event's creation.
  42691. *
  42692. * This value is local for the Timer Event and is relative to its Clock. As such, it's influenced by the Clock's time scale and paused state, the Timer Event's initial {@link #startAt} property, and the Timer Event's {@link #timeScale} and {@link #paused} state.
  42693. *
  42694. * @name Phaser.Time.TimerEvent#elapsed
  42695. * @type {number}
  42696. * @default 0
  42697. * @since 3.0.0
  42698. */
  42699. this.elapsed = 0;
  42700. /**
  42701. * Whether or not this timer is paused.
  42702. *
  42703. * @name Phaser.Time.TimerEvent#paused
  42704. * @type {boolean}
  42705. * @default false
  42706. * @since 3.0.0
  42707. */
  42708. this.paused = false;
  42709. /**
  42710. * Whether the Timer Event's function has been called.
  42711. *
  42712. * When the Timer Event fires, this property will be set to `true` before the callback function is invoked and will be reset immediately afterward if the Timer Event should repeat. The value of this property does not directly influence whether the Timer Event will be removed from its Clock, but can prevent it from firing.
  42713. *
  42714. * @name Phaser.Time.TimerEvent#hasDispatched
  42715. * @type {boolean}
  42716. * @default false
  42717. * @since 3.0.0
  42718. */
  42719. this.hasDispatched = false;
  42720. this.reset(config);
  42721. },
  42722. /**
  42723. * Completely reinitializes the Timer Event, regardless of its current state, according to a configuration object.
  42724. *
  42725. * @method Phaser.Time.TimerEvent#reset
  42726. * @since 3.0.0
  42727. *
  42728. * @param {TimerEventConfig} config - The new state for the Timer Event.
  42729. *
  42730. * @return {Phaser.Time.TimerEvent} This TimerEvent object.
  42731. */
  42732. reset: function (config)
  42733. {
  42734. this.delay = GetFastValue(config, 'delay', 0);
  42735. // Can also be set to -1 for an infinite loop (same as setting loop: true)
  42736. this.repeat = GetFastValue(config, 'repeat', 0);
  42737. this.loop = GetFastValue(config, 'loop', false);
  42738. this.callback = GetFastValue(config, 'callback', undefined);
  42739. this.callbackScope = GetFastValue(config, 'callbackScope', this.callback);
  42740. this.args = GetFastValue(config, 'args', []);
  42741. this.timeScale = GetFastValue(config, 'timeScale', 1);
  42742. this.startAt = GetFastValue(config, 'startAt', 0);
  42743. this.paused = GetFastValue(config, 'paused', false);
  42744. this.elapsed = this.startAt;
  42745. this.hasDispatched = false;
  42746. this.repeatCount = (this.repeat === -1 || this.loop) ? 999999999999 : this.repeat;
  42747. return this;
  42748. },
  42749. /**
  42750. * Gets the progress of the current iteration, not factoring in repeats.
  42751. *
  42752. * @method Phaser.Time.TimerEvent#getProgress
  42753. * @since 3.0.0
  42754. *
  42755. * @return {number} A number between 0 and 1 representing the current progress.
  42756. */
  42757. getProgress: function ()
  42758. {
  42759. return (this.elapsed / this.delay);
  42760. },
  42761. /**
  42762. * Gets the progress of the timer overall, factoring in repeats.
  42763. *
  42764. * @method Phaser.Time.TimerEvent#getOverallProgress
  42765. * @since 3.0.0
  42766. *
  42767. * @return {number} The overall progress of the Timer Event, between 0 and 1.
  42768. */
  42769. getOverallProgress: function ()
  42770. {
  42771. if (this.repeat > 0)
  42772. {
  42773. var totalDuration = this.delay + (this.delay * this.repeat);
  42774. var totalElapsed = this.elapsed + (this.delay * (this.repeat - this.repeatCount));
  42775. return (totalElapsed / totalDuration);
  42776. }
  42777. else
  42778. {
  42779. return this.getProgress();
  42780. }
  42781. },
  42782. /**
  42783. * Returns the number of times this Timer Event will repeat before finishing.
  42784. *
  42785. * This should not be confused with the number of times the Timer Event will fire before finishing. A return value of 0 doesn't indicate that the Timer Event has finished running - it indicates that it will not repeat after the next time it fires.
  42786. *
  42787. * @method Phaser.Time.TimerEvent#getRepeatCount
  42788. * @since 3.0.0
  42789. *
  42790. * @return {number} How many times the Timer Event will repeat.
  42791. */
  42792. getRepeatCount: function ()
  42793. {
  42794. return this.repeatCount;
  42795. },
  42796. /**
  42797. * Returns the local elapsed time for the current iteration of the Timer Event.
  42798. *
  42799. * @method Phaser.Time.TimerEvent#getElapsed
  42800. * @since 3.0.0
  42801. *
  42802. * @return {number} The local elapsed time in milliseconds.
  42803. */
  42804. getElapsed: function ()
  42805. {
  42806. return this.elapsed;
  42807. },
  42808. /**
  42809. * Returns the local elapsed time for the current iteration of the Timer Event in seconds.
  42810. *
  42811. * @method Phaser.Time.TimerEvent#getElapsedSeconds
  42812. * @since 3.0.0
  42813. *
  42814. * @return {number} The local elapsed time in seconds.
  42815. */
  42816. getElapsedSeconds: function ()
  42817. {
  42818. return this.elapsed * 0.001;
  42819. },
  42820. /**
  42821. * Forces the Timer Event to immediately expire, thus scheduling its removal in the next frame.
  42822. *
  42823. * @method Phaser.Time.TimerEvent#remove
  42824. * @since 3.0.0
  42825. *
  42826. * @param {boolean} [dispatchCallback] - If `true` (by default `false`), the function of the Timer Event will be called before its removal from its Clock.
  42827. */
  42828. remove: function (dispatchCallback)
  42829. {
  42830. if (dispatchCallback === undefined) { dispatchCallback = false; }
  42831. this.elapsed = this.delay;
  42832. this.hasDispatched = !dispatchCallback;
  42833. this.repeatCount = 0;
  42834. },
  42835. /**
  42836. * Destroys all object references in the Timer Event, i.e. its callback, scope, and arguments.
  42837. *
  42838. * Normally, this method is only called by the Clock when it shuts down. As such, it doesn't stop the Timer Event. If called manually, the Timer Event will still be updated by the Clock, but it won't do anything when it fires.
  42839. *
  42840. * @method Phaser.Time.TimerEvent#destroy
  42841. * @since 3.0.0
  42842. */
  42843. destroy: function ()
  42844. {
  42845. this.callback = undefined;
  42846. this.callbackScope = undefined;
  42847. this.args = [];
  42848. }
  42849. });
  42850. module.exports = TimerEvent;
  42851. /***/ }),
  42852. /* 223 */
  42853. /***/ (function(module, exports, __webpack_require__) {
  42854. /**
  42855. * @author Richard Davey <rich@photonstorm.com>
  42856. * @copyright 2019 Photon Storm Ltd.
  42857. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  42858. */
  42859. var Class = __webpack_require__(0);
  42860. var Components = __webpack_require__(13);
  42861. var CONST = __webpack_require__(28);
  42862. var GameObject = __webpack_require__(18);
  42863. var StaticTilemapLayerRender = __webpack_require__(485);
  42864. var TilemapComponents = __webpack_require__(110);
  42865. var TransformMatrix = __webpack_require__(41);
  42866. var Utils = __webpack_require__(9);
  42867. /**
  42868. * @classdesc
  42869. * A Static Tilemap Layer is a Game Object that renders LayerData from a Tilemap when used in combination
  42870. * with one, or more, Tilesets.
  42871. *
  42872. * A Static Tilemap Layer is optimized for rendering speed over flexibility. You cannot apply per-tile
  42873. * effects like tint or alpha, or change the tiles or tilesets the layer uses.
  42874. *
  42875. * Use a Static Tilemap Layer instead of a Dynamic Tilemap Layer when you don't need tile manipulation features.
  42876. *
  42877. * @class StaticTilemapLayer
  42878. * @extends Phaser.GameObjects.GameObject
  42879. * @memberof Phaser.Tilemaps
  42880. * @constructor
  42881. * @since 3.0.0
  42882. *
  42883. * @extends Phaser.GameObjects.Components.Alpha
  42884. * @extends Phaser.GameObjects.Components.BlendMode
  42885. * @extends Phaser.GameObjects.Components.ComputedSize
  42886. * @extends Phaser.GameObjects.Components.Depth
  42887. * @extends Phaser.GameObjects.Components.Flip
  42888. * @extends Phaser.GameObjects.Components.GetBounds
  42889. * @extends Phaser.GameObjects.Components.Origin
  42890. * @extends Phaser.GameObjects.Components.Pipeline
  42891. * @extends Phaser.GameObjects.Components.ScaleMode
  42892. * @extends Phaser.GameObjects.Components.Transform
  42893. * @extends Phaser.GameObjects.Components.Visible
  42894. * @extends Phaser.GameObjects.Components.ScrollFactor
  42895. *
  42896. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs.
  42897. * @param {Phaser.Tilemaps.Tilemap} tilemap - The Tilemap this layer is a part of.
  42898. * @param {integer} layerIndex - The index of the LayerData associated with this layer.
  42899. * @param {(string|string[]|Phaser.Tilemaps.Tileset|Phaser.Tilemaps.Tileset[])} tileset - The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object.
  42900. * @param {number} [x=0] - The world x position where the top left of this layer will be placed.
  42901. * @param {number} [y=0] - The world y position where the top left of this layer will be placed.
  42902. */
  42903. var StaticTilemapLayer = new Class({
  42904. Extends: GameObject,
  42905. Mixins: [
  42906. Components.Alpha,
  42907. Components.BlendMode,
  42908. Components.ComputedSize,
  42909. Components.Depth,
  42910. Components.Flip,
  42911. Components.GetBounds,
  42912. Components.Origin,
  42913. Components.Pipeline,
  42914. Components.ScaleMode,
  42915. Components.Transform,
  42916. Components.Visible,
  42917. Components.ScrollFactor,
  42918. StaticTilemapLayerRender
  42919. ],
  42920. initialize:
  42921. function StaticTilemapLayer (scene, tilemap, layerIndex, tileset, x, y)
  42922. {
  42923. GameObject.call(this, scene, 'StaticTilemapLayer');
  42924. /**
  42925. * Used internally by physics system to perform fast type checks.
  42926. *
  42927. * @name Phaser.Tilemaps.StaticTilemapLayer#isTilemap
  42928. * @type {boolean}
  42929. * @readonly
  42930. * @since 3.0.0
  42931. */
  42932. this.isTilemap = true;
  42933. /**
  42934. * The Tilemap that this layer is a part of.
  42935. *
  42936. * @name Phaser.Tilemaps.StaticTilemapLayer#tilemap
  42937. * @type {Phaser.Tilemaps.Tilemap}
  42938. * @since 3.0.0
  42939. */
  42940. this.tilemap = tilemap;
  42941. /**
  42942. * The index of the LayerData associated with this layer.
  42943. *
  42944. * @name Phaser.Tilemaps.StaticTilemapLayer#layerIndex
  42945. * @type {integer}
  42946. * @since 3.0.0
  42947. */
  42948. this.layerIndex = layerIndex;
  42949. /**
  42950. * The LayerData associated with this layer. LayerData can only be associated with one
  42951. * tilemap layer.
  42952. *
  42953. * @name Phaser.Tilemaps.StaticTilemapLayer#layer
  42954. * @type {Phaser.Tilemaps.LayerData}
  42955. * @since 3.0.0
  42956. */
  42957. this.layer = tilemap.layers[layerIndex];
  42958. // Link the LayerData with this static tilemap layer
  42959. this.layer.tilemapLayer = this;
  42960. /**
  42961. * The Tileset/s associated with this layer.
  42962. *
  42963. * As of Phaser 3.14 this property is now an array of Tileset objects, previously it was a single reference.
  42964. *
  42965. * @name Phaser.Tilemaps.StaticTilemapLayer#tileset
  42966. * @type {Phaser.Tilemaps.Tileset[]}
  42967. * @since 3.0.0
  42968. */
  42969. this.tileset = [];
  42970. /**
  42971. * Used internally by the Canvas renderer.
  42972. * This holds the tiles that are visible within the camera in the last frame.
  42973. *
  42974. * @name Phaser.Tilemaps.StaticTilemapLayer#culledTiles
  42975. * @type {array}
  42976. * @since 3.0.0
  42977. */
  42978. this.culledTiles = [];
  42979. /**
  42980. * Canvas only.
  42981. *
  42982. * You can control if the Cameras should cull tiles before rendering them or not.
  42983. * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer.
  42984. *
  42985. * However, there are some instances when you may wish to disable this, and toggling this flag allows
  42986. * you to do so. Also see `setSkipCull` for a chainable method that does the same thing.
  42987. *
  42988. * @name Phaser.Tilemaps.StaticTilemapLayer#skipCull
  42989. * @type {boolean}
  42990. * @since 3.12.0
  42991. */
  42992. this.skipCull = false;
  42993. /**
  42994. * Canvas only.
  42995. *
  42996. * The total number of tiles drawn by the renderer in the last frame.
  42997. *
  42998. * This only works when rending with Canvas.
  42999. *
  43000. * @name Phaser.Tilemaps.StaticTilemapLayer#tilesDrawn
  43001. * @type {integer}
  43002. * @readonly
  43003. * @since 3.12.0
  43004. */
  43005. this.tilesDrawn = 0;
  43006. /**
  43007. * Canvas only.
  43008. *
  43009. * The total number of tiles in this layer. Updated every frame.
  43010. *
  43011. * @name Phaser.Tilemaps.StaticTilemapLayer#tilesTotal
  43012. * @type {integer}
  43013. * @readonly
  43014. * @since 3.12.0
  43015. */
  43016. this.tilesTotal = this.layer.width * this.layer.height;
  43017. /**
  43018. * Canvas only.
  43019. *
  43020. * The amount of extra tiles to add into the cull rectangle when calculating its horizontal size.
  43021. *
  43022. * See the method `setCullPadding` for more details.
  43023. *
  43024. * @name Phaser.Tilemaps.StaticTilemapLayer#cullPaddingX
  43025. * @type {integer}
  43026. * @default 1
  43027. * @since 3.12.0
  43028. */
  43029. this.cullPaddingX = 1;
  43030. /**
  43031. * Canvas only.
  43032. *
  43033. * The amount of extra tiles to add into the cull rectangle when calculating its vertical size.
  43034. *
  43035. * See the method `setCullPadding` for more details.
  43036. *
  43037. * @name Phaser.Tilemaps.StaticTilemapLayer#cullPaddingY
  43038. * @type {integer}
  43039. * @default 1
  43040. * @since 3.12.0
  43041. */
  43042. this.cullPaddingY = 1;
  43043. /**
  43044. * Canvas only.
  43045. *
  43046. * The callback that is invoked when the tiles are culled.
  43047. *
  43048. * By default it will call `TilemapComponents.CullTiles` but you can override this to call any function you like.
  43049. *
  43050. * It will be sent 3 arguments:
  43051. *
  43052. * 1. The Phaser.Tilemaps.LayerData object for this Layer
  43053. * 2. The Camera that is culling the layer. You can check its `dirty` property to see if it has changed since the last cull.
  43054. * 3. A reference to the `culledTiles` array, which should be used to store the tiles you want rendered.
  43055. *
  43056. * See the `TilemapComponents.CullTiles` source code for details on implementing your own culling system.
  43057. *
  43058. * @name Phaser.Tilemaps.StaticTilemapLayer#cullCallback
  43059. * @type {function}
  43060. * @since 3.12.0
  43061. */
  43062. this.cullCallback = TilemapComponents.CullTiles;
  43063. /**
  43064. * A reference to the renderer.
  43065. *
  43066. * @name Phaser.Tilemaps.StaticTilemapLayer#renderer
  43067. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  43068. * @private
  43069. * @since 3.0.0
  43070. */
  43071. this.renderer = scene.sys.game.renderer;
  43072. /**
  43073. * An array of vertex buffer objects, used by the WebGL renderer.
  43074. *
  43075. * As of Phaser 3.14 this property is now an array, where each element maps to a Tileset instance. Previously it was a single instance.
  43076. *
  43077. * @name Phaser.Tilemaps.StaticTilemapLayer#vertexBuffer
  43078. * @type {WebGLBuffer[]}
  43079. * @private
  43080. * @since 3.0.0
  43081. */
  43082. this.vertexBuffer = [];
  43083. /**
  43084. * An array of ArrayBuffer objects, used by the WebGL renderer.
  43085. *
  43086. * As of Phaser 3.14 this property is now an array, where each element maps to a Tileset instance. Previously it was a single instance.
  43087. *
  43088. * @name Phaser.Tilemaps.StaticTilemapLayer#bufferData
  43089. * @type {ArrayBuffer[]}
  43090. * @private
  43091. * @since 3.0.0
  43092. */
  43093. this.bufferData = [];
  43094. /**
  43095. * An array of Float32 Array objects, used by the WebGL renderer.
  43096. *
  43097. * As of Phaser 3.14 this property is now an array, where each element maps to a Tileset instance. Previously it was a single instance.
  43098. *
  43099. * @name Phaser.Tilemaps.StaticTilemapLayer#vertexViewF32
  43100. * @type {Float32Array[]}
  43101. * @private
  43102. * @since 3.0.0
  43103. */
  43104. this.vertexViewF32 = [];
  43105. /**
  43106. * An array of Uint32 Array objects, used by the WebGL renderer.
  43107. *
  43108. * As of Phaser 3.14 this property is now an array, where each element maps to a Tileset instance. Previously it was a single instance.
  43109. *
  43110. * @name Phaser.Tilemaps.StaticTilemapLayer#vertexViewU32
  43111. * @type {Uint32Array[]}
  43112. * @private
  43113. * @since 3.0.0
  43114. */
  43115. this.vertexViewU32 = [];
  43116. /**
  43117. * An array of booleans, used by the WebGL renderer.
  43118. *
  43119. * As of Phaser 3.14 this property is now an array, where each element maps to a Tileset instance. Previously it was a single boolean.
  43120. *
  43121. * @name Phaser.Tilemaps.StaticTilemapLayer#dirty
  43122. * @type {boolean[]}
  43123. * @private
  43124. * @since 3.0.0
  43125. */
  43126. this.dirty = [];
  43127. /**
  43128. * An array of integers, used by the WebGL renderer.
  43129. *
  43130. * As of Phaser 3.14 this property is now an array, where each element maps to a Tileset instance. Previously it was a single integer.
  43131. *
  43132. * @name Phaser.Tilemaps.StaticTilemapLayer#vertexCount
  43133. * @type {integer[]}
  43134. * @private
  43135. * @since 3.0.0
  43136. */
  43137. this.vertexCount = [];
  43138. /**
  43139. * The rendering (draw) order of the tiles in this layer.
  43140. *
  43141. * The default is 0 which is 'right-down', meaning it will draw the tiles starting from the top-left,
  43142. * drawing to the right and then moving down to the next row.
  43143. *
  43144. * The draw orders are:
  43145. *
  43146. * 0 = right-down
  43147. * 1 = left-down
  43148. * 2 = right-up
  43149. * 3 = left-up
  43150. *
  43151. * This can be changed via the `setRenderOrder` method.
  43152. *
  43153. * @name Phaser.Tilemaps.StaticTilemapLayer#_renderOrder
  43154. * @type {integer}
  43155. * @default 0
  43156. * @private
  43157. * @since 3.12.0
  43158. */
  43159. this._renderOrder = 0;
  43160. /**
  43161. * A temporary Transform Matrix, re-used internally during batching.
  43162. *
  43163. * @name Phaser.Tilemaps.StaticTilemapLayer#_tempMatrix
  43164. * @private
  43165. * @type {Phaser.GameObjects.Components.TransformMatrix}
  43166. * @since 3.14.0
  43167. */
  43168. this._tempMatrix = new TransformMatrix();
  43169. /**
  43170. * An array holding the mapping between the tile indexes and the tileset they belong to.
  43171. *
  43172. * @name Phaser.Tilemaps.StaticTilemapLayer#gidMap
  43173. * @type {Phaser.Tilemaps.Tileset[]}
  43174. * @since 3.14.0
  43175. */
  43176. this.gidMap = [];
  43177. this.setTilesets(tileset);
  43178. this.setAlpha(this.layer.alpha);
  43179. this.setPosition(x, y);
  43180. this.setOrigin();
  43181. this.setSize(tilemap.tileWidth * this.layer.width, tilemap.tileHeight * this.layer.height);
  43182. this.updateVBOData();
  43183. this.initPipeline('TextureTintPipeline');
  43184. if (scene.sys.game.config.renderType === CONST.WEBGL)
  43185. {
  43186. scene.sys.game.renderer.onContextRestored(function ()
  43187. {
  43188. this.updateVBOData();
  43189. }, this);
  43190. }
  43191. },
  43192. /**
  43193. * Populates the internal `tileset` array with the Tileset references this Layer requires for rendering.
  43194. *
  43195. * @method Phaser.Tilemaps.StaticTilemapLayer#setTilesets
  43196. * @private
  43197. * @since 3.14.0
  43198. *
  43199. * @param {(string|string[]|Phaser.Tilemaps.Tileset|Phaser.Tilemaps.Tileset[])} tileset - The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object.
  43200. */
  43201. setTilesets: function (tilesets)
  43202. {
  43203. var gidMap = [];
  43204. var setList = [];
  43205. var map = this.tilemap;
  43206. if (!Array.isArray(tilesets))
  43207. {
  43208. tilesets = [ tilesets ];
  43209. }
  43210. for (var i = 0; i < tilesets.length; i++)
  43211. {
  43212. var tileset = tilesets[i];
  43213. if (typeof tileset === 'string')
  43214. {
  43215. tileset = map.getTileset(tileset);
  43216. }
  43217. if (tileset)
  43218. {
  43219. setList.push(tileset);
  43220. var s = tileset.firstgid;
  43221. for (var t = 0; t < tileset.total; t++)
  43222. {
  43223. gidMap[s + t] = tileset;
  43224. }
  43225. }
  43226. }
  43227. this.gidMap = gidMap;
  43228. this.tileset = setList;
  43229. },
  43230. /**
  43231. * Prepares the VBO data arrays for population by the `upload` method.
  43232. *
  43233. * @method Phaser.Tilemaps.StaticTilemapLayer#updateVBOData
  43234. * @private
  43235. * @since 3.14.0
  43236. *
  43237. * @return {this} This Tilemap Layer object.
  43238. */
  43239. updateVBOData: function ()
  43240. {
  43241. for (var i = 0; i < this.tileset.length; i++)
  43242. {
  43243. this.dirty[i] = true;
  43244. this.vertexCount[i] = 0;
  43245. this.vertexBuffer[i] = null;
  43246. this.bufferData[i] = null;
  43247. this.vertexViewF32[i] = null;
  43248. this.vertexViewU32[i] = null;
  43249. }
  43250. return this;
  43251. },
  43252. /**
  43253. * Upload the tile data to a VBO.
  43254. *
  43255. * @method Phaser.Tilemaps.StaticTilemapLayer#upload
  43256. * @since 3.0.0
  43257. *
  43258. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera to render to.
  43259. * @param {integer} tilesetIndex - The tileset index.
  43260. *
  43261. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43262. */
  43263. upload: function (camera, tilesetIndex)
  43264. {
  43265. var renderer = this.renderer;
  43266. var gl = renderer.gl;
  43267. var pipeline = renderer.pipelines.TextureTintPipeline;
  43268. if (this.dirty[tilesetIndex])
  43269. {
  43270. var tileset = this.tileset[tilesetIndex];
  43271. var mapWidth = this.layer.width;
  43272. var mapHeight = this.layer.height;
  43273. var width = tileset.image.source[0].width;
  43274. var height = tileset.image.source[0].height;
  43275. var mapData = this.layer.data;
  43276. var tile;
  43277. var row;
  43278. var col;
  43279. var renderOrder = this._renderOrder;
  43280. var minTileIndex = tileset.firstgid;
  43281. var maxTileIndex = tileset.firstgid + tileset.total;
  43282. var vertexBuffer = this.vertexBuffer[tilesetIndex];
  43283. var bufferData = this.bufferData[tilesetIndex];
  43284. var vOffset = -1;
  43285. var bufferSize = (mapWidth * mapHeight) * pipeline.vertexSize * 6;
  43286. this.vertexCount[tilesetIndex] = 0;
  43287. if (bufferData === null)
  43288. {
  43289. bufferData = new ArrayBuffer(bufferSize);
  43290. this.bufferData[tilesetIndex] = bufferData;
  43291. this.vertexViewF32[tilesetIndex] = new Float32Array(bufferData);
  43292. this.vertexViewU32[tilesetIndex] = new Uint32Array(bufferData);
  43293. }
  43294. if (renderOrder === 0)
  43295. {
  43296. // right-down
  43297. for (row = 0; row < mapHeight; row++)
  43298. {
  43299. for (col = 0; col < mapWidth; col++)
  43300. {
  43301. tile = mapData[row][col];
  43302. if (!tile || tile.index < minTileIndex || tile.index > maxTileIndex || !tile.visible)
  43303. {
  43304. continue;
  43305. }
  43306. vOffset = this.batchTile(vOffset, tile, tileset, width, height, camera, tilesetIndex);
  43307. }
  43308. }
  43309. }
  43310. else if (renderOrder === 1)
  43311. {
  43312. // left-down
  43313. for (row = 0; row < mapHeight; row++)
  43314. {
  43315. for (col = mapWidth - 1; col >= 0; col--)
  43316. {
  43317. tile = mapData[row][col];
  43318. if (!tile || tile.index < minTileIndex || tile.index > maxTileIndex || !tile.visible)
  43319. {
  43320. continue;
  43321. }
  43322. vOffset = this.batchTile(vOffset, tile, tileset, width, height, camera, tilesetIndex);
  43323. }
  43324. }
  43325. }
  43326. else if (renderOrder === 2)
  43327. {
  43328. // right-up
  43329. for (row = mapHeight - 1; row >= 0; row--)
  43330. {
  43331. for (col = 0; col < mapWidth; col++)
  43332. {
  43333. tile = mapData[row][col];
  43334. if (!tile || tile.index < minTileIndex || tile.index > maxTileIndex || !tile.visible)
  43335. {
  43336. continue;
  43337. }
  43338. vOffset = this.batchTile(vOffset, tile, tileset, width, height, camera, tilesetIndex);
  43339. }
  43340. }
  43341. }
  43342. else if (renderOrder === 3)
  43343. {
  43344. // left-up
  43345. for (row = mapHeight - 1; row >= 0; row--)
  43346. {
  43347. for (col = mapWidth - 1; col >= 0; col--)
  43348. {
  43349. tile = mapData[row][col];
  43350. if (!tile || tile.index < minTileIndex || tile.index > maxTileIndex || !tile.visible)
  43351. {
  43352. continue;
  43353. }
  43354. vOffset = this.batchTile(vOffset, tile, tileset, width, height, camera, tilesetIndex);
  43355. }
  43356. }
  43357. }
  43358. this.dirty[tilesetIndex] = false;
  43359. if (vertexBuffer === null)
  43360. {
  43361. vertexBuffer = renderer.createVertexBuffer(bufferData, gl.STATIC_DRAW);
  43362. this.vertexBuffer[tilesetIndex] = vertexBuffer;
  43363. }
  43364. else
  43365. {
  43366. renderer.setVertexBuffer(vertexBuffer);
  43367. gl.bufferSubData(gl.ARRAY_BUFFER, 0, bufferData);
  43368. }
  43369. }
  43370. return this;
  43371. },
  43372. /**
  43373. * Add a single tile into the batch.
  43374. *
  43375. * @method Phaser.Tilemaps.StaticTilemapLayer#batchTile
  43376. * @private
  43377. * @since 3.12.0
  43378. *
  43379. * @param {integer} vOffset - The vertex offset.
  43380. * @param {any} tile - The tile being rendered.
  43381. * @param {any} tileset - The tileset being used for rendering.
  43382. * @param {integer} width - The width of the tileset image in pixels.
  43383. * @param {integer} height - The height of the tileset image in pixels.
  43384. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera the layer is being rendered with.
  43385. * @param {integer} tilesetIndex - The tileset index.
  43386. *
  43387. * @return {integer} The new vOffset value.
  43388. */
  43389. batchTile: function (vOffset, tile, tileset, width, height, camera, tilesetIndex)
  43390. {
  43391. var texCoords = tileset.getTileTextureCoordinates(tile.index);
  43392. if (!texCoords)
  43393. {
  43394. return vOffset;
  43395. }
  43396. var tileWidth = tileset.tileWidth;
  43397. var tileHeight = tileset.tileHeight;
  43398. var halfTileWidth = tileWidth / 2;
  43399. var halfTileHeight = tileHeight / 2;
  43400. var u0 = texCoords.x / width;
  43401. var v0 = texCoords.y / height;
  43402. var u1 = (texCoords.x + tileWidth) / width;
  43403. var v1 = (texCoords.y + tileHeight) / height;
  43404. var matrix = this._tempMatrix;
  43405. var x = -halfTileWidth;
  43406. var y = -halfTileHeight;
  43407. if (tile.flipX)
  43408. {
  43409. tileWidth *= -1;
  43410. x += tileset.tileWidth;
  43411. }
  43412. if (tile.flipY)
  43413. {
  43414. tileHeight *= -1;
  43415. y += tileset.tileHeight;
  43416. }
  43417. var xw = x + tileWidth;
  43418. var yh = y + tileHeight;
  43419. matrix.applyITRS(halfTileWidth + tile.pixelX, halfTileHeight + tile.pixelY, tile.rotation, 1, 1);
  43420. var tint = Utils.getTintAppendFloatAlpha(0xffffff, camera.alpha * this.alpha * tile.alpha);
  43421. var tx0 = matrix.getX(x, y);
  43422. var ty0 = matrix.getY(x, y);
  43423. var tx1 = matrix.getX(x, yh);
  43424. var ty1 = matrix.getY(x, yh);
  43425. var tx2 = matrix.getX(xw, yh);
  43426. var ty2 = matrix.getY(xw, yh);
  43427. var tx3 = matrix.getX(xw, y);
  43428. var ty3 = matrix.getY(xw, y);
  43429. if (camera.roundPixels)
  43430. {
  43431. tx0 = Math.round(tx0);
  43432. ty0 = Math.round(ty0);
  43433. tx1 = Math.round(tx1);
  43434. ty1 = Math.round(ty1);
  43435. tx2 = Math.round(tx2);
  43436. ty2 = Math.round(ty2);
  43437. tx3 = Math.round(tx3);
  43438. ty3 = Math.round(ty3);
  43439. }
  43440. var vertexViewF32 = this.vertexViewF32[tilesetIndex];
  43441. var vertexViewU32 = this.vertexViewU32[tilesetIndex];
  43442. vertexViewF32[++vOffset] = tx0;
  43443. vertexViewF32[++vOffset] = ty0;
  43444. vertexViewF32[++vOffset] = u0;
  43445. vertexViewF32[++vOffset] = v0;
  43446. vertexViewF32[++vOffset] = 0;
  43447. vertexViewU32[++vOffset] = tint;
  43448. vertexViewF32[++vOffset] = tx1;
  43449. vertexViewF32[++vOffset] = ty1;
  43450. vertexViewF32[++vOffset] = u0;
  43451. vertexViewF32[++vOffset] = v1;
  43452. vertexViewF32[++vOffset] = 0;
  43453. vertexViewU32[++vOffset] = tint;
  43454. vertexViewF32[++vOffset] = tx2;
  43455. vertexViewF32[++vOffset] = ty2;
  43456. vertexViewF32[++vOffset] = u1;
  43457. vertexViewF32[++vOffset] = v1;
  43458. vertexViewF32[++vOffset] = 0;
  43459. vertexViewU32[++vOffset] = tint;
  43460. vertexViewF32[++vOffset] = tx0;
  43461. vertexViewF32[++vOffset] = ty0;
  43462. vertexViewF32[++vOffset] = u0;
  43463. vertexViewF32[++vOffset] = v0;
  43464. vertexViewF32[++vOffset] = 0;
  43465. vertexViewU32[++vOffset] = tint;
  43466. vertexViewF32[++vOffset] = tx2;
  43467. vertexViewF32[++vOffset] = ty2;
  43468. vertexViewF32[++vOffset] = u1;
  43469. vertexViewF32[++vOffset] = v1;
  43470. vertexViewF32[++vOffset] = 0;
  43471. vertexViewU32[++vOffset] = tint;
  43472. vertexViewF32[++vOffset] = tx3;
  43473. vertexViewF32[++vOffset] = ty3;
  43474. vertexViewF32[++vOffset] = u1;
  43475. vertexViewF32[++vOffset] = v0;
  43476. vertexViewF32[++vOffset] = 0;
  43477. vertexViewU32[++vOffset] = tint;
  43478. this.vertexCount[tilesetIndex] += 6;
  43479. return vOffset;
  43480. },
  43481. /**
  43482. * Sets the rendering (draw) order of the tiles in this layer.
  43483. *
  43484. * The default is 'right-down', meaning it will order the tiles starting from the top-left,
  43485. * drawing to the right and then moving down to the next row.
  43486. *
  43487. * The draw orders are:
  43488. *
  43489. * 0 = right-down
  43490. * 1 = left-down
  43491. * 2 = right-up
  43492. * 3 = left-up
  43493. *
  43494. * Setting the render order does not change the tiles or how they are stored in the layer,
  43495. * it purely impacts the order in which they are rendered.
  43496. *
  43497. * You can provide either an integer (0 to 3), or the string version of the order.
  43498. *
  43499. * @method Phaser.Tilemaps.StaticTilemapLayer#setRenderOrder
  43500. * @since 3.12.0
  43501. *
  43502. * @param {(integer|string)} renderOrder - The render (draw) order value. Either an integer between 0 and 3, or a string: 'right-down', 'left-down', 'right-up' or 'left-up'.
  43503. *
  43504. * @return {this} This Tilemap Layer object.
  43505. */
  43506. setRenderOrder: function (renderOrder)
  43507. {
  43508. var orders = [ 'right-down', 'left-down', 'right-up', 'left-up' ];
  43509. if (typeof renderOrder === 'string')
  43510. {
  43511. renderOrder = orders.indexOf(renderOrder);
  43512. }
  43513. if (renderOrder >= 0 && renderOrder < 4)
  43514. {
  43515. this._renderOrder = renderOrder;
  43516. for (var i = 0; i < this.tileset.length; i++)
  43517. {
  43518. this.dirty[i] = true;
  43519. }
  43520. }
  43521. return this;
  43522. },
  43523. /**
  43524. * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting
  43525. * faces are used internally for optimizing collisions against tiles. This method is mostly used
  43526. * internally to optimize recalculating faces when only one tile has been changed.
  43527. *
  43528. * @method Phaser.Tilemaps.StaticTilemapLayer#calculateFacesAt
  43529. * @since 3.0.0
  43530. *
  43531. * @param {integer} tileX - The x coordinate.
  43532. * @param {integer} tileY - The y coordinate.
  43533. *
  43534. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43535. */
  43536. calculateFacesAt: function (tileX, tileY)
  43537. {
  43538. TilemapComponents.CalculateFacesAt(tileX, tileY, this.layer);
  43539. return this;
  43540. },
  43541. /**
  43542. * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the
  43543. * layer. Interesting faces are used internally for optimizing collisions against tiles. This method
  43544. * is mostly used internally.
  43545. *
  43546. * @method Phaser.Tilemaps.StaticTilemapLayer#calculateFacesWithin
  43547. * @since 3.0.0
  43548. *
  43549. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  43550. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  43551. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  43552. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  43553. *
  43554. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43555. */
  43556. calculateFacesWithin: function (tileX, tileY, width, height)
  43557. {
  43558. TilemapComponents.CalculateFacesWithin(tileX, tileY, width, height, this.layer);
  43559. return this;
  43560. },
  43561. /**
  43562. * Creates a Sprite for every object matching the given tile indexes in the layer. You can
  43563. * optionally specify if each tile will be replaced with a new tile after the Sprite has been
  43564. * created. This is useful if you want to lay down special tiles in a level that are converted to
  43565. * Sprites, but want to replace the tile itself with a floor tile or similar once converted.
  43566. *
  43567. * @method Phaser.Tilemaps.StaticTilemapLayer#createFromTiles
  43568. * @since 3.0.0
  43569. *
  43570. * @param {(integer|array)} indexes - The tile index, or array of indexes, to create Sprites from.
  43571. * @param {(integer|array)} replacements - The tile index, or array of indexes, to change a converted
  43572. * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a
  43573. * one-to-one mapping with the indexes array.
  43574. * @param {SpriteConfig} spriteConfig - The config object to pass into the Sprite creator (i.e.
  43575. * scene.make.sprite).
  43576. * @param {Phaser.Scene} [scene=scene the map is within] - The Scene to create the Sprites within.
  43577. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when determining the world XY
  43578. *
  43579. * @return {Phaser.GameObjects.Sprite[]} An array of the Sprites that were created.
  43580. */
  43581. createFromTiles: function (indexes, replacements, spriteConfig, scene, camera)
  43582. {
  43583. return TilemapComponents.CreateFromTiles(indexes, replacements, spriteConfig, scene, camera, this.layer);
  43584. },
  43585. /**
  43586. * Returns the tiles in the given layer that are within the cameras viewport.
  43587. * This is used internally.
  43588. *
  43589. * @method Phaser.Tilemaps.StaticTilemapLayer#cull
  43590. * @since 3.0.0
  43591. *
  43592. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to run the cull check against.
  43593. *
  43594. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  43595. */
  43596. cull: function (camera)
  43597. {
  43598. return this.cullCallback(this.layer, camera, this.culledTiles);
  43599. },
  43600. /**
  43601. * Canvas only.
  43602. *
  43603. * You can control if the Cameras should cull tiles before rendering them or not.
  43604. * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer.
  43605. *
  43606. * However, there are some instances when you may wish to disable this.
  43607. *
  43608. * @method Phaser.Tilemaps.StaticTilemapLayer#setSkipCull
  43609. * @since 3.12.0
  43610. *
  43611. * @param {boolean} [value=true] - Set to `true` to stop culling tiles. Set to `false` to enable culling again.
  43612. *
  43613. * @return {this} This Tilemap Layer object.
  43614. */
  43615. setSkipCull: function (value)
  43616. {
  43617. if (value === undefined) { value = true; }
  43618. this.skipCull = value;
  43619. return this;
  43620. },
  43621. /**
  43622. * Canvas only.
  43623. *
  43624. * When a Camera culls the tiles in this layer it does so using its view into the world, building up a
  43625. * rectangle inside which the tiles must exist or they will be culled. Sometimes you may need to expand the size
  43626. * of this 'cull rectangle', especially if you plan on rotating the Camera viewing the layer. Do so
  43627. * by providing the padding values. The values given are in tiles, not pixels. So if the tile width was 32px
  43628. * and you set `paddingX` to be 4, it would add 32px x 4 to the cull rectangle (adjusted for scale)
  43629. *
  43630. * @method Phaser.Tilemaps.StaticTilemapLayer#setCullPadding
  43631. * @since 3.12.0
  43632. *
  43633. * @param {integer} [paddingX=1] - The amount of extra horizontal tiles to add to the cull check padding.
  43634. * @param {integer} [paddingY=1] - The amount of extra vertical tiles to add to the cull check padding.
  43635. *
  43636. * @return {this} This Tilemap Layer object.
  43637. */
  43638. setCullPadding: function (paddingX, paddingY)
  43639. {
  43640. if (paddingX === undefined) { paddingX = 1; }
  43641. if (paddingY === undefined) { paddingY = 1; }
  43642. this.cullPaddingX = paddingX;
  43643. this.cullPaddingY = paddingY;
  43644. return this;
  43645. },
  43646. /**
  43647. * Searches the entire map layer for the first tile matching the given index, then returns that Tile
  43648. * object. If no match is found, it returns null. The search starts from the top-left tile and
  43649. * continues horizontally until it hits the end of the row, then it drops down to the next column.
  43650. * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to
  43651. * the top-left.
  43652. *
  43653. * @method Phaser.Tilemaps.StaticTilemapLayer#findByIndex
  43654. * @since 3.0.0
  43655. *
  43656. * @param {integer} index - The tile index value to search for.
  43657. * @param {integer} [skip=0] - The number of times to skip a matching tile before returning.
  43658. * @param {boolean} [reverse=false] - If true it will scan the layer in reverse, starting at the
  43659. * bottom-right. Otherwise it scans from the top-left.
  43660. *
  43661. * @return {Phaser.Tilemaps.Tile} A Tile object.
  43662. */
  43663. findByIndex: function (findIndex, skip, reverse)
  43664. {
  43665. return TilemapComponents.FindByIndex(findIndex, skip, reverse, this.layer);
  43666. },
  43667. /**
  43668. * Find the first tile in the given rectangular area (in tile coordinates) of the layer that
  43669. * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns
  43670. * true. Similar to Array.prototype.find in vanilla JS.
  43671. *
  43672. * @method Phaser.Tilemaps.StaticTilemapLayer#findTile
  43673. * @since 3.0.0
  43674. *
  43675. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  43676. * callback as the first and only parameter.
  43677. * @param {object} [context] - The context under which the callback should be run.
  43678. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to filter.
  43679. * @param {integer} [tileY=0] - The topmost tile index (in tile coordinates) to use as the origin of the area to filter.
  43680. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  43681. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  43682. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  43683. *
  43684. * @return {?Phaser.Tilemaps.Tile}
  43685. */
  43686. findTile: function (callback, context, tileX, tileY, width, height, filteringOptions)
  43687. {
  43688. return TilemapComponents.FindTile(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  43689. },
  43690. /**
  43691. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  43692. * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns
  43693. * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS.
  43694. *
  43695. * @method Phaser.Tilemaps.StaticTilemapLayer#filterTiles
  43696. * @since 3.0.0
  43697. *
  43698. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  43699. * callback as the first and only parameter. The callback should return true for tiles that pass the
  43700. * filter.
  43701. * @param {object} [context] - The context under which the callback should be run.
  43702. * @param {integer} [tileX=0] - The leftmost tile index (in tile coordinates) to use as the origin of the area to filter.
  43703. * @param {integer} [tileY=0] - The topmost tile index (in tile coordinates) to use as the origin of the area to filter.
  43704. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  43705. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  43706. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  43707. *
  43708. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  43709. */
  43710. filterTiles: function (callback, context, tileX, tileY, width, height, filteringOptions)
  43711. {
  43712. return TilemapComponents.FilterTiles(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  43713. },
  43714. /**
  43715. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  43716. * callback. Similar to Array.prototype.forEach in vanilla JS.
  43717. *
  43718. * @method Phaser.Tilemaps.StaticTilemapLayer#forEachTile
  43719. * @since 3.0.0
  43720. *
  43721. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  43722. * callback as the first and only parameter.
  43723. * @param {object} [context] - The context under which the callback should be run.
  43724. * @param {integer} [tileX=0] - The leftmost tile index (in tile coordinates) to use as the origin of the area to filter.
  43725. * @param {integer} [tileY=0] - The topmost tile index (in tile coordinates) to use as the origin of the area to filter.
  43726. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  43727. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  43728. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  43729. *
  43730. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43731. */
  43732. forEachTile: function (callback, context, tileX, tileY, width, height, filteringOptions)
  43733. {
  43734. TilemapComponents.ForEachTile(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  43735. return this;
  43736. },
  43737. /**
  43738. * Gets a tile at the given tile coordinates from the given layer.
  43739. *
  43740. * @method Phaser.Tilemaps.StaticTilemapLayer#getTileAt
  43741. * @since 3.0.0
  43742. *
  43743. * @param {integer} tileX - X position to get the tile from (given in tile units, not pixels).
  43744. * @param {integer} tileY - Y position to get the tile from (given in tile units, not pixels).
  43745. * @param {boolean} [nonNull=false] - If true getTile won't return null for empty tiles, but a Tile
  43746. * object with an index of -1.
  43747. *
  43748. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates were invalid.
  43749. */
  43750. getTileAt: function (tileX, tileY, nonNull)
  43751. {
  43752. return TilemapComponents.GetTileAt(tileX, tileY, nonNull, this.layer);
  43753. },
  43754. /**
  43755. * Gets a tile at the given world coordinates from the given layer.
  43756. *
  43757. * @method Phaser.Tilemaps.StaticTilemapLayer#getTileAtWorldXY
  43758. * @since 3.0.0
  43759. *
  43760. * @param {number} worldX - X position to get the tile from (given in pixels)
  43761. * @param {number} worldY - Y position to get the tile from (given in pixels)
  43762. * @param {boolean} [nonNull=false] - If true, function won't return null for empty tiles, but a Tile
  43763. * object with an index of -1.
  43764. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  43765. *
  43766. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates
  43767. * were invalid.
  43768. */
  43769. getTileAtWorldXY: function (worldX, worldY, nonNull, camera)
  43770. {
  43771. return TilemapComponents.GetTileAtWorldXY(worldX, worldY, nonNull, camera, this.layer);
  43772. },
  43773. /**
  43774. * Gets the tiles in the given rectangular area (in tile coordinates) of the layer.
  43775. *
  43776. * @method Phaser.Tilemaps.StaticTilemapLayer#getTilesWithin
  43777. * @since 3.0.0
  43778. *
  43779. * @param {integer} [tileX=0] - The leftmost tile index (in tile coordinates) to use as the origin of the area.
  43780. * @param {integer} [tileY=0] - The topmost tile index (in tile coordinates) to use as the origin of the area.
  43781. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  43782. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  43783. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  43784. *
  43785. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  43786. */
  43787. getTilesWithin: function (tileX, tileY, width, height, filteringOptions)
  43788. {
  43789. return TilemapComponents.GetTilesWithin(tileX, tileY, width, height, filteringOptions, this.layer);
  43790. },
  43791. /**
  43792. * Gets the tiles in the given rectangular area (in world coordinates) of the layer.
  43793. *
  43794. * @method Phaser.Tilemaps.StaticTilemapLayer#getTilesWithinWorldXY
  43795. * @since 3.0.0
  43796. *
  43797. * @param {number} worldX - The leftmost tile index (in tile coordinates) to use as the origin of the area to filter.
  43798. * @param {number} worldY - The topmost tile index (in tile coordinates) to use as the origin of the area to filter.
  43799. * @param {number} width - How many tiles wide from the `tileX` index the area will be.
  43800. * @param {number} height - How many tiles high from the `tileY` index the area will be.
  43801. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  43802. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when factoring in which tiles to return.
  43803. *
  43804. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  43805. */
  43806. getTilesWithinWorldXY: function (worldX, worldY, width, height, filteringOptions, camera)
  43807. {
  43808. return TilemapComponents.GetTilesWithinWorldXY(worldX, worldY, width, height, filteringOptions, camera, this.layer);
  43809. },
  43810. /**
  43811. * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle,
  43812. * Line, Rectangle or Triangle. The shape should be in world coordinates.
  43813. *
  43814. * @method Phaser.Tilemaps.StaticTilemapLayer#getTilesWithinShape
  43815. * @since 3.0.0
  43816. *
  43817. * @param {(Phaser.Geom.Circle|Phaser.Geom.Line|Phaser.Geom.Rectangle|Phaser.Geom.Triangle)} shape - A shape in world (pixel) coordinates
  43818. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  43819. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  43820. *
  43821. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  43822. */
  43823. getTilesWithinShape: function (shape, filteringOptions, camera)
  43824. {
  43825. return TilemapComponents.GetTilesWithinShape(shape, filteringOptions, camera, this.layer);
  43826. },
  43827. /**
  43828. * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns
  43829. * false if there is no tile or if the tile at that location has an index of -1.
  43830. *
  43831. * @method Phaser.Tilemaps.StaticTilemapLayer#hasTileAt
  43832. * @since 3.0.0
  43833. *
  43834. * @param {integer} tileX - X position to get the tile from in tile coordinates.
  43835. * @param {integer} tileY - Y position to get the tile from in tile coordinates.
  43836. *
  43837. * @return {boolean}
  43838. */
  43839. hasTileAt: function (tileX, tileY)
  43840. {
  43841. return TilemapComponents.HasTileAt(tileX, tileY, this.layer);
  43842. },
  43843. /**
  43844. * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns
  43845. * false if there is no tile or if the tile at that location has an index of -1.
  43846. *
  43847. * @method Phaser.Tilemaps.StaticTilemapLayer#hasTileAtWorldXY
  43848. * @since 3.0.0
  43849. *
  43850. * @param {number} worldX - The X coordinate of the world position.
  43851. * @param {number} worldY - The Y coordinate of the world position.
  43852. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  43853. *
  43854. * @return {boolean}
  43855. */
  43856. hasTileAtWorldXY: function (worldX, worldY, camera)
  43857. {
  43858. return TilemapComponents.HasTileAtWorldXY(worldX, worldY, camera, this.layer);
  43859. },
  43860. /**
  43861. * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to
  43862. * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles
  43863. * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation
  43864. * wherever you want on the screen.
  43865. *
  43866. * @method Phaser.Tilemaps.StaticTilemapLayer#renderDebug
  43867. * @since 3.0.0
  43868. *
  43869. * @param {Phaser.GameObjects.Graphics} graphics - The target Graphics object to draw upon.
  43870. * @param {StyleConfig} styleConfig - An object specifying the colors to use for the debug drawing.
  43871. *
  43872. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43873. */
  43874. renderDebug: function (graphics, styleConfig)
  43875. {
  43876. TilemapComponents.RenderDebug(graphics, styleConfig, this.layer);
  43877. return this;
  43878. },
  43879. /**
  43880. * Sets collision on the given tile or tiles within a layer by index. You can pass in either a
  43881. * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if
  43882. * collision will be enabled (true) or disabled (false).
  43883. *
  43884. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollision
  43885. * @since 3.0.0
  43886. *
  43887. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes.
  43888. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  43889. * collision.
  43890. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  43891. * update.
  43892. *
  43893. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43894. */
  43895. setCollision: function (indexes, collides, recalculateFaces)
  43896. {
  43897. TilemapComponents.SetCollision(indexes, collides, recalculateFaces, this.layer);
  43898. return this;
  43899. },
  43900. /**
  43901. * Sets collision on a range of tiles in a layer whose index is between the specified `start` and
  43902. * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set
  43903. * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be
  43904. * enabled (true) or disabled (false).
  43905. *
  43906. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollisionBetween
  43907. * @since 3.0.0
  43908. *
  43909. * @param {integer} start - The first index of the tile to be set for collision.
  43910. * @param {integer} stop - The last index of the tile to be set for collision.
  43911. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  43912. * collision.
  43913. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  43914. * update.
  43915. *
  43916. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43917. */
  43918. setCollisionBetween: function (start, stop, collides, recalculateFaces)
  43919. {
  43920. TilemapComponents.SetCollisionBetween(start, stop, collides, recalculateFaces, this.layer);
  43921. return this;
  43922. },
  43923. /**
  43924. * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property
  43925. * that matches the given properties object, its collision flag will be set. The `collides`
  43926. * parameter controls if collision will be enabled (true) or disabled (false). Passing in
  43927. * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that
  43928. * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can
  43929. * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a
  43930. * "types" property that matches any of those values, its collision flag will be updated.
  43931. *
  43932. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollisionByProperty
  43933. * @since 3.0.0
  43934. *
  43935. * @param {object} properties - An object with tile properties and corresponding values that should
  43936. * be checked.
  43937. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  43938. * collision.
  43939. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  43940. * update.
  43941. *
  43942. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43943. */
  43944. setCollisionByProperty: function (properties, collides, recalculateFaces)
  43945. {
  43946. TilemapComponents.SetCollisionByProperty(properties, collides, recalculateFaces, this.layer);
  43947. return this;
  43948. },
  43949. /**
  43950. * Sets collision on all tiles in the given layer, except for tiles that have an index specified in
  43951. * the given array. The `collides` parameter controls if collision will be enabled (true) or
  43952. * disabled (false).
  43953. *
  43954. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollisionByExclusion
  43955. * @since 3.0.0
  43956. *
  43957. * @param {integer[]} indexes - An array of the tile indexes to not be counted for collision.
  43958. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  43959. * collision.
  43960. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  43961. * update.
  43962. *
  43963. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43964. */
  43965. setCollisionByExclusion: function (indexes, collides, recalculateFaces)
  43966. {
  43967. TilemapComponents.SetCollisionByExclusion(indexes, collides, recalculateFaces, this.layer);
  43968. return this;
  43969. },
  43970. /**
  43971. * Sets a global collision callback for the given tile index within the layer. This will affect all
  43972. * tiles on this layer that have the same index. If a callback is already set for the tile index it
  43973. * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile
  43974. * at a specific location on the map then see setTileLocationCallback.
  43975. *
  43976. * @method Phaser.Tilemaps.StaticTilemapLayer#setTileIndexCallback
  43977. * @since 3.0.0
  43978. *
  43979. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes to have a
  43980. * collision callback set for.
  43981. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  43982. * @param {object} callbackContext - The context under which the callback is called.
  43983. *
  43984. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  43985. */
  43986. setTileIndexCallback: function (indexes, callback, callbackContext)
  43987. {
  43988. TilemapComponents.SetTileIndexCallback(indexes, callback, callbackContext, this.layer);
  43989. return this;
  43990. },
  43991. /**
  43992. * Sets collision on the tiles within a layer by checking each tiles collision group data
  43993. * (typically defined in Tiled within the tileset collision editor). If any objects are found within
  43994. * a tiles collision group, the tile's colliding information will be set. The `collides` parameter
  43995. * controls if collision will be enabled (true) or disabled (false).
  43996. *
  43997. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollisionFromCollisionGroup
  43998. * @since 3.0.0
  43999. *
  44000. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  44001. * collision.
  44002. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  44003. * update.
  44004. *
  44005. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  44006. */
  44007. setCollisionFromCollisionGroup: function (collides, recalculateFaces)
  44008. {
  44009. TilemapComponents.SetCollisionFromCollisionGroup(collides, recalculateFaces, this.layer);
  44010. return this;
  44011. },
  44012. /**
  44013. * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer.
  44014. * If a callback is already set for the tile index it will be replaced. Set the callback to null to
  44015. * remove it.
  44016. *
  44017. * @method Phaser.Tilemaps.StaticTilemapLayer#setTileLocationCallback
  44018. * @since 3.0.0
  44019. *
  44020. * @param {integer} tileX - The leftmost tile index (in tile coordinates) to use as the origin of the area.
  44021. * @param {integer} tileY - The topmost tile index (in tile coordinates) to use as the origin of the area.
  44022. * @param {integer} width - How many tiles wide from the `tileX` index the area will be.
  44023. * @param {integer} height - How many tiles tall from the `tileY` index the area will be.
  44024. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  44025. * @param {object} [callbackContext] - The context under which the callback is called.
  44026. *
  44027. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  44028. */
  44029. setTileLocationCallback: function (tileX, tileY, width, height, callback, callbackContext)
  44030. {
  44031. TilemapComponents.SetTileLocationCallback(tileX, tileY, width, height, callback, callbackContext, this.layer);
  44032. return this;
  44033. },
  44034. /**
  44035. * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the
  44036. * layers position, scale and scroll.
  44037. *
  44038. * @method Phaser.Tilemaps.StaticTilemapLayer#tileToWorldX
  44039. * @since 3.0.0
  44040. *
  44041. * @param {integer} tileX - The X coordinate, in tile coordinates.
  44042. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the world values from the tile index.
  44043. *
  44044. * @return {number}
  44045. */
  44046. tileToWorldX: function (tileX, camera)
  44047. {
  44048. return TilemapComponents.TileToWorldX(tileX, camera, this.layer);
  44049. },
  44050. /**
  44051. * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the
  44052. * layers position, scale and scroll.
  44053. *
  44054. * @method Phaser.Tilemaps.StaticTilemapLayer#tileToWorldY
  44055. * @since 3.0.0
  44056. *
  44057. * @param {integer} tileY - The Y coordinate, in tile coordinates.
  44058. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the world values from the tile index.
  44059. *
  44060. * @return {number}
  44061. */
  44062. tileToWorldY: function (tileY, camera)
  44063. {
  44064. return TilemapComponents.TileToWorldY(tileY, camera, this.layer);
  44065. },
  44066. /**
  44067. * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the
  44068. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  44069. * `point` object.
  44070. *
  44071. * @method Phaser.Tilemaps.StaticTilemapLayer#tileToWorldXY
  44072. * @since 3.0.0
  44073. *
  44074. * @param {integer} tileX - The X coordinate, in tile coordinates.
  44075. * @param {integer} tileY - The Y coordinate, in tile coordinates.
  44076. * @param {Phaser.Math.Vector2} [point] - A Vector2 to store the coordinates in. If not given, a new Vector2 is created.
  44077. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the world values from the tile index.
  44078. *
  44079. * @return {Phaser.Math.Vector2}
  44080. */
  44081. tileToWorldXY: function (tileX, tileY, point, camera)
  44082. {
  44083. return TilemapComponents.TileToWorldXY(tileX, tileY, point, camera, this.layer);
  44084. },
  44085. /**
  44086. * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the
  44087. * layers position, scale and scroll.
  44088. *
  44089. * @method Phaser.Tilemaps.StaticTilemapLayer#worldToTileX
  44090. * @since 3.0.0
  44091. *
  44092. * @param {number} worldX - The X coordinate, in world pixels.
  44093. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  44094. * nearest integer.
  44095. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.]
  44096. *
  44097. * @return {number}
  44098. */
  44099. worldToTileX: function (worldX, snapToFloor, camera)
  44100. {
  44101. return TilemapComponents.WorldToTileX(worldX, snapToFloor, camera, this.layer);
  44102. },
  44103. /**
  44104. * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the
  44105. * layers position, scale and scroll.
  44106. *
  44107. * @method Phaser.Tilemaps.StaticTilemapLayer#worldToTileY
  44108. * @since 3.0.0
  44109. *
  44110. * @param {number} worldY - The Y coordinate, in world pixels.
  44111. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  44112. * nearest integer.
  44113. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  44114. *
  44115. * @return {number}
  44116. */
  44117. worldToTileY: function (worldY, snapToFloor, camera)
  44118. {
  44119. return TilemapComponents.WorldToTileY(worldY, snapToFloor, camera, this.layer);
  44120. },
  44121. /**
  44122. * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the
  44123. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  44124. * `point` object.
  44125. *
  44126. * @method Phaser.Tilemaps.StaticTilemapLayer#worldToTileXY
  44127. * @since 3.0.0
  44128. *
  44129. * @param {number} worldX - The X coordinate, in world pixels.
  44130. * @param {number} worldY - The Y coordinate, in world pixels.
  44131. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  44132. * nearest integer.
  44133. * @param {Phaser.Math.Vector2} [point] - A Vector2 to store the coordinates in. If not given, a new Vector2 is created.
  44134. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  44135. *
  44136. * @return {Phaser.Math.Vector2}
  44137. */
  44138. worldToTileXY: function (worldX, worldY, snapToFloor, point, camera)
  44139. {
  44140. return TilemapComponents.WorldToTileXY(worldX, worldY, snapToFloor, point, camera, this.layer);
  44141. },
  44142. /**
  44143. * Destroys this StaticTilemapLayer and removes its link to the associated LayerData.
  44144. *
  44145. * @method Phaser.Tilemaps.StaticTilemapLayer#destroy
  44146. * @since 3.0.0
  44147. */
  44148. destroy: function ()
  44149. {
  44150. // Uninstall this layer only if it is still installed on the LayerData object
  44151. if (this.layer.tilemapLayer === this)
  44152. {
  44153. this.layer.tilemapLayer = undefined;
  44154. }
  44155. this.tilemap = undefined;
  44156. this.layer = undefined;
  44157. this.culledTiles.length = 0;
  44158. this.cullCallback = null;
  44159. for (var i = 0; i < this.tileset.length; i++)
  44160. {
  44161. this.dirty[i] = true;
  44162. this.vertexCount[i] = 0;
  44163. this.vertexBuffer[i] = null;
  44164. this.bufferData[i] = null;
  44165. this.vertexViewF32[i] = null;
  44166. this.vertexViewU32[i] = null;
  44167. }
  44168. this.gidMap = [];
  44169. this.tileset = [];
  44170. GameObject.prototype.destroy.call(this);
  44171. }
  44172. });
  44173. module.exports = StaticTilemapLayer;
  44174. /***/ }),
  44175. /* 224 */
  44176. /***/ (function(module, exports, __webpack_require__) {
  44177. /**
  44178. * @author Richard Davey <rich@photonstorm.com>
  44179. * @copyright 2019 Photon Storm Ltd.
  44180. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  44181. */
  44182. var Class = __webpack_require__(0);
  44183. var Components = __webpack_require__(13);
  44184. var DynamicTilemapLayerRender = __webpack_require__(488);
  44185. var GameObject = __webpack_require__(18);
  44186. var TilemapComponents = __webpack_require__(110);
  44187. /**
  44188. * @classdesc
  44189. * A Dynamic Tilemap Layer is a Game Object that renders LayerData from a Tilemap when used in combination
  44190. * with one, or more, Tilesets.
  44191. *
  44192. * A Dynamic Tilemap Layer trades some speed for being able to apply powerful effects. Unlike a
  44193. * Static Tilemap Layer, you can apply per-tile effects like tint or alpha, and you can change the
  44194. * tiles in a DynamicTilemapLayer.
  44195. *
  44196. * Use this over a Static Tilemap Layer when you need those features.
  44197. *
  44198. * @class DynamicTilemapLayer
  44199. * @extends Phaser.GameObjects.GameObject
  44200. * @memberof Phaser.Tilemaps
  44201. * @constructor
  44202. * @since 3.0.0
  44203. *
  44204. * @extends Phaser.GameObjects.Components.Alpha
  44205. * @extends Phaser.GameObjects.Components.BlendMode
  44206. * @extends Phaser.GameObjects.Components.ComputedSize
  44207. * @extends Phaser.GameObjects.Components.Depth
  44208. * @extends Phaser.GameObjects.Components.Flip
  44209. * @extends Phaser.GameObjects.Components.GetBounds
  44210. * @extends Phaser.GameObjects.Components.Origin
  44211. * @extends Phaser.GameObjects.Components.Pipeline
  44212. * @extends Phaser.GameObjects.Components.ScaleMode
  44213. * @extends Phaser.GameObjects.Components.ScrollFactor
  44214. * @extends Phaser.GameObjects.Components.Transform
  44215. * @extends Phaser.GameObjects.Components.Visible
  44216. *
  44217. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs.
  44218. * @param {Phaser.Tilemaps.Tilemap} tilemap - The Tilemap this layer is a part of.
  44219. * @param {integer} layerIndex - The index of the LayerData associated with this layer.
  44220. * @param {(string|string[]|Phaser.Tilemaps.Tileset|Phaser.Tilemaps.Tileset[])} tileset - The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object.
  44221. * @param {number} [x=0] - The world x position where the top left of this layer will be placed.
  44222. * @param {number} [y=0] - The world y position where the top left of this layer will be placed.
  44223. */
  44224. var DynamicTilemapLayer = new Class({
  44225. Extends: GameObject,
  44226. Mixins: [
  44227. Components.Alpha,
  44228. Components.BlendMode,
  44229. Components.ComputedSize,
  44230. Components.Depth,
  44231. Components.Flip,
  44232. Components.GetBounds,
  44233. Components.Origin,
  44234. Components.Pipeline,
  44235. Components.ScaleMode,
  44236. Components.Transform,
  44237. Components.Visible,
  44238. Components.ScrollFactor,
  44239. DynamicTilemapLayerRender
  44240. ],
  44241. initialize:
  44242. function DynamicTilemapLayer (scene, tilemap, layerIndex, tileset, x, y)
  44243. {
  44244. GameObject.call(this, scene, 'DynamicTilemapLayer');
  44245. /**
  44246. * Used internally by physics system to perform fast type checks.
  44247. *
  44248. * @name Phaser.Tilemaps.DynamicTilemapLayer#isTilemap
  44249. * @type {boolean}
  44250. * @readonly
  44251. * @since 3.0.0
  44252. */
  44253. this.isTilemap = true;
  44254. /**
  44255. * The Tilemap that this layer is a part of.
  44256. *
  44257. * @name Phaser.Tilemaps.DynamicTilemapLayer#tilemap
  44258. * @type {Phaser.Tilemaps.Tilemap}
  44259. * @since 3.0.0
  44260. */
  44261. this.tilemap = tilemap;
  44262. /**
  44263. * The index of the LayerData associated with this layer.
  44264. *
  44265. * @name Phaser.Tilemaps.DynamicTilemapLayer#layerIndex
  44266. * @type {integer}
  44267. * @since 3.0.0
  44268. */
  44269. this.layerIndex = layerIndex;
  44270. /**
  44271. * The LayerData associated with this layer. LayerData can only be associated with one
  44272. * tilemap layer.
  44273. *
  44274. * @name Phaser.Tilemaps.DynamicTilemapLayer#layer
  44275. * @type {Phaser.Tilemaps.LayerData}
  44276. * @since 3.0.0
  44277. */
  44278. this.layer = tilemap.layers[layerIndex];
  44279. // Link the LayerData with this static tilemap layer
  44280. this.layer.tilemapLayer = this;
  44281. /**
  44282. * The Tileset/s associated with this layer.
  44283. *
  44284. * As of Phaser 3.14 this property is now an array of Tileset objects, previously it was a single reference.
  44285. *
  44286. * @name Phaser.Tilemaps.DynamicTilemapLayer#tileset
  44287. * @type {Phaser.Tilemaps.Tileset[]}
  44288. * @since 3.0.0
  44289. */
  44290. this.tileset = [];
  44291. /**
  44292. * Used internally with the canvas render. This holds the tiles that are visible within the
  44293. * camera.
  44294. *
  44295. * @name Phaser.Tilemaps.DynamicTilemapLayer#culledTiles
  44296. * @type {array}
  44297. * @since 3.0.0
  44298. */
  44299. this.culledTiles = [];
  44300. /**
  44301. * You can control if the Cameras should cull tiles before rendering them or not.
  44302. * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer.
  44303. *
  44304. * However, there are some instances when you may wish to disable this, and toggling this flag allows
  44305. * you to do so. Also see `setSkipCull` for a chainable method that does the same thing.
  44306. *
  44307. * @name Phaser.Tilemaps.DynamicTilemapLayer#skipCull
  44308. * @type {boolean}
  44309. * @since 3.11.0
  44310. */
  44311. this.skipCull = false;
  44312. /**
  44313. * The total number of tiles drawn by the renderer in the last frame.
  44314. *
  44315. * @name Phaser.Tilemaps.DynamicTilemapLayer#tilesDrawn
  44316. * @type {integer}
  44317. * @readonly
  44318. * @since 3.11.0
  44319. */
  44320. this.tilesDrawn = 0;
  44321. /**
  44322. * The total number of tiles in this layer. Updated every frame.
  44323. *
  44324. * @name Phaser.Tilemaps.DynamicTilemapLayer#tilesTotal
  44325. * @type {integer}
  44326. * @readonly
  44327. * @since 3.11.0
  44328. */
  44329. this.tilesTotal = this.layer.width * this.layer.height;
  44330. /**
  44331. * The amount of extra tiles to add into the cull rectangle when calculating its horizontal size.
  44332. *
  44333. * See the method `setCullPadding` for more details.
  44334. *
  44335. * @name Phaser.Tilemaps.DynamicTilemapLayer#cullPaddingX
  44336. * @type {integer}
  44337. * @default 1
  44338. * @since 3.11.0
  44339. */
  44340. this.cullPaddingX = 1;
  44341. /**
  44342. * The amount of extra tiles to add into the cull rectangle when calculating its vertical size.
  44343. *
  44344. * See the method `setCullPadding` for more details.
  44345. *
  44346. * @name Phaser.Tilemaps.DynamicTilemapLayer#cullPaddingY
  44347. * @type {integer}
  44348. * @default 1
  44349. * @since 3.11.0
  44350. */
  44351. this.cullPaddingY = 1;
  44352. /**
  44353. * The callback that is invoked when the tiles are culled.
  44354. *
  44355. * By default it will call `TilemapComponents.CullTiles` but you can override this to call any function you like.
  44356. *
  44357. * It will be sent 3 arguments:
  44358. *
  44359. * 1. The Phaser.Tilemaps.LayerData object for this Layer
  44360. * 2. The Camera that is culling the layer. You can check its `dirty` property to see if it has changed since the last cull.
  44361. * 3. A reference to the `culledTiles` array, which should be used to store the tiles you want rendered.
  44362. *
  44363. * See the `TilemapComponents.CullTiles` source code for details on implementing your own culling system.
  44364. *
  44365. * @name Phaser.Tilemaps.DynamicTilemapLayer#cullCallback
  44366. * @type {function}
  44367. * @since 3.11.0
  44368. */
  44369. this.cullCallback = TilemapComponents.CullTiles;
  44370. /**
  44371. * The rendering (draw) order of the tiles in this layer.
  44372. *
  44373. * The default is 0 which is 'right-down', meaning it will draw the tiles starting from the top-left,
  44374. * drawing to the right and then moving down to the next row.
  44375. *
  44376. * The draw orders are:
  44377. *
  44378. * 0 = right-down
  44379. * 1 = left-down
  44380. * 2 = right-up
  44381. * 3 = left-up
  44382. *
  44383. * This can be changed via the `setRenderOrder` method.
  44384. *
  44385. * @name Phaser.Tilemaps.DynamicTilemapLayer#_renderOrder
  44386. * @type {integer}
  44387. * @default 0
  44388. * @private
  44389. * @since 3.12.0
  44390. */
  44391. this._renderOrder = 0;
  44392. /**
  44393. * An array holding the mapping between the tile indexes and the tileset they belong to.
  44394. *
  44395. * @name Phaser.Tilemaps.DynamicTilemapLayer#gidMap
  44396. * @type {Phaser.Tilemaps.Tileset[]}
  44397. * @since 3.14.0
  44398. */
  44399. this.gidMap = [];
  44400. this.setTilesets(tileset);
  44401. this.setAlpha(this.layer.alpha);
  44402. this.setPosition(x, y);
  44403. this.setOrigin();
  44404. this.setSize(tilemap.tileWidth * this.layer.width, tilemap.tileHeight * this.layer.height);
  44405. this.initPipeline('TextureTintPipeline');
  44406. },
  44407. /**
  44408. * Populates the internal `tileset` array with the Tileset references this Layer requires for rendering.
  44409. *
  44410. * @method Phaser.Tilemaps.DynamicTilemapLayer#setTilesets
  44411. * @private
  44412. * @since 3.14.0
  44413. *
  44414. * @param {(string|string[]|Phaser.Tilemaps.Tileset|Phaser.Tilemaps.Tileset[])} tileset - The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object.
  44415. */
  44416. setTilesets: function (tilesets)
  44417. {
  44418. var gidMap = [];
  44419. var setList = [];
  44420. var map = this.tilemap;
  44421. if (!Array.isArray(tilesets))
  44422. {
  44423. tilesets = [ tilesets ];
  44424. }
  44425. for (var i = 0; i < tilesets.length; i++)
  44426. {
  44427. var tileset = tilesets[i];
  44428. if (typeof tileset === 'string')
  44429. {
  44430. tileset = map.getTileset(tileset);
  44431. }
  44432. if (tileset)
  44433. {
  44434. setList.push(tileset);
  44435. var s = tileset.firstgid;
  44436. for (var t = 0; t < tileset.total; t++)
  44437. {
  44438. gidMap[s + t] = tileset;
  44439. }
  44440. }
  44441. }
  44442. this.gidMap = gidMap;
  44443. this.tileset = setList;
  44444. },
  44445. /**
  44446. * Sets the rendering (draw) order of the tiles in this layer.
  44447. *
  44448. * The default is 'right-down', meaning it will order the tiles starting from the top-left,
  44449. * drawing to the right and then moving down to the next row.
  44450. *
  44451. * The draw orders are:
  44452. *
  44453. * 0 = right-down
  44454. * 1 = left-down
  44455. * 2 = right-up
  44456. * 3 = left-up
  44457. *
  44458. * Setting the render order does not change the tiles or how they are stored in the layer,
  44459. * it purely impacts the order in which they are rendered.
  44460. *
  44461. * You can provide either an integer (0 to 3), or the string version of the order.
  44462. *
  44463. * @method Phaser.Tilemaps.DynamicTilemapLayer#setRenderOrder
  44464. * @since 3.12.0
  44465. *
  44466. * @param {(integer|string)} renderOrder - The render (draw) order value. Either an integer between 0 and 3, or a string: 'right-down', 'left-down', 'right-up' or 'left-up'.
  44467. *
  44468. * @return {this} This Tilemap Layer object.
  44469. */
  44470. setRenderOrder: function (renderOrder)
  44471. {
  44472. var orders = [ 'right-down', 'left-down', 'right-up', 'left-up' ];
  44473. if (typeof renderOrder === 'string')
  44474. {
  44475. renderOrder = orders.indexOf(renderOrder);
  44476. }
  44477. if (renderOrder >= 0 && renderOrder < 4)
  44478. {
  44479. this._renderOrder = renderOrder;
  44480. }
  44481. return this;
  44482. },
  44483. /**
  44484. * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting
  44485. * faces are used internally for optimizing collisions against tiles. This method is mostly used
  44486. * internally to optimize recalculating faces when only one tile has been changed.
  44487. *
  44488. * @method Phaser.Tilemaps.DynamicTilemapLayer#calculateFacesAt
  44489. * @since 3.0.0
  44490. *
  44491. * @param {integer} tileX - The x coordinate.
  44492. * @param {integer} tileY - The y coordinate.
  44493. *
  44494. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  44495. */
  44496. calculateFacesAt: function (tileX, tileY)
  44497. {
  44498. TilemapComponents.CalculateFacesAt(tileX, tileY, this.layer);
  44499. return this;
  44500. },
  44501. /**
  44502. * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the
  44503. * layer. Interesting faces are used internally for optimizing collisions against tiles. This method
  44504. * is mostly used internally.
  44505. *
  44506. * @method Phaser.Tilemaps.DynamicTilemapLayer#calculateFacesWithin
  44507. * @since 3.0.0
  44508. *
  44509. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  44510. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  44511. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  44512. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  44513. *
  44514. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  44515. */
  44516. calculateFacesWithin: function (tileX, tileY, width, height)
  44517. {
  44518. TilemapComponents.CalculateFacesWithin(tileX, tileY, width, height, this.layer);
  44519. return this;
  44520. },
  44521. /**
  44522. * Creates a Sprite for every object matching the given tile indexes in the layer. You can
  44523. * optionally specify if each tile will be replaced with a new tile after the Sprite has been
  44524. * created. This is useful if you want to lay down special tiles in a level that are converted to
  44525. * Sprites, but want to replace the tile itself with a floor tile or similar once converted.
  44526. *
  44527. * @method Phaser.Tilemaps.DynamicTilemapLayer#createFromTiles
  44528. * @since 3.0.0
  44529. *
  44530. * @param {(integer|array)} indexes - The tile index, or array of indexes, to create Sprites from.
  44531. * @param {(integer|array)} replacements - The tile index, or array of indexes, to change a converted
  44532. * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a
  44533. * one-to-one mapping with the indexes array.
  44534. * @param {SpriteConfig} spriteConfig - The config object to pass into the Sprite creator (i.e.
  44535. * scene.make.sprite).
  44536. * @param {Phaser.Scene} [scene=scene the map is within] - The Scene to create the Sprites within.
  44537. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when determining the world XY
  44538. *
  44539. * @return {Phaser.GameObjects.Sprite[]} An array of the Sprites that were created.
  44540. */
  44541. createFromTiles: function (indexes, replacements, spriteConfig, scene, camera)
  44542. {
  44543. return TilemapComponents.CreateFromTiles(indexes, replacements, spriteConfig, scene, camera, this.layer);
  44544. },
  44545. /**
  44546. * Returns the tiles in the given layer that are within the cameras viewport.
  44547. * This is used internally.
  44548. *
  44549. * @method Phaser.Tilemaps.DynamicTilemapLayer#cull
  44550. * @since 3.0.0
  44551. *
  44552. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to run the cull check against.
  44553. *
  44554. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  44555. */
  44556. cull: function (camera)
  44557. {
  44558. return this.cullCallback(this.layer, camera, this.culledTiles, this._renderOrder);
  44559. },
  44560. /**
  44561. * Copies the tiles in the source rectangular area to a new destination (all specified in tile
  44562. * coordinates) within the layer. This copies all tile properties & recalculates collision
  44563. * information in the destination region.
  44564. *
  44565. * @method Phaser.Tilemaps.DynamicTilemapLayer#copy
  44566. * @since 3.0.0
  44567. *
  44568. * @param {integer} srcTileX - The x coordinate of the area to copy from, in tiles, not pixels.
  44569. * @param {integer} srcTileY - The y coordinate of the area to copy from, in tiles, not pixels.
  44570. * @param {integer} width - The width of the area to copy, in tiles, not pixels.
  44571. * @param {integer} height - The height of the area to copy, in tiles, not pixels.
  44572. * @param {integer} destTileX - The x coordinate of the area to copy to, in tiles, not pixels.
  44573. * @param {integer} destTileY - The y coordinate of the area to copy to, in tiles, not pixels.
  44574. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  44575. *
  44576. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  44577. */
  44578. copy: function (srcTileX, srcTileY, width, height, destTileX, destTileY, recalculateFaces)
  44579. {
  44580. TilemapComponents.Copy(srcTileX, srcTileY, width, height, destTileX, destTileY, recalculateFaces, this.layer);
  44581. return this;
  44582. },
  44583. /**
  44584. * Destroys this DynamicTilemapLayer and removes its link to the associated LayerData.
  44585. *
  44586. * @method Phaser.Tilemaps.DynamicTilemapLayer#destroy
  44587. * @since 3.0.0
  44588. */
  44589. destroy: function ()
  44590. {
  44591. // Uninstall this layer only if it is still installed on the LayerData object
  44592. if (this.layer.tilemapLayer === this)
  44593. {
  44594. this.layer.tilemapLayer = undefined;
  44595. }
  44596. this.tilemap = undefined;
  44597. this.layer = undefined;
  44598. this.culledTiles.length = 0;
  44599. this.cullCallback = null;
  44600. this.gidMap = [];
  44601. this.tileset = [];
  44602. GameObject.prototype.destroy.call(this);
  44603. },
  44604. /**
  44605. * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the
  44606. * specified index. Tiles will be set to collide if the given index is a colliding index.
  44607. * Collision information in the region will be recalculated.
  44608. *
  44609. * @method Phaser.Tilemaps.DynamicTilemapLayer#fill
  44610. * @since 3.0.0
  44611. *
  44612. * @param {integer} index - The tile index to fill the area with.
  44613. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  44614. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  44615. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  44616. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  44617. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  44618. *
  44619. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  44620. */
  44621. fill: function (index, tileX, tileY, width, height, recalculateFaces)
  44622. {
  44623. TilemapComponents.Fill(index, tileX, tileY, width, height, recalculateFaces, this.layer);
  44624. return this;
  44625. },
  44626. /**
  44627. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  44628. * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns
  44629. * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS.
  44630. *
  44631. * @method Phaser.Tilemaps.DynamicTilemapLayer#filterTiles
  44632. * @since 3.0.0
  44633. *
  44634. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  44635. * callback as the first and only parameter. The callback should return true for tiles that pass the
  44636. * filter.
  44637. * @param {object} [context] - The context under which the callback should be run.
  44638. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to filter.
  44639. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area to filter.
  44640. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  44641. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  44642. * @param {object} [FilteringOptions] - Optional filters to apply when getting the tiles.
  44643. *
  44644. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  44645. */
  44646. filterTiles: function (callback, context, tileX, tileY, width, height, filteringOptions)
  44647. {
  44648. return TilemapComponents.FilterTiles(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  44649. },
  44650. /**
  44651. * Searches the entire map layer for the first tile matching the given index, then returns that Tile
  44652. * object. If no match is found, it returns null. The search starts from the top-left tile and
  44653. * continues horizontally until it hits the end of the row, then it drops down to the next column.
  44654. * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to
  44655. * the top-left.
  44656. *
  44657. * @method Phaser.Tilemaps.DynamicTilemapLayer#findByIndex
  44658. * @since 3.0.0
  44659. *
  44660. * @param {integer} index - The tile index value to search for.
  44661. * @param {integer} [skip=0] - The number of times to skip a matching tile before returning.
  44662. * @param {boolean} [reverse=false] - If true it will scan the layer in reverse, starting at the
  44663. * bottom-right. Otherwise it scans from the top-left.
  44664. *
  44665. * @return {Phaser.Tilemaps.Tile} A Tile object.
  44666. */
  44667. findByIndex: function (findIndex, skip, reverse)
  44668. {
  44669. return TilemapComponents.FindByIndex(findIndex, skip, reverse, this.layer);
  44670. },
  44671. /**
  44672. * Find the first tile in the given rectangular area (in tile coordinates) of the layer that
  44673. * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns
  44674. * true. Similar to Array.prototype.find in vanilla JS.
  44675. *
  44676. * @method Phaser.Tilemaps.DynamicTilemapLayer#findTile
  44677. * @since 3.0.0
  44678. *
  44679. * @param {FindTileCallback} callback - The callback. Each tile in the given area will be passed to this callback as the first and only parameter.
  44680. * @param {object} [context] - The context under which the callback should be run.
  44681. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to search.
  44682. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area to search.
  44683. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  44684. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  44685. * @param {object} [FilteringOptions] - Optional filters to apply when getting the tiles.
  44686. *
  44687. * @return {?Phaser.Tilemaps.Tile}
  44688. */
  44689. findTile: function (callback, context, tileX, tileY, width, height, filteringOptions)
  44690. {
  44691. return TilemapComponents.FindTile(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  44692. },
  44693. /**
  44694. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  44695. * callback. Similar to Array.prototype.forEach in vanilla JS.
  44696. *
  44697. * @method Phaser.Tilemaps.DynamicTilemapLayer#forEachTile
  44698. * @since 3.0.0
  44699. *
  44700. * @param {EachTileCallback} callback - The callback. Each tile in the given area will be passed to this callback as the first and only parameter.
  44701. * @param {object} [context] - The context under which the callback should be run.
  44702. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to search.
  44703. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area to search.
  44704. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  44705. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  44706. * @param {object} [FilteringOptions] - Optional filters to apply when getting the tiles.
  44707. *
  44708. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  44709. */
  44710. forEachTile: function (callback, context, tileX, tileY, width, height, filteringOptions)
  44711. {
  44712. TilemapComponents.ForEachTile(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  44713. return this;
  44714. },
  44715. /**
  44716. * Gets a tile at the given tile coordinates from the given layer.
  44717. *
  44718. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTileAt
  44719. * @since 3.0.0
  44720. *
  44721. * @param {integer} tileX - X position to get the tile from (given in tile units, not pixels).
  44722. * @param {integer} tileY - Y position to get the tile from (given in tile units, not pixels).
  44723. * @param {boolean} [nonNull=false] - If true getTile won't return null for empty tiles, but a Tile object with an index of -1.
  44724. *
  44725. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates were invalid.
  44726. */
  44727. getTileAt: function (tileX, tileY, nonNull)
  44728. {
  44729. return TilemapComponents.GetTileAt(tileX, tileY, nonNull, this.layer);
  44730. },
  44731. /**
  44732. * Gets a tile at the given world coordinates from the given layer.
  44733. *
  44734. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTileAtWorldXY
  44735. * @since 3.0.0
  44736. *
  44737. * @param {number} worldX - X position to get the tile from (given in pixels)
  44738. * @param {number} worldY - Y position to get the tile from (given in pixels)
  44739. * @param {boolean} [nonNull=false] - If true, function won't return null for empty tiles, but a Tile object with an index of -1.
  44740. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  44741. *
  44742. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates
  44743. * were invalid.
  44744. */
  44745. getTileAtWorldXY: function (worldX, worldY, nonNull, camera)
  44746. {
  44747. return TilemapComponents.GetTileAtWorldXY(worldX, worldY, nonNull, camera, this.layer);
  44748. },
  44749. /**
  44750. * Gets the tiles in the given rectangular area (in tile coordinates) of the layer.
  44751. *
  44752. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTilesWithin
  44753. * @since 3.0.0
  44754. *
  44755. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  44756. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  44757. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  44758. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  44759. * @param {object} [FilteringOptions] - Optional filters to apply when getting the tiles.
  44760. *
  44761. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  44762. */
  44763. getTilesWithin: function (tileX, tileY, width, height, filteringOptions)
  44764. {
  44765. return TilemapComponents.GetTilesWithin(tileX, tileY, width, height, filteringOptions, this.layer);
  44766. },
  44767. /**
  44768. * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle,
  44769. * Line, Rectangle or Triangle. The shape should be in world coordinates.
  44770. *
  44771. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTilesWithinShape
  44772. * @since 3.0.0
  44773. *
  44774. * @param {(Phaser.Geom.Circle|Phaser.Geom.Line|Phaser.Geom.Rectangle|Phaser.Geom.Triangle)} shape - A shape in world (pixel) coordinates
  44775. * @param {object} [FilteringOptions] - Optional filters to apply when getting the tiles.
  44776. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when factoring in which tiles to return.
  44777. *
  44778. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  44779. */
  44780. getTilesWithinShape: function (shape, filteringOptions, camera)
  44781. {
  44782. return TilemapComponents.GetTilesWithinShape(shape, filteringOptions, camera, this.layer);
  44783. },
  44784. /**
  44785. * Gets the tiles in the given rectangular area (in world coordinates) of the layer.
  44786. *
  44787. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTilesWithinWorldXY
  44788. * @since 3.0.0
  44789. *
  44790. * @param {number} worldX - The world x coordinate for the top-left of the area.
  44791. * @param {number} worldY - The world y coordinate for the top-left of the area.
  44792. * @param {number} width - The width of the area.
  44793. * @param {number} height - The height of the area.
  44794. * @param {object} [FilteringOptions] - Optional filters to apply when getting the tiles.
  44795. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when factoring in which tiles to return.
  44796. *
  44797. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  44798. */
  44799. getTilesWithinWorldXY: function (worldX, worldY, width, height, filteringOptions, camera)
  44800. {
  44801. return TilemapComponents.GetTilesWithinWorldXY(worldX, worldY, width, height, filteringOptions, camera, this.layer);
  44802. },
  44803. /**
  44804. * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns
  44805. * false if there is no tile or if the tile at that location has an index of -1.
  44806. *
  44807. * @method Phaser.Tilemaps.DynamicTilemapLayer#hasTileAt
  44808. * @since 3.0.0
  44809. *
  44810. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  44811. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  44812. *
  44813. * @return {boolean} `true` if a tile was found at the given location, otherwise `false`.
  44814. */
  44815. hasTileAt: function (tileX, tileY)
  44816. {
  44817. return TilemapComponents.HasTileAt(tileX, tileY, this.layer);
  44818. },
  44819. /**
  44820. * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns
  44821. * false if there is no tile or if the tile at that location has an index of -1.
  44822. *
  44823. * @method Phaser.Tilemaps.DynamicTilemapLayer#hasTileAtWorldXY
  44824. * @since 3.0.0
  44825. *
  44826. * @param {number} worldX - The x coordinate, in pixels.
  44827. * @param {number} worldY - The y coordinate, in pixels.
  44828. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when factoring in which tiles to return.
  44829. *
  44830. * @return {boolean} `true` if a tile was found at the given location, otherwise `false`.
  44831. */
  44832. hasTileAtWorldXY: function (worldX, worldY, camera)
  44833. {
  44834. return TilemapComponents.HasTileAtWorldXY(worldX, worldY, camera, this.layer);
  44835. },
  44836. /**
  44837. * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index
  44838. * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified
  44839. * location. If you pass in an index, only the index at the specified location will be changed.
  44840. * Collision information will be recalculated at the specified location.
  44841. *
  44842. * @method Phaser.Tilemaps.DynamicTilemapLayer#putTileAt
  44843. * @since 3.0.0
  44844. *
  44845. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  44846. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  44847. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  44848. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  44849. *
  44850. * @return {Phaser.Tilemaps.Tile} A Tile object.
  44851. */
  44852. putTileAt: function (tile, tileX, tileY, recalculateFaces)
  44853. {
  44854. return TilemapComponents.PutTileAt(tile, tileX, tileY, recalculateFaces, this.layer);
  44855. },
  44856. /**
  44857. * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either
  44858. * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the
  44859. * specified location. If you pass in an index, only the index at the specified location will be
  44860. * changed. Collision information will be recalculated at the specified location.
  44861. *
  44862. * @method Phaser.Tilemaps.DynamicTilemapLayer#putTileAtWorldXY
  44863. * @since 3.0.0
  44864. *
  44865. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  44866. * @param {number} worldX - The x coordinate, in pixels.
  44867. * @param {number} worldY - The y coordinate, in pixels.
  44868. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  44869. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  44870. *
  44871. * @return {Phaser.Tilemaps.Tile} A Tile object.
  44872. */
  44873. putTileAtWorldXY: function (tile, worldX, worldY, recalculateFaces, camera)
  44874. {
  44875. return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, recalculateFaces, camera, this.layer);
  44876. },
  44877. /**
  44878. * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified
  44879. * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile,
  44880. * all attributes will be copied over to the specified location. If you pass in an index, only the
  44881. * index at the specified location will be changed. Collision information will be recalculated
  44882. * within the region tiles were changed.
  44883. *
  44884. * @method Phaser.Tilemaps.DynamicTilemapLayer#putTilesAt
  44885. * @since 3.0.0
  44886. *
  44887. * @param {(integer[]|integer[][]|Phaser.Tilemaps.Tile[]|Phaser.Tilemaps.Tile[][])} tile - A row (array) or grid (2D array) of Tiles or tile indexes to place.
  44888. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  44889. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  44890. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  44891. *
  44892. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  44893. */
  44894. putTilesAt: function (tilesArray, tileX, tileY, recalculateFaces)
  44895. {
  44896. TilemapComponents.PutTilesAt(tilesArray, tileX, tileY, recalculateFaces, this.layer);
  44897. return this;
  44898. },
  44899. /**
  44900. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  44901. * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then
  44902. * those will be used for randomly assigning new tile indexes. If an array is not provided, the
  44903. * indexes found within the region (excluding -1) will be used for randomly assigning new tile
  44904. * indexes. This method only modifies tile indexes and does not change collision information.
  44905. *
  44906. * @method Phaser.Tilemaps.DynamicTilemapLayer#randomize
  44907. * @since 3.0.0
  44908. *
  44909. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  44910. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  44911. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  44912. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  44913. * @param {integer[]} [indexes] - An array of indexes to randomly draw from during randomization.
  44914. *
  44915. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  44916. */
  44917. randomize: function (tileX, tileY, width, height, indexes)
  44918. {
  44919. TilemapComponents.Randomize(tileX, tileY, width, height, indexes, this.layer);
  44920. return this;
  44921. },
  44922. /**
  44923. * Removes the tile at the given tile coordinates in the specified layer and updates the layer's
  44924. * collision information.
  44925. *
  44926. * @method Phaser.Tilemaps.DynamicTilemapLayer#removeTileAt
  44927. * @since 3.0.0
  44928. *
  44929. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  44930. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  44931. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1.
  44932. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  44933. *
  44934. * @return {Phaser.Tilemaps.Tile} A Tile object.
  44935. */
  44936. removeTileAt: function (tileX, tileY, replaceWithNull, recalculateFaces)
  44937. {
  44938. return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, recalculateFaces, this.layer);
  44939. },
  44940. /**
  44941. * Removes the tile at the given world coordinates in the specified layer and updates the layer's
  44942. * collision information.
  44943. *
  44944. * @method Phaser.Tilemaps.DynamicTilemapLayer#removeTileAtWorldXY
  44945. * @since 3.0.0
  44946. *
  44947. * @param {number} worldX - The x coordinate, in pixels.
  44948. * @param {number} worldY - The y coordinate, in pixels.
  44949. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1.
  44950. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  44951. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  44952. *
  44953. * @return {Phaser.Tilemaps.Tile} A Tile object.
  44954. */
  44955. removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, recalculateFaces, camera)
  44956. {
  44957. return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, recalculateFaces, camera, this.layer);
  44958. },
  44959. /**
  44960. * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to
  44961. * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles
  44962. * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation
  44963. * wherever you want on the screen.
  44964. *
  44965. * @method Phaser.Tilemaps.DynamicTilemapLayer#renderDebug
  44966. * @since 3.0.0
  44967. *
  44968. * @param {Phaser.GameObjects.Graphics} graphics - The target Graphics object to draw upon.
  44969. * @param {StyleConfig} styleConfig - An object specifying the colors to use for the debug drawing.
  44970. *
  44971. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  44972. */
  44973. renderDebug: function (graphics, styleConfig)
  44974. {
  44975. TilemapComponents.RenderDebug(graphics, styleConfig, this.layer);
  44976. return this;
  44977. },
  44978. /**
  44979. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  44980. * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does
  44981. * not change collision information.
  44982. *
  44983. * @method Phaser.Tilemaps.DynamicTilemapLayer#replaceByIndex
  44984. * @since 3.0.0
  44985. *
  44986. * @param {integer} findIndex - The index of the tile to search for.
  44987. * @param {integer} newIndex - The index of the tile to replace it with.
  44988. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  44989. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  44990. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  44991. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  44992. *
  44993. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  44994. */
  44995. replaceByIndex: function (findIndex, newIndex, tileX, tileY, width, height)
  44996. {
  44997. TilemapComponents.ReplaceByIndex(findIndex, newIndex, tileX, tileY, width, height, this.layer);
  44998. return this;
  44999. },
  45000. /**
  45001. * You can control if the Cameras should cull tiles before rendering them or not.
  45002. * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer.
  45003. *
  45004. * However, there are some instances when you may wish to disable this.
  45005. *
  45006. * @method Phaser.Tilemaps.DynamicTilemapLayer#setSkipCull
  45007. * @since 3.11.0
  45008. *
  45009. * @param {boolean} [value=true] - Set to `true` to stop culling tiles. Set to `false` to enable culling again.
  45010. *
  45011. * @return {this} This Tilemap Layer object.
  45012. */
  45013. setSkipCull: function (value)
  45014. {
  45015. if (value === undefined) { value = true; }
  45016. this.skipCull = value;
  45017. return this;
  45018. },
  45019. /**
  45020. * When a Camera culls the tiles in this layer it does so using its view into the world, building up a
  45021. * rectangle inside which the tiles must exist or they will be culled. Sometimes you may need to expand the size
  45022. * of this 'cull rectangle', especially if you plan on rotating the Camera viewing the layer. Do so
  45023. * by providing the padding values. The values given are in tiles, not pixels. So if the tile width was 32px
  45024. * and you set `paddingX` to be 4, it would add 32px x 4 to the cull rectangle (adjusted for scale)
  45025. *
  45026. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCullPadding
  45027. * @since 3.11.0
  45028. *
  45029. * @param {integer} [paddingX=1] - The amount of extra horizontal tiles to add to the cull check padding.
  45030. * @param {integer} [paddingY=1] - The amount of extra vertical tiles to add to the cull check padding.
  45031. *
  45032. * @return {this} This Tilemap Layer object.
  45033. */
  45034. setCullPadding: function (paddingX, paddingY)
  45035. {
  45036. if (paddingX === undefined) { paddingX = 1; }
  45037. if (paddingY === undefined) { paddingY = 1; }
  45038. this.cullPaddingX = paddingX;
  45039. this.cullPaddingY = paddingY;
  45040. return this;
  45041. },
  45042. /**
  45043. * Sets collision on the given tile or tiles within a layer by index. You can pass in either a
  45044. * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if
  45045. * collision will be enabled (true) or disabled (false).
  45046. *
  45047. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollision
  45048. * @since 3.0.0
  45049. *
  45050. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes.
  45051. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  45052. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  45053. *
  45054. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45055. */
  45056. setCollision: function (indexes, collides, recalculateFaces)
  45057. {
  45058. TilemapComponents.SetCollision(indexes, collides, recalculateFaces, this.layer);
  45059. return this;
  45060. },
  45061. /**
  45062. * Sets collision on a range of tiles in a layer whose index is between the specified `start` and
  45063. * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set
  45064. * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be
  45065. * enabled (true) or disabled (false).
  45066. *
  45067. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollisionBetween
  45068. * @since 3.0.0
  45069. *
  45070. * @param {integer} start - The first index of the tile to be set for collision.
  45071. * @param {integer} stop - The last index of the tile to be set for collision.
  45072. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  45073. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  45074. *
  45075. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45076. */
  45077. setCollisionBetween: function (start, stop, collides, recalculateFaces)
  45078. {
  45079. TilemapComponents.SetCollisionBetween(start, stop, collides, recalculateFaces, this.layer);
  45080. return this;
  45081. },
  45082. /**
  45083. * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property
  45084. * that matches the given properties object, its collision flag will be set. The `collides`
  45085. * parameter controls if collision will be enabled (true) or disabled (false). Passing in
  45086. * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that
  45087. * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can
  45088. * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a
  45089. * "types" property that matches any of those values, its collision flag will be updated.
  45090. *
  45091. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollisionByProperty
  45092. * @since 3.0.0
  45093. *
  45094. * @param {object} properties - An object with tile properties and corresponding values that should be checked.
  45095. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  45096. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  45097. *
  45098. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45099. */
  45100. setCollisionByProperty: function (properties, collides, recalculateFaces)
  45101. {
  45102. TilemapComponents.SetCollisionByProperty(properties, collides, recalculateFaces, this.layer);
  45103. return this;
  45104. },
  45105. /**
  45106. * Sets collision on all tiles in the given layer, except for tiles that have an index specified in
  45107. * the given array. The `collides` parameter controls if collision will be enabled (true) or
  45108. * disabled (false).
  45109. *
  45110. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollisionByExclusion
  45111. * @since 3.0.0
  45112. *
  45113. * @param {integer[]} indexes - An array of the tile indexes to not be counted for collision.
  45114. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  45115. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  45116. *
  45117. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45118. */
  45119. setCollisionByExclusion: function (indexes, collides, recalculateFaces)
  45120. {
  45121. TilemapComponents.SetCollisionByExclusion(indexes, collides, recalculateFaces, this.layer);
  45122. return this;
  45123. },
  45124. /**
  45125. * Sets collision on the tiles within a layer by checking each tiles collision group data
  45126. * (typically defined in Tiled within the tileset collision editor). If any objects are found within
  45127. * a tiles collision group, the tile's colliding information will be set. The `collides` parameter
  45128. * controls if collision will be enabled (true) or disabled (false).
  45129. *
  45130. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollisionFromCollisionGroup
  45131. * @since 3.0.0
  45132. *
  45133. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  45134. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  45135. *
  45136. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45137. */
  45138. setCollisionFromCollisionGroup: function (collides, recalculateFaces)
  45139. {
  45140. TilemapComponents.SetCollisionFromCollisionGroup(collides, recalculateFaces, this.layer);
  45141. return this;
  45142. },
  45143. /**
  45144. * Sets a global collision callback for the given tile index within the layer. This will affect all
  45145. * tiles on this layer that have the same index. If a callback is already set for the tile index it
  45146. * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile
  45147. * at a specific location on the map then see setTileLocationCallback.
  45148. *
  45149. * @method Phaser.Tilemaps.DynamicTilemapLayer#setTileIndexCallback
  45150. * @since 3.0.0
  45151. *
  45152. * @param {(integer|integer[])} indexes - Either a single tile index, or an array of tile indexes to have a collision callback set for.
  45153. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  45154. * @param {object} callbackContext - The context under which the callback is called.
  45155. *
  45156. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45157. */
  45158. setTileIndexCallback: function (indexes, callback, callbackContext)
  45159. {
  45160. TilemapComponents.SetTileIndexCallback(indexes, callback, callbackContext, this.layer);
  45161. return this;
  45162. },
  45163. /**
  45164. * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer.
  45165. * If a callback is already set for the tile index it will be replaced. Set the callback to null to
  45166. * remove it.
  45167. *
  45168. * @method Phaser.Tilemaps.DynamicTilemapLayer#setTileLocationCallback
  45169. * @since 3.0.0
  45170. *
  45171. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  45172. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  45173. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  45174. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  45175. * @param {function} [callback] - The callback that will be invoked when the tile is collided with.
  45176. * @param {object} [callbackContext] - The context under which the callback is called.
  45177. *
  45178. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45179. */
  45180. setTileLocationCallback: function (tileX, tileY, width, height, callback, callbackContext)
  45181. {
  45182. TilemapComponents.SetTileLocationCallback(tileX, tileY, width, height, callback, callbackContext, this.layer);
  45183. return this;
  45184. },
  45185. /**
  45186. * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given
  45187. * layer. It will only randomize the tiles in that area, so if they're all the same nothing will
  45188. * appear to have changed! This method only modifies tile indexes and does not change collision
  45189. * information.
  45190. *
  45191. * @method Phaser.Tilemaps.DynamicTilemapLayer#shuffle
  45192. * @since 3.0.0
  45193. *
  45194. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  45195. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  45196. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  45197. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  45198. *
  45199. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45200. */
  45201. shuffle: function (tileX, tileY, width, height)
  45202. {
  45203. TilemapComponents.Shuffle(tileX, tileY, width, height, this.layer);
  45204. return this;
  45205. },
  45206. /**
  45207. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  45208. * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision
  45209. * information.
  45210. *
  45211. * @method Phaser.Tilemaps.DynamicTilemapLayer#swapByIndex
  45212. * @since 3.0.0
  45213. *
  45214. * @param {integer} tileA - First tile index.
  45215. * @param {integer} tileB - Second tile index.
  45216. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  45217. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  45218. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  45219. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  45220. *
  45221. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45222. */
  45223. swapByIndex: function (indexA, indexB, tileX, tileY, width, height)
  45224. {
  45225. TilemapComponents.SwapByIndex(indexA, indexB, tileX, tileY, width, height, this.layer);
  45226. return this;
  45227. },
  45228. /**
  45229. * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the
  45230. * layers position, scale and scroll.
  45231. *
  45232. * @method Phaser.Tilemaps.DynamicTilemapLayer#tileToWorldX
  45233. * @since 3.0.0
  45234. *
  45235. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  45236. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  45237. *
  45238. * @return {number}
  45239. */
  45240. tileToWorldX: function (tileX, camera)
  45241. {
  45242. return TilemapComponents.TileToWorldX(tileX, camera, this.layer);
  45243. },
  45244. /**
  45245. * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the
  45246. * layers position, scale and scroll.
  45247. *
  45248. * @method Phaser.Tilemaps.DynamicTilemapLayer#tileToWorldY
  45249. * @since 3.0.0
  45250. *
  45251. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  45252. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  45253. *
  45254. * @return {number}
  45255. */
  45256. tileToWorldY: function (tileY, camera)
  45257. {
  45258. return TilemapComponents.TileToWorldY(tileY, camera, this.layer);
  45259. },
  45260. /**
  45261. * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the
  45262. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  45263. * `point` object.
  45264. *
  45265. * @method Phaser.Tilemaps.DynamicTilemapLayer#tileToWorldXY
  45266. * @since 3.0.0
  45267. *
  45268. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  45269. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  45270. * @param {Phaser.Math.Vector2} [point] - A Vector2 to store the coordinates in. If not given a new Vector2 is created.
  45271. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  45272. *
  45273. * @return {Phaser.Math.Vector2}
  45274. */
  45275. tileToWorldXY: function (tileX, tileY, point, camera)
  45276. {
  45277. return TilemapComponents.TileToWorldXY(tileX, tileY, point, camera, this.layer);
  45278. },
  45279. /**
  45280. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  45281. * specified layer. Each tile will recieve a new index. New indexes are drawn from the given
  45282. * weightedIndexes array. An example weighted array:
  45283. *
  45284. * [
  45285. * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8
  45286. * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8
  45287. * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8
  45288. * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8
  45289. * ]
  45290. *
  45291. * The probability of any index being choose is (the index's weight) / (sum of all weights). This
  45292. * method only modifies tile indexes and does not change collision information.
  45293. *
  45294. * @method Phaser.Tilemaps.DynamicTilemapLayer#weightedRandomize
  45295. * @since 3.0.0
  45296. *
  45297. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  45298. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  45299. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  45300. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  45301. * @param {object[]} [weightedIndexes] - An array of objects to randomly draw from during
  45302. * randomization. They should be in the form: { index: 0, weight: 4 } or
  45303. * { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes.
  45304. *
  45305. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  45306. */
  45307. weightedRandomize: function (tileX, tileY, width, height, weightedIndexes)
  45308. {
  45309. TilemapComponents.WeightedRandomize(tileX, tileY, width, height, weightedIndexes, this.layer);
  45310. return this;
  45311. },
  45312. /**
  45313. * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the
  45314. * layers position, scale and scroll.
  45315. *
  45316. * @method Phaser.Tilemaps.DynamicTilemapLayer#worldToTileX
  45317. * @since 3.0.0
  45318. *
  45319. * @param {number} worldX - The x coordinate to be converted, in pixels, not tiles.
  45320. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the nearest integer.
  45321. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  45322. *
  45323. * @return {number}
  45324. */
  45325. worldToTileX: function (worldX, snapToFloor, camera)
  45326. {
  45327. return TilemapComponents.WorldToTileX(worldX, snapToFloor, camera, this.layer);
  45328. },
  45329. /**
  45330. * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the
  45331. * layers position, scale and scroll.
  45332. *
  45333. * @method Phaser.Tilemaps.DynamicTilemapLayer#worldToTileY
  45334. * @since 3.0.0
  45335. *
  45336. * @param {number} worldY - The y coordinate to be converted, in pixels, not tiles.
  45337. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the nearest integer.
  45338. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  45339. *
  45340. * @return {number}
  45341. */
  45342. worldToTileY: function (worldY, snapToFloor, camera)
  45343. {
  45344. return TilemapComponents.WorldToTileY(worldY, snapToFloor, camera, this.layer);
  45345. },
  45346. /**
  45347. * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the
  45348. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  45349. * `point` object.
  45350. *
  45351. * @method Phaser.Tilemaps.DynamicTilemapLayer#worldToTileXY
  45352. * @since 3.0.0
  45353. *
  45354. * @param {number} worldX - The x coordinate to be converted, in pixels, not tiles.
  45355. * @param {number} worldY - The y coordinate to be converted, in pixels, not tiles.
  45356. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the nearest integer.
  45357. * @param {Phaser.Math.Vector2} [point] - A Vector2 to store the coordinates in. If not given a new Vector2 is created.
  45358. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  45359. *
  45360. * @return {Phaser.Math.Vector2}
  45361. */
  45362. worldToTileXY: function (worldX, worldY, snapToFloor, point, camera)
  45363. {
  45364. return TilemapComponents.WorldToTileXY(worldX, worldY, snapToFloor, point, camera, this.layer);
  45365. }
  45366. });
  45367. module.exports = DynamicTilemapLayer;
  45368. /***/ }),
  45369. /* 225 */
  45370. /***/ (function(module, exports, __webpack_require__) {
  45371. /**
  45372. * @author Richard Davey <rich@photonstorm.com>
  45373. * @copyright 2019 Photon Storm Ltd.
  45374. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  45375. */
  45376. var Class = __webpack_require__(0);
  45377. var DegToRad = __webpack_require__(34);
  45378. var DynamicTilemapLayer = __webpack_require__(224);
  45379. var Extend = __webpack_require__(19);
  45380. var Formats = __webpack_require__(31);
  45381. var LayerData = __webpack_require__(84);
  45382. var Rotate = __webpack_require__(373);
  45383. var StaticTilemapLayer = __webpack_require__(223);
  45384. var Tile = __webpack_require__(61);
  45385. var TilemapComponents = __webpack_require__(110);
  45386. var Tileset = __webpack_require__(106);
  45387. /**
  45388. * @callback TilemapFilterCallback
  45389. *
  45390. * @param {Phaser.GameObjects.GameObject} value - An object found in the filtered area.
  45391. * @param {number} index - The index of the object within the array.
  45392. * @param {Phaser.GameObjects.GameObject[]} array - An array of all the objects found.
  45393. *
  45394. * @return {Phaser.GameObjects.GameObject} The object.
  45395. */
  45396. /**
  45397. * @callback TilemapFindCallback
  45398. *
  45399. * @param {Phaser.GameObjects.GameObject} value - An object found.
  45400. * @param {number} index - The index of the object within the array.
  45401. * @param {Phaser.GameObjects.GameObject[]} array - An array of all the objects found.
  45402. *
  45403. * @return {boolean} `true` if the callback should be invoked, otherwise `false`.
  45404. */
  45405. /**
  45406. * @classdesc
  45407. * A Tilemap is a container for Tilemap data. This isn't a display object, rather, it holds data
  45408. * about the map and allows you to add tilesets and tilemap layers to it. A map can have one or
  45409. * more tilemap layers (StaticTilemapLayer or DynamicTilemapLayer), which are the display
  45410. * objects that actually render tiles.
  45411. *
  45412. * The Tilemap data be parsed from a Tiled JSON file, a CSV file or a 2D array. Tiled is a free
  45413. * software package specifically for creating tile maps, and is available from:
  45414. * http://www.mapeditor.org
  45415. *
  45416. * A Tilemap has handy methods for getting & manipulating the tiles within a layer. You can only
  45417. * use the methods that change tiles (e.g. removeTileAt) on a DynamicTilemapLayer.
  45418. *
  45419. * Note that all Tilemaps use a base tile size to calculate dimensions from, but that a
  45420. * StaticTilemapLayer or DynamicTilemapLayer may have its own unique tile size that overrides
  45421. * it.
  45422. *
  45423. * @class Tilemap
  45424. * @memberof Phaser.Tilemaps
  45425. * @constructor
  45426. * @since 3.0.0
  45427. *
  45428. * @param {Phaser.Scene} scene - The Scene to which this Tilemap belongs.
  45429. * @param {Phaser.Tilemaps.MapData} mapData - A MapData instance containing Tilemap data.
  45430. */
  45431. var Tilemap = new Class({
  45432. initialize:
  45433. function Tilemap (scene, mapData)
  45434. {
  45435. /**
  45436. * @name Phaser.Tilemaps.Tilemap#scene
  45437. * @type {Phaser.Scene}
  45438. * @since 3.0.0
  45439. */
  45440. this.scene = scene;
  45441. /**
  45442. * The base width of a tile in pixels. Note that individual layers may have a different tile
  45443. * width.
  45444. *
  45445. * @name Phaser.Tilemaps.Tilemap#tileWidth
  45446. * @type {integer}
  45447. * @since 3.0.0
  45448. */
  45449. this.tileWidth = mapData.tileWidth;
  45450. /**
  45451. * The base height of a tile in pixels. Note that individual layers may have a different
  45452. * tile height.
  45453. *
  45454. * @name Phaser.Tilemaps.Tilemap#tileHeight
  45455. * @type {integer}
  45456. * @since 3.0.0
  45457. */
  45458. this.tileHeight = mapData.tileHeight;
  45459. /**
  45460. * The width of the map (in tiles).
  45461. *
  45462. * @name Phaser.Tilemaps.Tilemap#width
  45463. * @type {number}
  45464. * @since 3.0.0
  45465. */
  45466. this.width = mapData.width;
  45467. /**
  45468. * The height of the map (in tiles).
  45469. *
  45470. * @name Phaser.Tilemaps.Tilemap#height
  45471. * @type {number}
  45472. * @since 3.0.0
  45473. */
  45474. this.height = mapData.height;
  45475. /**
  45476. * The orientation of the map data (as specified in Tiled), usually 'orthogonal'.
  45477. *
  45478. * @name Phaser.Tilemaps.Tilemap#orientation
  45479. * @type {string}
  45480. * @since 3.0.0
  45481. */
  45482. this.orientation = mapData.orientation;
  45483. /**
  45484. * The render (draw) order of the map data (as specified in Tiled), usually 'right-down'.
  45485. *
  45486. * The draw orders are:
  45487. *
  45488. * right-down
  45489. * left-down
  45490. * right-up
  45491. * left-up
  45492. *
  45493. * This can be changed via the `setRenderOrder` method.
  45494. *
  45495. * @name Phaser.Tilemaps.Tilemap#renderOrder
  45496. * @type {string}
  45497. * @since 3.12.0
  45498. */
  45499. this.renderOrder = mapData.renderOrder;
  45500. /**
  45501. * The format of the map data.
  45502. *
  45503. * @name Phaser.Tilemaps.Tilemap#format
  45504. * @type {number}
  45505. * @since 3.0.0
  45506. */
  45507. this.format = mapData.format;
  45508. /**
  45509. * The version of the map data (as specified in Tiled, usually 1).
  45510. *
  45511. * @name Phaser.Tilemaps.Tilemap#version
  45512. * @type {number}
  45513. * @since 3.0.0
  45514. */
  45515. this.version = mapData.version;
  45516. /**
  45517. * Map specific properties as specified in Tiled.
  45518. *
  45519. * @name Phaser.Tilemaps.Tilemap#properties
  45520. * @type {object}
  45521. * @since 3.0.0
  45522. */
  45523. this.properties = mapData.properties;
  45524. /**
  45525. * The width of the map in pixels based on width * tileWidth.
  45526. *
  45527. * @name Phaser.Tilemaps.Tilemap#widthInPixels
  45528. * @type {number}
  45529. * @since 3.0.0
  45530. */
  45531. this.widthInPixels = mapData.widthInPixels;
  45532. /**
  45533. * The height of the map in pixels based on height * tileHeight.
  45534. *
  45535. * @name Phaser.Tilemaps.Tilemap#heightInPixels
  45536. * @type {number}
  45537. * @since 3.0.0
  45538. */
  45539. this.heightInPixels = mapData.heightInPixels;
  45540. /**
  45541. *
  45542. * @name Phaser.Tilemaps.Tilemap#imageCollections
  45543. * @type {Phaser.Tilemaps.ImageCollection[]}
  45544. * @since 3.0.0
  45545. */
  45546. this.imageCollections = mapData.imageCollections;
  45547. /**
  45548. * An array of Tiled Image Layers.
  45549. *
  45550. * @name Phaser.Tilemaps.Tilemap#images
  45551. * @type {array}
  45552. * @since 3.0.0
  45553. */
  45554. this.images = mapData.images;
  45555. /**
  45556. * An array of Tilemap layer data.
  45557. *
  45558. * @name Phaser.Tilemaps.Tilemap#layers
  45559. * @type {Phaser.Tilemaps.LayerData[]}
  45560. * @since 3.0.0
  45561. */
  45562. this.layers = mapData.layers;
  45563. /**
  45564. * An array of Tilesets used in the map.
  45565. *
  45566. * @name Phaser.Tilemaps.Tilemap#tilesets
  45567. * @type {Phaser.Tilemaps.Tileset[]}
  45568. * @since 3.0.0
  45569. */
  45570. this.tilesets = mapData.tilesets;
  45571. /**
  45572. * An array of ObjectLayer instances parsed from Tiled object layers.
  45573. *
  45574. * @name Phaser.Tilemaps.Tilemap#objects
  45575. * @type {Phaser.Tilemaps.ObjectLayer[]}
  45576. * @since 3.0.0
  45577. */
  45578. this.objects = mapData.objects;
  45579. /**
  45580. * The index of the currently selected LayerData object.
  45581. *
  45582. * @name Phaser.Tilemaps.Tilemap#currentLayerIndex
  45583. * @type {integer}
  45584. * @since 3.0.0
  45585. */
  45586. this.currentLayerIndex = 0;
  45587. },
  45588. /**
  45589. * Sets the rendering (draw) order of the tiles in this map.
  45590. *
  45591. * The default is 'right-down', meaning it will order the tiles starting from the top-left,
  45592. * drawing to the right and then moving down to the next row.
  45593. *
  45594. * The draw orders are:
  45595. *
  45596. * 0 = right-down
  45597. * 1 = left-down
  45598. * 2 = right-up
  45599. * 3 = left-up
  45600. *
  45601. * Setting the render order does not change the tiles or how they are stored in the layer,
  45602. * it purely impacts the order in which they are rendered.
  45603. *
  45604. * You can provide either an integer (0 to 3), or the string version of the order.
  45605. *
  45606. * Calling this method _after_ creating Static or Dynamic Tilemap Layers will **not** automatically
  45607. * update them to use the new render order. If you call this method after creating layers, use their
  45608. * own `setRenderOrder` methods to change them as needed.
  45609. *
  45610. * @method Phaser.Tilemaps.Tilemap#setRenderOrder
  45611. * @since 3.12.0
  45612. *
  45613. * @param {(integer|string)} renderOrder - The render (draw) order value. Either an integer between 0 and 3, or a string: 'right-down', 'left-down', 'right-up' or 'left-up'.
  45614. *
  45615. * @return {this} This Tilemap object.
  45616. */
  45617. setRenderOrder: function (renderOrder)
  45618. {
  45619. var orders = [ 'right-down', 'left-down', 'right-up', 'left-up' ];
  45620. if (typeof renderOrder === 'number')
  45621. {
  45622. renderOrder = orders[renderOrder];
  45623. }
  45624. if (orders.indexOf(renderOrder) > -1)
  45625. {
  45626. this.renderOrder = renderOrder;
  45627. }
  45628. return this;
  45629. },
  45630. /**
  45631. * Adds an image to the map to be used as a tileset. A single map may use multiple tilesets.
  45632. * Note that the tileset name can be found in the JSON file exported from Tiled, or in the Tiled
  45633. * editor.
  45634. *
  45635. * @method Phaser.Tilemaps.Tilemap#addTilesetImage
  45636. * @since 3.0.0
  45637. *
  45638. * @param {string} tilesetName - The name of the tileset as specified in the map data.
  45639. * @param {string} [key] - The key of the Phaser.Cache image used for this tileset. If
  45640. * `undefined` or `null` it will look for an image with a key matching the tilesetName parameter.
  45641. * @param {integer} [tileWidth] - The width of the tile (in pixels) in the Tileset Image. If not
  45642. * given it will default to the map's tileWidth value, or the tileWidth specified in the Tiled
  45643. * JSON file.
  45644. * @param {integer} [tileHeight] - The height of the tiles (in pixels) in the Tileset Image. If
  45645. * not given it will default to the map's tileHeight value, or the tileHeight specified in the
  45646. * Tiled JSON file.
  45647. * @param {integer} [tileMargin] - The margin around the tiles in the sheet (in pixels). If not
  45648. * specified, it will default to 0 or the value specified in the Tiled JSON file.
  45649. * @param {integer} [tileSpacing] - The spacing between each the tile in the sheet (in pixels).
  45650. * If not specified, it will default to 0 or the value specified in the Tiled JSON file.
  45651. * @param {integer} [gid=0] - If adding multiple tilesets to a blank map, specify the starting
  45652. * GID this set will use here.
  45653. *
  45654. * @return {?Phaser.Tilemaps.Tileset} Returns the Tileset object that was created or updated, or null if it
  45655. * failed.
  45656. */
  45657. addTilesetImage: function (tilesetName, key, tileWidth, tileHeight, tileMargin, tileSpacing, gid)
  45658. {
  45659. if (tilesetName === undefined) { return null; }
  45660. if (key === undefined || key === null) { key = tilesetName; }
  45661. if (!this.scene.sys.textures.exists(key))
  45662. {
  45663. console.warn('Invalid Tileset Image: ' + key);
  45664. return null;
  45665. }
  45666. var texture = this.scene.sys.textures.get(key);
  45667. var index = this.getTilesetIndex(tilesetName);
  45668. if (index === null && this.format === Formats.TILED_JSON)
  45669. {
  45670. console.warn('No data found for Tileset: ' + tilesetName);
  45671. return null;
  45672. }
  45673. var tileset = this.tilesets[index];
  45674. if (tileset)
  45675. {
  45676. tileset.setTileSize(tileWidth, tileHeight);
  45677. tileset.setSpacing(tileMargin, tileSpacing);
  45678. tileset.setImage(texture);
  45679. return tileset;
  45680. }
  45681. if (tileWidth === undefined) { tileWidth = this.tileWidth; }
  45682. if (tileHeight === undefined) { tileHeight = this.tileHeight; }
  45683. if (tileMargin === undefined) { tileMargin = 0; }
  45684. if (tileSpacing === undefined) { tileSpacing = 0; }
  45685. if (gid === undefined) { gid = 0; }
  45686. tileset = new Tileset(tilesetName, gid, tileWidth, tileHeight, tileMargin, tileSpacing);
  45687. tileset.setImage(texture);
  45688. this.tilesets.push(tileset);
  45689. return tileset;
  45690. },
  45691. /**
  45692. * Turns the StaticTilemapLayer associated with the given layer into a DynamicTilemapLayer. If
  45693. * no layer specified, the map's current layer is used. This is useful if you want to manipulate
  45694. * a map at the start of a scene, but then make it non-manipulable and optimize it for speed.
  45695. * Note: the DynamicTilemapLayer passed in is destroyed, so make sure to store the value
  45696. * returned from this method if you want to manipulate the new StaticTilemapLayer.
  45697. *
  45698. * @method Phaser.Tilemaps.Tilemap#convertLayerToStatic
  45699. * @since 3.0.0
  45700. *
  45701. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer)} [layer] - The name of the layer from Tiled, the
  45702. * index of the layer in the map, or a DynamicTilemapLayer.
  45703. *
  45704. * @return {?Phaser.Tilemaps.StaticTilemapLayer} Returns the new layer that was created, or null if it
  45705. * failed.
  45706. */
  45707. convertLayerToStatic: function (layer)
  45708. {
  45709. layer = this.getLayer(layer);
  45710. if (layer === null) { return null; }
  45711. var dynamicLayer = layer.tilemapLayer;
  45712. if (!dynamicLayer || !(dynamicLayer instanceof DynamicTilemapLayer))
  45713. {
  45714. return null;
  45715. }
  45716. var staticLayer = new StaticTilemapLayer(
  45717. dynamicLayer.scene,
  45718. dynamicLayer.tilemap,
  45719. dynamicLayer.layerIndex,
  45720. dynamicLayer.tileset,
  45721. dynamicLayer.x,
  45722. dynamicLayer.y
  45723. );
  45724. this.scene.sys.displayList.add(staticLayer);
  45725. dynamicLayer.destroy();
  45726. return staticLayer;
  45727. },
  45728. /**
  45729. * Copies the tiles in the source rectangular area to a new destination (all specified in tile
  45730. * coordinates) within the layer. This copies all tile properties & recalculates collision
  45731. * information in the destination region.
  45732. *
  45733. * If no layer specified, the map's current layer is used. This cannot be applied to StaticTilemapLayers.
  45734. *
  45735. * @method Phaser.Tilemaps.Tilemap#copy
  45736. * @since 3.0.0
  45737. *
  45738. * @param {integer} srcTileX - The x coordinate of the area to copy from, in tiles, not pixels.
  45739. * @param {integer} srcTileY - The y coordinate of the area to copy from, in tiles, not pixels.
  45740. * @param {integer} width - The width of the area to copy, in tiles, not pixels.
  45741. * @param {integer} height - The height of the area to copy, in tiles, not pixels.
  45742. * @param {integer} destTileX - The x coordinate of the area to copy to, in tiles, not pixels.
  45743. * @param {integer} destTileY - The y coordinate of the area to copy to, in tiles, not pixels.
  45744. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  45745. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  45746. *
  45747. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  45748. */
  45749. copy: function (srcTileX, srcTileY, width, height, destTileX, destTileY, recalculateFaces, layer)
  45750. {
  45751. layer = this.getLayer(layer);
  45752. if (this._isStaticCall(layer, 'copy')) { return this; }
  45753. if (layer !== null)
  45754. {
  45755. TilemapComponents.Copy(
  45756. srcTileX, srcTileY,
  45757. width, height,
  45758. destTileX, destTileY,
  45759. recalculateFaces, layer
  45760. );
  45761. }
  45762. return this;
  45763. },
  45764. /**
  45765. * Creates a new and empty DynamicTilemapLayer. The currently selected layer in the map is set to this new layer.
  45766. *
  45767. * @method Phaser.Tilemaps.Tilemap#createBlankDynamicLayer
  45768. * @since 3.0.0
  45769. *
  45770. * @param {string} name - The name of this layer. Must be unique within the map.
  45771. * @param {(string|string[]|Phaser.Tilemaps.Tileset|Phaser.Tilemaps.Tileset[])} tileset - The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object.
  45772. * @param {number} [x=0] - The world x position where the top left of this layer will be placed.
  45773. * @param {number} [y=0] - The world y position where the top left of this layer will be placed.
  45774. * @param {integer} [width] - The width of the layer in tiles. If not specified, it will default to the map's width.
  45775. * @param {integer} [height] - The height of the layer in tiles. If not specified, it will default to the map's height.
  45776. * @param {integer} [tileWidth] - The width of the tiles the layer uses for calculations. If not specified, it will default to the map's tileWidth.
  45777. * @param {integer} [tileHeight] - The height of the tiles the layer uses for calculations. If not specified, it will default to the map's tileHeight.
  45778. *
  45779. * @return {?Phaser.Tilemaps.DynamicTilemapLayer} Returns the new layer was created, or null if it failed.
  45780. */
  45781. createBlankDynamicLayer: function (name, tileset, x, y, width, height, tileWidth, tileHeight)
  45782. {
  45783. if (tileWidth === undefined) { tileWidth = tileset.tileWidth; }
  45784. if (tileHeight === undefined) { tileHeight = tileset.tileHeight; }
  45785. if (width === undefined) { width = this.width; }
  45786. if (height === undefined) { height = this.height; }
  45787. if (x === undefined) { x = 0; }
  45788. if (y === undefined) { y = 0; }
  45789. var index = this.getLayerIndex(name);
  45790. if (index !== null)
  45791. {
  45792. console.warn('Invalid Tilemap Layer ID: ' + name);
  45793. return null;
  45794. }
  45795. var layerData = new LayerData({
  45796. name: name,
  45797. tileWidth: tileWidth,
  45798. tileHeight: tileHeight,
  45799. width: width,
  45800. height: height
  45801. });
  45802. var row;
  45803. for (var tileY = 0; tileY < height; tileY++)
  45804. {
  45805. row = [];
  45806. for (var tileX = 0; tileX < width; tileX++)
  45807. {
  45808. row.push(new Tile(layerData, -1, tileX, tileY, tileWidth, tileHeight, this.tileWidth, this.tileHeight));
  45809. }
  45810. layerData.data.push(row);
  45811. }
  45812. this.layers.push(layerData);
  45813. this.currentLayerIndex = this.layers.length - 1;
  45814. var dynamicLayer = new DynamicTilemapLayer(this.scene, this, this.currentLayerIndex, tileset, x, y);
  45815. dynamicLayer.setRenderOrder(this.renderOrder);
  45816. this.scene.sys.displayList.add(dynamicLayer);
  45817. return dynamicLayer;
  45818. },
  45819. /**
  45820. * Creates a new DynamicTilemapLayer that renders the LayerData associated with the given
  45821. * `layerID`. The currently selected layer in the map is set to this new layer.
  45822. *
  45823. * The `layerID` is important. If you've created your map in Tiled then you can get this by
  45824. * looking in Tiled and looking at the layer name. Or you can open the JSON file it exports and
  45825. * look at the layers[].name value. Either way it must match.
  45826. *
  45827. * Unlike a static layer, a dynamic layer can be modified. See DynamicTilemapLayer for more
  45828. * information.
  45829. *
  45830. * @method Phaser.Tilemaps.Tilemap#createDynamicLayer
  45831. * @since 3.0.0
  45832. *
  45833. * @param {(integer|string)} layerID - The layer array index value, or if a string is given, the layer name from Tiled.
  45834. * @param {(string|string[]|Phaser.Tilemaps.Tileset|Phaser.Tilemaps.Tileset[])} tileset - The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object.
  45835. * @param {number} x - The x position to place the layer in the world. If not specified, it will default to the layer offset from Tiled or 0.
  45836. * @param {number} y - The y position to place the layer in the world. If not specified, it will default to the layer offset from Tiled or 0.
  45837. *
  45838. * @return {?Phaser.Tilemaps.DynamicTilemapLayer} Returns the new layer was created, or null if it failed.
  45839. */
  45840. createDynamicLayer: function (layerID, tileset, x, y)
  45841. {
  45842. var index = this.getLayerIndex(layerID);
  45843. if (index === null)
  45844. {
  45845. console.warn('Invalid Tilemap Layer ID: ' + layerID);
  45846. return null;
  45847. }
  45848. var layerData = this.layers[index];
  45849. // Check for an associated static or dynamic tilemap layer
  45850. if (layerData.tilemapLayer)
  45851. {
  45852. console.warn('Tilemap Layer ID already exists:' + layerID);
  45853. return null;
  45854. }
  45855. this.currentLayerIndex = index;
  45856. // Default the x/y position to match Tiled layer offset, if it exists.
  45857. if (x === undefined && this.layers[index].x) { x = this.layers[index].x; }
  45858. if (y === undefined && this.layers[index].y) { y = this.layers[index].y; }
  45859. var layer = new DynamicTilemapLayer(this.scene, this, index, tileset, x, y);
  45860. layer.setRenderOrder(this.renderOrder);
  45861. this.scene.sys.displayList.add(layer);
  45862. return layer;
  45863. },
  45864. /**
  45865. * Creates a Sprite for every object matching the given gid in the map data. All properties from
  45866. * the map data objectgroup are copied into the `spriteConfig`, so you can use this as an easy
  45867. * way to configure Sprite properties from within the map editor. For example giving an object a
  45868. * property of alpha: 0.5 in the map editor will duplicate that when the Sprite is created.
  45869. *
  45870. * Custom object properties not sharing names with the Sprite's own properties are copied to the
  45871. * Sprite's {@link Phaser.GameObjects.Sprite#data data store}.
  45872. *
  45873. * @method Phaser.Tilemaps.Tilemap#createFromObjects
  45874. * @since 3.0.0
  45875. *
  45876. * @param {string} name - The name of the object layer (from Tiled) to create Sprites from.
  45877. * @param {(integer|string)} id - Either the id (object), gid (tile object) or name (object or
  45878. * tile object) from Tiled. Ids are unique in Tiled, but a gid is shared by all tile objects
  45879. * with the same graphic. The same name can be used on multiple objects.
  45880. * @param {SpriteConfig} spriteConfig - The config object to pass into the Sprite creator (i.e.
  45881. * scene.make.sprite).
  45882. * @param {Phaser.Scene} [scene=the scene the map is within] - The Scene to create the Sprites within.
  45883. *
  45884. * @return {Phaser.GameObjects.Sprite[]} An array of the Sprites that were created.
  45885. */
  45886. createFromObjects: function (name, id, spriteConfig, scene)
  45887. {
  45888. if (spriteConfig === undefined) { spriteConfig = {}; }
  45889. if (scene === undefined) { scene = this.scene; }
  45890. var objectLayer = this.getObjectLayer(name);
  45891. if (!objectLayer)
  45892. {
  45893. console.warn('Cannot create from object. Invalid objectgroup name given: ' + name);
  45894. return;
  45895. }
  45896. var objects = objectLayer.objects;
  45897. var sprites = [];
  45898. for (var i = 0; i < objects.length; i++)
  45899. {
  45900. var found = false;
  45901. var obj = objects[i];
  45902. if (obj.gid !== undefined && typeof id === 'number' && obj.gid === id ||
  45903. obj.id !== undefined && typeof id === 'number' && obj.id === id ||
  45904. obj.name !== undefined && typeof id === 'string' && obj.name === id)
  45905. {
  45906. found = true;
  45907. }
  45908. if (found)
  45909. {
  45910. var config = Extend({}, spriteConfig, obj.properties);
  45911. config.x = obj.x;
  45912. config.y = obj.y;
  45913. var sprite = this.scene.make.sprite(config);
  45914. sprite.name = obj.name;
  45915. if (obj.width) { sprite.displayWidth = obj.width; }
  45916. if (obj.height) { sprite.displayHeight = obj.height; }
  45917. // Origin is (0, 1) in Tiled, so find the offset that matches the Sprite's origin.
  45918. var offset = {
  45919. x: sprite.originX * sprite.displayWidth,
  45920. y: (sprite.originY - 1) * sprite.displayHeight
  45921. };
  45922. // If the object is rotated, then the origin offset also needs to be rotated.
  45923. if (obj.rotation)
  45924. {
  45925. var angle = DegToRad(obj.rotation);
  45926. Rotate(offset, angle);
  45927. sprite.rotation = angle;
  45928. }
  45929. sprite.x += offset.x;
  45930. sprite.y += offset.y;
  45931. if (obj.flippedHorizontal !== undefined || obj.flippedVertical !== undefined)
  45932. {
  45933. sprite.setFlip(obj.flippedHorizontal, obj.flippedVertical);
  45934. }
  45935. if (!obj.visible) { sprite.visible = false; }
  45936. for (var key in obj.properties)
  45937. {
  45938. if (sprite.hasOwnProperty(key))
  45939. {
  45940. continue;
  45941. }
  45942. sprite.setData(key, obj.properties[key]);
  45943. }
  45944. sprites.push(sprite);
  45945. }
  45946. }
  45947. return sprites;
  45948. },
  45949. /**
  45950. * Creates a Sprite for every object matching the given tile indexes in the layer. You can
  45951. * optionally specify if each tile will be replaced with a new tile after the Sprite has been
  45952. * created. This is useful if you want to lay down special tiles in a level that are converted to
  45953. * Sprites, but want to replace the tile itself with a floor tile or similar once converted.
  45954. *
  45955. * @method Phaser.Tilemaps.Tilemap#createFromTiles
  45956. * @since 3.0.0
  45957. *
  45958. * @param {(integer|array)} indexes - The tile index, or array of indexes, to create Sprites from.
  45959. * @param {(integer|array)} replacements - The tile index, or array of indexes, to change a converted
  45960. * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a
  45961. * one-to-one mapping with the indexes array.
  45962. * @param {SpriteConfig} spriteConfig - The config object to pass into the Sprite creator (i.e. scene.make.sprite).
  45963. * @param {Phaser.Scene} [scene=scene the map is within] - The Scene to create the Sprites within.
  45964. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  45965. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  45966. *
  45967. * @return {?Phaser.GameObjects.Sprite[]} Returns an array of Tiles, or null if the layer given was invalid.
  45968. */
  45969. createFromTiles: function (indexes, replacements, spriteConfig, scene, camera, layer)
  45970. {
  45971. layer = this.getLayer(layer);
  45972. if (layer === null) { return null; }
  45973. return TilemapComponents.CreateFromTiles(indexes, replacements, spriteConfig, scene, camera, layer);
  45974. },
  45975. /**
  45976. * Creates a new StaticTilemapLayer that renders the LayerData associated with the given
  45977. * `layerID`. The currently selected layer in the map is set to this new layer.
  45978. *
  45979. * The `layerID` is important. If you've created your map in Tiled then you can get this by
  45980. * looking in Tiled and looking at the layer name. Or you can open the JSON file it exports and
  45981. * look at the layers[].name value. Either way it must match.
  45982. *
  45983. * It's important to remember that a static layer cannot be modified. See StaticTilemapLayer for
  45984. * more information.
  45985. *
  45986. * @method Phaser.Tilemaps.Tilemap#createStaticLayer
  45987. * @since 3.0.0
  45988. *
  45989. * @param {(integer|string)} layerID - The layer array index value, or if a string is given, the layer name from Tiled.
  45990. * @param {(string|string[]|Phaser.Tilemaps.Tileset|Phaser.Tilemaps.Tileset[])} tileset - The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object.
  45991. * @param {number} [x=0] - The x position to place the layer in the world. If not specified, it will default to the layer offset from Tiled or 0.
  45992. * @param {number} [y=0] - The y position to place the layer in the world. If not specified, it will default to the layer offset from Tiled or 0.
  45993. *
  45994. * @return {?Phaser.Tilemaps.StaticTilemapLayer} Returns the new layer was created, or null if it failed.
  45995. */
  45996. createStaticLayer: function (layerID, tileset, x, y)
  45997. {
  45998. var index = this.getLayerIndex(layerID);
  45999. if (index === null)
  46000. {
  46001. console.warn('Invalid Tilemap Layer ID: ' + layerID);
  46002. return null;
  46003. }
  46004. var layerData = this.layers[index];
  46005. // Check for an associated static or dynamic tilemap layer
  46006. if (layerData.tilemapLayer)
  46007. {
  46008. console.warn('Tilemap Layer ID already exists:' + layerID);
  46009. return null;
  46010. }
  46011. this.currentLayerIndex = index;
  46012. // Default the x/y position to match Tiled layer offset, if it exists.
  46013. if (x === undefined && this.layers[index].x) { x = this.layers[index].x; }
  46014. if (y === undefined && this.layers[index].y) { y = this.layers[index].y; }
  46015. var layer = new StaticTilemapLayer(this.scene, this, index, tileset, x, y);
  46016. layer.setRenderOrder(this.renderOrder);
  46017. this.scene.sys.displayList.add(layer);
  46018. return layer;
  46019. },
  46020. /**
  46021. * Removes all layer data from this Tilemap and nulls the scene reference. This will destroy any
  46022. * StaticTilemapLayers or DynamicTilemapLayers that have been linked to LayerData.
  46023. *
  46024. * @method Phaser.Tilemaps.Tilemap#destroy
  46025. * @since 3.0.0
  46026. */
  46027. destroy: function ()
  46028. {
  46029. this.removeAllLayers();
  46030. this.tilesets.length = 0;
  46031. this.objects.length = 0;
  46032. this.scene = undefined;
  46033. },
  46034. /**
  46035. * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the
  46036. * specified index. Tiles will be set to collide if the given index is a colliding index.
  46037. * Collision information in the region will be recalculated.
  46038. *
  46039. * If no layer specified, the map's current layer is used.
  46040. * This cannot be applied to StaticTilemapLayers.
  46041. *
  46042. * @method Phaser.Tilemaps.Tilemap#fill
  46043. * @since 3.0.0
  46044. *
  46045. * @param {integer} index - The tile index to fill the area with.
  46046. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  46047. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  46048. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  46049. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  46050. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  46051. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46052. *
  46053. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  46054. */
  46055. fill: function (index, tileX, tileY, width, height, recalculateFaces, layer)
  46056. {
  46057. layer = this.getLayer(layer);
  46058. if (this._isStaticCall(layer, 'fill')) { return this; }
  46059. if (layer !== null)
  46060. {
  46061. TilemapComponents.Fill(index, tileX, tileY, width, height, recalculateFaces, layer);
  46062. }
  46063. return this;
  46064. },
  46065. /**
  46066. * For each object in the given object layer, run the given filter callback function. Any
  46067. * objects that pass the filter test (i.e. where the callback returns true) will returned as a
  46068. * new array. Similar to Array.prototype.Filter in vanilla JS.
  46069. *
  46070. * @method Phaser.Tilemaps.Tilemap#filterObjects
  46071. * @since 3.0.0
  46072. *
  46073. * @param {(Phaser.Tilemaps.ObjectLayer|string)} objectLayer - The name of an object layer (from Tiled) or an ObjectLayer instance.
  46074. * @param {TilemapFilterCallback} callback - The callback. Each object in the given area will be passed to this callback as the first and only parameter.
  46075. * @param {object} [context] - The context under which the callback should be run.
  46076. *
  46077. * @return {?Phaser.GameObjects.GameObject[]} An array of object that match the search, or null if the objectLayer given was invalid.
  46078. */
  46079. filterObjects: function (objectLayer, callback, context)
  46080. {
  46081. if (typeof objectLayer === 'string')
  46082. {
  46083. var name = objectLayer;
  46084. objectLayer = this.getObjectLayer(objectLayer);
  46085. if (!objectLayer)
  46086. {
  46087. console.warn('No object layer found with the name: ' + name);
  46088. return null;
  46089. }
  46090. }
  46091. return objectLayer.objects.filter(callback, context);
  46092. },
  46093. /**
  46094. * @typedef {object} FilteringOptions
  46095. *
  46096. * @property {boolean} [isNotEmpty=false] - If true, only return tiles that don't have -1 for an index.
  46097. * @property {boolean} [isColliding=false] - If true, only return tiles that collide on at least one side.
  46098. * @property {boolean} [hasInterestingFace=false] - If true, only return tiles that have at least one interesting face.
  46099. */
  46100. /**
  46101. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  46102. * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns
  46103. * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS.
  46104. * If no layer specified, the map's current layer is used.
  46105. *
  46106. * @method Phaser.Tilemaps.Tilemap#filterTiles
  46107. * @since 3.0.0
  46108. *
  46109. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  46110. * callback as the first and only parameter. The callback should return true for tiles that pass the
  46111. * filter.
  46112. * @param {object} [context] - The context under which the callback should be run.
  46113. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to filter.
  46114. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area to filter.
  46115. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  46116. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  46117. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  46118. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46119. *
  46120. * @return {?Phaser.Tilemaps.Tile[]} Returns an array of Tiles, or null if the layer given was invalid.
  46121. */
  46122. filterTiles: function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  46123. {
  46124. layer = this.getLayer(layer);
  46125. if (layer === null) { return null; }
  46126. return TilemapComponents.FilterTiles(callback, context, tileX, tileY, width, height, filteringOptions, layer);
  46127. },
  46128. /**
  46129. * Searches the entire map layer for the first tile matching the given index, then returns that Tile
  46130. * object. If no match is found, it returns null. The search starts from the top-left tile and
  46131. * continues horizontally until it hits the end of the row, then it drops down to the next column.
  46132. * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to
  46133. * the top-left.
  46134. * If no layer specified, the map's current layer is used.
  46135. *
  46136. * @method Phaser.Tilemaps.Tilemap#findByIndex
  46137. * @since 3.0.0
  46138. *
  46139. * @param {integer} index - The tile index value to search for.
  46140. * @param {integer} [skip=0] - The number of times to skip a matching tile before returning.
  46141. * @param {boolean} [reverse=false] - If true it will scan the layer in reverse, starting at the bottom-right. Otherwise it scans from the top-left.
  46142. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46143. *
  46144. * @return {?Phaser.Tilemaps.Tile} Returns a Tiles, or null if the layer given was invalid.
  46145. */
  46146. findByIndex: function (findIndex, skip, reverse, layer)
  46147. {
  46148. layer = this.getLayer(layer);
  46149. if (layer === null) { return null; }
  46150. return TilemapComponents.FindByIndex(findIndex, skip, reverse, layer);
  46151. },
  46152. /**
  46153. * Find the first object in the given object layer that satisfies the provided testing function.
  46154. * I.e. finds the first object for which `callback` returns true. Similar to
  46155. * Array.prototype.find in vanilla JS.
  46156. *
  46157. * @method Phaser.Tilemaps.Tilemap#findObject
  46158. * @since 3.0.0
  46159. *
  46160. * @param {(Phaser.Tilemaps.ObjectLayer|string)} objectLayer - The name of an object layer (from Tiled) or an ObjectLayer instance.
  46161. * @param {TilemapFindCallback} callback - The callback. Each object in the given area will be passed to this callback as the first and only parameter.
  46162. * @param {object} [context] - The context under which the callback should be run.
  46163. *
  46164. * @return {?Phaser.GameObjects.GameObject} An object that matches the search, or null if no object found.
  46165. */
  46166. findObject: function (objectLayer, callback, context)
  46167. {
  46168. if (typeof objectLayer === 'string')
  46169. {
  46170. var name = objectLayer;
  46171. objectLayer = this.getObjectLayer(objectLayer);
  46172. if (!objectLayer)
  46173. {
  46174. console.warn('No object layer found with the name: ' + name);
  46175. return null;
  46176. }
  46177. }
  46178. return objectLayer.objects.find(callback, context) || null;
  46179. },
  46180. /**
  46181. * Find the first tile in the given rectangular area (in tile coordinates) of the layer that
  46182. * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns
  46183. * true. Similar to Array.prototype.find in vanilla JS.
  46184. * If no layer specified, the maps current layer is used.
  46185. *
  46186. * @method Phaser.Tilemaps.Tilemap#findTile
  46187. * @since 3.0.0
  46188. *
  46189. * @param {FindTileCallback} callback - The callback. Each tile in the given area will be passed to this callback as the first and only parameter.
  46190. * @param {object} [context] - The context under which the callback should be run.
  46191. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to search.
  46192. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area to search.
  46193. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  46194. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  46195. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  46196. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The Tile layer to run the search on. If not provided will use the current layer.
  46197. *
  46198. * @return {?Phaser.Tilemaps.Tile} Returns a Tiles, or null if the layer given was invalid.
  46199. */
  46200. findTile: function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  46201. {
  46202. layer = this.getLayer(layer);
  46203. if (layer === null) { return null; }
  46204. return TilemapComponents.FindTile(callback, context, tileX, tileY, width, height, filteringOptions, layer);
  46205. },
  46206. /**
  46207. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  46208. * callback. Similar to Array.prototype.forEach in vanilla JS.
  46209. *
  46210. * If no layer specified, the map's current layer is used.
  46211. *
  46212. * @method Phaser.Tilemaps.Tilemap#forEachTile
  46213. * @since 3.0.0
  46214. *
  46215. * @param {EachTileCallback} callback - The callback. Each tile in the given area will be passed to this callback as the first and only parameter.
  46216. * @param {object} [context] - The context under which the callback should be run.
  46217. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to search.
  46218. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area to search.
  46219. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  46220. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  46221. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  46222. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The Tile layer to run the search on. If not provided will use the current layer.
  46223. *
  46224. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  46225. */
  46226. forEachTile: function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  46227. {
  46228. layer = this.getLayer(layer);
  46229. if (layer !== null)
  46230. {
  46231. TilemapComponents.ForEachTile(callback, context, tileX, tileY, width, height, filteringOptions, layer);
  46232. }
  46233. return this;
  46234. },
  46235. /**
  46236. * Gets the image layer index based on its name.
  46237. *
  46238. * @method Phaser.Tilemaps.Tilemap#getImageIndex
  46239. * @since 3.0.0
  46240. *
  46241. * @param {string} name - The name of the image to get.
  46242. *
  46243. * @return {integer} The index of the image in this tilemap, or null if not found.
  46244. */
  46245. getImageIndex: function (name)
  46246. {
  46247. return this.getIndex(this.images, name);
  46248. },
  46249. /**
  46250. * Internally used. Returns the index of the object in one of the Tilemaps arrays whose name
  46251. * property matches the given `name`.
  46252. *
  46253. * @method Phaser.Tilemaps.Tilemap#getIndex
  46254. * @since 3.0.0
  46255. *
  46256. * @param {array} location - The Tilemap array to search.
  46257. * @param {string} name - The name of the array element to get.
  46258. *
  46259. * @return {number} The index of the element in the array, or null if not found.
  46260. */
  46261. getIndex: function (location, name)
  46262. {
  46263. for (var i = 0; i < location.length; i++)
  46264. {
  46265. if (location[i].name === name)
  46266. {
  46267. return i;
  46268. }
  46269. }
  46270. return null;
  46271. },
  46272. /**
  46273. * Gets the LayerData from this.layers that is associated with `layer`, or null if an invalid
  46274. * `layer` is given.
  46275. *
  46276. * @method Phaser.Tilemaps.Tilemap#getLayer
  46277. * @since 3.0.0
  46278. *
  46279. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The name of the
  46280. * layer from Tiled, the index of the layer in the map, a DynamicTilemapLayer or a
  46281. * StaticTilemapLayer. If not given will default to the maps current layer index.
  46282. *
  46283. * @return {Phaser.Tilemaps.LayerData} The corresponding LayerData within this.layers.
  46284. */
  46285. getLayer: function (layer)
  46286. {
  46287. var index = this.getLayerIndex(layer);
  46288. return index !== null ? this.layers[index] : null;
  46289. },
  46290. /**
  46291. * Gets the ObjectLayer from this.objects that has the given `name`, or null if no ObjectLayer
  46292. * is found with that name.
  46293. *
  46294. * @method Phaser.Tilemaps.Tilemap#getObjectLayer
  46295. * @since 3.0.0
  46296. *
  46297. * @param {string} [name] - The name of the object layer from Tiled.
  46298. *
  46299. * @return {?Phaser.Tilemaps.ObjectLayer} The corresponding ObjectLayer within this.objects or null.
  46300. */
  46301. getObjectLayer: function (name)
  46302. {
  46303. var index = this.getIndex(this.objects, name);
  46304. return index !== null ? this.objects[index] : null;
  46305. },
  46306. /**
  46307. * Gets the LayerData index of the given `layer` within this.layers, or null if an invalid
  46308. * `layer` is given.
  46309. *
  46310. * @method Phaser.Tilemaps.Tilemap#getLayerIndex
  46311. * @since 3.0.0
  46312. *
  46313. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The name of the
  46314. * layer from Tiled, the index of the layer in the map, a DynamicTilemapLayer or a
  46315. * StaticTilemapLayer. If not given will default to the map's current layer index.
  46316. *
  46317. * @return {integer} The LayerData index within this.layers.
  46318. */
  46319. getLayerIndex: function (layer)
  46320. {
  46321. if (layer === undefined)
  46322. {
  46323. return this.currentLayerIndex;
  46324. }
  46325. else if (typeof layer === 'string')
  46326. {
  46327. return this.getLayerIndexByName(layer);
  46328. }
  46329. else if (typeof layer === 'number' && layer < this.layers.length)
  46330. {
  46331. return layer;
  46332. }
  46333. else if (layer instanceof StaticTilemapLayer || layer instanceof DynamicTilemapLayer)
  46334. {
  46335. return layer.layerIndex;
  46336. }
  46337. else
  46338. {
  46339. return null;
  46340. }
  46341. },
  46342. /**
  46343. * Gets the index of the LayerData within this.layers that has the given `name`, or null if an
  46344. * invalid `name` is given.
  46345. *
  46346. * @method Phaser.Tilemaps.Tilemap#getLayerIndexByName
  46347. * @since 3.0.0
  46348. *
  46349. * @param {string} name - The name of the layer to get.
  46350. *
  46351. * @return {integer} The LayerData index within this.layers.
  46352. */
  46353. getLayerIndexByName: function (name)
  46354. {
  46355. return this.getIndex(this.layers, name);
  46356. },
  46357. /**
  46358. * Gets a tile at the given tile coordinates from the given layer.
  46359. * If no layer specified, the map's current layer is used.
  46360. *
  46361. * @method Phaser.Tilemaps.Tilemap#getTileAt
  46362. * @since 3.0.0
  46363. *
  46364. * @param {integer} tileX - X position to get the tile from (given in tile units, not pixels).
  46365. * @param {integer} tileY - Y position to get the tile from (given in tile units, not pixels).
  46366. * @param {boolean} [nonNull=false] - If true getTile won't return null for empty tiles, but a Tile object with an index of -1.
  46367. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46368. *
  46369. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  46370. */
  46371. getTileAt: function (tileX, tileY, nonNull, layer)
  46372. {
  46373. layer = this.getLayer(layer);
  46374. if (layer === null) { return null; }
  46375. return TilemapComponents.GetTileAt(tileX, tileY, nonNull, layer);
  46376. },
  46377. /**
  46378. * Gets a tile at the given world coordinates from the given layer.
  46379. * If no layer specified, the map's current layer is used.
  46380. *
  46381. * @method Phaser.Tilemaps.Tilemap#getTileAtWorldXY
  46382. * @since 3.0.0
  46383. *
  46384. * @param {number} worldX - X position to get the tile from (given in pixels)
  46385. * @param {number} worldY - Y position to get the tile from (given in pixels)
  46386. * @param {boolean} [nonNull=false] - If true, function won't return null for empty tiles, but a Tile object with an index of -1.
  46387. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  46388. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46389. *
  46390. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  46391. */
  46392. getTileAtWorldXY: function (worldX, worldY, nonNull, camera, layer)
  46393. {
  46394. layer = this.getLayer(layer);
  46395. if (layer === null)
  46396. {
  46397. return null;
  46398. }
  46399. else
  46400. {
  46401. return TilemapComponents.GetTileAtWorldXY(worldX, worldY, nonNull, camera, layer);
  46402. }
  46403. },
  46404. /**
  46405. * Gets the tiles in the given rectangular area (in tile coordinates) of the layer.
  46406. * If no layer specified, the maps current layer is used.
  46407. *
  46408. * @method Phaser.Tilemaps.Tilemap#getTilesWithin
  46409. * @since 3.0.0
  46410. *
  46411. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  46412. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  46413. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  46414. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  46415. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  46416. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46417. *
  46418. * @return {?Phaser.Tilemaps.Tile[]} Returns an array of Tiles, or null if the layer given was invalid.
  46419. */
  46420. getTilesWithin: function (tileX, tileY, width, height, filteringOptions, layer)
  46421. {
  46422. layer = this.getLayer(layer);
  46423. if (layer === null) { return null; }
  46424. return TilemapComponents.GetTilesWithin(tileX, tileY, width, height, filteringOptions, layer);
  46425. },
  46426. /**
  46427. * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle,
  46428. * Line, Rectangle or Triangle. The shape should be in world coordinates.
  46429. * If no layer specified, the maps current layer is used.
  46430. *
  46431. * @method Phaser.Tilemaps.Tilemap#getTilesWithinShape
  46432. * @since 3.0.0
  46433. *
  46434. * @param {(Phaser.Geom.Circle|Phaser.Geom.Line|Phaser.Geom.Rectangle|Phaser.Geom.Triangle)} shape - A shape in world (pixel) coordinates
  46435. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  46436. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when factoring in which tiles to return.
  46437. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46438. *
  46439. * @return {?Phaser.Tilemaps.Tile[]} Returns an array of Tiles, or null if the layer given was invalid.
  46440. */
  46441. getTilesWithinShape: function (shape, filteringOptions, camera, layer)
  46442. {
  46443. layer = this.getLayer(layer);
  46444. if (layer === null) { return null; }
  46445. return TilemapComponents.GetTilesWithinShape(shape, filteringOptions, camera, layer);
  46446. },
  46447. /**
  46448. * Gets the tiles in the given rectangular area (in world coordinates) of the layer.
  46449. * If no layer specified, the maps current layer is used.
  46450. *
  46451. * @method Phaser.Tilemaps.Tilemap#getTilesWithinWorldXY
  46452. * @since 3.0.0
  46453. *
  46454. * @param {number} worldX - The world x coordinate for the top-left of the area.
  46455. * @param {number} worldY - The world y coordinate for the top-left of the area.
  46456. * @param {number} width - The width of the area.
  46457. * @param {number} height - The height of the area.
  46458. * @param {FilteringOptions} [filteringOptions] - Optional filters to apply when getting the tiles.
  46459. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when factoring in which tiles to return.
  46460. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46461. *
  46462. * @return {?Phaser.Tilemaps.Tile[]} Returns an array of Tiles, or null if the layer given was invalid.
  46463. */
  46464. getTilesWithinWorldXY: function (worldX, worldY, width, height, filteringOptions, camera, layer)
  46465. {
  46466. layer = this.getLayer(layer);
  46467. if (layer === null) { return null; }
  46468. return TilemapComponents.GetTilesWithinWorldXY(worldX, worldY, width, height, filteringOptions, camera, layer);
  46469. },
  46470. /**
  46471. * Gets the Tileset that has the given `name`, or null if an invalid `name` is given.
  46472. *
  46473. * @method Phaser.Tilemaps.Tilemap#getTileset
  46474. * @since 3.14.0
  46475. *
  46476. * @param {string} name - The name of the Tileset to get.
  46477. *
  46478. * @return {?Phaser.Tilemaps.Tileset} The Tileset, or `null` if no matching named tileset was found.
  46479. */
  46480. getTileset: function (name)
  46481. {
  46482. var index = this.getIndex(this.tilesets, name);
  46483. return (index !== null) ? this.tilesets[index] : null;
  46484. },
  46485. /**
  46486. * Gets the index of the Tileset within this.tilesets that has the given `name`, or null if an
  46487. * invalid `name` is given.
  46488. *
  46489. * @method Phaser.Tilemaps.Tilemap#getTilesetIndex
  46490. * @since 3.0.0
  46491. *
  46492. * @param {string} name - The name of the Tileset to get.
  46493. *
  46494. * @return {integer} The Tileset index within this.tilesets.
  46495. */
  46496. getTilesetIndex: function (name)
  46497. {
  46498. return this.getIndex(this.tilesets, name);
  46499. },
  46500. /**
  46501. * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns
  46502. * false if there is no tile or if the tile at that location has an index of -1.
  46503. *
  46504. * If no layer specified, the map's current layer is used.
  46505. *
  46506. * @method Phaser.Tilemaps.Tilemap#hasTileAt
  46507. * @since 3.0.0
  46508. *
  46509. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  46510. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  46511. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46512. *
  46513. * @return {?boolean} Returns a boolean, or null if the layer given was invalid.
  46514. */
  46515. hasTileAt: function (tileX, tileY, layer)
  46516. {
  46517. layer = this.getLayer(layer);
  46518. if (layer === null) { return null; }
  46519. return TilemapComponents.HasTileAt(tileX, tileY, layer);
  46520. },
  46521. /**
  46522. * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns
  46523. * false if there is no tile or if the tile at that location has an index of -1.
  46524. *
  46525. * If no layer specified, the maps current layer is used.
  46526. *
  46527. * @method Phaser.Tilemaps.Tilemap#hasTileAtWorldXY
  46528. * @since 3.0.0
  46529. *
  46530. * @param {number} worldX - The x coordinate, in pixels.
  46531. * @param {number} worldY - The y coordinate, in pixels.
  46532. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when factoring in which tiles to return.
  46533. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46534. *
  46535. * @return {?boolean} Returns a boolean, or null if the layer given was invalid.
  46536. */
  46537. hasTileAtWorldXY: function (worldX, worldY, camera, layer)
  46538. {
  46539. layer = this.getLayer(layer);
  46540. if (layer === null) { return null; }
  46541. return TilemapComponents.HasTileAtWorldXY(worldX, worldY, camera, layer);
  46542. },
  46543. /**
  46544. * The LayerData object that is currently selected in the map. You can set this property using
  46545. * any type supported by setLayer.
  46546. *
  46547. * @name Phaser.Tilemaps.Tilemap#layer
  46548. * @type {Phaser.Tilemaps.LayerData}
  46549. * @since 3.0.0
  46550. */
  46551. layer: {
  46552. get: function ()
  46553. {
  46554. return this.layers[this.currentLayerIndex];
  46555. },
  46556. set: function (layer)
  46557. {
  46558. this.setLayer(layer);
  46559. }
  46560. },
  46561. /**
  46562. * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index
  46563. * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified
  46564. * location. If you pass in an index, only the index at the specified location will be changed.
  46565. * Collision information will be recalculated at the specified location.
  46566. *
  46567. * If no layer specified, the maps current layer is used.
  46568. *
  46569. * This cannot be applied to StaticTilemapLayers.
  46570. *
  46571. * @method Phaser.Tilemaps.Tilemap#putTileAt
  46572. * @since 3.0.0
  46573. *
  46574. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  46575. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  46576. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  46577. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  46578. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46579. *
  46580. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid or the coordinates were out of bounds.
  46581. */
  46582. putTileAt: function (tile, tileX, tileY, recalculateFaces, layer)
  46583. {
  46584. layer = this.getLayer(layer);
  46585. if (this._isStaticCall(layer, 'putTileAt')) { return null; }
  46586. if (layer === null) { return null; }
  46587. return TilemapComponents.PutTileAt(tile, tileX, tileY, recalculateFaces, layer);
  46588. },
  46589. /**
  46590. * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either
  46591. * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the
  46592. * specified location. If you pass in an index, only the index at the specified location will be
  46593. * changed. Collision information will be recalculated at the specified location.
  46594. *
  46595. * If no layer specified, the maps current layer is used. This
  46596. * cannot be applied to StaticTilemapLayers.
  46597. *
  46598. * @method Phaser.Tilemaps.Tilemap#putTileAtWorldXY
  46599. * @since 3.0.0
  46600. *
  46601. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  46602. * @param {number} worldX - The x coordinate, in pixels.
  46603. * @param {number} worldY - The y coordinate, in pixels.
  46604. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  46605. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  46606. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46607. *
  46608. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  46609. */
  46610. putTileAtWorldXY: function (tile, worldX, worldY, recalculateFaces, camera, layer)
  46611. {
  46612. layer = this.getLayer(layer);
  46613. if (this._isStaticCall(layer, 'putTileAtWorldXY')) { return null; }
  46614. if (layer === null) { return null; }
  46615. return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, recalculateFaces, camera, layer);
  46616. },
  46617. /**
  46618. * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified
  46619. * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile,
  46620. * all attributes will be copied over to the specified location. If you pass in an index, only the
  46621. * index at the specified location will be changed. Collision information will be recalculated
  46622. * within the region tiles were changed.
  46623. *
  46624. * If no layer specified, the maps current layer is used.
  46625. * This cannot be applied to StaticTilemapLayers.
  46626. *
  46627. * @method Phaser.Tilemaps.Tilemap#putTilesAt
  46628. * @since 3.0.0
  46629. *
  46630. * @param {(integer[]|integer[][]|Phaser.Tilemaps.Tile[]|Phaser.Tilemaps.Tile[][])} tile - A row (array) or grid (2D array) of Tiles or tile indexes to place.
  46631. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  46632. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  46633. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  46634. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46635. *
  46636. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  46637. */
  46638. putTilesAt: function (tilesArray, tileX, tileY, recalculateFaces, layer)
  46639. {
  46640. layer = this.getLayer(layer);
  46641. if (this._isStaticCall(layer, 'putTilesAt')) { return this; }
  46642. if (layer !== null)
  46643. {
  46644. TilemapComponents.PutTilesAt(tilesArray, tileX, tileY, recalculateFaces, layer);
  46645. }
  46646. return this;
  46647. },
  46648. /**
  46649. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  46650. * specified layer. Each tile will recieve a new index. If an array of indexes is passed in, then
  46651. * those will be used for randomly assigning new tile indexes. If an array is not provided, the
  46652. * indexes found within the region (excluding -1) will be used for randomly assigning new tile
  46653. * indexes. This method only modifies tile indexes and does not change collision information.
  46654. *
  46655. * If no layer specified, the maps current layer is used.
  46656. * This cannot be applied to StaticTilemapLayers.
  46657. *
  46658. * @method Phaser.Tilemaps.Tilemap#randomize
  46659. * @since 3.0.0
  46660. *
  46661. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  46662. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  46663. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  46664. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  46665. * @param {integer[]} [indexes] - An array of indexes to randomly draw from during randomization.
  46666. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46667. *
  46668. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  46669. */
  46670. randomize: function (tileX, tileY, width, height, indexes, layer)
  46671. {
  46672. layer = this.getLayer(layer);
  46673. if (this._isStaticCall(layer, 'randomize')) { return this; }
  46674. if (layer !== null)
  46675. {
  46676. TilemapComponents.Randomize(tileX, tileY, width, height, indexes, layer);
  46677. }
  46678. return this;
  46679. },
  46680. /**
  46681. * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting
  46682. * faces are used internally for optimizing collisions against tiles. This method is mostly used
  46683. * internally to optimize recalculating faces when only one tile has been changed.
  46684. *
  46685. * If no layer specified, the maps current layer is used.
  46686. *
  46687. * @method Phaser.Tilemaps.Tilemap#calculateFacesAt
  46688. * @since 3.0.0
  46689. *
  46690. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  46691. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  46692. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46693. *
  46694. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  46695. */
  46696. calculateFacesAt: function (tileX, tileY, layer)
  46697. {
  46698. layer = this.getLayer(layer);
  46699. if (layer === null) { return this; }
  46700. TilemapComponents.CalculateFacesAt(tileX, tileY, layer);
  46701. return this;
  46702. },
  46703. /**
  46704. * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the
  46705. * layer. Interesting faces are used internally for optimizing collisions against tiles. This method
  46706. * is mostly used internally.
  46707. *
  46708. * If no layer specified, the map's current layer is used.
  46709. *
  46710. * @method Phaser.Tilemaps.Tilemap#calculateFacesWithin
  46711. * @since 3.0.0
  46712. *
  46713. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  46714. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  46715. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  46716. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  46717. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46718. *
  46719. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  46720. */
  46721. calculateFacesWithin: function (tileX, tileY, width, height, layer)
  46722. {
  46723. layer = this.getLayer(layer);
  46724. if (layer === null) { return this; }
  46725. TilemapComponents.CalculateFacesWithin(tileX, tileY, width, height, layer);
  46726. return this;
  46727. },
  46728. /**
  46729. * Removes all layers from this Tilemap and destroys any associated StaticTilemapLayers or
  46730. * DynamicTilemapLayers.
  46731. *
  46732. * @method Phaser.Tilemaps.Tilemap#removeAllLayers
  46733. * @since 3.0.0
  46734. *
  46735. * @return {Phaser.Tilemaps.Tilemap} This Tilemap object.
  46736. */
  46737. removeAllLayers: function ()
  46738. {
  46739. // Destroy any StaticTilemapLayers or DynamicTilemapLayers that are stored in LayerData
  46740. for (var i = 0; i < this.layers.length; i++)
  46741. {
  46742. if (this.layers[i].tilemapLayer)
  46743. {
  46744. this.layers[i].tilemapLayer.destroy();
  46745. }
  46746. }
  46747. this.layers.length = 0;
  46748. this.currentLayerIndex = 0;
  46749. return this;
  46750. },
  46751. /**
  46752. * Removes the tile at the given tile coordinates in the specified layer and updates the layer's
  46753. * collision information.
  46754. *
  46755. * If no layer specified, the maps current layer is used.
  46756. * This cannot be applied to StaticTilemapLayers.
  46757. *
  46758. * @method Phaser.Tilemaps.Tilemap#removeTileAt
  46759. * @since 3.0.0
  46760. *
  46761. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  46762. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  46763. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1.
  46764. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  46765. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46766. *
  46767. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  46768. */
  46769. removeTileAt: function (tileX, tileY, replaceWithNull, recalculateFaces, layer)
  46770. {
  46771. layer = this.getLayer(layer);
  46772. if (this._isStaticCall(layer, 'removeTileAt')) { return null; }
  46773. if (layer === null) { return null; }
  46774. return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, recalculateFaces, layer);
  46775. },
  46776. /**
  46777. * Removes the tile at the given world coordinates in the specified layer and updates the layer's
  46778. * collision information.
  46779. *
  46780. * If no layer specified, the maps current layer is used.
  46781. * This cannot be applied to StaticTilemapLayers.
  46782. *
  46783. * @method Phaser.Tilemaps.Tilemap#removeTileAtWorldXY
  46784. * @since 3.0.0
  46785. *
  46786. * @param {number} worldX - The x coordinate, in pixels.
  46787. * @param {number} worldY - The y coordinate, in pixels.
  46788. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1.
  46789. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  46790. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  46791. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46792. *
  46793. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  46794. */
  46795. removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, recalculateFaces, camera, layer)
  46796. {
  46797. layer = this.getLayer(layer);
  46798. if (this._isStaticCall(layer, 'removeTileAtWorldXY')) { return null; }
  46799. if (layer === null) { return null; }
  46800. return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, recalculateFaces, camera, layer);
  46801. },
  46802. /**
  46803. * @typedef {object} StyleConfig
  46804. *
  46805. * @property {?number} [tileColor=blue] - Color to use for drawing a filled rectangle at non-colliding tile locations. If set to null, non-colliding tiles will not be drawn.
  46806. * @property {?number} [collidingTileColor=orange] - Color to use for drawing a filled rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn.
  46807. * @property {?number} [faceColor=grey] - Color to use for drawing a line at interesting tile faces. If set to null, interesting tile faces will not be drawn.
  46808. */
  46809. /**
  46810. * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to
  46811. * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles
  46812. * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation
  46813. * wherever you want on the screen.
  46814. *
  46815. * If no layer specified, the maps current layer is used.
  46816. *
  46817. * @method Phaser.Tilemaps.Tilemap#renderDebug
  46818. * @since 3.0.0
  46819. *
  46820. * @param {Phaser.GameObjects.Graphics} graphics - The target Graphics object to draw upon.
  46821. * @param {StyleConfig} styleConfig - An object specifying the colors to use for the debug drawing.
  46822. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46823. *
  46824. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  46825. */
  46826. renderDebug: function (graphics, styleConfig, layer)
  46827. {
  46828. layer = this.getLayer(layer);
  46829. if (layer === null) { return this; }
  46830. TilemapComponents.RenderDebug(graphics, styleConfig, layer);
  46831. return this;
  46832. },
  46833. /**
  46834. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  46835. * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does
  46836. * not change collision information.
  46837. *
  46838. * If no layer specified, the maps current layer is used.
  46839. * This cannot be applied to StaticTilemapLayers.
  46840. *
  46841. * @method Phaser.Tilemaps.Tilemap#replaceByIndex
  46842. * @since 3.0.0
  46843. *
  46844. * @param {integer} findIndex - The index of the tile to search for.
  46845. * @param {integer} newIndex - The index of the tile to replace it with.
  46846. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  46847. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  46848. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  46849. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  46850. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46851. *
  46852. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  46853. */
  46854. replaceByIndex: function (findIndex, newIndex, tileX, tileY, width, height, layer)
  46855. {
  46856. layer = this.getLayer(layer);
  46857. if (this._isStaticCall(layer, 'replaceByIndex')) { return this; }
  46858. if (layer !== null)
  46859. {
  46860. TilemapComponents.ReplaceByIndex(findIndex, newIndex, tileX, tileY, width, height, layer);
  46861. }
  46862. return this;
  46863. },
  46864. /**
  46865. * Sets collision on the given tile or tiles within a layer by index. You can pass in either a
  46866. * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if
  46867. * collision will be enabled (true) or disabled (false).
  46868. *
  46869. * If no layer specified, the map's current layer is used.
  46870. *
  46871. * @method Phaser.Tilemaps.Tilemap#setCollision
  46872. * @since 3.0.0
  46873. *
  46874. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes.
  46875. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  46876. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  46877. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46878. *
  46879. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  46880. */
  46881. setCollision: function (indexes, collides, recalculateFaces, layer)
  46882. {
  46883. layer = this.getLayer(layer);
  46884. if (layer === null) { return this; }
  46885. TilemapComponents.SetCollision(indexes, collides, recalculateFaces, layer);
  46886. return this;
  46887. },
  46888. /**
  46889. * Sets collision on a range of tiles in a layer whose index is between the specified `start` and
  46890. * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set
  46891. * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be
  46892. * enabled (true) or disabled (false).
  46893. *
  46894. * If no layer specified, the map's current layer is used.
  46895. *
  46896. * @method Phaser.Tilemaps.Tilemap#setCollisionBetween
  46897. * @since 3.0.0
  46898. *
  46899. * @param {integer} start - The first index of the tile to be set for collision.
  46900. * @param {integer} stop - The last index of the tile to be set for collision.
  46901. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  46902. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  46903. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46904. *
  46905. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  46906. */
  46907. setCollisionBetween: function (start, stop, collides, recalculateFaces, layer)
  46908. {
  46909. layer = this.getLayer(layer);
  46910. if (layer === null) { return this; }
  46911. TilemapComponents.SetCollisionBetween(start, stop, collides, recalculateFaces, layer);
  46912. return this;
  46913. },
  46914. /**
  46915. * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property
  46916. * that matches the given properties object, its collision flag will be set. The `collides`
  46917. * parameter controls if collision will be enabled (true) or disabled (false). Passing in
  46918. * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that
  46919. * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can
  46920. * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a
  46921. * "types" property that matches any of those values, its collision flag will be updated.
  46922. *
  46923. * If no layer specified, the map's current layer is used.
  46924. *
  46925. * @method Phaser.Tilemaps.Tilemap#setCollisionByProperty
  46926. * @since 3.0.0
  46927. *
  46928. * @param {object} properties - An object with tile properties and corresponding values that should be checked.
  46929. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  46930. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  46931. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46932. *
  46933. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  46934. */
  46935. setCollisionByProperty: function (properties, collides, recalculateFaces, layer)
  46936. {
  46937. layer = this.getLayer(layer);
  46938. if (layer === null) { return this; }
  46939. TilemapComponents.SetCollisionByProperty(properties, collides, recalculateFaces, layer);
  46940. return this;
  46941. },
  46942. /**
  46943. * Sets collision on all tiles in the given layer, except for tiles that have an index specified in
  46944. * the given array. The `collides` parameter controls if collision will be enabled (true) or
  46945. * disabled (false).
  46946. *
  46947. * If no layer specified, the map's current layer is used.
  46948. *
  46949. * @method Phaser.Tilemaps.Tilemap#setCollisionByExclusion
  46950. * @since 3.0.0
  46951. *
  46952. * @param {integer[]} indexes - An array of the tile indexes to not be counted for collision.
  46953. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  46954. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  46955. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46956. *
  46957. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  46958. */
  46959. setCollisionByExclusion: function (indexes, collides, recalculateFaces, layer)
  46960. {
  46961. layer = this.getLayer(layer);
  46962. if (layer === null) { return this; }
  46963. TilemapComponents.SetCollisionByExclusion(indexes, collides, recalculateFaces, layer);
  46964. return this;
  46965. },
  46966. /**
  46967. * Sets collision on the tiles within a layer by checking each tile's collision group data
  46968. * (typically defined in Tiled within the tileset collision editor). If any objects are found within
  46969. * a tile's collision group, the tile's colliding information will be set. The `collides` parameter
  46970. * controls if collision will be enabled (true) or disabled (false).
  46971. *
  46972. * If no layer specified, the map's current layer is used.
  46973. *
  46974. * @method Phaser.Tilemaps.Tilemap#setCollisionFromCollisionGroup
  46975. * @since 3.0.0
  46976. *
  46977. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  46978. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  46979. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  46980. *
  46981. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  46982. */
  46983. setCollisionFromCollisionGroup: function (collides, recalculateFaces, layer)
  46984. {
  46985. layer = this.getLayer(layer);
  46986. if (layer === null) { return this; }
  46987. TilemapComponents.SetCollisionFromCollisionGroup(collides, recalculateFaces, layer);
  46988. return this;
  46989. },
  46990. /**
  46991. * Sets a global collision callback for the given tile index within the layer. This will affect all
  46992. * tiles on this layer that have the same index. If a callback is already set for the tile index it
  46993. * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile
  46994. * at a specific location on the map then see setTileLocationCallback.
  46995. *
  46996. * If no layer specified, the map's current layer is used.
  46997. *
  46998. * @method Phaser.Tilemaps.Tilemap#setTileIndexCallback
  46999. * @since 3.0.0
  47000. *
  47001. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes to have a collision callback set for.
  47002. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  47003. * @param {object} callbackContext - The context under which the callback is called.
  47004. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  47005. *
  47006. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  47007. */
  47008. setTileIndexCallback: function (indexes, callback, callbackContext, layer)
  47009. {
  47010. layer = this.getLayer(layer);
  47011. if (layer === null) { return this; }
  47012. TilemapComponents.SetTileIndexCallback(indexes, callback, callbackContext, layer);
  47013. return this;
  47014. },
  47015. /**
  47016. * Sets a collision callback for the given rectangular area (in tile coordindates) within the layer.
  47017. * If a callback is already set for the tile index it will be replaced. Set the callback to null to
  47018. * remove it.
  47019. *
  47020. * If no layer specified, the map's current layer is used.
  47021. *
  47022. * @method Phaser.Tilemaps.Tilemap#setTileLocationCallback
  47023. * @since 3.0.0
  47024. *
  47025. * @param {integer} tileX - The left most tile index (in tile coordinates) to use as the origin of the area.
  47026. * @param {integer} tileY - The top most tile index (in tile coordinates) to use as the origin of the area.
  47027. * @param {integer} width - How many tiles wide from the `tileX` index the area will be.
  47028. * @param {integer} height - How many tiles tall from the `tileY` index the area will be.
  47029. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  47030. * @param {object} [callbackContext] - The context under which the callback is called.
  47031. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  47032. *
  47033. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  47034. */
  47035. setTileLocationCallback: function (tileX, tileY, width, height, callback, callbackContext, layer)
  47036. {
  47037. layer = this.getLayer(layer);
  47038. if (layer === null) { return this; }
  47039. TilemapComponents.SetTileLocationCallback(tileX, tileY, width, height, callback, callbackContext, layer);
  47040. return this;
  47041. },
  47042. /**
  47043. * Sets the current layer to the LayerData associated with `layer`.
  47044. *
  47045. * @method Phaser.Tilemaps.Tilemap#setLayer
  47046. * @since 3.0.0
  47047. *
  47048. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The name of the
  47049. * layer from Tiled, the index of the layer in the map, a DynamicTilemapLayer or a
  47050. * StaticTilemapLayer. If not given will default to the map's current layer index.
  47051. *
  47052. * @return {Phaser.Tilemaps.Tilemap} This Tilemap object.
  47053. */
  47054. setLayer: function (layer)
  47055. {
  47056. var index = this.getLayerIndex(layer);
  47057. if (index !== null)
  47058. {
  47059. this.currentLayerIndex = index;
  47060. }
  47061. return this;
  47062. },
  47063. /**
  47064. * Sets the base tile size for the map. Note: this does not necessarily match the tileWidth and
  47065. * tileHeight for all layers. This also updates the base size on all tiles across all layers.
  47066. *
  47067. * @method Phaser.Tilemaps.Tilemap#setBaseTileSize
  47068. * @since 3.0.0
  47069. *
  47070. * @param {integer} tileWidth - The width of the tiles the map uses for calculations.
  47071. * @param {integer} tileHeight - The height of the tiles the map uses for calculations.
  47072. *
  47073. * @return {Phaser.Tilemaps.Tilemap} This Tilemap object.
  47074. */
  47075. setBaseTileSize: function (tileWidth, tileHeight)
  47076. {
  47077. this.tileWidth = tileWidth;
  47078. this.tileHeight = tileHeight;
  47079. this.widthInPixels = this.width * tileWidth;
  47080. this.heightInPixels = this.height * tileHeight;
  47081. // Update the base tile size on all layers & tiles
  47082. for (var i = 0; i < this.layers.length; i++)
  47083. {
  47084. this.layers[i].baseTileWidth = tileWidth;
  47085. this.layers[i].baseTileHeight = tileHeight;
  47086. var mapData = this.layers[i].data;
  47087. var mapWidth = this.layers[i].width;
  47088. var mapHeight = this.layers[i].height;
  47089. for (var row = 0; row < mapHeight; row++)
  47090. {
  47091. for (var col = 0; col < mapWidth; col++)
  47092. {
  47093. var tile = mapData[row][col];
  47094. if (tile !== null)
  47095. {
  47096. tile.setSize(undefined, undefined, tileWidth, tileHeight);
  47097. }
  47098. }
  47099. }
  47100. }
  47101. return this;
  47102. },
  47103. /**
  47104. * Sets the tile size for a specific `layer`. Note: this does not necessarily match the map's
  47105. * tileWidth and tileHeight for all layers. This will set the tile size for the layer and any
  47106. * tiles the layer has.
  47107. *
  47108. * @method Phaser.Tilemaps.Tilemap#setLayerTileSize
  47109. * @since 3.0.0
  47110. *
  47111. * @param {integer} tileWidth - The width of the tiles (in pixels) in the layer.
  47112. * @param {integer} tileHeight - The height of the tiles (in pixels) in the layer.
  47113. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The name of the
  47114. * layer from Tiled, the index of the layer in the map, a DynamicTilemapLayer or a
  47115. * StaticTilemapLayer. If not given will default to the map's current layer index.
  47116. *
  47117. * @return {Phaser.Tilemaps.Tilemap} This Tilemap object.
  47118. */
  47119. setLayerTileSize: function (tileWidth, tileHeight, layer)
  47120. {
  47121. layer = this.getLayer(layer);
  47122. if (layer === null) { return this; }
  47123. layer.tileWidth = tileWidth;
  47124. layer.tileHeight = tileHeight;
  47125. var mapData = layer.data;
  47126. var mapWidth = layer.width;
  47127. var mapHeight = layer.height;
  47128. for (var row = 0; row < mapHeight; row++)
  47129. {
  47130. for (var col = 0; col < mapWidth; col++)
  47131. {
  47132. var tile = mapData[row][col];
  47133. if (tile !== null)
  47134. {
  47135. tile.setSize(tileWidth, tileHeight);
  47136. }
  47137. }
  47138. }
  47139. return this;
  47140. },
  47141. /**
  47142. * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given
  47143. * layer. It will only randomize the tiles in that area, so if they're all the same nothing will
  47144. * appear to have changed! This method only modifies tile indexes and does not change collision
  47145. * information.
  47146. *
  47147. * If no layer specified, the maps current layer is used.
  47148. * This cannot be applied to StaticTilemapLayers.
  47149. *
  47150. * @method Phaser.Tilemaps.Tilemap#shuffle
  47151. * @since 3.0.0
  47152. *
  47153. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  47154. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  47155. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  47156. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  47157. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  47158. *
  47159. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  47160. */
  47161. shuffle: function (tileX, tileY, width, height, layer)
  47162. {
  47163. layer = this.getLayer(layer);
  47164. if (this._isStaticCall(layer, 'shuffle')) { return this; }
  47165. if (layer !== null)
  47166. {
  47167. TilemapComponents.Shuffle(tileX, tileY, width, height, layer);
  47168. }
  47169. return this;
  47170. },
  47171. /**
  47172. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  47173. * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision
  47174. * information.
  47175. *
  47176. * If no layer specified, the maps current layer is used.
  47177. * This cannot be applied to StaticTilemapLayers.
  47178. *
  47179. * @method Phaser.Tilemaps.Tilemap#swapByIndex
  47180. * @since 3.0.0
  47181. *
  47182. * @param {integer} tileA - First tile index.
  47183. * @param {integer} tileB - Second tile index.
  47184. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  47185. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  47186. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  47187. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  47188. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  47189. *
  47190. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  47191. */
  47192. swapByIndex: function (indexA, indexB, tileX, tileY, width, height, layer)
  47193. {
  47194. layer = this.getLayer(layer);
  47195. if (this._isStaticCall(layer, 'swapByIndex')) { return this; }
  47196. if (layer !== null)
  47197. {
  47198. TilemapComponents.SwapByIndex(indexA, indexB, tileX, tileY, width, height, layer);
  47199. }
  47200. return this;
  47201. },
  47202. /**
  47203. * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the
  47204. * layers position, scale and scroll.
  47205. *
  47206. * If no layer specified, the maps current layer is used.
  47207. *
  47208. * @method Phaser.Tilemaps.Tilemap#tileToWorldX
  47209. * @since 3.0.0
  47210. *
  47211. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  47212. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  47213. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  47214. *
  47215. * @return {?number} Returns a number, or null if the layer given was invalid.
  47216. */
  47217. tileToWorldX: function (tileX, camera, layer)
  47218. {
  47219. layer = this.getLayer(layer);
  47220. if (layer === null) { return null; }
  47221. return TilemapComponents.TileToWorldX(tileX, camera, layer);
  47222. },
  47223. /**
  47224. * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the
  47225. * layers position, scale and scroll.
  47226. *
  47227. * If no layer specified, the maps current layer is used.
  47228. *
  47229. * @method Phaser.Tilemaps.Tilemap#tileToWorldY
  47230. * @since 3.0.0
  47231. *
  47232. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  47233. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  47234. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer
  47235. * to use. If not given the current layer is used.
  47236. *
  47237. * @return {?number} Returns a number, or null if the layer given was invalid.
  47238. */
  47239. tileToWorldY: function (tileX, camera, layer)
  47240. {
  47241. layer = this.getLayer(layer);
  47242. if (layer === null) { return null; }
  47243. return TilemapComponents.TileToWorldY(tileX, camera, layer);
  47244. },
  47245. /**
  47246. * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the
  47247. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  47248. * `point` object.
  47249. *
  47250. * If no layer specified, the maps current layer is used.
  47251. *
  47252. * @method Phaser.Tilemaps.Tilemap#tileToWorldXY
  47253. * @since 3.0.0
  47254. *
  47255. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  47256. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  47257. * @param {Phaser.Math.Vector2} [point] - A Vector2 to store the coordinates in. If not given a new Vector2 is created.
  47258. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  47259. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  47260. *
  47261. * @return {?Phaser.Math.Vector2} Returns a point, or null if the layer given was invalid.
  47262. */
  47263. tileToWorldXY: function (tileX, tileY, point, camera, layer)
  47264. {
  47265. layer = this.getLayer(layer);
  47266. if (layer === null) { return null; }
  47267. return TilemapComponents.TileToWorldXY(tileX, tileY, point, camera, layer);
  47268. },
  47269. /**
  47270. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  47271. * specified layer. Each tile will receive a new index. New indexes are drawn from the given
  47272. * weightedIndexes array. An example weighted array:
  47273. *
  47274. * [
  47275. * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8
  47276. * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8
  47277. * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8
  47278. * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8
  47279. * ]
  47280. *
  47281. * The probability of any index being choose is (the index's weight) / (sum of all weights). This
  47282. * method only modifies tile indexes and does not change collision information.
  47283. *
  47284. * If no layer specified, the map's current layer is used. This
  47285. * cannot be applied to StaticTilemapLayers.
  47286. *
  47287. * @method Phaser.Tilemaps.Tilemap#weightedRandomize
  47288. * @since 3.0.0
  47289. *
  47290. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  47291. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  47292. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  47293. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  47294. * @param {object[]} [weightedIndexes] - An array of objects to randomly draw from during
  47295. * randomization. They should be in the form: { index: 0, weight: 4 } or
  47296. * { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes.
  47297. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  47298. *
  47299. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  47300. */
  47301. weightedRandomize: function (tileX, tileY, width, height, weightedIndexes, layer)
  47302. {
  47303. layer = this.getLayer(layer);
  47304. if (this._isStaticCall(layer, 'weightedRandomize')) { return this; }
  47305. if (layer !== null)
  47306. {
  47307. TilemapComponents.WeightedRandomize(tileX, tileY, width, height, weightedIndexes, layer);
  47308. }
  47309. return this;
  47310. },
  47311. /**
  47312. * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the
  47313. * layers position, scale and scroll.
  47314. *
  47315. * If no layer specified, the maps current layer is used.
  47316. *
  47317. * @method Phaser.Tilemaps.Tilemap#worldToTileX
  47318. * @since 3.0.0
  47319. *
  47320. * @param {number} worldX - The x coordinate to be converted, in pixels, not tiles.
  47321. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the nearest integer.
  47322. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  47323. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer
  47324. * to use. If not given the current layer is used.
  47325. *
  47326. * @return {?number} Returns a number, or null if the layer given was invalid.
  47327. */
  47328. worldToTileX: function (worldX, snapToFloor, camera, layer)
  47329. {
  47330. layer = this.getLayer(layer);
  47331. if (layer === null) { return null; }
  47332. return TilemapComponents.WorldToTileX(worldX, snapToFloor, camera, layer);
  47333. },
  47334. /**
  47335. * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the
  47336. * layers position, scale and scroll.
  47337. *
  47338. * If no layer specified, the maps current layer is used.
  47339. *
  47340. * @method Phaser.Tilemaps.Tilemap#worldToTileY
  47341. * @since 3.0.0
  47342. *
  47343. * @param {number} worldY - The y coordinate to be converted, in pixels, not tiles.
  47344. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the nearest integer.
  47345. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  47346. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  47347. *
  47348. * @return {?number} Returns a number, or null if the layer given was invalid.
  47349. */
  47350. worldToTileY: function (worldY, snapToFloor, camera, layer)
  47351. {
  47352. layer = this.getLayer(layer);
  47353. if (layer === null) { return null; }
  47354. return TilemapComponents.WorldToTileY(worldY, snapToFloor, camera, layer);
  47355. },
  47356. /**
  47357. * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the
  47358. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  47359. * `point` object.
  47360. *
  47361. * If no layer specified, the maps current layer is used.
  47362. *
  47363. * @method Phaser.Tilemaps.Tilemap#worldToTileXY
  47364. * @since 3.0.0
  47365. *
  47366. * @param {number} worldX - The x coordinate to be converted, in pixels, not tiles.
  47367. * @param {number} worldY - The y coordinate to be converted, in pixels, not tiles.
  47368. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the nearest integer.
  47369. * @param {Phaser.Math.Vector2} [point] - A Vector2 to store the coordinates in. If not given a new Vector2 is created.
  47370. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  47371. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The tile layer to use. If not given the current layer is used.
  47372. *
  47373. * @return {?Phaser.Math.Vector2} Returns a point, or null if the layer given was invalid.
  47374. */
  47375. worldToTileXY: function (worldX, worldY, snapToFloor, point, camera, layer)
  47376. {
  47377. layer = this.getLayer(layer);
  47378. if (layer === null) { return null; }
  47379. return TilemapComponents.WorldToTileXY(worldX, worldY, snapToFloor, point, camera, layer);
  47380. },
  47381. /**
  47382. * Used internally to check if a layer is static and prints out a warning.
  47383. *
  47384. * @method Phaser.Tilemaps.Tilemap#_isStaticCall
  47385. * @private
  47386. * @since 3.0.0
  47387. *
  47388. * @return {boolean}
  47389. */
  47390. _isStaticCall: function (layer, functionName)
  47391. {
  47392. if (layer.tilemapLayer instanceof StaticTilemapLayer)
  47393. {
  47394. console.warn(functionName + ': You cannot change the tiles in a static tilemap layer');
  47395. return true;
  47396. }
  47397. else
  47398. {
  47399. return false;
  47400. }
  47401. }
  47402. });
  47403. module.exports = Tilemap;
  47404. /***/ }),
  47405. /* 226 */
  47406. /***/ (function(module, exports, __webpack_require__) {
  47407. /**
  47408. * @author Richard Davey <rich@photonstorm.com>
  47409. * @copyright 2019 Photon Storm Ltd.
  47410. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47411. */
  47412. var Formats = __webpack_require__(31);
  47413. var MapData = __webpack_require__(83);
  47414. var ParseTileLayers = __webpack_require__(490);
  47415. var ParseTilesets = __webpack_require__(489);
  47416. /**
  47417. * @namespace Phaser.Tilemaps.Parsers.Impact
  47418. */
  47419. /**
  47420. * Parses a Weltmeister JSON object into a new MapData object.
  47421. *
  47422. * @function Phaser.Tilemaps.Parsers.Impact.ParseWeltmeister
  47423. * @since 3.0.0
  47424. *
  47425. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  47426. * @param {object} json - The Weltmeister JSON object.
  47427. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  47428. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  47429. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  47430. * the tile data doesn't need to change then setting this value to `true` will help with memory
  47431. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  47432. * the default value set.
  47433. *
  47434. * @return {?object} [description]
  47435. */
  47436. var ParseWeltmeister = function (name, json, insertNull)
  47437. {
  47438. if (json.layer.length === 0)
  47439. {
  47440. console.warn('No layers found in the Weltmeister map: ' + name);
  47441. return null;
  47442. }
  47443. var width = 0;
  47444. var height = 0;
  47445. for (var i = 0; i < json.layer.length; i++)
  47446. {
  47447. if (json.layer[i].width > width) { width = json.layer[i].width; }
  47448. if (json.layer[i].height > height) { height = json.layer[i].height; }
  47449. }
  47450. var mapData = new MapData({
  47451. width: width,
  47452. height: height,
  47453. name: name,
  47454. tileWidth: json.layer[0].tilesize,
  47455. tileHeight: json.layer[0].tilesize,
  47456. format: Formats.WELTMEISTER
  47457. });
  47458. mapData.layers = ParseTileLayers(json, insertNull);
  47459. mapData.tilesets = ParseTilesets(json);
  47460. return mapData;
  47461. };
  47462. module.exports = ParseWeltmeister;
  47463. /***/ }),
  47464. /* 227 */
  47465. /***/ (function(module, exports, __webpack_require__) {
  47466. /**
  47467. * @author Richard Davey <rich@photonstorm.com>
  47468. * @copyright 2019 Photon Storm Ltd.
  47469. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47470. */
  47471. var Class = __webpack_require__(0);
  47472. var GetFastValue = __webpack_require__(2);
  47473. /**
  47474. * @classdesc
  47475. * A class for representing a Tiled object layer in a map. This mirrors the structure of a Tiled
  47476. * object layer, except:
  47477. * - "x" & "y" properties are ignored since these cannot be changed in Tiled.
  47478. * - "offsetx" & "offsety" are applied to the individual object coordinates directly, so they
  47479. * are ignored as well.
  47480. * - "draworder" is ignored.
  47481. *
  47482. * @class ObjectLayer
  47483. * @memberof Phaser.Tilemaps
  47484. * @constructor
  47485. * @since 3.0.0
  47486. *
  47487. * @param {object} [config] - The data for the layer from the Tiled JSON object.
  47488. */
  47489. var ObjectLayer = new Class({
  47490. initialize:
  47491. function ObjectLayer (config)
  47492. {
  47493. if (config === undefined) { config = {}; }
  47494. /**
  47495. * The name of the Object Layer.
  47496. *
  47497. * @name Phaser.Tilemaps.ObjectLayer#name
  47498. * @type {string}
  47499. * @since 3.0.0
  47500. */
  47501. this.name = GetFastValue(config, 'name', 'object layer');
  47502. /**
  47503. * The opacity of the layer, between 0 and 1.
  47504. *
  47505. * @name Phaser.Tilemaps.ObjectLayer#opacity
  47506. * @type {number}
  47507. * @since 3.0.0
  47508. */
  47509. this.opacity = GetFastValue(config, 'opacity', 1);
  47510. /**
  47511. * The custom properties defined on the Object Layer, keyed by their name.
  47512. *
  47513. * @name Phaser.Tilemaps.ObjectLayer#properties
  47514. * @type {object}
  47515. * @since 3.0.0
  47516. */
  47517. this.properties = GetFastValue(config, 'properties', {});
  47518. /**
  47519. * The type of each custom property defined on the Object Layer, keyed by its name.
  47520. *
  47521. * @name Phaser.Tilemaps.ObjectLayer#propertyTypes
  47522. * @type {object}
  47523. * @since 3.0.0
  47524. */
  47525. this.propertyTypes = GetFastValue(config, 'propertytypes', {});
  47526. /**
  47527. * The type of the layer, which should be `objectgroup`.
  47528. *
  47529. * @name Phaser.Tilemaps.ObjectLayer#type
  47530. * @type {string}
  47531. * @since 3.0.0
  47532. */
  47533. this.type = GetFastValue(config, 'type', 'objectgroup');
  47534. /**
  47535. * Whether the layer is shown (`true`) or hidden (`false`).
  47536. *
  47537. * @name Phaser.Tilemaps.ObjectLayer#visible
  47538. * @type {boolean}
  47539. * @since 3.0.0
  47540. */
  47541. this.visible = GetFastValue(config, 'visible', true);
  47542. /**
  47543. * An array of all objects on this Object Layer.
  47544. *
  47545. * Each Tiled object corresponds to a JavaScript object in this array. It has an `id` (unique), `name` (as assigned in Tiled), `type` (as assigned in Tiled), `rotation` (in clockwise degrees), `properties` (if any), `visible` state (`true` if visible, `false` otherwise), `x` and `y` coordinates (in pixels, relative to the tilemap), and a `width` and `height` (in pixels).
  47546. *
  47547. * An object tile has a `gid` property (GID of the represented tile), a `flippedHorizontal` property, a `flippedVertical` property, and `flippedAntiDiagonal` property. The {@link http://docs.mapeditor.org/en/latest/reference/tmx-map-format/|Tiled documentation} contains information on flipping and rotation.
  47548. *
  47549. * Polylines have a `polyline` property, which is an array of objects corresponding to points, where each point has an `x` property and a `y` property. Polygons have an identically structured array in their `polygon` property. Text objects have a `text` property with the text's properties.
  47550. *
  47551. * Rectangles and ellipses have a `rectangle` or `ellipse` property set to `true`.
  47552. *
  47553. * @name Phaser.Tilemaps.ObjectLayer#objects
  47554. * @type {Phaser.GameObjects.GameObject[]}
  47555. * @since 3.0.0
  47556. */
  47557. this.objects = GetFastValue(config, 'objects', []);
  47558. }
  47559. });
  47560. module.exports = ObjectLayer;
  47561. /***/ }),
  47562. /* 228 */
  47563. /***/ (function(module, exports, __webpack_require__) {
  47564. /**
  47565. * @author Richard Davey <rich@photonstorm.com>
  47566. * @copyright 2019 Photon Storm Ltd.
  47567. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47568. */
  47569. var Pick = __webpack_require__(494);
  47570. var ParseGID = __webpack_require__(230);
  47571. var copyPoints = function (p) { return { x: p.x, y: p.y }; };
  47572. var commonObjectProps = [ 'id', 'name', 'type', 'rotation', 'properties', 'visible', 'x', 'y', 'width', 'height' ];
  47573. /**
  47574. * Convert a Tiled object to an internal parsed object normalising and copying properties over, while applying optional x and y offsets. The parsed object will always have the properties `id`, `name`, `type`, `rotation`, `properties`, `visible`, `x`, `y`, `width` and `height`. Other properties will be added according to the object type (such as text, polyline, gid etc.)
  47575. *
  47576. * @function Phaser.Tilemaps.Parsers.Tiled.ParseObject
  47577. * @since 3.0.0
  47578. *
  47579. * @param {object} tiledObject - Tiled object to convert to an internal parsed object normalising and copying properties over.
  47580. * @param {number} [offsetX=0] - Optional additional offset to apply to the object's x property. Defaults to 0.
  47581. * @param {number} [offsetY=0] - Optional additional offset to apply to the object's y property. Defaults to 0.
  47582. *
  47583. * @return {object} The parsed object containing properties read from the Tiled object according to it's type with x and y values updated according to the given offsets.
  47584. */
  47585. var ParseObject = function (tiledObject, offsetX, offsetY)
  47586. {
  47587. if (offsetX === undefined) { offsetX = 0; }
  47588. if (offsetY === undefined) { offsetY = 0; }
  47589. var parsedObject = Pick(tiledObject, commonObjectProps);
  47590. parsedObject.x += offsetX;
  47591. parsedObject.y += offsetY;
  47592. if (tiledObject.gid)
  47593. {
  47594. // Object tiles
  47595. var gidInfo = ParseGID(tiledObject.gid);
  47596. parsedObject.gid = gidInfo.gid;
  47597. parsedObject.flippedHorizontal = gidInfo.flippedHorizontal;
  47598. parsedObject.flippedVertical = gidInfo.flippedVertical;
  47599. parsedObject.flippedAntiDiagonal = gidInfo.flippedAntiDiagonal;
  47600. }
  47601. else if (tiledObject.polyline)
  47602. {
  47603. parsedObject.polyline = tiledObject.polyline.map(copyPoints);
  47604. }
  47605. else if (tiledObject.polygon)
  47606. {
  47607. parsedObject.polygon = tiledObject.polygon.map(copyPoints);
  47608. }
  47609. else if (tiledObject.ellipse)
  47610. {
  47611. parsedObject.ellipse = tiledObject.ellipse;
  47612. parsedObject.width = tiledObject.width;
  47613. parsedObject.height = tiledObject.height;
  47614. }
  47615. else if (tiledObject.text)
  47616. {
  47617. parsedObject.width = tiledObject.width;
  47618. parsedObject.height = tiledObject.height;
  47619. parsedObject.text = tiledObject.text;
  47620. }
  47621. else
  47622. {
  47623. // Otherwise, assume it is a rectangle
  47624. parsedObject.rectangle = true;
  47625. parsedObject.width = tiledObject.width;
  47626. parsedObject.height = tiledObject.height;
  47627. }
  47628. return parsedObject;
  47629. };
  47630. module.exports = ParseObject;
  47631. /***/ }),
  47632. /* 229 */
  47633. /***/ (function(module, exports, __webpack_require__) {
  47634. /**
  47635. * @author Richard Davey <rich@photonstorm.com>
  47636. * @copyright 2019 Photon Storm Ltd.
  47637. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47638. */
  47639. var Class = __webpack_require__(0);
  47640. /**
  47641. * @classdesc
  47642. * An Image Collection is a special Tile Set containing multiple images, with no slicing into each image.
  47643. *
  47644. * Image Collections are normally created automatically when Tiled data is loaded.
  47645. *
  47646. * @class ImageCollection
  47647. * @memberof Phaser.Tilemaps
  47648. * @constructor
  47649. * @since 3.0.0
  47650. *
  47651. * @param {string} name - The name of the image collection in the map data.
  47652. * @param {integer} firstgid - The first image index this image collection contains.
  47653. * @param {integer} [width=32] - Width of widest image (in pixels).
  47654. * @param {integer} [height=32] - Height of tallest image (in pixels).
  47655. * @param {integer} [margin=0] - The margin around all images in the collection (in pixels).
  47656. * @param {integer} [spacing=0] - The spacing between each image in the collection (in pixels).
  47657. * @param {object} [properties={}] - Custom Image Collection properties.
  47658. */
  47659. var ImageCollection = new Class({
  47660. initialize:
  47661. function ImageCollection (name, firstgid, width, height, margin, spacing, properties)
  47662. {
  47663. if (width === undefined || width <= 0) { width = 32; }
  47664. if (height === undefined || height <= 0) { height = 32; }
  47665. if (margin === undefined) { margin = 0; }
  47666. if (spacing === undefined) { spacing = 0; }
  47667. /**
  47668. * The name of the Image Collection.
  47669. *
  47670. * @name Phaser.Tilemaps.ImageCollection#name
  47671. * @type {string}
  47672. * @since 3.0.0
  47673. */
  47674. this.name = name;
  47675. /**
  47676. * The Tiled firstgid value.
  47677. * This is the starting index of the first image index this Image Collection contains.
  47678. *
  47679. * @name Phaser.Tilemaps.ImageCollection#firstgid
  47680. * @type {integer}
  47681. * @since 3.0.0
  47682. */
  47683. this.firstgid = firstgid | 0;
  47684. /**
  47685. * The width of the widest image (in pixels).
  47686. *
  47687. * @name Phaser.Tilemaps.ImageCollection#imageWidth
  47688. * @type {integer}
  47689. * @readonly
  47690. * @since 3.0.0
  47691. */
  47692. this.imageWidth = width | 0;
  47693. /**
  47694. * The height of the tallest image (in pixels).
  47695. *
  47696. * @name Phaser.Tilemaps.ImageCollection#imageHeight
  47697. * @type {integer}
  47698. * @readonly
  47699. * @since 3.0.0
  47700. */
  47701. this.imageHeight = height | 0;
  47702. /**
  47703. * The margin around the images in the collection (in pixels).
  47704. * Use `setSpacing` to change.
  47705. *
  47706. * @name Phaser.Tilemaps.ImageCollection#imageMarge
  47707. * @type {integer}
  47708. * @readonly
  47709. * @since 3.0.0
  47710. */
  47711. this.imageMargin = margin | 0;
  47712. /**
  47713. * The spacing between each image in the collection (in pixels).
  47714. * Use `setSpacing` to change.
  47715. *
  47716. * @name Phaser.Tilemaps.ImageCollection#imageSpacing
  47717. * @type {integer}
  47718. * @readonly
  47719. * @since 3.0.0
  47720. */
  47721. this.imageSpacing = spacing | 0;
  47722. /**
  47723. * Image Collection-specific properties that are typically defined in the Tiled editor.
  47724. *
  47725. * @name Phaser.Tilemaps.ImageCollection#properties
  47726. * @type {object}
  47727. * @since 3.0.0
  47728. */
  47729. this.properties = properties || {};
  47730. /**
  47731. * The cached images that are a part of this collection.
  47732. *
  47733. * @name Phaser.Tilemaps.ImageCollection#images
  47734. * @type {array}
  47735. * @readonly
  47736. * @since 3.0.0
  47737. */
  47738. this.images = [];
  47739. /**
  47740. * The total number of images in the image collection.
  47741. *
  47742. * @name Phaser.Tilemaps.ImageCollection#total
  47743. * @type {integer}
  47744. * @readonly
  47745. * @since 3.0.0
  47746. */
  47747. this.total = 0;
  47748. },
  47749. /**
  47750. * Returns true if and only if this image collection contains the given image index.
  47751. *
  47752. * @method Phaser.Tilemaps.ImageCollection#containsImageIndex
  47753. * @since 3.0.0
  47754. *
  47755. * @param {integer} imageIndex - The image index to search for.
  47756. *
  47757. * @return {boolean} True if this Image Collection contains the given index.
  47758. */
  47759. containsImageIndex: function (imageIndex)
  47760. {
  47761. return (imageIndex >= this.firstgid && imageIndex < (this.firstgid + this.total));
  47762. },
  47763. /**
  47764. * Add an image to this Image Collection.
  47765. *
  47766. * @method Phaser.Tilemaps.ImageCollection#addImage
  47767. * @since 3.0.0
  47768. *
  47769. * @param {integer} gid - The gid of the image in the Image Collection.
  47770. * @param {string} image - The the key of the image in the Image Collection and in the cache.
  47771. *
  47772. * @return {Phaser.Tilemaps.ImageCollection} This ImageCollection object.
  47773. */
  47774. addImage: function (gid, image)
  47775. {
  47776. this.images.push({ gid: gid, image: image });
  47777. this.total++;
  47778. return this;
  47779. }
  47780. });
  47781. module.exports = ImageCollection;
  47782. /***/ }),
  47783. /* 230 */
  47784. /***/ (function(module, exports) {
  47785. /**
  47786. * @author Richard Davey <rich@photonstorm.com>
  47787. * @copyright 2019 Photon Storm Ltd.
  47788. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47789. */
  47790. var FLIPPED_HORIZONTAL = 0x80000000;
  47791. var FLIPPED_VERTICAL = 0x40000000;
  47792. var FLIPPED_ANTI_DIAGONAL = 0x20000000; // Top-right is swapped with bottom-left corners
  47793. /**
  47794. * See Tiled documentation on tile flipping:
  47795. * http://docs.mapeditor.org/en/latest/reference/tmx-map-format/
  47796. *
  47797. * @function Phaser.Tilemaps.Parsers.Tiled.ParseGID
  47798. * @since 3.0.0
  47799. *
  47800. * @param {number} gid - [description]
  47801. *
  47802. * @return {object} [description]
  47803. */
  47804. var ParseGID = function (gid)
  47805. {
  47806. var flippedHorizontal = Boolean(gid & FLIPPED_HORIZONTAL);
  47807. var flippedVertical = Boolean(gid & FLIPPED_VERTICAL);
  47808. var flippedAntiDiagonal = Boolean(gid & FLIPPED_ANTI_DIAGONAL);
  47809. gid = gid & ~(FLIPPED_HORIZONTAL | FLIPPED_VERTICAL | FLIPPED_ANTI_DIAGONAL);
  47810. // Parse the flip flags into something Phaser can use
  47811. var rotation = 0;
  47812. var flipped = false;
  47813. if (flippedHorizontal && flippedVertical && flippedAntiDiagonal)
  47814. {
  47815. rotation = Math.PI / 2;
  47816. flipped = true;
  47817. }
  47818. else if (flippedHorizontal && flippedVertical && !flippedAntiDiagonal)
  47819. {
  47820. rotation = Math.PI;
  47821. flipped = false;
  47822. }
  47823. else if (flippedHorizontal && !flippedVertical && flippedAntiDiagonal)
  47824. {
  47825. rotation = Math.PI / 2;
  47826. flipped = false;
  47827. }
  47828. else if (flippedHorizontal && !flippedVertical && !flippedAntiDiagonal)
  47829. {
  47830. rotation = 0;
  47831. flipped = true;
  47832. }
  47833. else if (!flippedHorizontal && flippedVertical && flippedAntiDiagonal)
  47834. {
  47835. rotation = 3 * Math.PI / 2;
  47836. flipped = false;
  47837. }
  47838. else if (!flippedHorizontal && flippedVertical && !flippedAntiDiagonal)
  47839. {
  47840. rotation = Math.PI;
  47841. flipped = true;
  47842. }
  47843. else if (!flippedHorizontal && !flippedVertical && flippedAntiDiagonal)
  47844. {
  47845. rotation = 3 * Math.PI / 2;
  47846. flipped = true;
  47847. }
  47848. else if (!flippedHorizontal && !flippedVertical && !flippedAntiDiagonal)
  47849. {
  47850. rotation = 0;
  47851. flipped = false;
  47852. }
  47853. return {
  47854. gid: gid,
  47855. flippedHorizontal: flippedHorizontal,
  47856. flippedVertical: flippedVertical,
  47857. flippedAntiDiagonal: flippedAntiDiagonal,
  47858. rotation: rotation,
  47859. flipped: flipped
  47860. };
  47861. };
  47862. module.exports = ParseGID;
  47863. /***/ }),
  47864. /* 231 */
  47865. /***/ (function(module, exports, __webpack_require__) {
  47866. /**
  47867. * @author Richard Davey <rich@photonstorm.com>
  47868. * @copyright 2019 Photon Storm Ltd.
  47869. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47870. */
  47871. var Formats = __webpack_require__(31);
  47872. var MapData = __webpack_require__(83);
  47873. var ParseTileLayers = __webpack_require__(498);
  47874. var ParseImageLayers = __webpack_require__(496);
  47875. var ParseTilesets = __webpack_require__(495);
  47876. var ParseObjectLayers = __webpack_require__(493);
  47877. var BuildTilesetIndex = __webpack_require__(492);
  47878. var AssignTileProperties = __webpack_require__(491);
  47879. /**
  47880. * @namespace Phaser.Tilemaps.Parsers.Tiled
  47881. */
  47882. /**
  47883. * Parses a Tiled JSON object into a new MapData object.
  47884. *
  47885. * @function Phaser.Tilemaps.Parsers.Tiled.ParseJSONTiled
  47886. * @since 3.0.0
  47887. *
  47888. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  47889. * @param {object} json - The Tiled JSON object.
  47890. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  47891. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  47892. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  47893. * the tile data doesn't need to change then setting this value to `true` will help with memory
  47894. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  47895. * the default value set.
  47896. *
  47897. * @return {?Phaser.Tilemaps.MapData} The created MapData object, or `null` if the data can't be parsed.
  47898. */
  47899. var ParseJSONTiled = function (name, json, insertNull)
  47900. {
  47901. if (json.orientation !== 'orthogonal')
  47902. {
  47903. console.warn('Only orthogonal map types are supported in this version of Phaser');
  47904. return null;
  47905. }
  47906. // Map data will consist of: layers, objects, images, tilesets, sizes
  47907. var mapData = new MapData({
  47908. width: json.width,
  47909. height: json.height,
  47910. name: name,
  47911. tileWidth: json.tilewidth,
  47912. tileHeight: json.tileheight,
  47913. orientation: json.orientation,
  47914. format: Formats.TILED_JSON,
  47915. version: json.version,
  47916. properties: json.properties,
  47917. renderOrder: json.renderorder
  47918. });
  47919. mapData.layers = ParseTileLayers(json, insertNull);
  47920. mapData.images = ParseImageLayers(json);
  47921. var sets = ParseTilesets(json);
  47922. mapData.tilesets = sets.tilesets;
  47923. mapData.imageCollections = sets.imageCollections;
  47924. mapData.objects = ParseObjectLayers(json);
  47925. mapData.tiles = BuildTilesetIndex(mapData);
  47926. AssignTileProperties(mapData);
  47927. return mapData;
  47928. };
  47929. module.exports = ParseJSONTiled;
  47930. /***/ }),
  47931. /* 232 */
  47932. /***/ (function(module, exports, __webpack_require__) {
  47933. /**
  47934. * @author Richard Davey <rich@photonstorm.com>
  47935. * @copyright 2019 Photon Storm Ltd.
  47936. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47937. */
  47938. var Formats = __webpack_require__(31);
  47939. var Parse2DArray = __webpack_require__(145);
  47940. /**
  47941. * Parses a CSV string of tile indexes into a new MapData object with a single layer.
  47942. *
  47943. * @function Phaser.Tilemaps.Parsers.ParseCSV
  47944. * @since 3.0.0
  47945. *
  47946. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  47947. * @param {string} data - CSV string of tile indexes.
  47948. * @param {integer} tileWidth - The width of a tile in pixels.
  47949. * @param {integer} tileHeight - The height of a tile in pixels.
  47950. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  47951. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  47952. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  47953. * the tile data doesn't need to change then setting this value to `true` will help with memory
  47954. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  47955. * the default value set.
  47956. *
  47957. * @return {Phaser.Tilemaps.MapData} The resulting MapData object.
  47958. */
  47959. var ParseCSV = function (name, data, tileWidth, tileHeight, insertNull)
  47960. {
  47961. var array2D = data
  47962. .trim()
  47963. .split('\n')
  47964. .map(function (row) { return row.split(','); });
  47965. var map = Parse2DArray(name, array2D, tileWidth, tileHeight, insertNull);
  47966. map.format = Formats.CSV;
  47967. return map;
  47968. };
  47969. module.exports = ParseCSV;
  47970. /***/ }),
  47971. /* 233 */
  47972. /***/ (function(module, exports, __webpack_require__) {
  47973. /**
  47974. * @author Richard Davey <rich@photonstorm.com>
  47975. * @copyright 2019 Photon Storm Ltd.
  47976. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47977. */
  47978. var Formats = __webpack_require__(31);
  47979. var Parse2DArray = __webpack_require__(145);
  47980. var ParseCSV = __webpack_require__(232);
  47981. var ParseJSONTiled = __webpack_require__(231);
  47982. var ParseWeltmeister = __webpack_require__(226);
  47983. /**
  47984. * Parses raw data of a given Tilemap format into a new MapData object. If no recognized data format
  47985. * is found, returns `null`. When loading from CSV or a 2D array, you should specify the tileWidth &
  47986. * tileHeight. When parsing from a map from Tiled, the tileWidth & tileHeight will be pulled from
  47987. * the map data.
  47988. *
  47989. * @function Phaser.Tilemaps.Parsers.Parse
  47990. * @since 3.0.0
  47991. *
  47992. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  47993. * @param {integer} mapFormat - See ../Formats.js.
  47994. * @param {(integer[][]|string|object)} data - 2D array, CSV string or Tiled JSON object.
  47995. * @param {integer} tileWidth - The width of a tile in pixels. Required for 2D array and CSV, but
  47996. * ignored for Tiled JSON.
  47997. * @param {integer} tileHeight - The height of a tile in pixels. Required for 2D array and CSV, but
  47998. * ignored for Tiled JSON.
  47999. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  48000. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  48001. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  48002. * the tile data doesn't need to change then setting this value to `true` will help with memory
  48003. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  48004. * the default value set.
  48005. *
  48006. * @return {Phaser.Tilemaps.MapData} The created `MapData` object.
  48007. */
  48008. var Parse = function (name, mapFormat, data, tileWidth, tileHeight, insertNull)
  48009. {
  48010. var newMap;
  48011. switch (mapFormat)
  48012. {
  48013. case (Formats.ARRAY_2D):
  48014. newMap = Parse2DArray(name, data, tileWidth, tileHeight, insertNull);
  48015. break;
  48016. case (Formats.CSV):
  48017. newMap = ParseCSV(name, data, tileWidth, tileHeight, insertNull);
  48018. break;
  48019. case (Formats.TILED_JSON):
  48020. newMap = ParseJSONTiled(name, data, insertNull);
  48021. break;
  48022. case (Formats.WELTMEISTER):
  48023. newMap = ParseWeltmeister(name, data, insertNull);
  48024. break;
  48025. default:
  48026. console.warn('Unrecognized tilemap data format: ' + mapFormat);
  48027. newMap = null;
  48028. }
  48029. return newMap;
  48030. };
  48031. module.exports = Parse;
  48032. /***/ }),
  48033. /* 234 */
  48034. /***/ (function(module, exports, __webpack_require__) {
  48035. /**
  48036. * @author Richard Davey <rich@photonstorm.com>
  48037. * @copyright 2019 Photon Storm Ltd.
  48038. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48039. */
  48040. var Tile = __webpack_require__(61);
  48041. var IsInLayerBounds = __webpack_require__(85);
  48042. var CalculateFacesAt = __webpack_require__(148);
  48043. /**
  48044. * Removes the tile at the given tile coordinates in the specified layer and updates the layer's
  48045. * collision information.
  48046. *
  48047. * @function Phaser.Tilemaps.Components.RemoveTileAt
  48048. * @private
  48049. * @since 3.0.0
  48050. *
  48051. * @param {integer} tileX - The x coordinate.
  48052. * @param {integer} tileY - The y coordinate.
  48053. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1.
  48054. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  48055. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  48056. *
  48057. * @return {Phaser.Tilemaps.Tile} The Tile object that was removed.
  48058. */
  48059. var RemoveTileAt = function (tileX, tileY, replaceWithNull, recalculateFaces, layer)
  48060. {
  48061. if (replaceWithNull === undefined) { replaceWithNull = false; }
  48062. if (recalculateFaces === undefined) { recalculateFaces = true; }
  48063. if (!IsInLayerBounds(tileX, tileY, layer)) { return null; }
  48064. var tile = layer.data[tileY][tileX] || null;
  48065. if (tile === null)
  48066. {
  48067. return null;
  48068. }
  48069. else
  48070. {
  48071. layer.data[tileY][tileX] = replaceWithNull
  48072. ? null
  48073. : new Tile(layer, -1, tileX, tileY, tile.width, tile.height);
  48074. }
  48075. // Recalculate faces only if the removed tile was a colliding tile
  48076. if (recalculateFaces && tile && tile.collides)
  48077. {
  48078. CalculateFacesAt(tileX, tileY, layer);
  48079. }
  48080. return tile;
  48081. };
  48082. module.exports = RemoveTileAt;
  48083. /***/ }),
  48084. /* 235 */
  48085. /***/ (function(module, exports, __webpack_require__) {
  48086. /**
  48087. * @author Richard Davey <rich@photonstorm.com>
  48088. * @copyright 2019 Photon Storm Ltd.
  48089. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48090. */
  48091. var IsInLayerBounds = __webpack_require__(85);
  48092. /**
  48093. * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns
  48094. * false if there is no tile or if the tile at that location has an index of -1.
  48095. *
  48096. * @function Phaser.Tilemaps.Components.HasTileAt
  48097. * @private
  48098. * @since 3.0.0
  48099. *
  48100. * @param {integer} tileX - X position to get the tile from (given in tile units, not pixels).
  48101. * @param {integer} tileY - Y position to get the tile from (given in tile units, not pixels).
  48102. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  48103. *
  48104. * @return {?boolean} Returns a boolean, or null if the layer given was invalid.
  48105. */
  48106. var HasTileAt = function (tileX, tileY, layer)
  48107. {
  48108. if (IsInLayerBounds(tileX, tileY, layer))
  48109. {
  48110. var tile = layer.data[tileY][tileX];
  48111. return (tile !== null && tile.index > -1);
  48112. }
  48113. else
  48114. {
  48115. return false;
  48116. }
  48117. };
  48118. module.exports = HasTileAt;
  48119. /***/ }),
  48120. /* 236 */
  48121. /***/ (function(module, exports, __webpack_require__) {
  48122. /**
  48123. * @author Richard Davey <rich@photonstorm.com>
  48124. * @copyright 2019 Photon Storm Ltd.
  48125. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48126. */
  48127. var GetTilesWithin = __webpack_require__(21);
  48128. /**
  48129. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  48130. * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does
  48131. * not change collision information.
  48132. *
  48133. * @function Phaser.Tilemaps.Components.ReplaceByIndex
  48134. * @private
  48135. * @since 3.0.0
  48136. *
  48137. * @param {integer} findIndex - The index of the tile to search for.
  48138. * @param {integer} newIndex - The index of the tile to replace it with.
  48139. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  48140. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  48141. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  48142. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  48143. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  48144. */
  48145. var ReplaceByIndex = function (findIndex, newIndex, tileX, tileY, width, height, layer)
  48146. {
  48147. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  48148. for (var i = 0; i < tiles.length; i++)
  48149. {
  48150. if (tiles[i] && tiles[i].index === findIndex)
  48151. {
  48152. tiles[i].index = newIndex;
  48153. }
  48154. }
  48155. };
  48156. module.exports = ReplaceByIndex;
  48157. /***/ }),
  48158. /* 237 */
  48159. /***/ (function(module, exports, __webpack_require__) {
  48160. /**
  48161. * @author Richard Davey <rich@photonstorm.com>
  48162. * @copyright 2019 Photon Storm Ltd.
  48163. * @license {@link https://github.com/photonstorm/phaser3-plugin-template/blob/master/LICENSE|MIT License}
  48164. */
  48165. var Class = __webpack_require__(0);
  48166. /**
  48167. * @classdesc
  48168. * A Global Plugin is installed just once into the Game owned Plugin Manager.
  48169. * It can listen for Game events and respond to them.
  48170. *
  48171. * @class BasePlugin
  48172. * @memberof Phaser.Plugins
  48173. * @constructor
  48174. * @since 3.8.0
  48175. *
  48176. * @param {Phaser.Plugins.PluginManager} pluginManager - A reference to the Plugin Manager.
  48177. */
  48178. var BasePlugin = new Class({
  48179. initialize:
  48180. function BasePlugin (pluginManager)
  48181. {
  48182. /**
  48183. * A handy reference to the Plugin Manager that is responsible for this plugin.
  48184. * Can be used as a route to gain access to game systems and events.
  48185. *
  48186. * @name Phaser.Plugins.BasePlugin#pluginManager
  48187. * @type {Phaser.Plugins.PluginManager}
  48188. * @protected
  48189. * @since 3.8.0
  48190. */
  48191. this.pluginManager = pluginManager;
  48192. /**
  48193. * A reference to the Game instance this plugin is running under.
  48194. *
  48195. * @name Phaser.Plugins.BasePlugin#game
  48196. * @type {Phaser.Game}
  48197. * @protected
  48198. * @since 3.8.0
  48199. */
  48200. this.game = pluginManager.game;
  48201. /**
  48202. * A reference to the Scene that has installed this plugin.
  48203. * Only set if it's a Scene Plugin, otherwise `null`.
  48204. * This property is only set when the plugin is instantiated and added to the Scene, not before.
  48205. * You cannot use it during the `init` method, but you can during the `boot` method.
  48206. *
  48207. * @name Phaser.Plugins.BasePlugin#scene
  48208. * @type {?Phaser.Scene}
  48209. * @protected
  48210. * @since 3.8.0
  48211. */
  48212. this.scene;
  48213. /**
  48214. * A reference to the Scene Systems of the Scene that has installed this plugin.
  48215. * Only set if it's a Scene Plugin, otherwise `null`.
  48216. * This property is only set when the plugin is instantiated and added to the Scene, not before.
  48217. * You cannot use it during the `init` method, but you can during the `boot` method.
  48218. *
  48219. * @name Phaser.Plugins.BasePlugin#systems
  48220. * @type {?Phaser.Scenes.Systems}
  48221. * @protected
  48222. * @since 3.8.0
  48223. */
  48224. this.systems;
  48225. },
  48226. /**
  48227. * Called by the PluginManager when this plugin is first instantiated.
  48228. * It will never be called again on this instance.
  48229. * In here you can set-up whatever you need for this plugin to run.
  48230. * If a plugin is set to automatically start then `BasePlugin.start` will be called immediately after this.
  48231. *
  48232. * @method Phaser.Plugins.BasePlugin#init
  48233. * @since 3.8.0
  48234. *
  48235. * @param {?any} [data] - A value specified by the user, if any, from the `data` property of the plugin's configuration object (if started at game boot) or passed in the PluginManager's `install` method (if started manually).
  48236. */
  48237. init: function ()
  48238. {
  48239. },
  48240. /**
  48241. * Called by the PluginManager when this plugin is started.
  48242. * If a plugin is stopped, and then started again, this will get called again.
  48243. * Typically called immediately after `BasePlugin.init`.
  48244. *
  48245. * @method Phaser.Plugins.BasePlugin#start
  48246. * @since 3.8.0
  48247. */
  48248. start: function ()
  48249. {
  48250. // Here are the game-level events you can listen to.
  48251. // At the very least you should offer a destroy handler for when the game closes down.
  48252. // var eventEmitter = this.game.events;
  48253. // eventEmitter.once('destroy', this.gameDestroy, this);
  48254. // eventEmitter.on('pause', this.gamePause, this);
  48255. // eventEmitter.on('resume', this.gameResume, this);
  48256. // eventEmitter.on('resize', this.gameResize, this);
  48257. // eventEmitter.on('prestep', this.gamePreStep, this);
  48258. // eventEmitter.on('step', this.gameStep, this);
  48259. // eventEmitter.on('poststep', this.gamePostStep, this);
  48260. // eventEmitter.on('prerender', this.gamePreRender, this);
  48261. // eventEmitter.on('postrender', this.gamePostRender, this);
  48262. },
  48263. /**
  48264. * Called by the PluginManager when this plugin is stopped.
  48265. * The game code has requested that your plugin stop doing whatever it does.
  48266. * It is now considered as 'inactive' by the PluginManager.
  48267. * Handle that process here (i.e. stop listening for events, etc)
  48268. * If the plugin is started again then `BasePlugin.start` will be called again.
  48269. *
  48270. * @method Phaser.Plugins.BasePlugin#stop
  48271. * @since 3.8.0
  48272. */
  48273. stop: function ()
  48274. {
  48275. },
  48276. /**
  48277. * If this is a Scene Plugin (i.e. installed into a Scene) then this method is called when the Scene boots.
  48278. * By this point the plugin properties `scene` and `systems` will have already been set.
  48279. * In here you can listen for Scene events and set-up whatever you need for this plugin to run.
  48280. *
  48281. * @method Phaser.Plugins.BasePlugin#boot
  48282. * @since 3.8.0
  48283. */
  48284. boot: function ()
  48285. {
  48286. // Here are the Scene events you can listen to.
  48287. // At the very least you should offer a destroy handler for when the Scene closes down.
  48288. // var eventEmitter = this.systems.events;
  48289. // eventEmitter.once('destroy', this.sceneDestroy, this);
  48290. // eventEmitter.on('start', this.sceneStart, this);
  48291. // eventEmitter.on('preupdate', this.scenePreUpdate, this);
  48292. // eventEmitter.on('update', this.sceneUpdate, this);
  48293. // eventEmitter.on('postupdate', this.scenePostUpdate, this);
  48294. // eventEmitter.on('pause', this.scenePause, this);
  48295. // eventEmitter.on('resume', this.sceneResume, this);
  48296. // eventEmitter.on('sleep', this.sceneSleep, this);
  48297. // eventEmitter.on('wake', this.sceneWake, this);
  48298. // eventEmitter.on('shutdown', this.sceneShutdown, this);
  48299. // eventEmitter.on('destroy', this.sceneDestroy, this);
  48300. },
  48301. /**
  48302. * Game instance has been destroyed.
  48303. * You must release everything in here, all references, all objects, free it all up.
  48304. *
  48305. * @method Phaser.Plugins.BasePlugin#destroy
  48306. * @since 3.8.0
  48307. */
  48308. destroy: function ()
  48309. {
  48310. this.pluginManager = null;
  48311. this.game = null;
  48312. this.scene = null;
  48313. this.systems = null;
  48314. }
  48315. });
  48316. module.exports = BasePlugin;
  48317. /***/ }),
  48318. /* 238 */
  48319. /***/ (function(module, exports, __webpack_require__) {
  48320. /**
  48321. * The `Matter.Sleeping` module contains methods to manage the sleeping state of bodies.
  48322. *
  48323. * @class Sleeping
  48324. */
  48325. var Sleeping = {};
  48326. module.exports = Sleeping;
  48327. var Events = __webpack_require__(210);
  48328. (function() {
  48329. Sleeping._motionWakeThreshold = 0.18;
  48330. Sleeping._motionSleepThreshold = 0.08;
  48331. Sleeping._minBias = 0.9;
  48332. /**
  48333. * Puts bodies to sleep or wakes them up depending on their motion.
  48334. * @method update
  48335. * @param {body[]} bodies
  48336. * @param {number} timeScale
  48337. */
  48338. Sleeping.update = function(bodies, timeScale) {
  48339. var timeFactor = timeScale * timeScale * timeScale;
  48340. // update bodies sleeping status
  48341. for (var i = 0; i < bodies.length; i++) {
  48342. var body = bodies[i],
  48343. motion = body.speed * body.speed + body.angularSpeed * body.angularSpeed;
  48344. // wake up bodies if they have a force applied
  48345. if (body.force.x !== 0 || body.force.y !== 0) {
  48346. Sleeping.set(body, false);
  48347. continue;
  48348. }
  48349. var minMotion = Math.min(body.motion, motion),
  48350. maxMotion = Math.max(body.motion, motion);
  48351. // biased average motion estimation between frames
  48352. body.motion = Sleeping._minBias * minMotion + (1 - Sleeping._minBias) * maxMotion;
  48353. if (body.sleepThreshold > 0 && body.motion < Sleeping._motionSleepThreshold * timeFactor) {
  48354. body.sleepCounter += 1;
  48355. if (body.sleepCounter >= body.sleepThreshold)
  48356. Sleeping.set(body, true);
  48357. } else if (body.sleepCounter > 0) {
  48358. body.sleepCounter -= 1;
  48359. }
  48360. }
  48361. };
  48362. /**
  48363. * Given a set of colliding pairs, wakes the sleeping bodies involved.
  48364. * @method afterCollisions
  48365. * @param {pair[]} pairs
  48366. * @param {number} timeScale
  48367. */
  48368. Sleeping.afterCollisions = function(pairs, timeScale) {
  48369. var timeFactor = timeScale * timeScale * timeScale;
  48370. // wake up bodies involved in collisions
  48371. for (var i = 0; i < pairs.length; i++) {
  48372. var pair = pairs[i];
  48373. // don't wake inactive pairs
  48374. if (!pair.isActive)
  48375. continue;
  48376. var collision = pair.collision,
  48377. bodyA = collision.bodyA.parent,
  48378. bodyB = collision.bodyB.parent;
  48379. // don't wake if at least one body is static
  48380. if ((bodyA.isSleeping && bodyB.isSleeping) || bodyA.isStatic || bodyB.isStatic)
  48381. continue;
  48382. if (bodyA.isSleeping || bodyB.isSleeping) {
  48383. var sleepingBody = (bodyA.isSleeping && !bodyA.isStatic) ? bodyA : bodyB,
  48384. movingBody = sleepingBody === bodyA ? bodyB : bodyA;
  48385. if (!sleepingBody.isStatic && movingBody.motion > Sleeping._motionWakeThreshold * timeFactor) {
  48386. Sleeping.set(sleepingBody, false);
  48387. }
  48388. }
  48389. }
  48390. };
  48391. /**
  48392. * Set a body as sleeping or awake.
  48393. * @method set
  48394. * @param {body} body
  48395. * @param {boolean} isSleeping
  48396. */
  48397. Sleeping.set = function(body, isSleeping) {
  48398. var wasSleeping = body.isSleeping;
  48399. if (isSleeping) {
  48400. body.isSleeping = true;
  48401. body.sleepCounter = body.sleepThreshold;
  48402. body.positionImpulse.x = 0;
  48403. body.positionImpulse.y = 0;
  48404. body.positionPrev.x = body.position.x;
  48405. body.positionPrev.y = body.position.y;
  48406. body.anglePrev = body.angle;
  48407. body.speed = 0;
  48408. body.angularSpeed = 0;
  48409. body.motion = 0;
  48410. if (!wasSleeping) {
  48411. Events.trigger(body, 'sleepStart');
  48412. }
  48413. } else {
  48414. body.isSleeping = false;
  48415. body.sleepCounter = 0;
  48416. if (wasSleeping) {
  48417. Events.trigger(body, 'sleepEnd');
  48418. }
  48419. }
  48420. };
  48421. })();
  48422. /***/ }),
  48423. /* 239 */
  48424. /***/ (function(module, exports) {
  48425. /**
  48426. * @author Richard Davey <rich@photonstorm.com>
  48427. * @copyright 2019 Photon Storm Ltd.
  48428. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48429. */
  48430. /**
  48431. * Collision Types - Determine if and how entities collide with each other.
  48432. *
  48433. * In ACTIVE vs. LITE or FIXED vs. ANY collisions, only the "weak" entity moves,
  48434. * while the other one stays fixed. In ACTIVE vs. ACTIVE and ACTIVE vs. PASSIVE
  48435. * collisions, both entities are moved. LITE or PASSIVE entities don't collide
  48436. * with other LITE or PASSIVE entities at all. The behavior for FIXED vs.
  48437. * FIXED collisions is undefined.
  48438. *
  48439. * @name Phaser.Physics.Impact.TYPE
  48440. * @enum {integer}
  48441. * @memberof Phaser.Physics.Impact
  48442. * @readonly
  48443. * @since 3.0.0
  48444. */
  48445. module.exports = {
  48446. /**
  48447. * Collides with nothing.
  48448. *
  48449. * @name Phaser.Physics.Impact.TYPE.NONE
  48450. */
  48451. NONE: 0,
  48452. /**
  48453. * Type A. Collides with Type B.
  48454. *
  48455. * @name Phaser.Physics.Impact.TYPE.A
  48456. */
  48457. A: 1,
  48458. /**
  48459. * Type B. Collides with Type A.
  48460. *
  48461. * @name Phaser.Physics.Impact.TYPE.B
  48462. */
  48463. B: 2,
  48464. /**
  48465. * Collides with both types A and B.
  48466. *
  48467. * @name Phaser.Physics.Impact.TYPE.BOTH
  48468. */
  48469. BOTH: 3
  48470. };
  48471. /***/ }),
  48472. /* 240 */
  48473. /***/ (function(module, exports) {
  48474. /**
  48475. * @author Richard Davey <rich@photonstorm.com>
  48476. * @copyright 2019 Photon Storm Ltd.
  48477. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48478. */
  48479. /**
  48480. * Collision Types - Determine if and how entities collide with each other.
  48481. *
  48482. * In ACTIVE vs. LITE or FIXED vs. ANY collisions, only the "weak" entity moves,
  48483. * while the other one stays fixed. In ACTIVE vs. ACTIVE and ACTIVE vs. PASSIVE
  48484. * collisions, both entities are moved. LITE or PASSIVE entities don't collide
  48485. * with other LITE or PASSIVE entities at all. The behavior for FIXED vs.
  48486. * FIXED collisions is undefined.
  48487. *
  48488. * @name Phaser.Physics.Impact.COLLIDES
  48489. * @enum {integer}
  48490. * @memberof Phaser.Physics.Impact
  48491. * @readonly
  48492. * @since 3.0.0
  48493. */
  48494. module.exports = {
  48495. /**
  48496. * Never collides.
  48497. *
  48498. * @name Phaser.Physics.Impact.COLLIDES.NEVER
  48499. */
  48500. NEVER: 0,
  48501. /**
  48502. * Lite collision.
  48503. *
  48504. * @name Phaser.Physics.Impact.COLLIDES.LITE
  48505. */
  48506. LITE: 1,
  48507. /**
  48508. * Passive collision.
  48509. *
  48510. * @name Phaser.Physics.Impact.COLLIDES.PASSIVE
  48511. */
  48512. PASSIVE: 2,
  48513. /**
  48514. * Active collision.
  48515. *
  48516. * @name Phaser.Physics.Impact.COLLIDES.ACTIVE
  48517. */
  48518. ACTIVE: 4,
  48519. /**
  48520. * Fixed collision.
  48521. *
  48522. * @name Phaser.Physics.Impact.COLLIDES.FIXED
  48523. */
  48524. FIXED: 8
  48525. };
  48526. /***/ }),
  48527. /* 241 */
  48528. /***/ (function(module, exports, __webpack_require__) {
  48529. /**
  48530. * @author Richard Davey <rich@photonstorm.com>
  48531. * @copyright 2019 Photon Storm Ltd.
  48532. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48533. */
  48534. var CircleContains = __webpack_require__(43);
  48535. var Class = __webpack_require__(0);
  48536. var CONST = __webpack_require__(38);
  48537. var RectangleContains = __webpack_require__(42);
  48538. var Vector2 = __webpack_require__(3);
  48539. /**
  48540. * @classdesc
  48541. * A Static Arcade Physics Body.
  48542. *
  48543. * A Static Body never moves, and isn't automatically synchronized with its parent Game Object.
  48544. * That means if you make any change to the parent's origin, position, or scale after creating or adding the body, you'll need to update the Body manually.
  48545. *
  48546. * A Static Body can collide with other Bodies, but is never moved by collisions.
  48547. *
  48548. * Its dynamic counterpart is {@link Phaser.Physics.Arcade.Body}.
  48549. *
  48550. * @class StaticBody
  48551. * @memberof Phaser.Physics.Arcade
  48552. * @constructor
  48553. * @since 3.0.0
  48554. *
  48555. * @param {Phaser.Physics.Arcade.World} world - The Arcade Physics simulation this Static Body belongs to.
  48556. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object this Static Body belongs to.
  48557. */
  48558. var StaticBody = new Class({
  48559. initialize:
  48560. function StaticBody (world, gameObject)
  48561. {
  48562. var width = (gameObject.width) ? gameObject.width : 64;
  48563. var height = (gameObject.height) ? gameObject.height : 64;
  48564. /**
  48565. * The Arcade Physics simulation this Static Body belongs to.
  48566. *
  48567. * @name Phaser.Physics.Arcade.StaticBody#world
  48568. * @type {Phaser.Physics.Arcade.World}
  48569. * @since 3.0.0
  48570. */
  48571. this.world = world;
  48572. /**
  48573. * The Game Object this Static Body belongs to.
  48574. *
  48575. * @name Phaser.Physics.Arcade.StaticBody#gameObject
  48576. * @type {Phaser.GameObjects.GameObject}
  48577. * @since 3.0.0
  48578. */
  48579. this.gameObject = gameObject;
  48580. /**
  48581. * Whether the Static Body's boundary is drawn to the debug display.
  48582. *
  48583. * @name Phaser.Physics.Arcade.StaticBody#debugShowBody
  48584. * @type {boolean}
  48585. * @since 3.0.0
  48586. */
  48587. this.debugShowBody = world.defaults.debugShowStaticBody;
  48588. /**
  48589. * The color of this Static Body on the debug display.
  48590. *
  48591. * @name Phaser.Physics.Arcade.StaticBody#debugBodyColor
  48592. * @type {integer}
  48593. * @since 3.0.0
  48594. */
  48595. this.debugBodyColor = world.defaults.staticBodyDebugColor;
  48596. /**
  48597. * Whether this Static Body is updated by the physics simulation.
  48598. *
  48599. * @name Phaser.Physics.Arcade.StaticBody#enable
  48600. * @type {boolean}
  48601. * @default true
  48602. * @since 3.0.0
  48603. */
  48604. this.enable = true;
  48605. /**
  48606. * Whether this Static Body's boundary is circular (`true`) or rectangular (`false`).
  48607. *
  48608. * @name Phaser.Physics.Arcade.StaticBody#isCircle
  48609. * @type {boolean}
  48610. * @default false
  48611. * @since 3.0.0
  48612. */
  48613. this.isCircle = false;
  48614. /**
  48615. * If this Static Body is circular, this is the unscaled radius of the Static Body's boundary, as set by {@link #setCircle}, in source pixels.
  48616. * The true radius is equal to `halfWidth`.
  48617. *
  48618. * @name Phaser.Physics.Arcade.StaticBody#radius
  48619. * @type {number}
  48620. * @default 0
  48621. * @since 3.0.0
  48622. */
  48623. this.radius = 0;
  48624. /**
  48625. * The offset of this Static Body's actual position from any updated position.
  48626. *
  48627. * Unlike a dynamic Body, a Static Body does not follow its Game Object. As such, this offset is only applied when resizing the Static Body.
  48628. *
  48629. * @name Phaser.Physics.Arcade.StaticBody#offset
  48630. * @type {Phaser.Math.Vector2}
  48631. * @since 3.0.0
  48632. */
  48633. this.offset = new Vector2();
  48634. /**
  48635. * The position of this Static Body within the simulation.
  48636. *
  48637. * @name Phaser.Physics.Arcade.StaticBody#position
  48638. * @type {Phaser.Math.Vector2}
  48639. * @since 3.0.0
  48640. */
  48641. this.position = new Vector2(gameObject.x - gameObject.displayOriginX, gameObject.y - gameObject.displayOriginY);
  48642. /**
  48643. * The width of the Static Body's boundary, in pixels.
  48644. * If the Static Body is circular, this is also the Static Body's diameter.
  48645. *
  48646. * @name Phaser.Physics.Arcade.StaticBody#width
  48647. * @type {number}
  48648. * @since 3.0.0
  48649. */
  48650. this.width = width;
  48651. /**
  48652. * The height of the Static Body's boundary, in pixels.
  48653. * If the Static Body is circular, this is also the Static Body's diameter.
  48654. *
  48655. * @name Phaser.Physics.Arcade.StaticBody#height
  48656. * @type {number}
  48657. * @since 3.0.0
  48658. */
  48659. this.height = height;
  48660. /**
  48661. * Half the Static Body's width, in pixels.
  48662. * If the Static Body is circular, this is also the Static Body's radius.
  48663. *
  48664. * @name Phaser.Physics.Arcade.StaticBody#halfWidth
  48665. * @type {number}
  48666. * @since 3.0.0
  48667. */
  48668. this.halfWidth = Math.abs(this.width / 2);
  48669. /**
  48670. * Half the Static Body's height, in pixels.
  48671. * If the Static Body is circular, this is also the Static Body's radius.
  48672. *
  48673. * @name Phaser.Physics.Arcade.StaticBody#halfHeight
  48674. * @type {number}
  48675. * @since 3.0.0
  48676. */
  48677. this.halfHeight = Math.abs(this.height / 2);
  48678. /**
  48679. * The center of the Static Body's boundary.
  48680. * This is the midpoint of its `position` (top-left corner) and its bottom-right corner.
  48681. *
  48682. * @name Phaser.Physics.Arcade.StaticBody#center
  48683. * @type {Phaser.Math.Vector2}
  48684. * @since 3.0.0
  48685. */
  48686. this.center = new Vector2(gameObject.x + this.halfWidth, gameObject.y + this.halfHeight);
  48687. /**
  48688. * A constant zero velocity used by the Arcade Physics simulation for calculations.
  48689. *
  48690. * @name Phaser.Physics.Arcade.StaticBody#velocity
  48691. * @type {Phaser.Math.Vector2}
  48692. * @readonly
  48693. * @since 3.0.0
  48694. */
  48695. this.velocity = Vector2.ZERO;
  48696. /**
  48697. * A constant `false` value expected by the Arcade Physics simulation.
  48698. *
  48699. * @name Phaser.Physics.Arcade.StaticBody#allowGravity
  48700. * @type {boolean}
  48701. * @readonly
  48702. * @default false
  48703. * @since 3.0.0
  48704. */
  48705. this.allowGravity = false;
  48706. /**
  48707. * Gravitational force applied specifically to this Body. Values are in pixels per second squared. Always zero for a Static Body.
  48708. *
  48709. * @name Phaser.Physics.Arcade.StaticBody#gravity
  48710. * @type {Phaser.Math.Vector2}
  48711. * @readonly
  48712. * @since 3.0.0
  48713. */
  48714. this.gravity = Vector2.ZERO;
  48715. /**
  48716. * Rebound, or restitution, following a collision, relative to 1. Always zero for a Static Body.
  48717. *
  48718. * @name Phaser.Physics.Arcade.StaticBody#bounce
  48719. * @type {Phaser.Math.Vector2}
  48720. * @readonly
  48721. * @since 3.0.0
  48722. */
  48723. this.bounce = Vector2.ZERO;
  48724. // If true this Body will dispatch events
  48725. /**
  48726. * Whether the simulation emits a `worldbounds` event when this StaticBody collides with the world boundary.
  48727. * Always false for a Static Body. (Static Bodies never collide with the world boundary and never trigger a `worldbounds` event.)
  48728. *
  48729. * @name Phaser.Physics.Arcade.StaticBody#onWorldBounds
  48730. * @type {boolean}
  48731. * @readonly
  48732. * @default false
  48733. * @since 3.0.0
  48734. */
  48735. this.onWorldBounds = false;
  48736. /**
  48737. * Whether the simulation emits a `collide` event when this StaticBody collides with another.
  48738. *
  48739. * @name Phaser.Physics.Arcade.StaticBody#onCollide
  48740. * @type {boolean}
  48741. * @default false
  48742. * @since 3.0.0
  48743. */
  48744. this.onCollide = false;
  48745. /**
  48746. * Whether the simulation emits an `overlap` event when this StaticBody overlaps with another.
  48747. *
  48748. * @name Phaser.Physics.Arcade.StaticBody#onOverlap
  48749. * @type {boolean}
  48750. * @default false
  48751. * @since 3.0.0
  48752. */
  48753. this.onOverlap = false;
  48754. /**
  48755. * The StaticBody's inertia, relative to a default unit (1). With `bounce`, this affects the exchange of momentum (velocities) during collisions.
  48756. *
  48757. * @name Phaser.Physics.Arcade.StaticBody#mass
  48758. * @type {number}
  48759. * @default 1
  48760. * @since 3.0.0
  48761. */
  48762. this.mass = 1;
  48763. /**
  48764. * Whether this object can be moved by collisions with another body.
  48765. *
  48766. * @name Phaser.Physics.Arcade.StaticBody#immovable
  48767. * @type {boolean}
  48768. * @default true
  48769. * @since 3.0.0
  48770. */
  48771. this.immovable = true;
  48772. /**
  48773. * A flag disabling the default horizontal separation of colliding bodies. Pass your own `collideHandler` to the collider.
  48774. *
  48775. * @name Phaser.Physics.Arcade.StaticBody#customSeparateX
  48776. * @type {boolean}
  48777. * @default false
  48778. * @since 3.0.0
  48779. */
  48780. this.customSeparateX = false;
  48781. /**
  48782. * A flag disabling the default vertical separation of colliding bodies. Pass your own `collideHandler` to the collider.
  48783. *
  48784. * @name Phaser.Physics.Arcade.StaticBody#customSeparateY
  48785. * @type {boolean}
  48786. * @default false
  48787. * @since 3.0.0
  48788. */
  48789. this.customSeparateY = false;
  48790. /**
  48791. * The amount of horizontal overlap (before separation), if this Body is colliding with another.
  48792. *
  48793. * @name Phaser.Physics.Arcade.StaticBody#overlapX
  48794. * @type {number}
  48795. * @default 0
  48796. * @since 3.0.0
  48797. */
  48798. this.overlapX = 0;
  48799. /**
  48800. * The amount of vertical overlap (before separation), if this Body is colliding with another.
  48801. *
  48802. * @name Phaser.Physics.Arcade.StaticBody#overlapY
  48803. * @type {number}
  48804. * @default 0
  48805. * @since 3.0.0
  48806. */
  48807. this.overlapY = 0;
  48808. /**
  48809. * The amount of overlap (before separation), if this StaticBody is circular and colliding with another circular body.
  48810. *
  48811. * @name Phaser.Physics.Arcade.StaticBody#overlapR
  48812. * @type {number}
  48813. * @default 0
  48814. * @since 3.0.0
  48815. */
  48816. this.overlapR = 0;
  48817. /**
  48818. * Whether this StaticBody has ever overlapped with another while both were not moving.
  48819. *
  48820. * @name Phaser.Physics.Arcade.StaticBody#embedded
  48821. * @type {boolean}
  48822. * @default false
  48823. * @since 3.0.0
  48824. */
  48825. this.embedded = false;
  48826. /**
  48827. * Whether this StaticBody interacts with the world boundary.
  48828. * Always false for a Static Body. (Static Bodies never collide with the world boundary.)
  48829. *
  48830. * @name Phaser.Physics.Arcade.StaticBody#collideWorldBounds
  48831. * @type {boolean}
  48832. * @readonly
  48833. * @default false
  48834. * @since 3.0.0
  48835. */
  48836. this.collideWorldBounds = false;
  48837. /**
  48838. * Whether this StaticBody is checked for collisions and for which directions. You can set `checkCollision.none = false` to disable collision checks.
  48839. *
  48840. * @name Phaser.Physics.Arcade.StaticBody#checkCollision
  48841. * @type {ArcadeBodyCollision}
  48842. * @since 3.0.0
  48843. */
  48844. this.checkCollision = { none: false, up: true, down: true, left: true, right: true };
  48845. /**
  48846. * Whether this StaticBody has ever collided with another body and in which direction.
  48847. *
  48848. * @name Phaser.Physics.Arcade.StaticBody#touching
  48849. * @type {ArcadeBodyCollision}
  48850. * @since 3.0.0
  48851. */
  48852. this.touching = { none: true, up: false, down: false, left: false, right: false };
  48853. /**
  48854. * Whether this StaticBody was colliding with another body during the last step or any previous step, and in which direction.
  48855. *
  48856. * @name Phaser.Physics.Arcade.StaticBody#wasTouching
  48857. * @type {ArcadeBodyCollision}
  48858. * @since 3.0.0
  48859. */
  48860. this.wasTouching = { none: true, up: false, down: false, left: false, right: false };
  48861. /**
  48862. * Whether this StaticBody has ever collided with a tile or the world boundary.
  48863. *
  48864. * @name Phaser.Physics.Arcade.StaticBody#blocked
  48865. * @type {ArcadeBodyCollision}
  48866. * @since 3.0.0
  48867. */
  48868. this.blocked = { none: true, up: false, down: false, left: false, right: false };
  48869. /**
  48870. * The StaticBody's physics type (static by default).
  48871. *
  48872. * @name Phaser.Physics.Arcade.StaticBody#physicsType
  48873. * @type {integer}
  48874. * @default Phaser.Physics.Arcade.STATIC_BODY
  48875. * @since 3.0.0
  48876. */
  48877. this.physicsType = CONST.STATIC_BODY;
  48878. /**
  48879. * The calculated change in the Body's horizontal position during the current step.
  48880. * For a static body this is always zero.
  48881. *
  48882. * @name Phaser.Physics.Arcade.StaticBody#_dx
  48883. * @type {number}
  48884. * @private
  48885. * @default 0
  48886. * @since 3.10.0
  48887. */
  48888. this._dx = 0;
  48889. /**
  48890. * The calculated change in the Body's vertical position during the current step.
  48891. * For a static body this is always zero.
  48892. *
  48893. * @name Phaser.Physics.Arcade.StaticBody#_dy
  48894. * @type {number}
  48895. * @private
  48896. * @default 0
  48897. * @since 3.10.0
  48898. */
  48899. this._dy = 0;
  48900. },
  48901. /**
  48902. * Changes the Game Object this Body is bound to.
  48903. * First it removes its reference from the old Game Object, then sets the new one.
  48904. * You can optionally update the position and dimensions of this Body to reflect that of the new Game Object.
  48905. *
  48906. * @method Phaser.Physics.Arcade.StaticBody#setGameObject
  48907. * @since 3.1.0
  48908. *
  48909. * @param {Phaser.GameObjects.GameObject} gameObject - The new Game Object that will own this Body.
  48910. * @param {boolean} [update=true] - Reposition and resize this Body to match the new Game Object?
  48911. *
  48912. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  48913. *
  48914. * @see Phaser.Physics.Arcade.StaticBody#updateFromGameObject
  48915. */
  48916. setGameObject: function (gameObject, update)
  48917. {
  48918. if (gameObject && gameObject !== this.gameObject)
  48919. {
  48920. // Remove this body from the old game object
  48921. this.gameObject.body = null;
  48922. gameObject.body = this;
  48923. // Update our reference
  48924. this.gameObject = gameObject;
  48925. }
  48926. if (update)
  48927. {
  48928. this.updateFromGameObject();
  48929. }
  48930. return this;
  48931. },
  48932. /**
  48933. * Updates this Static Body so that its position and dimensions are updated
  48934. * based on the current Game Object it is bound to.
  48935. *
  48936. * @method Phaser.Physics.Arcade.StaticBody#updateFromGameObject
  48937. * @since 3.1.0
  48938. *
  48939. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  48940. */
  48941. updateFromGameObject: function ()
  48942. {
  48943. this.world.staticTree.remove(this);
  48944. var gameObject = this.gameObject;
  48945. gameObject.getTopLeft(this.position);
  48946. this.width = gameObject.displayWidth;
  48947. this.height = gameObject.displayHeight;
  48948. this.halfWidth = Math.abs(this.width / 2);
  48949. this.halfHeight = Math.abs(this.height / 2);
  48950. this.center.set(this.position.x + this.halfWidth, this.position.y + this.halfHeight);
  48951. this.world.staticTree.insert(this);
  48952. return this;
  48953. },
  48954. /**
  48955. * Sets the offset of the body.
  48956. *
  48957. * @method Phaser.Physics.Arcade.StaticBody#setOffset
  48958. * @since 3.4.0
  48959. *
  48960. * @param {number} x - The horizontal offset of the Body from the Game Object's center.
  48961. * @param {number} y - The vertical offset of the Body from the Game Object's center.
  48962. *
  48963. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  48964. */
  48965. setOffset: function (x, y)
  48966. {
  48967. if (y === undefined) { y = x; }
  48968. this.world.staticTree.remove(this);
  48969. this.position.x -= this.offset.x;
  48970. this.position.y -= this.offset.y;
  48971. this.offset.set(x, y);
  48972. this.position.x += this.offset.x;
  48973. this.position.y += this.offset.y;
  48974. this.updateCenter();
  48975. this.world.staticTree.insert(this);
  48976. return this;
  48977. },
  48978. /**
  48979. * Sets the size of the body.
  48980. * Resets the width and height to match current frame, if no width and height provided and a frame is found.
  48981. *
  48982. * @method Phaser.Physics.Arcade.StaticBody#setSize
  48983. * @since 3.0.0
  48984. *
  48985. * @param {integer} [width] - The width of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame width.
  48986. * @param {integer} [height] - The height of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame height.
  48987. * @param {number} [offsetX] - The horizontal offset of the Body from the Game Object's center.
  48988. * @param {number} [offsetY] - The vertical offset of the Body from the Game Object's center.
  48989. *
  48990. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  48991. */
  48992. setSize: function (width, height, offsetX, offsetY)
  48993. {
  48994. if (offsetX === undefined) { offsetX = this.offset.x; }
  48995. if (offsetY === undefined) { offsetY = this.offset.y; }
  48996. var gameObject = this.gameObject;
  48997. if (!width && gameObject.frame)
  48998. {
  48999. width = gameObject.frame.realWidth;
  49000. }
  49001. if (!height && gameObject.frame)
  49002. {
  49003. height = gameObject.frame.realHeight;
  49004. }
  49005. this.world.staticTree.remove(this);
  49006. this.width = width;
  49007. this.height = height;
  49008. this.halfWidth = Math.floor(width / 2);
  49009. this.halfHeight = Math.floor(height / 2);
  49010. this.offset.set(offsetX, offsetY);
  49011. this.updateCenter();
  49012. this.isCircle = false;
  49013. this.radius = 0;
  49014. this.world.staticTree.insert(this);
  49015. return this;
  49016. },
  49017. /**
  49018. * Sets this Static Body to have a circular body and sets its sizes and position.
  49019. *
  49020. * @method Phaser.Physics.Arcade.StaticBody#setCircle
  49021. * @since 3.0.0
  49022. *
  49023. * @param {number} radius - The radius of the StaticBody, in pixels.
  49024. * @param {number} [offsetX] - The horizontal offset of the StaticBody from its Game Object, in pixels.
  49025. * @param {number} [offsetY] - The vertical offset of the StaticBody from its Game Object, in pixels.
  49026. *
  49027. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  49028. */
  49029. setCircle: function (radius, offsetX, offsetY)
  49030. {
  49031. if (offsetX === undefined) { offsetX = this.offset.x; }
  49032. if (offsetY === undefined) { offsetY = this.offset.y; }
  49033. if (radius > 0)
  49034. {
  49035. this.world.staticTree.remove(this);
  49036. this.isCircle = true;
  49037. this.radius = radius;
  49038. this.width = radius * 2;
  49039. this.height = radius * 2;
  49040. this.halfWidth = Math.floor(this.width / 2);
  49041. this.halfHeight = Math.floor(this.height / 2);
  49042. this.offset.set(offsetX, offsetY);
  49043. this.updateCenter();
  49044. this.world.staticTree.insert(this);
  49045. }
  49046. else
  49047. {
  49048. this.isCircle = false;
  49049. }
  49050. return this;
  49051. },
  49052. /**
  49053. * Updates the StaticBody's `center` from its `position` and dimensions.
  49054. *
  49055. * @method Phaser.Physics.Arcade.StaticBody#updateCenter
  49056. * @since 3.0.0
  49057. */
  49058. updateCenter: function ()
  49059. {
  49060. this.center.set(this.position.x + this.halfWidth, this.position.y + this.halfHeight);
  49061. },
  49062. /**
  49063. * Resets this Body to the given coordinates. Also positions its parent Game Object to the same coordinates.
  49064. * Similar to `updateFromGameObject`, but doesn't modify the Body's dimensions.
  49065. *
  49066. * @method Phaser.Physics.Arcade.StaticBody#reset
  49067. * @since 3.0.0
  49068. *
  49069. * @param {number} [x] - The x coordinate to reset the body to. If not given will use the parent Game Object's coordinate.
  49070. * @param {number} [y] - The y coordinate to reset the body to. If not given will use the parent Game Object's coordinate.
  49071. */
  49072. reset: function (x, y)
  49073. {
  49074. var gameObject = this.gameObject;
  49075. if (x === undefined) { x = gameObject.x; }
  49076. if (y === undefined) { y = gameObject.y; }
  49077. this.world.staticTree.remove(this);
  49078. gameObject.setPosition(x, y);
  49079. gameObject.getTopLeft(this.position);
  49080. this.updateCenter();
  49081. this.world.staticTree.insert(this);
  49082. },
  49083. /**
  49084. * NOOP function. A Static Body cannot be stopped.
  49085. *
  49086. * @method Phaser.Physics.Arcade.StaticBody#stop
  49087. * @since 3.0.0
  49088. *
  49089. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  49090. */
  49091. stop: function ()
  49092. {
  49093. return this;
  49094. },
  49095. /**
  49096. * Returns the x and y coordinates of the top left and bottom right points of the StaticBody.
  49097. *
  49098. * @method Phaser.Physics.Arcade.StaticBody#getBounds
  49099. * @since 3.0.0
  49100. *
  49101. * @param {ArcadeBodyBounds} obj - The object which will hold the coordinates of the bounds.
  49102. *
  49103. * @return {ArcadeBodyBounds} The same object that was passed with `x`, `y`, `right` and `bottom` values matching the respective values of the StaticBody.
  49104. */
  49105. getBounds: function (obj)
  49106. {
  49107. obj.x = this.x;
  49108. obj.y = this.y;
  49109. obj.right = this.right;
  49110. obj.bottom = this.bottom;
  49111. return obj;
  49112. },
  49113. /**
  49114. * Checks to see if a given x,y coordinate is colliding with this Static Body.
  49115. *
  49116. * @method Phaser.Physics.Arcade.StaticBody#hitTest
  49117. * @since 3.0.0
  49118. *
  49119. * @param {number} x - The x coordinate to check against this body.
  49120. * @param {number} y - The y coordinate to check against this body.
  49121. *
  49122. * @return {boolean} `true` if the given coordinate lies within this body, otherwise `false`.
  49123. */
  49124. hitTest: function (x, y)
  49125. {
  49126. return (this.isCircle) ? CircleContains(this, x, y) : RectangleContains(this, x, y);
  49127. },
  49128. /**
  49129. * NOOP
  49130. *
  49131. * @method Phaser.Physics.Arcade.StaticBody#postUpdate
  49132. * @since 3.12.0
  49133. */
  49134. postUpdate: function ()
  49135. {
  49136. },
  49137. /**
  49138. * The absolute (non-negative) change in this StaticBody's horizontal position from the previous step. Always zero.
  49139. *
  49140. * @method Phaser.Physics.Arcade.StaticBody#deltaAbsX
  49141. * @since 3.0.0
  49142. *
  49143. * @return {number} Always zero for a Static Body.
  49144. */
  49145. deltaAbsX: function ()
  49146. {
  49147. return 0;
  49148. },
  49149. /**
  49150. * The absolute (non-negative) change in this StaticBody's vertical position from the previous step. Always zero.
  49151. *
  49152. * @method Phaser.Physics.Arcade.StaticBody#deltaAbsY
  49153. * @since 3.0.0
  49154. *
  49155. * @return {number} Always zero for a Static Body.
  49156. */
  49157. deltaAbsY: function ()
  49158. {
  49159. return 0;
  49160. },
  49161. /**
  49162. * The change in this StaticBody's horizontal position from the previous step. Always zero.
  49163. *
  49164. * @method Phaser.Physics.Arcade.StaticBody#deltaX
  49165. * @since 3.0.0
  49166. *
  49167. * @return {number} The change in this StaticBody's velocity from the previous step. Always zero.
  49168. */
  49169. deltaX: function ()
  49170. {
  49171. return 0;
  49172. },
  49173. /**
  49174. * The change in this StaticBody's vertical position from the previous step. Always zero.
  49175. *
  49176. * @method Phaser.Physics.Arcade.StaticBody#deltaY
  49177. * @since 3.0.0
  49178. *
  49179. * @return {number} The change in this StaticBody's velocity from the previous step. Always zero.
  49180. */
  49181. deltaY: function ()
  49182. {
  49183. return 0;
  49184. },
  49185. /**
  49186. * The change in this StaticBody's rotation from the previous step. Always zero.
  49187. *
  49188. * @method Phaser.Physics.Arcade.StaticBody#deltaZ
  49189. * @since 3.0.0
  49190. *
  49191. * @return {number} The change in this StaticBody's rotation from the previous step. Always zero.
  49192. */
  49193. deltaZ: function ()
  49194. {
  49195. return 0;
  49196. },
  49197. /**
  49198. * Disables this Body and marks it for destruction during the next step.
  49199. *
  49200. * @method Phaser.Physics.Arcade.StaticBody#destroy
  49201. * @since 3.0.0
  49202. */
  49203. destroy: function ()
  49204. {
  49205. this.enable = false;
  49206. this.world.pendingDestroy.set(this);
  49207. },
  49208. /**
  49209. * Draws a graphical representation of the StaticBody for visual debugging purposes.
  49210. *
  49211. * @method Phaser.Physics.Arcade.StaticBody#drawDebug
  49212. * @since 3.0.0
  49213. *
  49214. * @param {Phaser.GameObjects.Graphics} graphic - The Graphics object to use for the debug drawing of the StaticBody.
  49215. */
  49216. drawDebug: function (graphic)
  49217. {
  49218. var pos = this.position;
  49219. var x = pos.x + this.halfWidth;
  49220. var y = pos.y + this.halfHeight;
  49221. if (this.debugShowBody)
  49222. {
  49223. graphic.lineStyle(1, this.debugBodyColor, 1);
  49224. if (this.isCircle)
  49225. {
  49226. graphic.strokeCircle(x, y, this.width / 2);
  49227. }
  49228. else
  49229. {
  49230. graphic.strokeRect(pos.x, pos.y, this.width, this.height);
  49231. }
  49232. }
  49233. },
  49234. /**
  49235. * Indicates whether the StaticBody is going to be showing a debug visualization during postUpdate.
  49236. *
  49237. * @method Phaser.Physics.Arcade.StaticBody#willDrawDebug
  49238. * @since 3.0.0
  49239. *
  49240. * @return {boolean} Whether or not the StaticBody is going to show the debug visualization during postUpdate.
  49241. */
  49242. willDrawDebug: function ()
  49243. {
  49244. return this.debugShowBody;
  49245. },
  49246. /**
  49247. * Sets the Mass of the StaticBody. Will set the Mass to 0.1 if the value passed is less than or equal to zero.
  49248. *
  49249. * @method Phaser.Physics.Arcade.StaticBody#setMass
  49250. * @since 3.0.0
  49251. *
  49252. * @param {number} value - The value to set the Mass to. Values of zero or less are changed to 0.1.
  49253. *
  49254. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  49255. */
  49256. setMass: function (value)
  49257. {
  49258. if (value <= 0)
  49259. {
  49260. // Causes havoc otherwise
  49261. value = 0.1;
  49262. }
  49263. this.mass = value;
  49264. return this;
  49265. },
  49266. /**
  49267. * The x coordinate of the StaticBody.
  49268. *
  49269. * @name Phaser.Physics.Arcade.StaticBody#x
  49270. * @type {number}
  49271. * @since 3.0.0
  49272. */
  49273. x: {
  49274. get: function ()
  49275. {
  49276. return this.position.x;
  49277. },
  49278. set: function (value)
  49279. {
  49280. this.world.staticTree.remove(this);
  49281. this.position.x = value;
  49282. this.world.staticTree.insert(this);
  49283. }
  49284. },
  49285. /**
  49286. * The y coordinate of the StaticBody.
  49287. *
  49288. * @name Phaser.Physics.Arcade.StaticBody#y
  49289. * @type {number}
  49290. * @since 3.0.0
  49291. */
  49292. y: {
  49293. get: function ()
  49294. {
  49295. return this.position.y;
  49296. },
  49297. set: function (value)
  49298. {
  49299. this.world.staticTree.remove(this);
  49300. this.position.y = value;
  49301. this.world.staticTree.insert(this);
  49302. }
  49303. },
  49304. /**
  49305. * Returns the left-most x coordinate of the area of the StaticBody.
  49306. *
  49307. * @name Phaser.Physics.Arcade.StaticBody#left
  49308. * @type {number}
  49309. * @readonly
  49310. * @since 3.0.0
  49311. */
  49312. left: {
  49313. get: function ()
  49314. {
  49315. return this.position.x;
  49316. }
  49317. },
  49318. /**
  49319. * The right-most x coordinate of the area of the StaticBody.
  49320. *
  49321. * @name Phaser.Physics.Arcade.StaticBody#right
  49322. * @type {number}
  49323. * @readonly
  49324. * @since 3.0.0
  49325. */
  49326. right: {
  49327. get: function ()
  49328. {
  49329. return this.position.x + this.width;
  49330. }
  49331. },
  49332. /**
  49333. * The highest y coordinate of the area of the StaticBody.
  49334. *
  49335. * @name Phaser.Physics.Arcade.StaticBody#top
  49336. * @type {number}
  49337. * @readonly
  49338. * @since 3.0.0
  49339. */
  49340. top: {
  49341. get: function ()
  49342. {
  49343. return this.position.y;
  49344. }
  49345. },
  49346. /**
  49347. * The lowest y coordinate of the area of the StaticBody. (y + height)
  49348. *
  49349. * @name Phaser.Physics.Arcade.StaticBody#bottom
  49350. * @type {number}
  49351. * @readonly
  49352. * @since 3.0.0
  49353. */
  49354. bottom: {
  49355. get: function ()
  49356. {
  49357. return this.position.y + this.height;
  49358. }
  49359. }
  49360. });
  49361. module.exports = StaticBody;
  49362. /***/ }),
  49363. /* 242 */
  49364. /***/ (function(module, exports) {
  49365. /**
  49366. * @author Richard Davey <rich@photonstorm.com>
  49367. * @copyright 2019 Photon Storm Ltd.
  49368. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49369. */
  49370. /**
  49371. * Checks for intersection between the given tile rectangle-like object and an Arcade Physics body.
  49372. *
  49373. * @function Phaser.Physics.Arcade.Tilemap.TileIntersectsBody
  49374. * @since 3.0.0
  49375. *
  49376. * @param {{ left: number, right: number, top: number, bottom: number }} tileWorldRect - A rectangle object that defines the tile placement in the world.
  49377. * @param {Phaser.Physics.Arcade.Body} body - The body to check for intersection against.
  49378. *
  49379. * @return {boolean} Returns `true` of the tile intersects with the body, otherwise `false`.
  49380. */
  49381. var TileIntersectsBody = function (tileWorldRect, body)
  49382. {
  49383. // Currently, all bodies are treated as rectangles when colliding with a Tile.
  49384. return !(
  49385. body.right <= tileWorldRect.left ||
  49386. body.bottom <= tileWorldRect.top ||
  49387. body.position.x >= tileWorldRect.right ||
  49388. body.position.y >= tileWorldRect.bottom
  49389. );
  49390. };
  49391. module.exports = TileIntersectsBody;
  49392. /***/ }),
  49393. /* 243 */
  49394. /***/ (function(module, exports, __webpack_require__) {
  49395. /**
  49396. * @author Richard Davey <rich@photonstorm.com>
  49397. * @copyright 2019 Photon Storm Ltd.
  49398. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49399. */
  49400. var quickselect = __webpack_require__(317);
  49401. /**
  49402. * @classdesc
  49403. * RBush is a high-performance JavaScript library for 2D spatial indexing of points and rectangles.
  49404. * It's based on an optimized R-tree data structure with bulk insertion support.
  49405. *
  49406. * Spatial index is a special data structure for points and rectangles that allows you to perform queries like
  49407. * "all items within this bounding box" very efficiently (e.g. hundreds of times faster than looping over all items).
  49408. *
  49409. * This version of RBush uses a fixed min/max accessor structure of `[ '.left', '.top', '.right', '.bottom' ]`.
  49410. * This is to avoid the eval like function creation that the original library used, which caused CSP policy violations.
  49411. *
  49412. * @class RTree
  49413. * @memberof Phaser.Structs
  49414. * @constructor
  49415. * @since 3.0.0
  49416. */
  49417. function rbush (maxEntries)
  49418. {
  49419. var format = [ '.left', '.top', '.right', '.bottom' ];
  49420. if (!(this instanceof rbush)) return new rbush(maxEntries, format);
  49421. // max entries in a node is 9 by default; min node fill is 40% for best performance
  49422. this._maxEntries = Math.max(4, maxEntries || 9);
  49423. this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
  49424. this.clear();
  49425. }
  49426. rbush.prototype = {
  49427. all: function ()
  49428. {
  49429. return this._all(this.data, []);
  49430. },
  49431. search: function (bbox)
  49432. {
  49433. var node = this.data,
  49434. result = [],
  49435. toBBox = this.toBBox;
  49436. if (!intersects(bbox, node)) return result;
  49437. var nodesToSearch = [],
  49438. i, len, child, childBBox;
  49439. while (node) {
  49440. for (i = 0, len = node.children.length; i < len; i++) {
  49441. child = node.children[i];
  49442. childBBox = node.leaf ? toBBox(child) : child;
  49443. if (intersects(bbox, childBBox)) {
  49444. if (node.leaf) result.push(child);
  49445. else if (contains(bbox, childBBox)) this._all(child, result);
  49446. else nodesToSearch.push(child);
  49447. }
  49448. }
  49449. node = nodesToSearch.pop();
  49450. }
  49451. return result;
  49452. },
  49453. collides: function (bbox)
  49454. {
  49455. var node = this.data,
  49456. toBBox = this.toBBox;
  49457. if (!intersects(bbox, node)) return false;
  49458. var nodesToSearch = [],
  49459. i, len, child, childBBox;
  49460. while (node) {
  49461. for (i = 0, len = node.children.length; i < len; i++) {
  49462. child = node.children[i];
  49463. childBBox = node.leaf ? toBBox(child) : child;
  49464. if (intersects(bbox, childBBox)) {
  49465. if (node.leaf || contains(bbox, childBBox)) return true;
  49466. nodesToSearch.push(child);
  49467. }
  49468. }
  49469. node = nodesToSearch.pop();
  49470. }
  49471. return false;
  49472. },
  49473. load: function (data)
  49474. {
  49475. if (!(data && data.length)) return this;
  49476. if (data.length < this._minEntries) {
  49477. for (var i = 0, len = data.length; i < len; i++) {
  49478. this.insert(data[i]);
  49479. }
  49480. return this;
  49481. }
  49482. // recursively build the tree with the given data from scratch using OMT algorithm
  49483. var node = this._build(data.slice(), 0, data.length - 1, 0);
  49484. if (!this.data.children.length) {
  49485. // save as is if tree is empty
  49486. this.data = node;
  49487. } else if (this.data.height === node.height) {
  49488. // split root if trees have the same height
  49489. this._splitRoot(this.data, node);
  49490. } else {
  49491. if (this.data.height < node.height) {
  49492. // swap trees if inserted one is bigger
  49493. var tmpNode = this.data;
  49494. this.data = node;
  49495. node = tmpNode;
  49496. }
  49497. // insert the small tree into the large tree at appropriate level
  49498. this._insert(node, this.data.height - node.height - 1, true);
  49499. }
  49500. return this;
  49501. },
  49502. insert: function (item)
  49503. {
  49504. if (item) this._insert(item, this.data.height - 1);
  49505. return this;
  49506. },
  49507. clear: function ()
  49508. {
  49509. this.data = createNode([]);
  49510. return this;
  49511. },
  49512. remove: function (item, equalsFn)
  49513. {
  49514. if (!item) return this;
  49515. var node = this.data,
  49516. bbox = this.toBBox(item),
  49517. path = [],
  49518. indexes = [],
  49519. i, parent, index, goingUp;
  49520. // depth-first iterative tree traversal
  49521. while (node || path.length) {
  49522. if (!node) { // go up
  49523. node = path.pop();
  49524. parent = path[path.length - 1];
  49525. i = indexes.pop();
  49526. goingUp = true;
  49527. }
  49528. if (node.leaf) { // check current node
  49529. index = findItem(item, node.children, equalsFn);
  49530. if (index !== -1) {
  49531. // item found, remove the item and condense tree upwards
  49532. node.children.splice(index, 1);
  49533. path.push(node);
  49534. this._condense(path);
  49535. return this;
  49536. }
  49537. }
  49538. if (!goingUp && !node.leaf && contains(node, bbox)) { // go down
  49539. path.push(node);
  49540. indexes.push(i);
  49541. i = 0;
  49542. parent = node;
  49543. node = node.children[0];
  49544. } else if (parent) { // go right
  49545. i++;
  49546. node = parent.children[i];
  49547. goingUp = false;
  49548. } else node = null; // nothing found
  49549. }
  49550. return this;
  49551. },
  49552. toBBox: function (item) { return item; },
  49553. compareMinX: compareNodeMinX,
  49554. compareMinY: compareNodeMinY,
  49555. toJSON: function () { return this.data; },
  49556. fromJSON: function (data)
  49557. {
  49558. this.data = data;
  49559. return this;
  49560. },
  49561. _all: function (node, result)
  49562. {
  49563. var nodesToSearch = [];
  49564. while (node) {
  49565. if (node.leaf) result.push.apply(result, node.children);
  49566. else nodesToSearch.push.apply(nodesToSearch, node.children);
  49567. node = nodesToSearch.pop();
  49568. }
  49569. return result;
  49570. },
  49571. _build: function (items, left, right, height)
  49572. {
  49573. var N = right - left + 1,
  49574. M = this._maxEntries,
  49575. node;
  49576. if (N <= M) {
  49577. // reached leaf level; return leaf
  49578. node = createNode(items.slice(left, right + 1));
  49579. calcBBox(node, this.toBBox);
  49580. return node;
  49581. }
  49582. if (!height) {
  49583. // target height of the bulk-loaded tree
  49584. height = Math.ceil(Math.log(N) / Math.log(M));
  49585. // target number of root entries to maximize storage utilization
  49586. M = Math.ceil(N / Math.pow(M, height - 1));
  49587. }
  49588. node = createNode([]);
  49589. node.leaf = false;
  49590. node.height = height;
  49591. // split the items into M mostly square tiles
  49592. var N2 = Math.ceil(N / M),
  49593. N1 = N2 * Math.ceil(Math.sqrt(M)),
  49594. i, j, right2, right3;
  49595. multiSelect(items, left, right, N1, this.compareMinX);
  49596. for (i = left; i <= right; i += N1) {
  49597. right2 = Math.min(i + N1 - 1, right);
  49598. multiSelect(items, i, right2, N2, this.compareMinY);
  49599. for (j = i; j <= right2; j += N2) {
  49600. right3 = Math.min(j + N2 - 1, right2);
  49601. // pack each entry recursively
  49602. node.children.push(this._build(items, j, right3, height - 1));
  49603. }
  49604. }
  49605. calcBBox(node, this.toBBox);
  49606. return node;
  49607. },
  49608. _chooseSubtree: function (bbox, node, level, path)
  49609. {
  49610. var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
  49611. while (true) {
  49612. path.push(node);
  49613. if (node.leaf || path.length - 1 === level) break;
  49614. minArea = minEnlargement = Infinity;
  49615. for (i = 0, len = node.children.length; i < len; i++) {
  49616. child = node.children[i];
  49617. area = bboxArea(child);
  49618. enlargement = enlargedArea(bbox, child) - area;
  49619. // choose entry with the least area enlargement
  49620. if (enlargement < minEnlargement) {
  49621. minEnlargement = enlargement;
  49622. minArea = area < minArea ? area : minArea;
  49623. targetNode = child;
  49624. } else if (enlargement === minEnlargement) {
  49625. // otherwise choose one with the smallest area
  49626. if (area < minArea) {
  49627. minArea = area;
  49628. targetNode = child;
  49629. }
  49630. }
  49631. }
  49632. node = targetNode || node.children[0];
  49633. }
  49634. return node;
  49635. },
  49636. _insert: function (item, level, isNode)
  49637. {
  49638. var toBBox = this.toBBox,
  49639. bbox = isNode ? item : toBBox(item),
  49640. insertPath = [];
  49641. // find the best node for accommodating the item, saving all nodes along the path too
  49642. var node = this._chooseSubtree(bbox, this.data, level, insertPath);
  49643. // put the item into the node
  49644. node.children.push(item);
  49645. extend(node, bbox);
  49646. // split on node overflow; propagate upwards if necessary
  49647. while (level >= 0) {
  49648. if (insertPath[level].children.length > this._maxEntries) {
  49649. this._split(insertPath, level);
  49650. level--;
  49651. } else break;
  49652. }
  49653. // adjust bboxes along the insertion path
  49654. this._adjustParentBBoxes(bbox, insertPath, level);
  49655. },
  49656. // split overflowed node into two
  49657. _split: function (insertPath, level)
  49658. {
  49659. var node = insertPath[level],
  49660. M = node.children.length,
  49661. m = this._minEntries;
  49662. this._chooseSplitAxis(node, m, M);
  49663. var splitIndex = this._chooseSplitIndex(node, m, M);
  49664. var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
  49665. newNode.height = node.height;
  49666. newNode.leaf = node.leaf;
  49667. calcBBox(node, this.toBBox);
  49668. calcBBox(newNode, this.toBBox);
  49669. if (level) insertPath[level - 1].children.push(newNode);
  49670. else this._splitRoot(node, newNode);
  49671. },
  49672. _splitRoot: function (node, newNode)
  49673. {
  49674. // split root node
  49675. this.data = createNode([node, newNode]);
  49676. this.data.height = node.height + 1;
  49677. this.data.leaf = false;
  49678. calcBBox(this.data, this.toBBox);
  49679. },
  49680. _chooseSplitIndex: function (node, m, M)
  49681. {
  49682. var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
  49683. minOverlap = minArea = Infinity;
  49684. for (i = m; i <= M - m; i++) {
  49685. bbox1 = distBBox(node, 0, i, this.toBBox);
  49686. bbox2 = distBBox(node, i, M, this.toBBox);
  49687. overlap = intersectionArea(bbox1, bbox2);
  49688. area = bboxArea(bbox1) + bboxArea(bbox2);
  49689. // choose distribution with minimum overlap
  49690. if (overlap < minOverlap) {
  49691. minOverlap = overlap;
  49692. index = i;
  49693. minArea = area < minArea ? area : minArea;
  49694. } else if (overlap === minOverlap) {
  49695. // otherwise choose distribution with minimum area
  49696. if (area < minArea) {
  49697. minArea = area;
  49698. index = i;
  49699. }
  49700. }
  49701. }
  49702. return index;
  49703. },
  49704. // sorts node children by the best axis for split
  49705. _chooseSplitAxis: function (node, m, M)
  49706. {
  49707. var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
  49708. compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
  49709. xMargin = this._allDistMargin(node, m, M, compareMinX),
  49710. yMargin = this._allDistMargin(node, m, M, compareMinY);
  49711. // if total distributions margin value is minimal for x, sort by minX,
  49712. // otherwise it's already sorted by minY
  49713. if (xMargin < yMargin) node.children.sort(compareMinX);
  49714. },
  49715. // total margin of all possible split distributions where each node is at least m full
  49716. _allDistMargin: function (node, m, M, compare)
  49717. {
  49718. node.children.sort(compare);
  49719. var toBBox = this.toBBox,
  49720. leftBBox = distBBox(node, 0, m, toBBox),
  49721. rightBBox = distBBox(node, M - m, M, toBBox),
  49722. margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
  49723. i, child;
  49724. for (i = m; i < M - m; i++) {
  49725. child = node.children[i];
  49726. extend(leftBBox, node.leaf ? toBBox(child) : child);
  49727. margin += bboxMargin(leftBBox);
  49728. }
  49729. for (i = M - m - 1; i >= m; i--) {
  49730. child = node.children[i];
  49731. extend(rightBBox, node.leaf ? toBBox(child) : child);
  49732. margin += bboxMargin(rightBBox);
  49733. }
  49734. return margin;
  49735. },
  49736. _adjustParentBBoxes: function (bbox, path, level)
  49737. {
  49738. // adjust bboxes along the given tree path
  49739. for (var i = level; i >= 0; i--) {
  49740. extend(path[i], bbox);
  49741. }
  49742. },
  49743. _condense: function (path)
  49744. {
  49745. // go through the path, removing empty nodes and updating bboxes
  49746. for (var i = path.length - 1, siblings; i >= 0; i--) {
  49747. if (path[i].children.length === 0) {
  49748. if (i > 0) {
  49749. siblings = path[i - 1].children;
  49750. siblings.splice(siblings.indexOf(path[i]), 1);
  49751. } else this.clear();
  49752. } else calcBBox(path[i], this.toBBox);
  49753. }
  49754. },
  49755. compareMinX: function (a, b)
  49756. {
  49757. return a.left - b.left;
  49758. },
  49759. compareMinY: function (a, b)
  49760. {
  49761. return a.top - b.top;
  49762. },
  49763. toBBox: function (a)
  49764. {
  49765. return {
  49766. minX: a.left,
  49767. minY: a.top,
  49768. maxX: a.right,
  49769. maxY: a.bottom
  49770. };
  49771. }
  49772. };
  49773. function findItem (item, items, equalsFn)
  49774. {
  49775. if (!equalsFn) return items.indexOf(item);
  49776. for (var i = 0; i < items.length; i++) {
  49777. if (equalsFn(item, items[i])) return i;
  49778. }
  49779. return -1;
  49780. }
  49781. // calculate node's bbox from bboxes of its children
  49782. function calcBBox (node, toBBox)
  49783. {
  49784. distBBox(node, 0, node.children.length, toBBox, node);
  49785. }
  49786. // min bounding rectangle of node children from k to p-1
  49787. function distBBox (node, k, p, toBBox, destNode)
  49788. {
  49789. if (!destNode) destNode = createNode(null);
  49790. destNode.minX = Infinity;
  49791. destNode.minY = Infinity;
  49792. destNode.maxX = -Infinity;
  49793. destNode.maxY = -Infinity;
  49794. for (var i = k, child; i < p; i++) {
  49795. child = node.children[i];
  49796. extend(destNode, node.leaf ? toBBox(child) : child);
  49797. }
  49798. return destNode;
  49799. }
  49800. function extend (a, b)
  49801. {
  49802. a.minX = Math.min(a.minX, b.minX);
  49803. a.minY = Math.min(a.minY, b.minY);
  49804. a.maxX = Math.max(a.maxX, b.maxX);
  49805. a.maxY = Math.max(a.maxY, b.maxY);
  49806. return a;
  49807. }
  49808. function compareNodeMinX (a, b) { return a.minX - b.minX; }
  49809. function compareNodeMinY (a, b) { return a.minY - b.minY; }
  49810. function bboxArea (a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }
  49811. function bboxMargin (a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
  49812. function enlargedArea (a, b)
  49813. {
  49814. return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
  49815. (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
  49816. }
  49817. function intersectionArea (a, b)
  49818. {
  49819. var minX = Math.max(a.minX, b.minX),
  49820. minY = Math.max(a.minY, b.minY),
  49821. maxX = Math.min(a.maxX, b.maxX),
  49822. maxY = Math.min(a.maxY, b.maxY);
  49823. return Math.max(0, maxX - minX) *
  49824. Math.max(0, maxY - minY);
  49825. }
  49826. function contains (a, b)
  49827. {
  49828. return a.minX <= b.minX &&
  49829. a.minY <= b.minY &&
  49830. b.maxX <= a.maxX &&
  49831. b.maxY <= a.maxY;
  49832. }
  49833. function intersects (a, b)
  49834. {
  49835. return b.minX <= a.maxX &&
  49836. b.minY <= a.maxY &&
  49837. b.maxX >= a.minX &&
  49838. b.maxY >= a.minY;
  49839. }
  49840. function createNode (children)
  49841. {
  49842. return {
  49843. children: children,
  49844. height: 1,
  49845. leaf: true,
  49846. minX: Infinity,
  49847. minY: Infinity,
  49848. maxX: -Infinity,
  49849. maxY: -Infinity
  49850. };
  49851. }
  49852. // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
  49853. // combines selection algorithm with binary divide & conquer approach
  49854. function multiSelect (arr, left, right, n, compare)
  49855. {
  49856. var stack = [left, right],
  49857. mid;
  49858. while (stack.length)
  49859. {
  49860. right = stack.pop();
  49861. left = stack.pop();
  49862. if (right - left <= n) continue;
  49863. mid = left + Math.ceil((right - left) / n / 2) * n;
  49864. quickselect(arr, mid, left, right, compare);
  49865. stack.push(left, mid, mid, right);
  49866. }
  49867. }
  49868. module.exports = rbush;
  49869. /***/ }),
  49870. /* 244 */
  49871. /***/ (function(module, exports, __webpack_require__) {
  49872. /**
  49873. * @author Richard Davey <rich@photonstorm.com>
  49874. * @copyright 2019 Photon Storm Ltd.
  49875. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49876. */
  49877. var Class = __webpack_require__(0);
  49878. /**
  49879. * @classdesc
  49880. * A Process Queue maintains three internal lists.
  49881. *
  49882. * The `pending` list is a selection of items which are due to be made 'active' in the next update.
  49883. * The `active` list is a selection of items which are considered active and should be updated.
  49884. * The `destroy` list is a selection of items that were active and are awaiting being destroyed in the next update.
  49885. *
  49886. * When new items are added to a Process Queue they are put in a pending data, rather than being added
  49887. * immediately the active list. Equally, items that are removed are put into the destroy list, rather than
  49888. * being destroyed immediately. This allows the Process Queue to carefully process each item at a specific, fixed
  49889. * time, rather than at the time of the request from the API.
  49890. *
  49891. * @class ProcessQueue
  49892. * @memberof Phaser.Structs
  49893. * @constructor
  49894. * @since 3.0.0
  49895. *
  49896. * @generic T
  49897. */
  49898. var ProcessQueue = new Class({
  49899. initialize:
  49900. function ProcessQueue ()
  49901. {
  49902. /**
  49903. * The `pending` list is a selection of items which are due to be made 'active' in the next update.
  49904. *
  49905. * @genericUse {T[]} - [$type]
  49906. *
  49907. * @name Phaser.Structs.ProcessQueue#_pending
  49908. * @type {Array.<*>}
  49909. * @private
  49910. * @default []
  49911. * @since 3.0.0
  49912. */
  49913. this._pending = [];
  49914. /**
  49915. * The `active` list is a selection of items which are considered active and should be updated.
  49916. *
  49917. * @genericUse {T[]} - [$type]
  49918. *
  49919. * @name Phaser.Structs.ProcessQueue#_active
  49920. * @type {Array.<*>}
  49921. * @private
  49922. * @default []
  49923. * @since 3.0.0
  49924. */
  49925. this._active = [];
  49926. /**
  49927. * The `destroy` list is a selection of items that were active and are awaiting being destroyed in the next update.
  49928. *
  49929. * @genericUse {T[]} - [$type]
  49930. *
  49931. * @name Phaser.Structs.ProcessQueue#_destroy
  49932. * @type {Array.<*>}
  49933. * @private
  49934. * @default []
  49935. * @since 3.0.0
  49936. */
  49937. this._destroy = [];
  49938. /**
  49939. * The total number of items awaiting processing.
  49940. *
  49941. * @name Phaser.Structs.ProcessQueue#_toProcess
  49942. * @type {integer}
  49943. * @private
  49944. * @default 0
  49945. * @since 3.0.0
  49946. */
  49947. this._toProcess = 0;
  49948. },
  49949. /**
  49950. * Adds a new item to the Process Queue.
  49951. * The item is added to the pending list and made active in the next update.
  49952. *
  49953. * @method Phaser.Structs.ProcessQueue#add
  49954. * @since 3.0.0
  49955. *
  49956. * @genericUse {T} - [item]
  49957. * @genericUse {Phaser.Structs.ProcessQueue.<T>} - [$return]
  49958. *
  49959. * @param {*} item - The item to add to the queue.
  49960. *
  49961. * @return {Phaser.Structs.ProcessQueue} This Process Queue object.
  49962. */
  49963. add: function (item)
  49964. {
  49965. this._pending.push(item);
  49966. this._toProcess++;
  49967. return this;
  49968. },
  49969. /**
  49970. * Removes an item from the Process Queue.
  49971. * The item is added to the pending destroy and fully removed in the next update.
  49972. *
  49973. * @method Phaser.Structs.ProcessQueue#remove
  49974. * @since 3.0.0
  49975. *
  49976. * @genericUse {T} - [item]
  49977. * @genericUse {Phaser.Structs.ProcessQueue.<T>} - [$return]
  49978. *
  49979. * @param {*} item - The item to be removed from the queue.
  49980. *
  49981. * @return {Phaser.Structs.ProcessQueue} This Process Queue object.
  49982. */
  49983. remove: function (item)
  49984. {
  49985. this._destroy.push(item);
  49986. this._toProcess++;
  49987. return this;
  49988. },
  49989. /**
  49990. * Update this queue. First it will process any items awaiting destruction, and remove them.
  49991. *
  49992. * Then it will check to see if there are any items pending insertion, and move them to an
  49993. * active state. Finally, it will return a list of active items for further processing.
  49994. *
  49995. * @method Phaser.Structs.ProcessQueue#update
  49996. * @since 3.0.0
  49997. *
  49998. * @genericUse {T[]} - [$return]
  49999. *
  50000. * @return {Array.<*>} A list of active items.
  50001. */
  50002. update: function ()
  50003. {
  50004. if (this._toProcess === 0)
  50005. {
  50006. // Quick bail
  50007. return this._active;
  50008. }
  50009. var list = this._destroy;
  50010. var active = this._active;
  50011. var i;
  50012. var item;
  50013. // Clear the 'destroy' list
  50014. for (i = 0; i < list.length; i++)
  50015. {
  50016. item = list[i];
  50017. // Remove from the 'active' array
  50018. var idx = active.indexOf(item);
  50019. if (idx !== -1)
  50020. {
  50021. active.splice(idx, 1);
  50022. }
  50023. }
  50024. list.length = 0;
  50025. // Process the pending addition list
  50026. // This stops callbacks and out of sync events from populating the active array mid-way during an update
  50027. list = this._pending;
  50028. for (i = 0; i < list.length; i++)
  50029. {
  50030. item = list[i];
  50031. this._active.push(item);
  50032. }
  50033. list.length = 0;
  50034. this._toProcess = 0;
  50035. // The owner of this queue can now safely do whatever it needs to with the active list
  50036. return this._active;
  50037. },
  50038. /**
  50039. * Returns the current list of active items.
  50040. *
  50041. * @method Phaser.Structs.ProcessQueue#getActive
  50042. * @since 3.0.0
  50043. *
  50044. * @genericUse {T[]} - [$return]
  50045. *
  50046. * @return {Array.<*>} A list of active items.
  50047. */
  50048. getActive: function ()
  50049. {
  50050. return this._active;
  50051. },
  50052. /**
  50053. * Immediately destroys this process queue, clearing all of its internal arrays and resetting the process totals.
  50054. *
  50055. * @method Phaser.Structs.ProcessQueue#destroy
  50056. * @since 3.0.0
  50057. */
  50058. destroy: function ()
  50059. {
  50060. this._toProcess = 0;
  50061. this._pending = [];
  50062. this._active = [];
  50063. this._destroy = [];
  50064. }
  50065. });
  50066. module.exports = ProcessQueue;
  50067. /***/ }),
  50068. /* 245 */
  50069. /***/ (function(module, exports, __webpack_require__) {
  50070. /**
  50071. * @author Richard Davey <rich@photonstorm.com>
  50072. * @copyright 2019 Photon Storm Ltd.
  50073. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50074. */
  50075. var CONST = __webpack_require__(38);
  50076. /**
  50077. * Calculates and returns the vertical overlap between two arcade physics bodies and sets their properties
  50078. * accordingly, including: `touching.up`, `touching.down`, `touching.none` and `overlapY'.
  50079. *
  50080. * @function Phaser.Physics.Arcade.GetOverlapY
  50081. * @since 3.0.0
  50082. *
  50083. * @param {Phaser.Physics.Arcade.Body} body1 - The first Body to separate.
  50084. * @param {Phaser.Physics.Arcade.Body} body2 - The second Body to separate.
  50085. * @param {boolean} overlapOnly - Is this an overlap only check, or part of separation?
  50086. * @param {number} bias - A value added to the delta values during collision checks. Increase it to prevent sprite tunneling(sprites passing through another instead of colliding).
  50087. *
  50088. * @return {number} The amount of overlap.
  50089. */
  50090. var GetOverlapY = function (body1, body2, overlapOnly, bias)
  50091. {
  50092. var overlap = 0;
  50093. var maxOverlap = body1.deltaAbsY() + body2.deltaAbsY() + bias;
  50094. if (body1._dy === 0 && body2._dy === 0)
  50095. {
  50096. // They overlap but neither of them are moving
  50097. body1.embedded = true;
  50098. body2.embedded = true;
  50099. }
  50100. else if (body1._dy > body2._dy)
  50101. {
  50102. // Body1 is moving down and/or Body2 is moving up
  50103. overlap = body1.bottom - body2.y;
  50104. if ((overlap > maxOverlap && !overlapOnly) || body1.checkCollision.down === false || body2.checkCollision.up === false)
  50105. {
  50106. overlap = 0;
  50107. }
  50108. else
  50109. {
  50110. body1.touching.none = false;
  50111. body1.touching.down = true;
  50112. body2.touching.none = false;
  50113. body2.touching.up = true;
  50114. if (body2.physicsType === CONST.STATIC_BODY)
  50115. {
  50116. body1.blocked.none = false;
  50117. body1.blocked.down = true;
  50118. }
  50119. if (body1.physicsType === CONST.STATIC_BODY)
  50120. {
  50121. body2.blocked.none = false;
  50122. body2.blocked.up = true;
  50123. }
  50124. }
  50125. }
  50126. else if (body1._dy < body2._dy)
  50127. {
  50128. // Body1 is moving up and/or Body2 is moving down
  50129. overlap = body1.y - body2.bottom;
  50130. if ((-overlap > maxOverlap && !overlapOnly) || body1.checkCollision.up === false || body2.checkCollision.down === false)
  50131. {
  50132. overlap = 0;
  50133. }
  50134. else
  50135. {
  50136. body1.touching.none = false;
  50137. body1.touching.up = true;
  50138. body2.touching.none = false;
  50139. body2.touching.down = true;
  50140. if (body2.physicsType === CONST.STATIC_BODY)
  50141. {
  50142. body1.blocked.none = false;
  50143. body1.blocked.up = true;
  50144. }
  50145. if (body1.physicsType === CONST.STATIC_BODY)
  50146. {
  50147. body2.blocked.none = false;
  50148. body2.blocked.down = true;
  50149. }
  50150. }
  50151. }
  50152. // Resets the overlapY to zero if there is no overlap, or to the actual pixel value if there is
  50153. body1.overlapY = overlap;
  50154. body2.overlapY = overlap;
  50155. return overlap;
  50156. };
  50157. module.exports = GetOverlapY;
  50158. /***/ }),
  50159. /* 246 */
  50160. /***/ (function(module, exports, __webpack_require__) {
  50161. /**
  50162. * @author Richard Davey <rich@photonstorm.com>
  50163. * @copyright 2019 Photon Storm Ltd.
  50164. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50165. */
  50166. var CONST = __webpack_require__(38);
  50167. /**
  50168. * Calculates and returns the horizontal overlap between two arcade physics bodies and sets their properties
  50169. * accordingly, including: `touching.left`, `touching.right`, `touching.none` and `overlapX'.
  50170. *
  50171. * @function Phaser.Physics.Arcade.GetOverlapX
  50172. * @since 3.0.0
  50173. *
  50174. * @param {Phaser.Physics.Arcade.Body} body1 - The first Body to separate.
  50175. * @param {Phaser.Physics.Arcade.Body} body2 - The second Body to separate.
  50176. * @param {boolean} overlapOnly - Is this an overlap only check, or part of separation?
  50177. * @param {number} bias - A value added to the delta values during collision checks. Increase it to prevent sprite tunneling(sprites passing through another instead of colliding).
  50178. *
  50179. * @return {number} The amount of overlap.
  50180. */
  50181. var GetOverlapX = function (body1, body2, overlapOnly, bias)
  50182. {
  50183. var overlap = 0;
  50184. var maxOverlap = body1.deltaAbsX() + body2.deltaAbsX() + bias;
  50185. if (body1._dx === 0 && body2._dx === 0)
  50186. {
  50187. // They overlap but neither of them are moving
  50188. body1.embedded = true;
  50189. body2.embedded = true;
  50190. }
  50191. else if (body1._dx > body2._dx)
  50192. {
  50193. // Body1 is moving right and / or Body2 is moving left
  50194. overlap = body1.right - body2.x;
  50195. if ((overlap > maxOverlap && !overlapOnly) || body1.checkCollision.right === false || body2.checkCollision.left === false)
  50196. {
  50197. overlap = 0;
  50198. }
  50199. else
  50200. {
  50201. body1.touching.none = false;
  50202. body1.touching.right = true;
  50203. body2.touching.none = false;
  50204. body2.touching.left = true;
  50205. if (body2.physicsType === CONST.STATIC_BODY)
  50206. {
  50207. body1.blocked.none = false;
  50208. body1.blocked.right = true;
  50209. }
  50210. if (body1.physicsType === CONST.STATIC_BODY)
  50211. {
  50212. body2.blocked.none = false;
  50213. body2.blocked.left = true;
  50214. }
  50215. }
  50216. }
  50217. else if (body1._dx < body2._dx)
  50218. {
  50219. // Body1 is moving left and/or Body2 is moving right
  50220. overlap = body1.x - body2.width - body2.x;
  50221. if ((-overlap > maxOverlap && !overlapOnly) || body1.checkCollision.left === false || body2.checkCollision.right === false)
  50222. {
  50223. overlap = 0;
  50224. }
  50225. else
  50226. {
  50227. body1.touching.none = false;
  50228. body1.touching.left = true;
  50229. body2.touching.none = false;
  50230. body2.touching.right = true;
  50231. if (body2.physicsType === CONST.STATIC_BODY)
  50232. {
  50233. body1.blocked.none = false;
  50234. body1.blocked.left = true;
  50235. }
  50236. if (body1.physicsType === CONST.STATIC_BODY)
  50237. {
  50238. body2.blocked.none = false;
  50239. body2.blocked.right = true;
  50240. }
  50241. }
  50242. }
  50243. // Resets the overlapX to zero if there is no overlap, or to the actual pixel value if there is
  50244. body1.overlapX = overlap;
  50245. body2.overlapX = overlap;
  50246. return overlap;
  50247. };
  50248. module.exports = GetOverlapX;
  50249. /***/ }),
  50250. /* 247 */
  50251. /***/ (function(module, exports, __webpack_require__) {
  50252. /**
  50253. * @author Richard Davey <rich@photonstorm.com>
  50254. * @copyright 2019 Photon Storm Ltd.
  50255. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50256. */
  50257. var Class = __webpack_require__(0);
  50258. /**
  50259. * @classdesc
  50260. * An Arcade Physics Collider will automatically check for collision, or overlaps, between two objects
  50261. * every step. If a collision, or overlap, occurs it will invoke the given callbacks.
  50262. *
  50263. * @class Collider
  50264. * @memberof Phaser.Physics.Arcade
  50265. * @constructor
  50266. * @since 3.0.0
  50267. *
  50268. * @param {Phaser.Physics.Arcade.World} world - The Arcade physics World that will manage the collisions.
  50269. * @param {boolean} overlapOnly - Whether to check for collisions or overlap.
  50270. * @param {ArcadeColliderType} object1 - The first object to check for collision.
  50271. * @param {ArcadeColliderType} object2 - The second object to check for collision.
  50272. * @param {ArcadePhysicsCallback} collideCallback - The callback to invoke when the two objects collide.
  50273. * @param {ArcadePhysicsCallback} processCallback - The callback to invoke when the two objects collide. Must return a boolean.
  50274. * @param {any} callbackContext - The scope in which to call the callbacks.
  50275. */
  50276. var Collider = new Class({
  50277. initialize:
  50278. function Collider (world, overlapOnly, object1, object2, collideCallback, processCallback, callbackContext)
  50279. {
  50280. /**
  50281. * The world in which the bodies will collide.
  50282. *
  50283. * @name Phaser.Physics.Arcade.Collider#world
  50284. * @type {Phaser.Physics.Arcade.World}
  50285. * @since 3.0.0
  50286. */
  50287. this.world = world;
  50288. /**
  50289. * The name of the collider (unused by Phaser).
  50290. *
  50291. * @name Phaser.Physics.Arcade.Collider#name
  50292. * @type {string}
  50293. * @since 3.1.0
  50294. */
  50295. this.name = '';
  50296. /**
  50297. * Whether the collider is active.
  50298. *
  50299. * @name Phaser.Physics.Arcade.Collider#active
  50300. * @type {boolean}
  50301. * @default true
  50302. * @since 3.0.0
  50303. */
  50304. this.active = true;
  50305. /**
  50306. * Whether to check for collisions or overlaps.
  50307. *
  50308. * @name Phaser.Physics.Arcade.Collider#overlapOnly
  50309. * @type {boolean}
  50310. * @since 3.0.0
  50311. */
  50312. this.overlapOnly = overlapOnly;
  50313. /**
  50314. * The first object to check for collision.
  50315. *
  50316. * @name Phaser.Physics.Arcade.Collider#object1
  50317. * @type {ArcadeColliderType}
  50318. * @since 3.0.0
  50319. */
  50320. this.object1 = object1;
  50321. /**
  50322. * The second object to check for collision.
  50323. *
  50324. * @name Phaser.Physics.Arcade.Collider#object2
  50325. * @type {ArcadeColliderType}
  50326. * @since 3.0.0
  50327. */
  50328. this.object2 = object2;
  50329. /**
  50330. * The callback to invoke when the two objects collide.
  50331. *
  50332. * @name Phaser.Physics.Arcade.Collider#collideCallback
  50333. * @type {ArcadePhysicsCallback}
  50334. * @since 3.0.0
  50335. */
  50336. this.collideCallback = collideCallback;
  50337. /**
  50338. * If a processCallback exists it must return true or collision checking will be skipped.
  50339. *
  50340. * @name Phaser.Physics.Arcade.Collider#processCallback
  50341. * @type {ArcadePhysicsCallback}
  50342. * @since 3.0.0
  50343. */
  50344. this.processCallback = processCallback;
  50345. /**
  50346. * The context the collideCallback and processCallback will run in.
  50347. *
  50348. * @name Phaser.Physics.Arcade.Collider#callbackContext
  50349. * @type {object}
  50350. * @since 3.0.0
  50351. */
  50352. this.callbackContext = callbackContext;
  50353. },
  50354. /**
  50355. * A name for the Collider.
  50356. *
  50357. * Phaser does not use this value, it's for your own reference.
  50358. *
  50359. * @method Phaser.Physics.Arcade.Collider#setName
  50360. * @since 3.1.0
  50361. *
  50362. * @param {string} name - The name to assign to the Collider.
  50363. *
  50364. * @return {Phaser.Physics.Arcade.Collider} This Collider instance.
  50365. */
  50366. setName: function (name)
  50367. {
  50368. this.name = name;
  50369. return this;
  50370. },
  50371. /**
  50372. * Called by World as part of its step processing, initial operation of collision checking.
  50373. *
  50374. * @method Phaser.Physics.Arcade.Collider#update
  50375. * @since 3.0.0
  50376. */
  50377. update: function ()
  50378. {
  50379. this.world.collideObjects(
  50380. this.object1,
  50381. this.object2,
  50382. this.collideCallback,
  50383. this.processCallback,
  50384. this.callbackContext,
  50385. this.overlapOnly
  50386. );
  50387. },
  50388. /**
  50389. * Removes Collider from World and disposes of its resources.
  50390. *
  50391. * @method Phaser.Physics.Arcade.Collider#destroy
  50392. * @since 3.0.0
  50393. */
  50394. destroy: function ()
  50395. {
  50396. this.world.removeCollider(this);
  50397. this.active = false;
  50398. this.world = null;
  50399. this.object1 = null;
  50400. this.object2 = null;
  50401. this.collideCallback = null;
  50402. this.processCallback = null;
  50403. this.callbackContext = null;
  50404. }
  50405. });
  50406. module.exports = Collider;
  50407. /***/ }),
  50408. /* 248 */
  50409. /***/ (function(module, exports, __webpack_require__) {
  50410. /**
  50411. * @author Richard Davey <rich@photonstorm.com>
  50412. * @copyright 2019 Photon Storm Ltd.
  50413. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50414. */
  50415. /**
  50416. * @namespace Phaser.Physics.Arcade.Events
  50417. */
  50418. module.exports = {
  50419. COLLIDE: __webpack_require__(563),
  50420. OVERLAP: __webpack_require__(562),
  50421. PAUSE: __webpack_require__(561),
  50422. RESUME: __webpack_require__(560),
  50423. TILE_COLLIDE: __webpack_require__(559),
  50424. TILE_OVERLAP: __webpack_require__(558),
  50425. WORLD_BOUNDS: __webpack_require__(557)
  50426. };
  50427. /***/ }),
  50428. /* 249 */
  50429. /***/ (function(module, exports, __webpack_require__) {
  50430. /**
  50431. * @author Richard Davey <rich@photonstorm.com>
  50432. * @copyright 2019 Photon Storm Ltd.
  50433. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50434. */
  50435. var CircleContains = __webpack_require__(43);
  50436. var Class = __webpack_require__(0);
  50437. var CONST = __webpack_require__(38);
  50438. var Events = __webpack_require__(248);
  50439. var RadToDeg = __webpack_require__(183);
  50440. var Rectangle = __webpack_require__(10);
  50441. var RectangleContains = __webpack_require__(42);
  50442. var Vector2 = __webpack_require__(3);
  50443. /**
  50444. * @typedef {object} ArcadeBodyBounds
  50445. *
  50446. * @property {number} x - The left edge.
  50447. * @property {number} y - The upper edge.
  50448. * @property {number} right - The right edge.
  50449. * @property {number} bottom - The lower edge.
  50450. */
  50451. /**
  50452. * @typedef {object} ArcadeBodyCollision
  50453. *
  50454. * @property {boolean} none - True if the Body is not colliding.
  50455. * @property {boolean} up - True if the Body is colliding on its upper edge.
  50456. * @property {boolean} down - True if the Body is colliding on its lower edge.
  50457. * @property {boolean} left - True if the Body is colliding on its left edge.
  50458. * @property {boolean} right - True if the Body is colliding on its right edge.
  50459. */
  50460. /**
  50461. * @classdesc
  50462. * A Dynamic Arcade Body.
  50463. *
  50464. * Its static counterpart is {@link Phaser.Physics.Arcade.StaticBody}.
  50465. *
  50466. * @class Body
  50467. * @memberof Phaser.Physics.Arcade
  50468. * @constructor
  50469. * @since 3.0.0
  50470. *
  50471. * @param {Phaser.Physics.Arcade.World} world - The Arcade Physics simulation this Body belongs to.
  50472. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object this Body belongs to.
  50473. */
  50474. var Body = new Class({
  50475. initialize:
  50476. function Body (world, gameObject)
  50477. {
  50478. var width = (gameObject.width) ? gameObject.width : 64;
  50479. var height = (gameObject.height) ? gameObject.height : 64;
  50480. /**
  50481. * The Arcade Physics simulation this Body belongs to.
  50482. *
  50483. * @name Phaser.Physics.Arcade.Body#world
  50484. * @type {Phaser.Physics.Arcade.World}
  50485. * @since 3.0.0
  50486. */
  50487. this.world = world;
  50488. /**
  50489. * The Game Object this Body belongs to.
  50490. *
  50491. * @name Phaser.Physics.Arcade.Body#gameObject
  50492. * @type {Phaser.GameObjects.GameObject}
  50493. * @since 3.0.0
  50494. */
  50495. this.gameObject = gameObject;
  50496. /**
  50497. * Transformations applied to this Body.
  50498. *
  50499. * @name Phaser.Physics.Arcade.Body#transform
  50500. * @type {object}
  50501. * @since 3.4.0
  50502. */
  50503. this.transform = {
  50504. x: gameObject.x,
  50505. y: gameObject.y,
  50506. rotation: gameObject.angle,
  50507. scaleX: gameObject.scaleX,
  50508. scaleY: gameObject.scaleY,
  50509. displayOriginX: gameObject.displayOriginX,
  50510. displayOriginY: gameObject.displayOriginY
  50511. };
  50512. /**
  50513. * Whether the Body's boundary is drawn to the debug display.
  50514. *
  50515. * @name Phaser.Physics.Arcade.Body#debugShowBody
  50516. * @type {boolean}
  50517. * @since 3.0.0
  50518. */
  50519. this.debugShowBody = world.defaults.debugShowBody;
  50520. /**
  50521. * Whether the Body's velocity is drawn to the debug display.
  50522. *
  50523. * @name Phaser.Physics.Arcade.Body#debugShowVelocity
  50524. * @type {boolean}
  50525. * @since 3.0.0
  50526. */
  50527. this.debugShowVelocity = world.defaults.debugShowVelocity;
  50528. /**
  50529. * The color of this Body on the debug display.
  50530. *
  50531. * @name Phaser.Physics.Arcade.Body#debugBodyColor
  50532. * @type {integer}
  50533. * @since 3.0.0
  50534. */
  50535. this.debugBodyColor = world.defaults.bodyDebugColor;
  50536. /**
  50537. * Whether this Body is updated by the physics simulation.
  50538. *
  50539. * @name Phaser.Physics.Arcade.Body#enable
  50540. * @type {boolean}
  50541. * @default true
  50542. * @since 3.0.0
  50543. */
  50544. this.enable = true;
  50545. /**
  50546. * Whether this Body's boundary is circular (true) or rectangular (false).
  50547. *
  50548. * @name Phaser.Physics.Arcade.Body#isCircle
  50549. * @type {boolean}
  50550. * @default false
  50551. * @since 3.0.0
  50552. * @see Phaser.Physics.Arcade.Body#setCircle
  50553. */
  50554. this.isCircle = false;
  50555. /**
  50556. * If this Body is circular, this is the unscaled radius of the Body's boundary, as set by setCircle(), in source pixels.
  50557. * The true radius is equal to `halfWidth`.
  50558. *
  50559. * @name Phaser.Physics.Arcade.Body#radius
  50560. * @type {number}
  50561. * @default 0
  50562. * @since 3.0.0
  50563. * @see Phaser.Physics.Arcade.Body#setCircle
  50564. */
  50565. this.radius = 0;
  50566. /**
  50567. * The offset of this Body's position from its Game Object's position, in source pixels.
  50568. *
  50569. * @name Phaser.Physics.Arcade.Body#offset
  50570. * @type {Phaser.Math.Vector2}
  50571. * @since 3.0.0
  50572. * @see Phaser.Physics.Arcade.Body#setOffset
  50573. */
  50574. this.offset = new Vector2();
  50575. /**
  50576. * The position of this Body within the simulation.
  50577. *
  50578. * @name Phaser.Physics.Arcade.Body#position
  50579. * @type {Phaser.Math.Vector2}
  50580. * @since 3.0.0
  50581. */
  50582. this.position = new Vector2(gameObject.x, gameObject.y);
  50583. /**
  50584. * The position of this Body during the previous step.
  50585. *
  50586. * @name Phaser.Physics.Arcade.Body#prev
  50587. * @type {Phaser.Math.Vector2}
  50588. * @since 3.0.0
  50589. */
  50590. this.prev = new Vector2(gameObject.x, gameObject.y);
  50591. /**
  50592. * Whether this Body's `rotation` is affected by its angular acceleration and angular velocity.
  50593. *
  50594. * @name Phaser.Physics.Arcade.Body#allowRotation
  50595. * @type {boolean}
  50596. * @default true
  50597. * @since 3.0.0
  50598. */
  50599. this.allowRotation = true;
  50600. /**
  50601. * This body's rotation, in degrees, based on its angular acceleration and angular velocity.
  50602. * The Body's rotation controls the `angle` of its Game Object.
  50603. * It doesn't rotate the Body's boundary, which is always an axis-aligned rectangle or a circle.
  50604. *
  50605. * @name Phaser.Physics.Arcade.Body#rotation
  50606. * @type {number}
  50607. * @since 3.0.0
  50608. */
  50609. this.rotation = gameObject.angle;
  50610. /**
  50611. * The Body's rotation, in degrees, during the previous step.
  50612. *
  50613. * @name Phaser.Physics.Arcade.Body#preRotation
  50614. * @type {number}
  50615. * @since 3.0.0
  50616. */
  50617. this.preRotation = gameObject.angle;
  50618. /**
  50619. * The width of the Body's boundary, in pixels.
  50620. * If the Body is circular, this is also the Body's diameter.
  50621. *
  50622. * @name Phaser.Physics.Arcade.Body#width
  50623. * @type {number}
  50624. * @default 64
  50625. * @since 3.0.0
  50626. */
  50627. this.width = width;
  50628. /**
  50629. * The height of the Body's boundary, in pixels.
  50630. * If the Body is circular, this is also the Body's diameter.
  50631. *
  50632. * @name Phaser.Physics.Arcade.Body#height
  50633. * @type {number}
  50634. * @default 64
  50635. * @since 3.0.0
  50636. */
  50637. this.height = height;
  50638. /**
  50639. * The unscaled width of the Body, in source pixels, as set by setSize().
  50640. * The default is the width of the Body's Game Object's texture frame.
  50641. *
  50642. * @name Phaser.Physics.Arcade.Body#sourceWidth
  50643. * @type {number}
  50644. * @since 3.0.0
  50645. * @see Phaser.Physics.Arcade.Body#setSize
  50646. */
  50647. this.sourceWidth = width;
  50648. /**
  50649. * The unscaled height of the Body, in source pixels, as set by setSize().
  50650. * The default is the height of the Body's Game Object's texture frame.
  50651. *
  50652. * @name Phaser.Physics.Arcade.Body#sourceHeight
  50653. * @type {number}
  50654. * @since 3.0.0
  50655. * @see Phaser.Physics.Arcade.Body#setSize
  50656. */
  50657. this.sourceHeight = height;
  50658. if (gameObject.frame)
  50659. {
  50660. this.sourceWidth = gameObject.frame.realWidth;
  50661. this.sourceHeight = gameObject.frame.realHeight;
  50662. }
  50663. /**
  50664. * Half the Body's width, in pixels.
  50665. *
  50666. * @name Phaser.Physics.Arcade.Body#halfWidth
  50667. * @type {number}
  50668. * @since 3.0.0
  50669. */
  50670. this.halfWidth = Math.abs(width / 2);
  50671. /**
  50672. * Half the Body's height, in pixels.
  50673. *
  50674. * @name Phaser.Physics.Arcade.Body#halfHeight
  50675. * @type {number}
  50676. * @since 3.0.0
  50677. */
  50678. this.halfHeight = Math.abs(height / 2);
  50679. /**
  50680. * The center of the Body's boundary.
  50681. * The midpoint of its `position` (top-left corner) and its bottom-right corner.
  50682. *
  50683. * @name Phaser.Physics.Arcade.Body#center
  50684. * @type {Phaser.Math.Vector2}
  50685. * @since 3.0.0
  50686. */
  50687. this.center = new Vector2(gameObject.x + this.halfWidth, gameObject.y + this.halfHeight);
  50688. /**
  50689. * The Body's velocity, in pixels per second.
  50690. *
  50691. * @name Phaser.Physics.Arcade.Body#velocity
  50692. * @type {Phaser.Math.Vector2}
  50693. * @since 3.0.0
  50694. */
  50695. this.velocity = new Vector2();
  50696. /**
  50697. * The Body's calculated velocity, in pixels per second, at the last step.
  50698. *
  50699. * @name Phaser.Physics.Arcade.Body#newVelocity
  50700. * @type {Phaser.Math.Vector2}
  50701. * @readonly
  50702. * @since 3.0.0
  50703. */
  50704. this.newVelocity = new Vector2();
  50705. /**
  50706. * The Body's absolute maximum change in position, in pixels per step.
  50707. *
  50708. * @name Phaser.Physics.Arcade.Body#deltaMax
  50709. * @type {Phaser.Math.Vector2}
  50710. * @since 3.0.0
  50711. */
  50712. this.deltaMax = new Vector2();
  50713. /**
  50714. * The Body's change in velocity, in pixels per second squared.
  50715. *
  50716. * @name Phaser.Physics.Arcade.Body#acceleration
  50717. * @type {Phaser.Math.Vector2}
  50718. * @since 3.0.0
  50719. */
  50720. this.acceleration = new Vector2();
  50721. /**
  50722. * Whether this Body's velocity is affected by its `drag`.
  50723. *
  50724. * @name Phaser.Physics.Arcade.Body#allowDrag
  50725. * @type {boolean}
  50726. * @default true
  50727. * @since 3.0.0
  50728. */
  50729. this.allowDrag = true;
  50730. /**
  50731. * Absolute loss of velocity due to movement, in pixels per second squared.
  50732. * The x and y components are applied separately.
  50733. *
  50734. * When `useDamping` is true, this is 1 minus the damping factor.
  50735. * A value of 1 means the Body loses no velocity.
  50736. * A value of 0.95 means the Body loses 5% of its velocity per step.
  50737. * A value of 0.5 means the Body loses 50% of its velocity per step.
  50738. *
  50739. * Drag is applied only when `acceleration` is zero.
  50740. *
  50741. * @name Phaser.Physics.Arcade.Body#drag
  50742. * @type {(Phaser.Math.Vector2|number)}
  50743. * @since 3.0.0
  50744. */
  50745. this.drag = new Vector2();
  50746. /**
  50747. * Whether this Body's position is affected by gravity (local or world).
  50748. *
  50749. * @name Phaser.Physics.Arcade.Body#allowGravity
  50750. * @type {boolean}
  50751. * @default true
  50752. * @since 3.0.0
  50753. * @see Phaser.Physics.Arcade.Body#gravity
  50754. * @see Phaser.Physics.Arcade.World#gravity
  50755. */
  50756. this.allowGravity = true;
  50757. /**
  50758. * Acceleration due to gravity (specific to this Body), in pixels per second squared.
  50759. * Total gravity is the sum of this vector and the simulation's `gravity`.
  50760. *
  50761. * @name Phaser.Physics.Arcade.Body#gravity
  50762. * @type {Phaser.Math.Vector2}
  50763. * @since 3.0.0
  50764. * @see Phaser.Physics.Arcade.World#gravity
  50765. */
  50766. this.gravity = new Vector2();
  50767. /**
  50768. * Rebound following a collision, relative to 1.
  50769. *
  50770. * @name Phaser.Physics.Arcade.Body#bounce
  50771. * @type {Phaser.Math.Vector2}
  50772. * @since 3.0.0
  50773. */
  50774. this.bounce = new Vector2();
  50775. /**
  50776. * Rebound following a collision with the world boundary, relative to 1.
  50777. * If null, `bounce` is used instead.
  50778. *
  50779. * @name Phaser.Physics.Arcade.Body#worldBounce
  50780. * @type {?Phaser.Math.Vector2}
  50781. * @default null
  50782. * @since 3.0.0
  50783. */
  50784. this.worldBounce = null;
  50785. // If true this Body will dispatch events
  50786. /**
  50787. * Whether the simulation emits a `worldbounds` event when this Body collides with the world boundary (and `collideWorldBounds` is also true).
  50788. *
  50789. * @name Phaser.Physics.Arcade.Body#onWorldBounds
  50790. * @type {boolean}
  50791. * @default false
  50792. * @since 3.0.0
  50793. * @see Phaser.Physics.Arcade.World#worldboundsEvent
  50794. */
  50795. this.onWorldBounds = false;
  50796. /**
  50797. * Whether the simulation emits a `collide` event when this Body collides with another.
  50798. *
  50799. * @name Phaser.Physics.Arcade.Body#onCollide
  50800. * @type {boolean}
  50801. * @default false
  50802. * @since 3.0.0
  50803. * @see Phaser.Physics.Arcade.World#collideEvent
  50804. */
  50805. this.onCollide = false;
  50806. /**
  50807. * Whether the simulation emits an `overlap` event when this Body overlaps with another.
  50808. *
  50809. * @name Phaser.Physics.Arcade.Body#onOverlap
  50810. * @type {boolean}
  50811. * @default false
  50812. * @since 3.0.0
  50813. * @see Phaser.Physics.Arcade.World#overlapEvent
  50814. */
  50815. this.onOverlap = false;
  50816. /**
  50817. * The Body's absolute maximum velocity, in pixels per second.
  50818. * The horizontal and vertical components are applied separately.
  50819. *
  50820. * @name Phaser.Physics.Arcade.Body#maxVelocity
  50821. * @type {Phaser.Math.Vector2}
  50822. * @since 3.0.0
  50823. */
  50824. this.maxVelocity = new Vector2(10000, 10000);
  50825. /**
  50826. * The maximum speed this Body is allowed to reach.
  50827. *
  50828. * If not negative it limits the scalar value of speed.
  50829. *
  50830. * Any negative value means no maximum is being applied.
  50831. *
  50832. * @name Phaser.Physics.Arcade.Body#maxSpeed
  50833. * @type {number}
  50834. * @since 3.16.0
  50835. */
  50836. this.maxSpeed = -1;
  50837. /**
  50838. * If this Body is `immovable` and in motion, `friction` is the proportion of this Body's motion received by the riding Body on each axis, relative to 1.
  50839. * The default value (1, 0) moves the riding Body horizontally in equal proportion to this Body and vertically not at all.
  50840. * The horizontal component (x) is applied only when two colliding Bodies are separated vertically.
  50841. * The vertical component (y) is applied only when two colliding Bodies are separated horizontally.
  50842. *
  50843. * @name Phaser.Physics.Arcade.Body#friction
  50844. * @type {Phaser.Math.Vector2}
  50845. * @since 3.0.0
  50846. */
  50847. this.friction = new Vector2(1, 0);
  50848. /**
  50849. * If this Body is using `drag` for deceleration this property controls how the drag is applied.
  50850. * If set to `true` drag will use a damping effect rather than a linear approach. If you are
  50851. * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in
  50852. * the game Asteroids) then you will get a far smoother and more visually correct deceleration
  50853. * by using damping, avoiding the axis-drift that is prone with linear deceleration.
  50854. *
  50855. * If you enable this property then you should use far smaller `drag` values than with linear, as
  50856. * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow
  50857. * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately.
  50858. *
  50859. * @name Phaser.Physics.Arcade.Body#useDamping
  50860. * @type {boolean}
  50861. * @default false
  50862. * @since 3.10.0
  50863. */
  50864. this.useDamping = false;
  50865. /**
  50866. * The rate of change of this Body's `rotation`, in degrees per second.
  50867. *
  50868. * @name Phaser.Physics.Arcade.Body#angularVelocity
  50869. * @type {number}
  50870. * @default 0
  50871. * @since 3.0.0
  50872. */
  50873. this.angularVelocity = 0;
  50874. /**
  50875. * The Body's angular acceleration (change in angular velocity), in degrees per second squared.
  50876. *
  50877. * @name Phaser.Physics.Arcade.Body#angularAcceleration
  50878. * @type {number}
  50879. * @default 0
  50880. * @since 3.0.0
  50881. */
  50882. this.angularAcceleration = 0;
  50883. /**
  50884. * Loss of angular velocity due to angular movement, in degrees per second.
  50885. *
  50886. * Angular drag is applied only when angular acceleration is zero.
  50887. *
  50888. * @name Phaser.Physics.Arcade.Body#angularDrag
  50889. * @type {number}
  50890. * @default 0
  50891. * @since 3.0.0
  50892. */
  50893. this.angularDrag = 0;
  50894. /**
  50895. * The Body's maximum angular velocity, in degrees per second.
  50896. *
  50897. * @name Phaser.Physics.Arcade.Body#maxAngular
  50898. * @type {number}
  50899. * @default 1000
  50900. * @since 3.0.0
  50901. */
  50902. this.maxAngular = 1000;
  50903. /**
  50904. * The Body's inertia, relative to a default unit (1).
  50905. * With `bounce`, this affects the exchange of momentum (velocities) during collisions.
  50906. *
  50907. * @name Phaser.Physics.Arcade.Body#mass
  50908. * @type {number}
  50909. * @default 1
  50910. * @since 3.0.0
  50911. */
  50912. this.mass = 1;
  50913. /**
  50914. * The calculated angle of this Body's velocity vector, in degrees, during the last step.
  50915. *
  50916. * @name Phaser.Physics.Arcade.Body#angle
  50917. * @type {number}
  50918. * @default 0
  50919. * @since 3.0.0
  50920. */
  50921. this.angle = 0;
  50922. /**
  50923. * The calculated magnitude of the Body's velocity, in pixels per second, during the last step.
  50924. *
  50925. * @name Phaser.Physics.Arcade.Body#speed
  50926. * @type {number}
  50927. * @default 0
  50928. * @since 3.0.0
  50929. */
  50930. this.speed = 0;
  50931. /**
  50932. * The direction of the Body's velocity, as calculated during the last step.
  50933. * If the Body is moving on both axes (diagonally), this describes motion on the vertical axis only.
  50934. *
  50935. * @name Phaser.Physics.Arcade.Body#facing
  50936. * @type {integer}
  50937. * @since 3.0.0
  50938. */
  50939. this.facing = CONST.FACING_NONE;
  50940. /**
  50941. * Whether this Body can be moved by collisions with another Body.
  50942. *
  50943. * @name Phaser.Physics.Arcade.Body#immovable
  50944. * @type {boolean}
  50945. * @default false
  50946. * @since 3.0.0
  50947. */
  50948. this.immovable = false;
  50949. /**
  50950. * Whether the Body's position and rotation are affected by its velocity, acceleration, drag, and gravity.
  50951. *
  50952. * @name Phaser.Physics.Arcade.Body#moves
  50953. * @type {boolean}
  50954. * @default true
  50955. * @since 3.0.0
  50956. */
  50957. this.moves = true;
  50958. /**
  50959. * A flag disabling the default horizontal separation of colliding bodies.
  50960. * Pass your own `collideCallback` to the collider.
  50961. *
  50962. * @name Phaser.Physics.Arcade.Body#customSeparateX
  50963. * @type {boolean}
  50964. * @default false
  50965. * @since 3.0.0
  50966. */
  50967. this.customSeparateX = false;
  50968. /**
  50969. * A flag disabling the default vertical separation of colliding bodies.
  50970. * Pass your own `collideCallback` to the collider.
  50971. *
  50972. * @name Phaser.Physics.Arcade.Body#customSeparateY
  50973. * @type {boolean}
  50974. * @default false
  50975. * @since 3.0.0
  50976. */
  50977. this.customSeparateY = false;
  50978. /**
  50979. * The amount of horizontal overlap (before separation), if this Body is colliding with another.
  50980. *
  50981. * @name Phaser.Physics.Arcade.Body#overlapX
  50982. * @type {number}
  50983. * @default 0
  50984. * @since 3.0.0
  50985. */
  50986. this.overlapX = 0;
  50987. /**
  50988. * The amount of vertical overlap (before separation), if this Body is colliding with another.
  50989. *
  50990. * @name Phaser.Physics.Arcade.Body#overlapY
  50991. * @type {number}
  50992. * @default 0
  50993. * @since 3.0.0
  50994. */
  50995. this.overlapY = 0;
  50996. /**
  50997. * The amount of overlap (before separation), if this Body is circular and colliding with another circular body.
  50998. *
  50999. * @name Phaser.Physics.Arcade.Body#overlapR
  51000. * @type {number}
  51001. * @default 0
  51002. * @since 3.0.0
  51003. */
  51004. this.overlapR = 0;
  51005. /**
  51006. * Whether this Body is overlapped with another and both are not moving.
  51007. *
  51008. * @name Phaser.Physics.Arcade.Body#embedded
  51009. * @type {boolean}
  51010. * @default false
  51011. * @since 3.0.0
  51012. */
  51013. this.embedded = false;
  51014. /**
  51015. * Whether this Body interacts with the world boundary.
  51016. *
  51017. * @name Phaser.Physics.Arcade.Body#collideWorldBounds
  51018. * @type {boolean}
  51019. * @default false
  51020. * @since 3.0.0
  51021. */
  51022. this.collideWorldBounds = false;
  51023. /**
  51024. * Whether this Body is checked for collisions and for which directions.
  51025. * You can set `checkCollision.none = true` to disable collision checks.
  51026. *
  51027. * @name Phaser.Physics.Arcade.Body#checkCollision
  51028. * @type {ArcadeBodyCollision}
  51029. * @since 3.0.0
  51030. */
  51031. this.checkCollision = { none: false, up: true, down: true, left: true, right: true };
  51032. /**
  51033. * Whether this Body is colliding with another and in which direction.
  51034. *
  51035. * @name Phaser.Physics.Arcade.Body#touching
  51036. * @type {ArcadeBodyCollision}
  51037. * @since 3.0.0
  51038. */
  51039. this.touching = { none: true, up: false, down: false, left: false, right: false };
  51040. /**
  51041. * Whether this Body was colliding with another during the last step, and in which direction.
  51042. *
  51043. * @name Phaser.Physics.Arcade.Body#wasTouching
  51044. * @type {ArcadeBodyCollision}
  51045. * @since 3.0.0
  51046. */
  51047. this.wasTouching = { none: true, up: false, down: false, left: false, right: false };
  51048. /**
  51049. * Whether this Body is colliding with a tile or the world boundary.
  51050. *
  51051. * @name Phaser.Physics.Arcade.Body#blocked
  51052. * @type {ArcadeBodyCollision}
  51053. * @since 3.0.0
  51054. */
  51055. this.blocked = { none: true, up: false, down: false, left: false, right: false };
  51056. /**
  51057. * Whether to automatically synchronize this Body's dimensions to the dimensions of its Game Object's visual bounds.
  51058. *
  51059. * @name Phaser.Physics.Arcade.Body#syncBounds
  51060. * @type {boolean}
  51061. * @default false
  51062. * @since 3.0.0
  51063. * @see Phaser.GameObjects.Components.GetBounds#getBounds
  51064. */
  51065. this.syncBounds = false;
  51066. /**
  51067. * Whether this Body is being moved by the `moveTo` or `moveFrom` methods.
  51068. *
  51069. * @name Phaser.Physics.Arcade.Body#isMoving
  51070. * @type {boolean}
  51071. * @default false
  51072. * @since 3.0.0
  51073. */
  51074. this.isMoving = false;
  51075. /**
  51076. * Whether this Body's movement by `moveTo` or `moveFrom` will be stopped by collisions with other bodies.
  51077. *
  51078. * @name Phaser.Physics.Arcade.Body#stopVelocityOnCollide
  51079. * @type {boolean}
  51080. * @default true
  51081. * @since 3.0.0
  51082. */
  51083. this.stopVelocityOnCollide = true;
  51084. // read-only
  51085. /**
  51086. * The Body's physics type (dynamic or static).
  51087. *
  51088. * @name Phaser.Physics.Arcade.Body#physicsType
  51089. * @type {integer}
  51090. * @readonly
  51091. * @default Phaser.Physics.Arcade.DYNAMIC_BODY
  51092. * @since 3.0.0
  51093. */
  51094. this.physicsType = CONST.DYNAMIC_BODY;
  51095. /**
  51096. * Whether the Body's position needs updating from its Game Object.
  51097. *
  51098. * @name Phaser.Physics.Arcade.Body#_reset
  51099. * @type {boolean}
  51100. * @private
  51101. * @default true
  51102. * @since 3.0.0
  51103. */
  51104. this._reset = true;
  51105. /**
  51106. * Cached horizontal scale of the Body's Game Object.
  51107. *
  51108. * @name Phaser.Physics.Arcade.Body#_sx
  51109. * @type {number}
  51110. * @private
  51111. * @since 3.0.0
  51112. */
  51113. this._sx = gameObject.scaleX;
  51114. /**
  51115. * Cached vertical scale of the Body's Game Object.
  51116. *
  51117. * @name Phaser.Physics.Arcade.Body#_sy
  51118. * @type {number}
  51119. * @private
  51120. * @since 3.0.0
  51121. */
  51122. this._sy = gameObject.scaleY;
  51123. /**
  51124. * The calculated change in the Body's horizontal position during the last step.
  51125. *
  51126. * @name Phaser.Physics.Arcade.Body#_dx
  51127. * @type {number}
  51128. * @private
  51129. * @default 0
  51130. * @since 3.0.0
  51131. */
  51132. this._dx = 0;
  51133. /**
  51134. * The calculated change in the Body's vertical position during the last step.
  51135. *
  51136. * @name Phaser.Physics.Arcade.Body#_dy
  51137. * @type {number}
  51138. * @private
  51139. * @default 0
  51140. * @since 3.0.0
  51141. */
  51142. this._dy = 0;
  51143. /**
  51144. * Stores the Game Object's bounds.
  51145. *
  51146. * @name Phaser.Physics.Arcade.Body#_bounds
  51147. * @type {Phaser.Geom.Rectangle}
  51148. * @private
  51149. * @since 3.0.0
  51150. */
  51151. this._bounds = new Rectangle();
  51152. },
  51153. /**
  51154. * Updates the Body's `transform`, `width`, `height`, and `center` from its Game Object.
  51155. * The Body's `position` isn't changed.
  51156. *
  51157. * @method Phaser.Physics.Arcade.Body#updateBounds
  51158. * @since 3.0.0
  51159. */
  51160. updateBounds: function ()
  51161. {
  51162. var sprite = this.gameObject;
  51163. // Container?
  51164. var transform = this.transform;
  51165. if (sprite.parentContainer)
  51166. {
  51167. var matrix = sprite.getWorldTransformMatrix(this.world._tempMatrix, this.world._tempMatrix2);
  51168. transform.x = matrix.tx;
  51169. transform.y = matrix.ty;
  51170. transform.rotation = RadToDeg(matrix.rotation);
  51171. transform.scaleX = matrix.scaleX;
  51172. transform.scaleY = matrix.scaleY;
  51173. transform.displayOriginX = sprite.displayOriginX;
  51174. transform.displayOriginY = sprite.displayOriginY;
  51175. }
  51176. else
  51177. {
  51178. transform.x = sprite.x;
  51179. transform.y = sprite.y;
  51180. transform.rotation = sprite.angle;
  51181. transform.scaleX = sprite.scaleX;
  51182. transform.scaleY = sprite.scaleY;
  51183. transform.displayOriginX = sprite.displayOriginX;
  51184. transform.displayOriginY = sprite.displayOriginY;
  51185. }
  51186. var recalc = false;
  51187. if (this.syncBounds)
  51188. {
  51189. var b = sprite.getBounds(this._bounds);
  51190. this.width = b.width;
  51191. this.height = b.height;
  51192. recalc = true;
  51193. }
  51194. else
  51195. {
  51196. var asx = Math.abs(transform.scaleX);
  51197. var asy = Math.abs(transform.scaleY);
  51198. if (this._sx !== asx || this._sy !== asy)
  51199. {
  51200. this.width = this.sourceWidth * asx;
  51201. this.height = this.sourceHeight * asy;
  51202. this._sx = asx;
  51203. this._sy = asy;
  51204. recalc = true;
  51205. }
  51206. }
  51207. if (recalc)
  51208. {
  51209. this.halfWidth = Math.floor(this.width / 2);
  51210. this.halfHeight = Math.floor(this.height / 2);
  51211. this.updateCenter();
  51212. }
  51213. },
  51214. /**
  51215. * Updates the Body's `center` from its `position`, `width`, and `height`.
  51216. *
  51217. * @method Phaser.Physics.Arcade.Body#updateCenter
  51218. * @since 3.0.0
  51219. */
  51220. updateCenter: function ()
  51221. {
  51222. this.center.set(this.position.x + this.halfWidth, this.position.y + this.halfHeight);
  51223. },
  51224. /**
  51225. * Updates the Body.
  51226. *
  51227. * @method Phaser.Physics.Arcade.Body#update
  51228. * @fires Phaser.Physics.Arcade.World#worldbounds
  51229. * @since 3.0.0
  51230. *
  51231. * @param {number} delta - The delta time, in seconds, elapsed since the last frame.
  51232. */
  51233. update: function (delta)
  51234. {
  51235. // Store and reset collision flags
  51236. this.wasTouching.none = this.touching.none;
  51237. this.wasTouching.up = this.touching.up;
  51238. this.wasTouching.down = this.touching.down;
  51239. this.wasTouching.left = this.touching.left;
  51240. this.wasTouching.right = this.touching.right;
  51241. this.touching.none = true;
  51242. this.touching.up = false;
  51243. this.touching.down = false;
  51244. this.touching.left = false;
  51245. this.touching.right = false;
  51246. this.blocked.none = true;
  51247. this.blocked.up = false;
  51248. this.blocked.down = false;
  51249. this.blocked.left = false;
  51250. this.blocked.right = false;
  51251. this.overlapR = 0;
  51252. this.overlapX = 0;
  51253. this.overlapY = 0;
  51254. this.embedded = false;
  51255. // Updates the transform values
  51256. this.updateBounds();
  51257. var sprite = this.transform;
  51258. this.position.x = sprite.x + sprite.scaleX * (this.offset.x - sprite.displayOriginX);
  51259. this.position.y = sprite.y + sprite.scaleY * (this.offset.y - sprite.displayOriginY);
  51260. this.updateCenter();
  51261. this.rotation = sprite.rotation;
  51262. this.preRotation = this.rotation;
  51263. if (this._reset)
  51264. {
  51265. this.prev.x = this.position.x;
  51266. this.prev.y = this.position.y;
  51267. }
  51268. if (this.moves)
  51269. {
  51270. this.world.updateMotion(this, delta);
  51271. var vx = this.velocity.x;
  51272. var vy = this.velocity.y;
  51273. this.newVelocity.set(vx * delta, vy * delta);
  51274. this.position.add(this.newVelocity);
  51275. this.updateCenter();
  51276. this.angle = Math.atan2(vy, vx);
  51277. this.speed = Math.sqrt(vx * vx + vy * vy);
  51278. // Now the State update will throw collision checks at the Body
  51279. // And finally we'll integrate the new position back to the Sprite in postUpdate
  51280. if (this.collideWorldBounds && this.checkWorldBounds() && this.onWorldBounds)
  51281. {
  51282. this.world.emit(Events.WORLD_BOUNDS, this, this.blocked.up, this.blocked.down, this.blocked.left, this.blocked.right);
  51283. }
  51284. }
  51285. this._dx = this.position.x - this.prev.x;
  51286. this._dy = this.position.y - this.prev.y;
  51287. },
  51288. /**
  51289. * Feeds the Body results back into the parent Game Object.
  51290. *
  51291. * @method Phaser.Physics.Arcade.Body#postUpdate
  51292. * @since 3.0.0
  51293. *
  51294. * @param {boolean} resetDelta - Reset the delta properties?
  51295. */
  51296. postUpdate: function ()
  51297. {
  51298. this._dx = this.position.x - this.prev.x;
  51299. this._dy = this.position.y - this.prev.y;
  51300. if (this.moves)
  51301. {
  51302. if (this.deltaMax.x !== 0 && this._dx !== 0)
  51303. {
  51304. if (this._dx < 0 && this._dx < -this.deltaMax.x)
  51305. {
  51306. this._dx = -this.deltaMax.x;
  51307. }
  51308. else if (this._dx > 0 && this._dx > this.deltaMax.x)
  51309. {
  51310. this._dx = this.deltaMax.x;
  51311. }
  51312. }
  51313. if (this.deltaMax.y !== 0 && this._dy !== 0)
  51314. {
  51315. if (this._dy < 0 && this._dy < -this.deltaMax.y)
  51316. {
  51317. this._dy = -this.deltaMax.y;
  51318. }
  51319. else if (this._dy > 0 && this._dy > this.deltaMax.y)
  51320. {
  51321. this._dy = this.deltaMax.y;
  51322. }
  51323. }
  51324. this.gameObject.x += this._dx;
  51325. this.gameObject.y += this._dy;
  51326. this._reset = true;
  51327. }
  51328. if (this._dx < 0)
  51329. {
  51330. this.facing = CONST.FACING_LEFT;
  51331. }
  51332. else if (this._dx > 0)
  51333. {
  51334. this.facing = CONST.FACING_RIGHT;
  51335. }
  51336. if (this._dy < 0)
  51337. {
  51338. this.facing = CONST.FACING_UP;
  51339. }
  51340. else if (this._dy > 0)
  51341. {
  51342. this.facing = CONST.FACING_DOWN;
  51343. }
  51344. if (this.allowRotation)
  51345. {
  51346. this.gameObject.angle += this.deltaZ();
  51347. }
  51348. this.prev.x = this.position.x;
  51349. this.prev.y = this.position.y;
  51350. },
  51351. /**
  51352. * Checks for collisions between this Body and the world boundary and separates them.
  51353. *
  51354. * @method Phaser.Physics.Arcade.Body#checkWorldBounds
  51355. * @since 3.0.0
  51356. *
  51357. * @return {boolean} True if this Body is colliding with the world boundary.
  51358. */
  51359. checkWorldBounds: function ()
  51360. {
  51361. var pos = this.position;
  51362. var bounds = this.world.bounds;
  51363. var check = this.world.checkCollision;
  51364. var bx = (this.worldBounce) ? -this.worldBounce.x : -this.bounce.x;
  51365. var by = (this.worldBounce) ? -this.worldBounce.y : -this.bounce.y;
  51366. if (pos.x < bounds.x && check.left)
  51367. {
  51368. pos.x = bounds.x;
  51369. this.velocity.x *= bx;
  51370. this.blocked.left = true;
  51371. this.blocked.none = false;
  51372. }
  51373. else if (this.right > bounds.right && check.right)
  51374. {
  51375. pos.x = bounds.right - this.width;
  51376. this.velocity.x *= bx;
  51377. this.blocked.right = true;
  51378. this.blocked.none = false;
  51379. }
  51380. if (pos.y < bounds.y && check.up)
  51381. {
  51382. pos.y = bounds.y;
  51383. this.velocity.y *= by;
  51384. this.blocked.up = true;
  51385. this.blocked.none = false;
  51386. }
  51387. else if (this.bottom > bounds.bottom && check.down)
  51388. {
  51389. pos.y = bounds.bottom - this.height;
  51390. this.velocity.y *= by;
  51391. this.blocked.down = true;
  51392. this.blocked.none = false;
  51393. }
  51394. return !this.blocked.none;
  51395. },
  51396. /**
  51397. * Sets the offset of the Body's position from its Game Object's position.
  51398. *
  51399. * @method Phaser.Physics.Arcade.Body#setOffset
  51400. * @since 3.0.0
  51401. *
  51402. * @param {number} x - The horizontal offset, in source pixels.
  51403. * @param {number} [y=x] - The vertical offset, in source pixels.
  51404. *
  51405. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51406. */
  51407. setOffset: function (x, y)
  51408. {
  51409. if (y === undefined) { y = x; }
  51410. this.offset.set(x, y);
  51411. return this;
  51412. },
  51413. /**
  51414. * Sizes and positions this Body's boundary, as a rectangle.
  51415. * Modifies the Body `offset` if `center` is true (the default).
  51416. * Resets the width and height to match current frame, if no width and height provided and a frame is found.
  51417. *
  51418. * @method Phaser.Physics.Arcade.Body#setSize
  51419. * @since 3.0.0
  51420. *
  51421. * @param {integer} [width] - The width of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame width.
  51422. * @param {integer} [height] - The height of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame height.
  51423. * @param {boolean} [center=true] - Modify the Body's `offset`, placing the Body's center on its Game Object's center. Only works if the Game Object has the `getCenter` method.
  51424. *
  51425. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51426. */
  51427. setSize: function (width, height, center)
  51428. {
  51429. if (center === undefined) { center = true; }
  51430. var gameObject = this.gameObject;
  51431. if (!width && gameObject.frame)
  51432. {
  51433. width = gameObject.frame.realWidth;
  51434. }
  51435. if (!height && gameObject.frame)
  51436. {
  51437. height = gameObject.frame.realHeight;
  51438. }
  51439. this.sourceWidth = width;
  51440. this.sourceHeight = height;
  51441. this.width = this.sourceWidth * this._sx;
  51442. this.height = this.sourceHeight * this._sy;
  51443. this.halfWidth = Math.floor(this.width / 2);
  51444. this.halfHeight = Math.floor(this.height / 2);
  51445. this.updateCenter();
  51446. if (center && gameObject.getCenter)
  51447. {
  51448. var ox = gameObject.displayWidth / 2;
  51449. var oy = gameObject.displayHeight / 2;
  51450. this.offset.set(ox - this.halfWidth, oy - this.halfHeight);
  51451. }
  51452. this.isCircle = false;
  51453. this.radius = 0;
  51454. return this;
  51455. },
  51456. /**
  51457. * Sizes and positions this Body's boundary, as a circle.
  51458. *
  51459. * @method Phaser.Physics.Arcade.Body#setCircle
  51460. * @since 3.0.0
  51461. *
  51462. * @param {number} radius - The radius of the Body, in source pixels.
  51463. * @param {number} [offsetX] - The horizontal offset of the Body from its Game Object, in source pixels.
  51464. * @param {number} [offsetY] - The vertical offset of the Body from its Game Object, in source pixels.
  51465. *
  51466. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51467. */
  51468. setCircle: function (radius, offsetX, offsetY)
  51469. {
  51470. if (offsetX === undefined) { offsetX = this.offset.x; }
  51471. if (offsetY === undefined) { offsetY = this.offset.y; }
  51472. if (radius > 0)
  51473. {
  51474. this.isCircle = true;
  51475. this.radius = radius;
  51476. this.sourceWidth = radius * 2;
  51477. this.sourceHeight = radius * 2;
  51478. this.width = this.sourceWidth * this._sx;
  51479. this.height = this.sourceHeight * this._sy;
  51480. this.halfWidth = Math.floor(this.width / 2);
  51481. this.halfHeight = Math.floor(this.height / 2);
  51482. this.offset.set(offsetX, offsetY);
  51483. this.updateCenter();
  51484. }
  51485. else
  51486. {
  51487. this.isCircle = false;
  51488. }
  51489. return this;
  51490. },
  51491. /**
  51492. * Resets this Body to the given coordinates. Also positions its parent Game Object to the same coordinates.
  51493. * If the Body had any velocity or acceleration it is lost as a result of calling this.
  51494. *
  51495. * @method Phaser.Physics.Arcade.Body#reset
  51496. * @since 3.0.0
  51497. *
  51498. * @param {number} x - The horizontal position to place the Game Object and Body.
  51499. * @param {number} y - The vertical position to place the Game Object and Body.
  51500. */
  51501. reset: function (x, y)
  51502. {
  51503. this.stop();
  51504. var gameObject = this.gameObject;
  51505. gameObject.setPosition(x, y);
  51506. gameObject.getTopLeft(this.position);
  51507. this.prev.copy(this.position);
  51508. this.rotation = gameObject.angle;
  51509. this.preRotation = gameObject.angle;
  51510. this.updateBounds();
  51511. this.updateCenter();
  51512. },
  51513. /**
  51514. * Sets acceleration, velocity, and speed to zero.
  51515. *
  51516. * @method Phaser.Physics.Arcade.Body#stop
  51517. * @since 3.0.0
  51518. *
  51519. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51520. */
  51521. stop: function ()
  51522. {
  51523. this.velocity.set(0);
  51524. this.acceleration.set(0);
  51525. this.speed = 0;
  51526. this.angularVelocity = 0;
  51527. this.angularAcceleration = 0;
  51528. return this;
  51529. },
  51530. /**
  51531. * Copies the coordinates of this Body's edges into an object.
  51532. *
  51533. * @method Phaser.Physics.Arcade.Body#getBounds
  51534. * @since 3.0.0
  51535. *
  51536. * @param {ArcadeBodyBounds} obj - An object to copy the values into.
  51537. *
  51538. * @return {ArcadeBodyBounds} - An object with {x, y, right, bottom}.
  51539. */
  51540. getBounds: function (obj)
  51541. {
  51542. obj.x = this.x;
  51543. obj.y = this.y;
  51544. obj.right = this.right;
  51545. obj.bottom = this.bottom;
  51546. return obj;
  51547. },
  51548. /**
  51549. * Tests if the coordinates are within this Body's boundary.
  51550. *
  51551. * @method Phaser.Physics.Arcade.Body#hitTest
  51552. * @since 3.0.0
  51553. *
  51554. * @param {number} x - The horizontal coordinate.
  51555. * @param {number} y - The vertical coordinate.
  51556. *
  51557. * @return {boolean} True if (x, y) is within this Body.
  51558. */
  51559. hitTest: function (x, y)
  51560. {
  51561. return (this.isCircle) ? CircleContains(this, x, y) : RectangleContains(this, x, y);
  51562. },
  51563. /**
  51564. * Whether this Body is touching a tile or the world boundary while moving down.
  51565. *
  51566. * @method Phaser.Physics.Arcade.Body#onFloor
  51567. * @since 3.0.0
  51568. * @see Phaser.Physics.Arcade.Body#blocked
  51569. *
  51570. * @return {boolean} True if touching.
  51571. */
  51572. onFloor: function ()
  51573. {
  51574. return this.blocked.down;
  51575. },
  51576. /**
  51577. * Whether this Body is touching a tile or the world boundary while moving up.
  51578. *
  51579. * @method Phaser.Physics.Arcade.Body#onCeiling
  51580. * @since 3.0.0
  51581. * @see Phaser.Physics.Arcade.Body#blocked
  51582. *
  51583. * @return {boolean} True if touching.
  51584. */
  51585. onCeiling: function ()
  51586. {
  51587. return this.blocked.up;
  51588. },
  51589. /**
  51590. * Whether this Body is touching a tile or the world boundary while moving left or right.
  51591. *
  51592. * @method Phaser.Physics.Arcade.Body#onWall
  51593. * @since 3.0.0
  51594. * @see Phaser.Physics.Arcade.Body#blocked
  51595. *
  51596. * @return {boolean} True if touching.
  51597. */
  51598. onWall: function ()
  51599. {
  51600. return (this.blocked.left || this.blocked.right);
  51601. },
  51602. /**
  51603. * The absolute (non-negative) change in this Body's horizontal position from the previous step.
  51604. *
  51605. * @method Phaser.Physics.Arcade.Body#deltaAbsX
  51606. * @since 3.0.0
  51607. *
  51608. * @return {number} The delta value.
  51609. */
  51610. deltaAbsX: function ()
  51611. {
  51612. return (this._dx > 0) ? this._dx : -this._dx;
  51613. },
  51614. /**
  51615. * The absolute (non-negative) change in this Body's vertical position from the previous step.
  51616. *
  51617. * @method Phaser.Physics.Arcade.Body#deltaAbsY
  51618. * @since 3.0.0
  51619. *
  51620. * @return {number} The delta value.
  51621. */
  51622. deltaAbsY: function ()
  51623. {
  51624. return (this._dy > 0) ? this._dy : -this._dy;
  51625. },
  51626. /**
  51627. * The change in this Body's horizontal position from the previous step.
  51628. * This value is set during the Body's update phase.
  51629. *
  51630. * @method Phaser.Physics.Arcade.Body#deltaX
  51631. * @since 3.0.0
  51632. *
  51633. * @return {number} The delta value.
  51634. */
  51635. deltaX: function ()
  51636. {
  51637. return this._dx;
  51638. },
  51639. /**
  51640. * The change in this Body's vertical position from the previous step.
  51641. * This value is set during the Body's update phase.
  51642. *
  51643. * @method Phaser.Physics.Arcade.Body#deltaY
  51644. * @since 3.0.0
  51645. *
  51646. * @return {number} The delta value.
  51647. */
  51648. deltaY: function ()
  51649. {
  51650. return this._dy;
  51651. },
  51652. /**
  51653. * The change in this Body's rotation from the previous step, in degrees.
  51654. *
  51655. * @method Phaser.Physics.Arcade.Body#deltaZ
  51656. * @since 3.0.0
  51657. *
  51658. * @return {number} The delta value.
  51659. */
  51660. deltaZ: function ()
  51661. {
  51662. return this.rotation - this.preRotation;
  51663. },
  51664. /**
  51665. * Disables this Body and marks it for deletion by the simulation.
  51666. *
  51667. * @method Phaser.Physics.Arcade.Body#destroy
  51668. * @since 3.0.0
  51669. */
  51670. destroy: function ()
  51671. {
  51672. this.enable = false;
  51673. if (this.world)
  51674. {
  51675. this.world.pendingDestroy.set(this);
  51676. }
  51677. },
  51678. /**
  51679. * Draws this Body's boundary and velocity, if enabled.
  51680. *
  51681. * @method Phaser.Physics.Arcade.Body#drawDebug
  51682. * @since 3.0.0
  51683. *
  51684. * @param {Phaser.GameObjects.Graphics} graphic - The Graphics object to draw on.
  51685. */
  51686. drawDebug: function (graphic)
  51687. {
  51688. var pos = this.position;
  51689. var x = pos.x + this.halfWidth;
  51690. var y = pos.y + this.halfHeight;
  51691. if (this.debugShowBody)
  51692. {
  51693. graphic.lineStyle(graphic.defaultStrokeWidth, this.debugBodyColor);
  51694. if (this.isCircle)
  51695. {
  51696. graphic.strokeCircle(x, y, this.width / 2);
  51697. }
  51698. else
  51699. {
  51700. graphic.strokeRect(pos.x, pos.y, this.width, this.height);
  51701. }
  51702. }
  51703. if (this.debugShowVelocity)
  51704. {
  51705. graphic.lineStyle(graphic.defaultStrokeWidth, this.world.defaults.velocityDebugColor, 1);
  51706. graphic.lineBetween(x, y, x + this.velocity.x / 2, y + this.velocity.y / 2);
  51707. }
  51708. },
  51709. /**
  51710. * Whether this Body will be drawn to the debug display.
  51711. *
  51712. * @method Phaser.Physics.Arcade.Body#willDrawDebug
  51713. * @since 3.0.0
  51714. *
  51715. * @return {boolean} True if either `debugShowBody` or `debugShowVelocity` are enabled.
  51716. */
  51717. willDrawDebug: function ()
  51718. {
  51719. return (this.debugShowBody || this.debugShowVelocity);
  51720. },
  51721. /**
  51722. * Sets whether this Body collides with the world boundary.
  51723. *
  51724. * @method Phaser.Physics.Arcade.Body#setCollideWorldBounds
  51725. * @since 3.0.0
  51726. *
  51727. * @param {boolean} [value=true] - True (collisions) or false (no collisions).
  51728. *
  51729. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51730. */
  51731. setCollideWorldBounds: function (value)
  51732. {
  51733. if (value === undefined) { value = true; }
  51734. this.collideWorldBounds = value;
  51735. return this;
  51736. },
  51737. /**
  51738. * Sets the Body's velocity.
  51739. *
  51740. * @method Phaser.Physics.Arcade.Body#setVelocity
  51741. * @since 3.0.0
  51742. *
  51743. * @param {number} x - The horizontal velocity, in pixels per second.
  51744. * @param {number} [y=x] - The vertical velocity, in pixels per second.
  51745. *
  51746. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51747. */
  51748. setVelocity: function (x, y)
  51749. {
  51750. this.velocity.set(x, y);
  51751. this.speed = Math.sqrt(x * x + y * y);
  51752. return this;
  51753. },
  51754. /**
  51755. * Sets the Body's horizontal velocity.
  51756. *
  51757. * @method Phaser.Physics.Arcade.Body#setVelocityX
  51758. * @since 3.0.0
  51759. *
  51760. * @param {number} value - The velocity, in pixels per second.
  51761. *
  51762. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51763. */
  51764. setVelocityX: function (value)
  51765. {
  51766. this.velocity.x = value;
  51767. var vx = value;
  51768. var vy = this.velocity.y;
  51769. this.speed = Math.sqrt(vx * vx + vy * vy);
  51770. return this;
  51771. },
  51772. /**
  51773. * Sets the Body's vertical velocity.
  51774. *
  51775. * @method Phaser.Physics.Arcade.Body#setVelocityY
  51776. * @since 3.0.0
  51777. *
  51778. * @param {number} value - The velocity, in pixels per second.
  51779. *
  51780. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51781. */
  51782. setVelocityY: function (value)
  51783. {
  51784. this.velocity.y = value;
  51785. var vx = this.velocity.x;
  51786. var vy = value;
  51787. this.speed = Math.sqrt(vx * vx + vy * vy);
  51788. return this;
  51789. },
  51790. /**
  51791. * Sets the Body's maximum velocity.
  51792. *
  51793. * @method Phaser.Physics.Arcade.Body#setMaxVelocity
  51794. * @since 3.10.0
  51795. *
  51796. * @param {number} x - The horizontal velocity, in pixels per second.
  51797. * @param {number} [y=x] - The vertical velocity, in pixels per second.
  51798. *
  51799. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51800. */
  51801. setMaxVelocity: function (x, y)
  51802. {
  51803. this.maxVelocity.set(x, y);
  51804. return this;
  51805. },
  51806. /**
  51807. * Sets the maximum speed the Body can move.
  51808. *
  51809. * @method Phaser.Physics.Arcade.Body#setMaxSpeed
  51810. * @since 3.16.0
  51811. *
  51812. * @param {number} value - The maximum speed value, in pixels per second. Set to a negative value to disable.
  51813. *
  51814. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51815. */
  51816. setMaxSpeed: function (value)
  51817. {
  51818. this.maxSpeed = value;
  51819. return this;
  51820. },
  51821. /**
  51822. * Sets the Body's bounce.
  51823. *
  51824. * @method Phaser.Physics.Arcade.Body#setBounce
  51825. * @since 3.0.0
  51826. *
  51827. * @param {number} x - The horizontal bounce, relative to 1.
  51828. * @param {number} y - The vertical bounce, relative to 1.
  51829. *
  51830. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51831. */
  51832. setBounce: function (x, y)
  51833. {
  51834. this.bounce.set(x, y);
  51835. return this;
  51836. },
  51837. /**
  51838. * Sets the Body's horizontal bounce.
  51839. *
  51840. * @method Phaser.Physics.Arcade.Body#setBounceX
  51841. * @since 3.0.0
  51842. *
  51843. * @param {number} value - The bounce, relative to 1.
  51844. *
  51845. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51846. */
  51847. setBounceX: function (value)
  51848. {
  51849. this.bounce.x = value;
  51850. return this;
  51851. },
  51852. /**
  51853. * Sets the Body's vertical bounce.
  51854. *
  51855. * @method Phaser.Physics.Arcade.Body#setBounceY
  51856. * @since 3.0.0
  51857. *
  51858. * @param {number} value - The bounce, relative to 1.
  51859. *
  51860. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51861. */
  51862. setBounceY: function (value)
  51863. {
  51864. this.bounce.y = value;
  51865. return this;
  51866. },
  51867. /**
  51868. * Sets the Body's acceleration.
  51869. *
  51870. * @method Phaser.Physics.Arcade.Body#setAcceleration
  51871. * @since 3.0.0
  51872. *
  51873. * @param {number} x - The horizontal component, in pixels per second squared.
  51874. * @param {number} y - The vertical component, in pixels per second squared.
  51875. *
  51876. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51877. */
  51878. setAcceleration: function (x, y)
  51879. {
  51880. this.acceleration.set(x, y);
  51881. return this;
  51882. },
  51883. /**
  51884. * Sets the Body's horizontal acceleration.
  51885. *
  51886. * @method Phaser.Physics.Arcade.Body#setAccelerationX
  51887. * @since 3.0.0
  51888. *
  51889. * @param {number} value - The acceleration, in pixels per second squared.
  51890. *
  51891. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51892. */
  51893. setAccelerationX: function (value)
  51894. {
  51895. this.acceleration.x = value;
  51896. return this;
  51897. },
  51898. /**
  51899. * Sets the Body's vertical acceleration.
  51900. *
  51901. * @method Phaser.Physics.Arcade.Body#setAccelerationY
  51902. * @since 3.0.0
  51903. *
  51904. * @param {number} value - The acceleration, in pixels per second squared.
  51905. *
  51906. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51907. */
  51908. setAccelerationY: function (value)
  51909. {
  51910. this.acceleration.y = value;
  51911. return this;
  51912. },
  51913. /**
  51914. * Enables or disables drag.
  51915. *
  51916. * @method Phaser.Physics.Arcade.Body#setAllowDrag
  51917. * @since 3.9.0
  51918. * @see Phaser.Physics.Arcade.Body#allowDrag
  51919. *
  51920. * @param {boolean} [value=true] - `true` to allow drag on this body, or `false` to disable it.
  51921. *
  51922. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51923. */
  51924. setAllowDrag: function (value)
  51925. {
  51926. if (value === undefined) { value = true; }
  51927. this.allowDrag = value;
  51928. return this;
  51929. },
  51930. /**
  51931. * Enables or disables gravity's effect on this Body.
  51932. *
  51933. * @method Phaser.Physics.Arcade.Body#setAllowGravity
  51934. * @since 3.9.0
  51935. * @see Phaser.Physics.Arcade.Body#allowGravity
  51936. *
  51937. * @param {boolean} [value=true] - `true` to allow gravity on this body, or `false` to disable it.
  51938. *
  51939. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51940. */
  51941. setAllowGravity: function (value)
  51942. {
  51943. if (value === undefined) { value = true; }
  51944. this.allowGravity = value;
  51945. return this;
  51946. },
  51947. /**
  51948. * Enables or disables rotation.
  51949. *
  51950. * @method Phaser.Physics.Arcade.Body#setAllowRotation
  51951. * @since 3.9.0
  51952. * @see Phaser.Physics.Arcade.Body#allowRotation
  51953. *
  51954. * @param {boolean} [value=true] - `true` to allow rotation on this body, or `false` to disable it.
  51955. *
  51956. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51957. */
  51958. setAllowRotation: function (value)
  51959. {
  51960. if (value === undefined) { value = true; }
  51961. this.allowRotation = value;
  51962. return this;
  51963. },
  51964. /**
  51965. * Sets the Body's drag.
  51966. *
  51967. * @method Phaser.Physics.Arcade.Body#setDrag
  51968. * @since 3.0.0
  51969. *
  51970. * @param {number} x - The horizontal component, in pixels per second squared.
  51971. * @param {number} y - The vertical component, in pixels per second squared.
  51972. *
  51973. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51974. */
  51975. setDrag: function (x, y)
  51976. {
  51977. this.drag.set(x, y);
  51978. return this;
  51979. },
  51980. /**
  51981. * Sets the Body's horizontal drag.
  51982. *
  51983. * @method Phaser.Physics.Arcade.Body#setDragX
  51984. * @since 3.0.0
  51985. *
  51986. * @param {number} value - The drag, in pixels per second squared.
  51987. *
  51988. * @return {Phaser.Physics.Arcade.Body} This Body object.
  51989. */
  51990. setDragX: function (value)
  51991. {
  51992. this.drag.x = value;
  51993. return this;
  51994. },
  51995. /**
  51996. * Sets the Body's vertical drag.
  51997. *
  51998. * @method Phaser.Physics.Arcade.Body#setDragY
  51999. * @since 3.0.0
  52000. *
  52001. * @param {number} value - The drag, in pixels per second squared.
  52002. *
  52003. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52004. */
  52005. setDragY: function (value)
  52006. {
  52007. this.drag.y = value;
  52008. return this;
  52009. },
  52010. /**
  52011. * Sets the Body's gravity.
  52012. *
  52013. * @method Phaser.Physics.Arcade.Body#setGravity
  52014. * @since 3.0.0
  52015. *
  52016. * @param {number} x - The horizontal component, in pixels per second squared.
  52017. * @param {number} y - The vertical component, in pixels per second squared.
  52018. *
  52019. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52020. */
  52021. setGravity: function (x, y)
  52022. {
  52023. this.gravity.set(x, y);
  52024. return this;
  52025. },
  52026. /**
  52027. * Sets the Body's horizontal gravity.
  52028. *
  52029. * @method Phaser.Physics.Arcade.Body#setGravityX
  52030. * @since 3.0.0
  52031. *
  52032. * @param {number} value - The gravity, in pixels per second squared.
  52033. *
  52034. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52035. */
  52036. setGravityX: function (value)
  52037. {
  52038. this.gravity.x = value;
  52039. return this;
  52040. },
  52041. /**
  52042. * Sets the Body's vertical gravity.
  52043. *
  52044. * @method Phaser.Physics.Arcade.Body#setGravityY
  52045. * @since 3.0.0
  52046. *
  52047. * @param {number} value - The gravity, in pixels per second squared.
  52048. *
  52049. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52050. */
  52051. setGravityY: function (value)
  52052. {
  52053. this.gravity.y = value;
  52054. return this;
  52055. },
  52056. /**
  52057. * Sets the Body's friction.
  52058. *
  52059. * @method Phaser.Physics.Arcade.Body#setFriction
  52060. * @since 3.0.0
  52061. *
  52062. * @param {number} x - The horizontal component, relative to 1.
  52063. * @param {number} y - The vertical component, relative to 1.
  52064. *
  52065. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52066. */
  52067. setFriction: function (x, y)
  52068. {
  52069. this.friction.set(x, y);
  52070. return this;
  52071. },
  52072. /**
  52073. * Sets the Body's horizontal friction.
  52074. *
  52075. * @method Phaser.Physics.Arcade.Body#setFrictionX
  52076. * @since 3.0.0
  52077. *
  52078. * @param {number} value - The friction value, relative to 1.
  52079. *
  52080. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52081. */
  52082. setFrictionX: function (value)
  52083. {
  52084. this.friction.x = value;
  52085. return this;
  52086. },
  52087. /**
  52088. * Sets the Body's vertical friction.
  52089. *
  52090. * @method Phaser.Physics.Arcade.Body#setFrictionY
  52091. * @since 3.0.0
  52092. *
  52093. * @param {number} value - The friction value, relative to 1.
  52094. *
  52095. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52096. */
  52097. setFrictionY: function (value)
  52098. {
  52099. this.friction.y = value;
  52100. return this;
  52101. },
  52102. /**
  52103. * Sets the Body's angular velocity.
  52104. *
  52105. * @method Phaser.Physics.Arcade.Body#setAngularVelocity
  52106. * @since 3.0.0
  52107. *
  52108. * @param {number} value - The velocity, in degrees per second.
  52109. *
  52110. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52111. */
  52112. setAngularVelocity: function (value)
  52113. {
  52114. this.angularVelocity = value;
  52115. return this;
  52116. },
  52117. /**
  52118. * Sets the Body's angular acceleration.
  52119. *
  52120. * @method Phaser.Physics.Arcade.Body#setAngularAcceleration
  52121. * @since 3.0.0
  52122. *
  52123. * @param {number} value - The acceleration, in degrees per second squared.
  52124. *
  52125. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52126. */
  52127. setAngularAcceleration: function (value)
  52128. {
  52129. this.angularAcceleration = value;
  52130. return this;
  52131. },
  52132. /**
  52133. * Sets the Body's angular drag.
  52134. *
  52135. * @method Phaser.Physics.Arcade.Body#setAngularDrag
  52136. * @since 3.0.0
  52137. *
  52138. * @param {number} value - The drag, in degrees per second squared.
  52139. *
  52140. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52141. */
  52142. setAngularDrag: function (value)
  52143. {
  52144. this.angularDrag = value;
  52145. return this;
  52146. },
  52147. /**
  52148. * Sets the Body's mass.
  52149. *
  52150. * @method Phaser.Physics.Arcade.Body#setMass
  52151. * @since 3.0.0
  52152. *
  52153. * @param {number} value - The mass value, relative to 1.
  52154. *
  52155. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52156. */
  52157. setMass: function (value)
  52158. {
  52159. this.mass = value;
  52160. return this;
  52161. },
  52162. /**
  52163. * Sets the Body's `immovable` property.
  52164. *
  52165. * @method Phaser.Physics.Arcade.Body#setImmovable
  52166. * @since 3.0.0
  52167. *
  52168. * @param {boolean} [value=true] - The value to assign to `immovable`.
  52169. *
  52170. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52171. */
  52172. setImmovable: function (value)
  52173. {
  52174. if (value === undefined) { value = true; }
  52175. this.immovable = value;
  52176. return this;
  52177. },
  52178. /**
  52179. * Sets the Body's `enable` property.
  52180. *
  52181. * @method Phaser.Physics.Arcade.Body#setEnable
  52182. * @since 3.15.0
  52183. *
  52184. * @param {boolean} [value=true] - The value to assign to `enable`.
  52185. *
  52186. * @return {Phaser.Physics.Arcade.Body} This Body object.
  52187. */
  52188. setEnable: function (value)
  52189. {
  52190. if (value === undefined) { value = true; }
  52191. this.enable = value;
  52192. return this;
  52193. },
  52194. /**
  52195. * The Body's horizontal position (left edge).
  52196. *
  52197. * @name Phaser.Physics.Arcade.Body#x
  52198. * @type {number}
  52199. * @since 3.0.0
  52200. */
  52201. x: {
  52202. get: function ()
  52203. {
  52204. return this.position.x;
  52205. },
  52206. set: function (value)
  52207. {
  52208. this.position.x = value;
  52209. }
  52210. },
  52211. /**
  52212. * The Body's vertical position (top edge).
  52213. *
  52214. * @name Phaser.Physics.Arcade.Body#y
  52215. * @type {number}
  52216. * @since 3.0.0
  52217. */
  52218. y: {
  52219. get: function ()
  52220. {
  52221. return this.position.y;
  52222. },
  52223. set: function (value)
  52224. {
  52225. this.position.y = value;
  52226. }
  52227. },
  52228. /**
  52229. * The left edge of the Body's boundary. Identical to x.
  52230. *
  52231. * @name Phaser.Physics.Arcade.Body#left
  52232. * @type {number}
  52233. * @readonly
  52234. * @since 3.0.0
  52235. */
  52236. left: {
  52237. get: function ()
  52238. {
  52239. return this.position.x;
  52240. }
  52241. },
  52242. /**
  52243. * The right edge of the Body's boundary.
  52244. *
  52245. * @name Phaser.Physics.Arcade.Body#right
  52246. * @type {number}
  52247. * @readonly
  52248. * @since 3.0.0
  52249. */
  52250. right: {
  52251. get: function ()
  52252. {
  52253. return this.position.x + this.width;
  52254. }
  52255. },
  52256. /**
  52257. * The top edge of the Body's boundary. Identical to y.
  52258. *
  52259. * @name Phaser.Physics.Arcade.Body#top
  52260. * @type {number}
  52261. * @readonly
  52262. * @since 3.0.0
  52263. */
  52264. top: {
  52265. get: function ()
  52266. {
  52267. return this.position.y;
  52268. }
  52269. },
  52270. /**
  52271. * The bottom edge of this Body's boundary.
  52272. *
  52273. * @name Phaser.Physics.Arcade.Body#bottom
  52274. * @type {number}
  52275. * @readonly
  52276. * @since 3.0.0
  52277. */
  52278. bottom: {
  52279. get: function ()
  52280. {
  52281. return this.position.y + this.height;
  52282. }
  52283. }
  52284. });
  52285. module.exports = Body;
  52286. /***/ }),
  52287. /* 250 */
  52288. /***/ (function(module, exports, __webpack_require__) {
  52289. /**
  52290. * @author Richard Davey <rich@photonstorm.com>
  52291. * @copyright 2019 Photon Storm Ltd.
  52292. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  52293. */
  52294. var Body = __webpack_require__(249);
  52295. var Clamp = __webpack_require__(23);
  52296. var Class = __webpack_require__(0);
  52297. var Collider = __webpack_require__(247);
  52298. var CONST = __webpack_require__(38);
  52299. var DistanceBetween = __webpack_require__(56);
  52300. var EventEmitter = __webpack_require__(11);
  52301. var Events = __webpack_require__(248);
  52302. var FuzzyEqual = __webpack_require__(186);
  52303. var FuzzyGreaterThan = __webpack_require__(383);
  52304. var FuzzyLessThan = __webpack_require__(382);
  52305. var GetOverlapX = __webpack_require__(246);
  52306. var GetOverlapY = __webpack_require__(245);
  52307. var GetValue = __webpack_require__(4);
  52308. var ProcessQueue = __webpack_require__(244);
  52309. var ProcessTileCallbacks = __webpack_require__(556);
  52310. var Rectangle = __webpack_require__(10);
  52311. var RTree = __webpack_require__(243);
  52312. var SeparateTile = __webpack_require__(555);
  52313. var SeparateX = __webpack_require__(550);
  52314. var SeparateY = __webpack_require__(549);
  52315. var Set = __webpack_require__(102);
  52316. var StaticBody = __webpack_require__(241);
  52317. var TileIntersectsBody = __webpack_require__(242);
  52318. var TransformMatrix = __webpack_require__(41);
  52319. var Vector2 = __webpack_require__(3);
  52320. var Wrap = __webpack_require__(57);
  52321. /**
  52322. * @typedef {object} ArcadeWorldConfig
  52323. *
  52324. * @property {number} [fps=60] - Sets {@link Phaser.Physics.Arcade.World#fps}.
  52325. * @property {number} [timeScale=1] - Sets {@link Phaser.Physics.Arcade.World#timeScale}.
  52326. * @property {object} [gravity] - Sets {@link Phaser.Physics.Arcade.World#gravity}.
  52327. * @property {number} [gravity.x=0] - The horizontal world gravity value.
  52328. * @property {number} [gravity.y=0] - The vertical world gravity value.
  52329. * @property {number} [x=0] - Sets {@link Phaser.Physics.Arcade.World#bounds bounds.x}.
  52330. * @property {number} [y=0] - Sets {@link Phaser.Physics.Arcade.World#bounds bounds.y}.
  52331. * @property {number} [width=0] - Sets {@link Phaser.Physics.Arcade.World#bounds bounds.width}.
  52332. * @property {number} [height=0] - Sets {@link Phaser.Physics.Arcade.World#bounds bounds.height}.
  52333. * @property {object} [checkCollision] - Sets {@link Phaser.Physics.Arcade.World#checkCollision}.
  52334. * @property {boolean} [checkCollision.up=true] - Should bodies collide with the top of the world bounds?
  52335. * @property {boolean} [checkCollision.down=true] - Should bodies collide with the bottom of the world bounds?
  52336. * @property {boolean} [checkCollision.left=true] - Should bodies collide with the left of the world bounds?
  52337. * @property {boolean} [checkCollision.right=true] - Should bodies collide with the right of the world bounds?
  52338. * @property {number} [overlapBias=4] - Sets {@link Phaser.Physics.Arcade.World#OVERLAP_BIAS}.
  52339. * @property {number} [tileBias=16] - Sets {@link Phaser.Physics.Arcade.World#TILE_BIAS}.
  52340. * @property {boolean} [forceX=false] - Sets {@link Phaser.Physics.Arcade.World#forceX}.
  52341. * @property {boolean} [isPaused=false] - Sets {@link Phaser.Physics.Arcade.World#isPaused}.
  52342. * @property {boolean} [debug=false] - Sets {@link Phaser.Physics.Arcade.World#debug}.
  52343. * @property {boolean} [debugShowBody=true] - Sets {@link Phaser.Physics.Arcade.World#defaults debugShowBody}.
  52344. * @property {boolean} [debugShowStaticBody=true] - Sets {@link Phaser.Physics.Arcade.World#defaults debugShowStaticBody}.
  52345. * @property {boolean} [debugShowVelocity=true] - Sets {@link Phaser.Physics.Arcade.World#defaults debugShowStaticBody}.
  52346. * @property {number} [debugBodyColor=0xff00ff] - Sets {@link Phaser.Physics.Arcade.World#defaults debugBodyColor}.
  52347. * @property {number} [debugStaticBodyColor=0x0000ff] - Sets {@link Phaser.Physics.Arcade.World#defaults debugStaticBodyColor}.
  52348. * @property {number} [debugVelocityColor=0x00ff00] - Sets {@link Phaser.Physics.Arcade.World#defaults debugVelocityColor}.
  52349. * @property {number} [maxEntries=16] - Sets {@link Phaser.Physics.Arcade.World#maxEntries}.
  52350. * @property {boolean} [useTree=true] - Sets {@link Phaser.Physics.Arcade.World#useTree}.
  52351. */
  52352. /**
  52353. * @typedef {object} CheckCollisionObject
  52354. *
  52355. * @property {boolean} up - Will bodies collide with the top side of the world bounds?
  52356. * @property {boolean} down - Will bodies collide with the bottom side of the world bounds?
  52357. * @property {boolean} left - Will bodies collide with the left side of the world bounds?
  52358. * @property {boolean} right - Will bodies collide with the right side of the world bounds?
  52359. */
  52360. /**
  52361. * @typedef {object} ArcadeWorldDefaults
  52362. *
  52363. * @property {boolean} debugShowBody - Set to `true` to render dynamic body outlines to the debug display.
  52364. * @property {boolean} debugShowStaticBody - Set to `true` to render static body outlines to the debug display.
  52365. * @property {boolean} debugShowVelocity - Set to `true` to render body velocity markers to the debug display.
  52366. * @property {number} bodyDebugColor - The color of dynamic body outlines when rendered to the debug display.
  52367. * @property {number} staticBodyDebugColor - The color of static body outlines when rendered to the debug display.
  52368. * @property {number} velocityDebugColor - The color of the velocity markers when rendered to the debug display.
  52369. */
  52370. /**
  52371. * @typedef {object} ArcadeWorldTreeMinMax
  52372. *
  52373. * @property {number} minX - The minimum x value used in RTree searches.
  52374. * @property {number} minY - The minimum y value used in RTree searches.
  52375. * @property {number} maxX - The maximum x value used in RTree searches.
  52376. * @property {number} maxY - The maximum y value used in RTree searches.
  52377. */
  52378. /**
  52379. * An Arcade Physics Collider Type.
  52380. *
  52381. * @typedef {(
  52382. * Phaser.GameObjects.GameObject|
  52383. * Phaser.GameObjects.Group|
  52384. * Phaser.Physics.Arcade.Sprite|
  52385. * Phaser.Physics.Arcade.Image|
  52386. * Phaser.Physics.Arcade.StaticGroup|
  52387. * Phaser.Physics.Arcade.Group|
  52388. * Phaser.Tilemaps.DynamicTilemapLayer|
  52389. * Phaser.Tilemaps.StaticTilemapLayer|
  52390. * Phaser.GameObjects.GameObject[]|
  52391. * Phaser.Physics.Arcade.Sprite[]|
  52392. * Phaser.Physics.Arcade.Image[]|
  52393. * Phaser.Physics.Arcade.StaticGroup[]|
  52394. * Phaser.Physics.Arcade.Group[]|
  52395. * Phaser.Tilemaps.DynamicTilemapLayer[]|
  52396. * Phaser.Tilemaps.StaticTilemapLayer[]
  52397. * )} ArcadeColliderType
  52398. */
  52399. /**
  52400. * @classdesc
  52401. * The Arcade Physics World.
  52402. *
  52403. * The World is responsible for creating, managing, colliding and updating all of the bodies within it.
  52404. *
  52405. * An instance of the World belongs to a Phaser.Scene and is accessed via the property `physics.world`.
  52406. *
  52407. * @class World
  52408. * @extends Phaser.Events.EventEmitter
  52409. * @memberof Phaser.Physics.Arcade
  52410. * @constructor
  52411. * @since 3.0.0
  52412. *
  52413. * @param {Phaser.Scene} scene - The Scene to which this World instance belongs.
  52414. * @param {ArcadeWorldConfig} config - An Arcade Physics Configuration object.
  52415. */
  52416. var World = new Class({
  52417. Extends: EventEmitter,
  52418. initialize:
  52419. function World (scene, config)
  52420. {
  52421. EventEmitter.call(this);
  52422. /**
  52423. * The Scene this simulation belongs to.
  52424. *
  52425. * @name Phaser.Physics.Arcade.World#scene
  52426. * @type {Phaser.Scene}
  52427. * @since 3.0.0
  52428. */
  52429. this.scene = scene;
  52430. /**
  52431. * Dynamic Bodies in this simulation.
  52432. *
  52433. * @name Phaser.Physics.Arcade.World#bodies
  52434. * @type {Phaser.Structs.Set.<Phaser.Physics.Arcade.Body>}
  52435. * @since 3.0.0
  52436. */
  52437. this.bodies = new Set();
  52438. /**
  52439. * Static Bodies in this simulation.
  52440. *
  52441. * @name Phaser.Physics.Arcade.World#staticBodies
  52442. * @type {Phaser.Structs.Set.<Phaser.Physics.Arcade.StaticBody>}
  52443. * @since 3.0.0
  52444. */
  52445. this.staticBodies = new Set();
  52446. /**
  52447. * Static Bodies marked for deletion.
  52448. *
  52449. * @name Phaser.Physics.Arcade.World#pendingDestroy
  52450. * @type {Phaser.Structs.Set.<(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)>}
  52451. * @since 3.1.0
  52452. */
  52453. this.pendingDestroy = new Set();
  52454. /**
  52455. * Dynamic Bodies that need a second `update` call to resynchronize their Game Objects.
  52456. * This set is filled only when the `_late` flag is on, and is processed and cleared during `postUpdate`.
  52457. *
  52458. * @name Phaser.Physics.Arcade.World#late
  52459. * @type {Phaser.Structs.Set.<Phaser.Physics.Arcade.Body>}
  52460. * @private
  52461. * @since 3.16.0
  52462. */
  52463. this.late = new Set();
  52464. /**
  52465. * A flag allowing the `late` set to be filled, as appropriate.
  52466. * This is on (true) only between `update` and `postUpdate` and false at other times.
  52467. *
  52468. * @name Phaser.Physics.Arcade.World#_late
  52469. * @type {boolean}
  52470. * @private
  52471. * @since 3.16.0
  52472. */
  52473. this._late = false;
  52474. /**
  52475. * This simulation's collision processors.
  52476. *
  52477. * @name Phaser.Physics.Arcade.World#colliders
  52478. * @type {Phaser.Structs.ProcessQueue.<Phaser.Physics.Arcade.Collider>}
  52479. * @since 3.0.0
  52480. */
  52481. this.colliders = new ProcessQueue();
  52482. /**
  52483. * Acceleration of Bodies due to gravity, in pixels per second.
  52484. *
  52485. * @name Phaser.Physics.Arcade.World#gravity
  52486. * @type {Phaser.Math.Vector2}
  52487. * @since 3.0.0
  52488. */
  52489. this.gravity = new Vector2(GetValue(config, 'gravity.x', 0), GetValue(config, 'gravity.y', 0));
  52490. /**
  52491. * A boundary constraining Bodies.
  52492. *
  52493. * @name Phaser.Physics.Arcade.World#bounds
  52494. * @type {Phaser.Geom.Rectangle}
  52495. * @since 3.0.0
  52496. */
  52497. this.bounds = new Rectangle(
  52498. GetValue(config, 'x', 0),
  52499. GetValue(config, 'y', 0),
  52500. GetValue(config, 'width', scene.sys.scale.width),
  52501. GetValue(config, 'height', scene.sys.scale.height)
  52502. );
  52503. /**
  52504. * The boundary edges that Bodies can collide with.
  52505. *
  52506. * @name Phaser.Physics.Arcade.World#checkCollision
  52507. * @type {CheckCollisionObject}
  52508. * @since 3.0.0
  52509. */
  52510. this.checkCollision = {
  52511. up: GetValue(config, 'checkCollision.up', true),
  52512. down: GetValue(config, 'checkCollision.down', true),
  52513. left: GetValue(config, 'checkCollision.left', true),
  52514. right: GetValue(config, 'checkCollision.right', true)
  52515. };
  52516. /**
  52517. * The number of physics steps to be taken per second.
  52518. *
  52519. * This property is read-only. Use the `setFPS` method to modify it at run-time.
  52520. *
  52521. * @name Phaser.Physics.Arcade.World#fps
  52522. * @readonly
  52523. * @type {number}
  52524. * @default 60
  52525. * @since 3.10.0
  52526. */
  52527. this.fps = GetValue(config, 'fps', 60);
  52528. /**
  52529. * The amount of elapsed ms since the last frame.
  52530. *
  52531. * @name Phaser.Physics.Arcade.World#_elapsed
  52532. * @private
  52533. * @type {number}
  52534. * @since 3.10.0
  52535. */
  52536. this._elapsed = 0;
  52537. /**
  52538. * Internal frame time value.
  52539. *
  52540. * @name Phaser.Physics.Arcade.World#_frameTime
  52541. * @private
  52542. * @type {number}
  52543. * @since 3.10.0
  52544. */
  52545. this._frameTime = 1 / this.fps;
  52546. /**
  52547. * Internal frame time ms value.
  52548. *
  52549. * @name Phaser.Physics.Arcade.World#_frameTimeMS
  52550. * @private
  52551. * @type {number}
  52552. * @since 3.10.0
  52553. */
  52554. this._frameTimeMS = 1000 * this._frameTime;
  52555. /**
  52556. * The number of steps that took place in the last frame.
  52557. *
  52558. * @name Phaser.Physics.Arcade.World#stepsLastFrame
  52559. * @readonly
  52560. * @type {number}
  52561. * @since 3.10.0
  52562. */
  52563. this.stepsLastFrame = 0;
  52564. /**
  52565. * Scaling factor applied to the frame rate.
  52566. *
  52567. * - 1.0 = normal speed
  52568. * - 2.0 = half speed
  52569. * - 0.5 = double speed
  52570. *
  52571. * @name Phaser.Physics.Arcade.World#timeScale
  52572. * @property {number}
  52573. * @default 1
  52574. * @since 3.10.0
  52575. */
  52576. this.timeScale = GetValue(config, 'timeScale', 1);
  52577. /**
  52578. * The maximum absolute difference of a Body's per-step velocity and its overlap with another Body that will result in separation on *each axis*.
  52579. * Larger values favor separation.
  52580. * Smaller values favor no separation.
  52581. *
  52582. * @name Phaser.Physics.Arcade.World#OVERLAP_BIAS
  52583. * @type {number}
  52584. * @default 4
  52585. * @since 3.0.0
  52586. */
  52587. this.OVERLAP_BIAS = GetValue(config, 'overlapBias', 4);
  52588. /**
  52589. * The maximum absolute value of a Body's overlap with a tile that will result in separation on *each axis*.
  52590. * Larger values favor separation.
  52591. * Smaller values favor no separation.
  52592. * The optimum value may be similar to the tile size.
  52593. *
  52594. * @name Phaser.Physics.Arcade.World#TILE_BIAS
  52595. * @type {number}
  52596. * @default 16
  52597. * @since 3.0.0
  52598. */
  52599. this.TILE_BIAS = GetValue(config, 'tileBias', 16);
  52600. /**
  52601. * Always separate overlapping Bodies horizontally before vertically.
  52602. * False (the default) means Bodies are first separated on the axis of greater gravity, or the vertical axis if neither is greater.
  52603. *
  52604. * @name Phaser.Physics.Arcade.World#forceX
  52605. * @type {boolean}
  52606. * @default false
  52607. * @since 3.0.0
  52608. */
  52609. this.forceX = GetValue(config, 'forceX', false);
  52610. /**
  52611. * Whether the simulation advances with the game loop.
  52612. *
  52613. * @name Phaser.Physics.Arcade.World#isPaused
  52614. * @type {boolean}
  52615. * @default false
  52616. * @since 3.0.0
  52617. */
  52618. this.isPaused = GetValue(config, 'isPaused', false);
  52619. /**
  52620. * Temporary total of colliding Bodies.
  52621. *
  52622. * @name Phaser.Physics.Arcade.World#_total
  52623. * @type {number}
  52624. * @private
  52625. * @default 0
  52626. * @since 3.0.0
  52627. */
  52628. this._total = 0;
  52629. /**
  52630. * Enables the debug display.
  52631. *
  52632. * @name Phaser.Physics.Arcade.World#drawDebug
  52633. * @type {boolean}
  52634. * @default false
  52635. * @since 3.0.0
  52636. */
  52637. this.drawDebug = GetValue(config, 'debug', false);
  52638. /**
  52639. * The graphics object drawing the debug display.
  52640. *
  52641. * @name Phaser.Physics.Arcade.World#debugGraphic
  52642. * @type {Phaser.GameObjects.Graphics}
  52643. * @since 3.0.0
  52644. */
  52645. this.debugGraphic;
  52646. /**
  52647. * Default debug display settings for new Bodies.
  52648. *
  52649. * @name Phaser.Physics.Arcade.World#defaults
  52650. * @type {ArcadeWorldDefaults}
  52651. * @since 3.0.0
  52652. */
  52653. this.defaults = {
  52654. debugShowBody: GetValue(config, 'debugShowBody', true),
  52655. debugShowStaticBody: GetValue(config, 'debugShowStaticBody', true),
  52656. debugShowVelocity: GetValue(config, 'debugShowVelocity', true),
  52657. bodyDebugColor: GetValue(config, 'debugBodyColor', 0xff00ff),
  52658. staticBodyDebugColor: GetValue(config, 'debugStaticBodyColor', 0x0000ff),
  52659. velocityDebugColor: GetValue(config, 'debugVelocityColor', 0x00ff00)
  52660. };
  52661. /**
  52662. * The maximum number of items per node on the RTree.
  52663. *
  52664. * This is ignored if `useTree` is `false`. If you have a large number of bodies in
  52665. * your world then you may find search performance improves by increasing this value,
  52666. * to allow more items per node and less node division.
  52667. *
  52668. * @name Phaser.Physics.Arcade.World#maxEntries
  52669. * @type {integer}
  52670. * @default 16
  52671. * @since 3.0.0
  52672. */
  52673. this.maxEntries = GetValue(config, 'maxEntries', 16);
  52674. /**
  52675. * Should this Arcade Physics World use an RTree for Dynamic Physics bodies or not?
  52676. *
  52677. * An RTree is a fast way of spatially sorting of all the moving bodies in the world.
  52678. * However, at certain limits, the cost of clearing and inserting the bodies into the
  52679. * tree every frame becomes more expensive than the search speed gains it provides.
  52680. *
  52681. * If you have a large number of dynamic bodies in your world then it may be best to
  52682. * disable the use of the RTree by setting this property to `true`.
  52683. * The number it can cope with depends on browser and device, but a conservative estimate
  52684. * of around 5,000 bodies should be considered the max before disabling it.
  52685. *
  52686. * Note this only applies to dynamic bodies. Static bodies are always kept in an RTree,
  52687. * because they don't have to be cleared every frame, so you benefit from the
  52688. * massive search speeds all the time.
  52689. *
  52690. * @name Phaser.Physics.Arcade.World#useTree
  52691. * @type {boolean}
  52692. * @default true
  52693. * @since 3.10.0
  52694. */
  52695. this.useTree = GetValue(config, 'useTree', true);
  52696. /**
  52697. * The spatial index of Dynamic Bodies.
  52698. *
  52699. * @name Phaser.Physics.Arcade.World#tree
  52700. * @type {Phaser.Structs.RTree}
  52701. * @since 3.0.0
  52702. */
  52703. this.tree = new RTree(this.maxEntries);
  52704. /**
  52705. * The spatial index of Static Bodies.
  52706. *
  52707. * @name Phaser.Physics.Arcade.World#staticTree
  52708. * @type {Phaser.Structs.RTree}
  52709. * @since 3.0.0
  52710. */
  52711. this.staticTree = new RTree(this.maxEntries);
  52712. /**
  52713. * Recycled input for tree searches.
  52714. *
  52715. * @name Phaser.Physics.Arcade.World#treeMinMax
  52716. * @type {ArcadeWorldTreeMinMax}
  52717. * @since 3.0.0
  52718. */
  52719. this.treeMinMax = { minX: 0, minY: 0, maxX: 0, maxY: 0 };
  52720. /**
  52721. * A temporary Transform Matrix used by bodies for calculations without them needing their own local copy.
  52722. *
  52723. * @name Phaser.Physics.Arcade.World#_tempMatrix
  52724. * @type {Phaser.GameObjects.Components.TransformMatrix}
  52725. * @private
  52726. * @since 3.12.0
  52727. */
  52728. this._tempMatrix = new TransformMatrix();
  52729. /**
  52730. * A temporary Transform Matrix used by bodies for calculations without them needing their own local copy.
  52731. *
  52732. * @name Phaser.Physics.Arcade.World#_tempMatrix2
  52733. * @type {Phaser.GameObjects.Components.TransformMatrix}
  52734. * @private
  52735. * @since 3.12.0
  52736. */
  52737. this._tempMatrix2 = new TransformMatrix();
  52738. if (this.drawDebug)
  52739. {
  52740. this.createDebugGraphic();
  52741. }
  52742. },
  52743. /**
  52744. * Adds an Arcade Physics Body to a Game Object, an array of Game Objects, or the children of a Group.
  52745. *
  52746. * The difference between this and the `enableBody` method is that you can pass arrays or Groups
  52747. * to this method.
  52748. *
  52749. * You can specify if the bodies are to be Dynamic or Static. A dynamic body can move via velocity and
  52750. * acceleration. A static body remains fixed in place and as such is able to use an optimized search
  52751. * tree, making it ideal for static elements such as level objects. You can still collide and overlap
  52752. * with static bodies.
  52753. *
  52754. * Normally, rather than calling this method directly, you'd use the helper methods available in the
  52755. * Arcade Physics Factory, such as:
  52756. *
  52757. * ```javascript
  52758. * this.physics.add.image(x, y, textureKey);
  52759. * this.physics.add.sprite(x, y, textureKey);
  52760. * ```
  52761. *
  52762. * Calling factory methods encapsulates the creation of a Game Object and the creation of its
  52763. * body at the same time. If you are creating custom classes then you can pass them to this
  52764. * method to have their bodies created.
  52765. *
  52766. * @method Phaser.Physics.Arcade.World#enable
  52767. * @since 3.0.0
  52768. *
  52769. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object - The object, or objects, on which to create the bodies.
  52770. * @param {integer} [bodyType] - The type of Body to create. Either `DYNAMIC_BODY` or `STATIC_BODY`.
  52771. */
  52772. enable: function (object, bodyType)
  52773. {
  52774. if (bodyType === undefined) { bodyType = CONST.DYNAMIC_BODY; }
  52775. if (!Array.isArray(object))
  52776. {
  52777. object = [ object ];
  52778. }
  52779. for (var i = 0; i < object.length; i++)
  52780. {
  52781. var entry = object[i];
  52782. if (entry.isParent)
  52783. {
  52784. var children = entry.getChildren();
  52785. for (var c = 0; c < children.length; c++)
  52786. {
  52787. var child = children[c];
  52788. if (child.isParent)
  52789. {
  52790. // Handle Groups nested inside of Groups
  52791. this.enable(child, bodyType);
  52792. }
  52793. else
  52794. {
  52795. this.enableBody(child, bodyType);
  52796. }
  52797. }
  52798. }
  52799. else
  52800. {
  52801. this.enableBody(entry, bodyType);
  52802. }
  52803. }
  52804. },
  52805. /**
  52806. * Creates an Arcade Physics Body on a single Game Object.
  52807. *
  52808. * If the Game Object already has a body, this method will simply add it back into the simulation.
  52809. *
  52810. * You can specify if the body is Dynamic or Static. A dynamic body can move via velocity and
  52811. * acceleration. A static body remains fixed in place and as such is able to use an optimized search
  52812. * tree, making it ideal for static elements such as level objects. You can still collide and overlap
  52813. * with static bodies.
  52814. *
  52815. * Normally, rather than calling this method directly, you'd use the helper methods available in the
  52816. * Arcade Physics Factory, such as:
  52817. *
  52818. * ```javascript
  52819. * this.physics.add.image(x, y, textureKey);
  52820. * this.physics.add.sprite(x, y, textureKey);
  52821. * ```
  52822. *
  52823. * Calling factory methods encapsulates the creation of a Game Object and the creation of its
  52824. * body at the same time. If you are creating custom classes then you can pass them to this
  52825. * method to have their bodies created.
  52826. *
  52827. * @method Phaser.Physics.Arcade.World#enableBody
  52828. * @since 3.0.0
  52829. *
  52830. * @param {Phaser.GameObjects.GameObject} object - The Game Object on which to create the body.
  52831. * @param {integer} [bodyType] - The type of Body to create. Either `DYNAMIC_BODY` or `STATIC_BODY`.
  52832. *
  52833. * @return {Phaser.GameObjects.GameObject} The Game Object on which the body was created.
  52834. */
  52835. enableBody: function (object, bodyType)
  52836. {
  52837. if (bodyType === undefined) { bodyType = CONST.DYNAMIC_BODY; }
  52838. if (!object.body)
  52839. {
  52840. if (bodyType === CONST.DYNAMIC_BODY)
  52841. {
  52842. object.body = new Body(this, object);
  52843. }
  52844. else if (bodyType === CONST.STATIC_BODY)
  52845. {
  52846. object.body = new StaticBody(this, object);
  52847. }
  52848. }
  52849. this.add(object.body);
  52850. return object;
  52851. },
  52852. /**
  52853. * Adds an existing Arcade Physics Body or StaticBody to the simulation.
  52854. *
  52855. * The body is enabled and added to the local search trees.
  52856. *
  52857. * @method Phaser.Physics.Arcade.World#add
  52858. * @since 3.10.0
  52859. *
  52860. * @param {(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)} body - The Body to be added to the simulation.
  52861. *
  52862. * @return {(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)} The Body that was added to the simulation.
  52863. */
  52864. add: function (body)
  52865. {
  52866. if (body.physicsType === CONST.DYNAMIC_BODY)
  52867. {
  52868. this.bodies.set(body);
  52869. }
  52870. else if (body.physicsType === CONST.STATIC_BODY)
  52871. {
  52872. this.staticBodies.set(body);
  52873. this.staticTree.insert(body);
  52874. }
  52875. body.enable = true;
  52876. return body;
  52877. },
  52878. /**
  52879. * Disables the Arcade Physics Body of a Game Object, an array of Game Objects, or the children of a Group.
  52880. *
  52881. * The difference between this and the `disableBody` method is that you can pass arrays or Groups
  52882. * to this method.
  52883. *
  52884. * The body itself is not deleted, it just has its `enable` property set to false, which
  52885. * means you can re-enable it again at any point by passing it to enable `World.enable` or `World.add`.
  52886. *
  52887. * @method Phaser.Physics.Arcade.World#disable
  52888. * @since 3.0.0
  52889. *
  52890. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object - The object, or objects, on which to disable the bodies.
  52891. */
  52892. disable: function (object)
  52893. {
  52894. if (!Array.isArray(object))
  52895. {
  52896. object = [ object ];
  52897. }
  52898. for (var i = 0; i < object.length; i++)
  52899. {
  52900. var entry = object[i];
  52901. if (entry.isParent)
  52902. {
  52903. var children = entry.getChildren();
  52904. for (var c = 0; c < children.length; c++)
  52905. {
  52906. var child = children[c];
  52907. if (child.isParent)
  52908. {
  52909. // Handle Groups nested inside of Groups
  52910. this.disable(child);
  52911. }
  52912. else
  52913. {
  52914. this.disableBody(child.body);
  52915. }
  52916. }
  52917. }
  52918. else
  52919. {
  52920. this.disableBody(entry.body);
  52921. }
  52922. }
  52923. },
  52924. /**
  52925. * Disables an existing Arcade Physics Body or StaticBody and removes it from the simulation.
  52926. *
  52927. * The body is disabled and removed from the local search trees.
  52928. *
  52929. * The body itself is not deleted, it just has its `enable` property set to false, which
  52930. * means you can re-enable it again at any point by passing it to enable `World.enable` or `World.add`.
  52931. *
  52932. * @method Phaser.Physics.Arcade.World#disableBody
  52933. * @since 3.0.0
  52934. *
  52935. * @param {(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)} body - The Body to be disabled.
  52936. */
  52937. disableBody: function (body)
  52938. {
  52939. this.remove(body);
  52940. body.enable = false;
  52941. },
  52942. /**
  52943. * Removes an existing Arcade Physics Body or StaticBody from the simulation.
  52944. *
  52945. * The body is disabled and removed from the local search trees.
  52946. *
  52947. * The body itself is not deleted, it just has its `enabled` property set to false, which
  52948. * means you can re-enable it again at any point by passing it to enable `enable` or `add`.
  52949. *
  52950. * @method Phaser.Physics.Arcade.World#remove
  52951. * @since 3.0.0
  52952. *
  52953. * @param {(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)} body - The body to be removed from the simulation.
  52954. */
  52955. remove: function (body)
  52956. {
  52957. if (body.physicsType === CONST.DYNAMIC_BODY)
  52958. {
  52959. this.tree.remove(body);
  52960. this.bodies.delete(body);
  52961. this.late.delete(body);
  52962. }
  52963. else if (body.physicsType === CONST.STATIC_BODY)
  52964. {
  52965. this.staticBodies.delete(body);
  52966. this.staticTree.remove(body);
  52967. }
  52968. },
  52969. /**
  52970. * Creates a Graphics Game Object that the world will use to render the debug display to.
  52971. *
  52972. * This is called automatically when the World is instantiated if the `debug` config property
  52973. * was set to `true`. However, you can call it at any point should you need to display the
  52974. * debug Graphic from a fixed point.
  52975. *
  52976. * You can control which objects are drawn to the Graphics object, and the colors they use,
  52977. * by setting the debug properties in the physics config.
  52978. *
  52979. * You should not typically use this in a production game. Use it to aid during debugging.
  52980. *
  52981. * @method Phaser.Physics.Arcade.World#createDebugGraphic
  52982. * @since 3.0.0
  52983. *
  52984. * @return {Phaser.GameObjects.Graphics} The Graphics object that was created for use by the World.
  52985. */
  52986. createDebugGraphic: function ()
  52987. {
  52988. var graphic = this.scene.sys.add.graphics({ x: 0, y: 0 });
  52989. graphic.setDepth(Number.MAX_VALUE);
  52990. this.debugGraphic = graphic;
  52991. this.drawDebug = true;
  52992. return graphic;
  52993. },
  52994. /**
  52995. * Sets the position, size and properties of the World boundary.
  52996. *
  52997. * The World boundary is an invisible rectangle that defines the edges of the World.
  52998. * If a Body is set to collide with the world bounds then it will automatically stop
  52999. * when it reaches any of the edges. You can optionally set which edges of the boundary
  53000. * should be checked against.
  53001. *
  53002. * @method Phaser.Physics.Arcade.World#setBounds
  53003. * @since 3.0.0
  53004. *
  53005. * @param {number} x - The top-left x coordinate of the boundary.
  53006. * @param {number} y - The top-left y coordinate of the boundary.
  53007. * @param {number} width - The width of the boundary.
  53008. * @param {number} height - The height of the boundary.
  53009. * @param {boolean} [checkLeft] - Should bodies check against the left edge of the boundary?
  53010. * @param {boolean} [checkRight] - Should bodies check against the right edge of the boundary?
  53011. * @param {boolean} [checkUp] - Should bodies check against the top edge of the boundary?
  53012. * @param {boolean} [checkDown] - Should bodies check against the bottom edge of the boundary?
  53013. *
  53014. * @return {Phaser.Physics.Arcade.World} This World object.
  53015. */
  53016. setBounds: function (x, y, width, height, checkLeft, checkRight, checkUp, checkDown)
  53017. {
  53018. this.bounds.setTo(x, y, width, height);
  53019. if (checkLeft !== undefined)
  53020. {
  53021. this.setBoundsCollision(checkLeft, checkRight, checkUp, checkDown);
  53022. }
  53023. return this;
  53024. },
  53025. /**
  53026. * Enables or disables collisions on each edge of the World boundary.
  53027. *
  53028. * @method Phaser.Physics.Arcade.World#setBoundsCollision
  53029. * @since 3.0.0
  53030. *
  53031. * @param {boolean} [left=true] - Should bodies check against the left edge of the boundary?
  53032. * @param {boolean} [right=true] - Should bodies check against the right edge of the boundary?
  53033. * @param {boolean} [up=true] - Should bodies check against the top edge of the boundary?
  53034. * @param {boolean} [down=true] - Should bodies check against the bottom edge of the boundary?
  53035. *
  53036. * @return {Phaser.Physics.Arcade.World} This World object.
  53037. */
  53038. setBoundsCollision: function (left, right, up, down)
  53039. {
  53040. if (left === undefined) { left = true; }
  53041. if (right === undefined) { right = true; }
  53042. if (up === undefined) { up = true; }
  53043. if (down === undefined) { down = true; }
  53044. this.checkCollision.left = left;
  53045. this.checkCollision.right = right;
  53046. this.checkCollision.up = up;
  53047. this.checkCollision.down = down;
  53048. return this;
  53049. },
  53050. /**
  53051. * Pauses the simulation.
  53052. *
  53053. * A paused simulation does not update any existing bodies, or run any Colliders.
  53054. *
  53055. * However, you can still enable and disable bodies within it, or manually run collide or overlap
  53056. * checks.
  53057. *
  53058. * @method Phaser.Physics.Arcade.World#pause
  53059. * @fires Phaser.Physics.Arcade.Events#PAUSE
  53060. * @since 3.0.0
  53061. *
  53062. * @return {Phaser.Physics.Arcade.World} This World object.
  53063. */
  53064. pause: function ()
  53065. {
  53066. this.isPaused = true;
  53067. this.emit(Events.PAUSE);
  53068. return this;
  53069. },
  53070. /**
  53071. * Resumes the simulation, if paused.
  53072. *
  53073. * @method Phaser.Physics.Arcade.World#resume
  53074. * @fires Phaser.Physics.Arcade.Events#RESUME
  53075. * @since 3.0.0
  53076. *
  53077. * @return {Phaser.Physics.Arcade.World} This World object.
  53078. */
  53079. resume: function ()
  53080. {
  53081. this.isPaused = false;
  53082. this.emit(Events.RESUME);
  53083. return this;
  53084. },
  53085. /**
  53086. * Creates a new Collider object and adds it to the simulation.
  53087. *
  53088. * A Collider is a way to automatically perform collision checks between two objects,
  53089. * calling the collide and process callbacks if they occur.
  53090. *
  53091. * Colliders are run as part of the World update, after all of the Bodies have updated.
  53092. *
  53093. * By creating a Collider you don't need then call `World.collide` in your `update` loop,
  53094. * as it will be handled for you automatically.
  53095. *
  53096. * @method Phaser.Physics.Arcade.World#addCollider
  53097. * @since 3.0.0
  53098. * @see Phaser.Physics.Arcade.World#collide
  53099. *
  53100. * @param {ArcadeColliderType} object1 - The first object to check for collision.
  53101. * @param {ArcadeColliderType} object2 - The second object to check for collision.
  53102. * @param {ArcadePhysicsCallback} [collideCallback] - The callback to invoke when the two objects collide.
  53103. * @param {ArcadePhysicsCallback} [processCallback] - The callback to invoke when the two objects collide. Must return a boolean.
  53104. * @param {*} [callbackContext] - The scope in which to call the callbacks.
  53105. *
  53106. * @return {Phaser.Physics.Arcade.Collider} The Collider that was created.
  53107. */
  53108. addCollider: function (object1, object2, collideCallback, processCallback, callbackContext)
  53109. {
  53110. if (collideCallback === undefined) { collideCallback = null; }
  53111. if (processCallback === undefined) { processCallback = null; }
  53112. if (callbackContext === undefined) { callbackContext = collideCallback; }
  53113. var collider = new Collider(this, false, object1, object2, collideCallback, processCallback, callbackContext);
  53114. this.colliders.add(collider);
  53115. return collider;
  53116. },
  53117. /**
  53118. * Creates a new Overlap Collider object and adds it to the simulation.
  53119. *
  53120. * A Collider is a way to automatically perform overlap checks between two objects,
  53121. * calling the collide and process callbacks if they occur.
  53122. *
  53123. * Colliders are run as part of the World update, after all of the Bodies have updated.
  53124. *
  53125. * By creating a Collider you don't need then call `World.overlap` in your `update` loop,
  53126. * as it will be handled for you automatically.
  53127. *
  53128. * @method Phaser.Physics.Arcade.World#addOverlap
  53129. * @since 3.0.0
  53130. *
  53131. * @param {ArcadeColliderType} object1 - The first object to check for overlap.
  53132. * @param {ArcadeColliderType} object2 - The second object to check for overlap.
  53133. * @param {ArcadePhysicsCallback} [collideCallback] - The callback to invoke when the two objects overlap.
  53134. * @param {ArcadePhysicsCallback} [processCallback] - The callback to invoke when the two objects overlap. Must return a boolean.
  53135. * @param {*} [callbackContext] - The scope in which to call the callbacks.
  53136. *
  53137. * @return {Phaser.Physics.Arcade.Collider} The Collider that was created.
  53138. */
  53139. addOverlap: function (object1, object2, collideCallback, processCallback, callbackContext)
  53140. {
  53141. if (collideCallback === undefined) { collideCallback = null; }
  53142. if (processCallback === undefined) { processCallback = null; }
  53143. if (callbackContext === undefined) { callbackContext = collideCallback; }
  53144. var collider = new Collider(this, true, object1, object2, collideCallback, processCallback, callbackContext);
  53145. this.colliders.add(collider);
  53146. return collider;
  53147. },
  53148. /**
  53149. * Removes a Collider from the simulation so it is no longer processed.
  53150. *
  53151. * This method does not destroy the Collider. If you wish to add it back at a later stage you can call
  53152. * `World.colliders.add(Collider)`.
  53153. *
  53154. * If you no longer need the Collider you can call the `Collider.destroy` method instead, which will
  53155. * automatically clear all of its references and then remove it from the World. If you call destroy on
  53156. * a Collider you _don't_ need to pass it to this method too.
  53157. *
  53158. * @method Phaser.Physics.Arcade.World#removeCollider
  53159. * @since 3.0.0
  53160. *
  53161. * @param {Phaser.Physics.Arcade.Collider} collider - The Collider to remove from the simulation.
  53162. *
  53163. * @return {Phaser.Physics.Arcade.World} This World object.
  53164. */
  53165. removeCollider: function (collider)
  53166. {
  53167. this.colliders.remove(collider);
  53168. return this;
  53169. },
  53170. /**
  53171. * Sets the frame rate to run the simulation at.
  53172. *
  53173. * The frame rate value is used to simulate a fixed update time step. This fixed
  53174. * time step allows for a straightforward implementation of a deterministic game state.
  53175. *
  53176. * This frame rate is independent of the frequency at which the game is rendering. The
  53177. * higher you set the fps, the more physics simulation steps will occur per game step.
  53178. * Conversely, the lower you set it, the less will take place.
  53179. *
  53180. * You can optionally advance the simulation directly yourself by calling the `step` method.
  53181. *
  53182. * @method Phaser.Physics.Arcade.World#setFPS
  53183. * @since 3.10.0
  53184. *
  53185. * @param {integer} framerate - The frame rate to advance the simulation at.
  53186. *
  53187. * @return {this} This World object.
  53188. */
  53189. setFPS: function (framerate)
  53190. {
  53191. this.fps = framerate;
  53192. this._frameTime = 1 / this.fps;
  53193. this._frameTimeMS = 1000 * this._frameTime;
  53194. return this;
  53195. },
  53196. /**
  53197. * Advances the simulation based on the elapsed time and fps rate.
  53198. *
  53199. * This is called automatically by your Scene and does not need to be invoked directly.
  53200. *
  53201. * @method Phaser.Physics.Arcade.World#update
  53202. * @protected
  53203. * @since 3.0.0
  53204. *
  53205. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  53206. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  53207. */
  53208. update: function (time, delta)
  53209. {
  53210. if (this.isPaused || this.bodies.size === 0)
  53211. {
  53212. return;
  53213. }
  53214. var stepsThisFrame = 0;
  53215. var fixedDelta = this._frameTime;
  53216. var msPerFrame = this._frameTimeMS * this.timeScale;
  53217. this._elapsed += delta;
  53218. this._late = false;
  53219. while (this._elapsed >= msPerFrame)
  53220. {
  53221. this._elapsed -= msPerFrame;
  53222. stepsThisFrame++;
  53223. this.step(fixedDelta);
  53224. }
  53225. this.stepsLastFrame = stepsThisFrame;
  53226. this._late = true;
  53227. },
  53228. /**
  53229. * Advances the simulation by a time increment.
  53230. *
  53231. * @method Phaser.Physics.Arcade.World#step
  53232. * @since 3.10.0
  53233. *
  53234. * @param {number} delta - The delta time amount, in seconds, by which to advance the simulation.
  53235. */
  53236. step: function (delta)
  53237. {
  53238. // Update all active bodies
  53239. var i;
  53240. var body;
  53241. var bodies = this.bodies.entries;
  53242. var len = bodies.length;
  53243. for (i = 0; i < len; i++)
  53244. {
  53245. body = bodies[i];
  53246. if (body.enable)
  53247. {
  53248. body.update(delta);
  53249. }
  53250. }
  53251. // Optionally populate our dynamic collision tree
  53252. if (this.useTree)
  53253. {
  53254. this.tree.clear();
  53255. this.tree.load(bodies);
  53256. }
  53257. // Process any colliders
  53258. var colliders = this.colliders.update();
  53259. for (i = 0; i < colliders.length; i++)
  53260. {
  53261. var collider = colliders[i];
  53262. if (collider.active)
  53263. {
  53264. collider.update();
  53265. }
  53266. }
  53267. len = bodies.length;
  53268. for (i = 0; i < len; i++)
  53269. {
  53270. body = bodies[i];
  53271. if (body.enable)
  53272. {
  53273. body.postUpdate();
  53274. }
  53275. }
  53276. },
  53277. /**
  53278. * Updates bodies, draws the debug display, and handles pending queue operations.
  53279. *
  53280. * @method Phaser.Physics.Arcade.World#postUpdate
  53281. * @since 3.0.0
  53282. */
  53283. postUpdate: function ()
  53284. {
  53285. var i;
  53286. var bodies;
  53287. var body;
  53288. var len;
  53289. var dynamic = this.bodies;
  53290. var staticBodies = this.staticBodies;
  53291. var pending = this.pendingDestroy;
  53292. var late = this.late;
  53293. if (late.size > 0)
  53294. {
  53295. bodies = late.entries;
  53296. len = bodies.length;
  53297. for (i = 0; i < len; i++)
  53298. {
  53299. body = bodies[i];
  53300. if (body.enable)
  53301. {
  53302. body.postUpdate();
  53303. }
  53304. }
  53305. late.clear();
  53306. }
  53307. this._late = false;
  53308. bodies = dynamic.entries;
  53309. len = bodies.length;
  53310. if (this.drawDebug)
  53311. {
  53312. var graphics = this.debugGraphic;
  53313. graphics.clear();
  53314. for (i = 0; i < len; i++)
  53315. {
  53316. body = bodies[i];
  53317. if (body.willDrawDebug())
  53318. {
  53319. body.drawDebug(graphics);
  53320. }
  53321. }
  53322. bodies = staticBodies.entries;
  53323. len = bodies.length;
  53324. for (i = 0; i < len; i++)
  53325. {
  53326. body = bodies[i];
  53327. if (body.willDrawDebug())
  53328. {
  53329. body.drawDebug(graphics);
  53330. }
  53331. }
  53332. }
  53333. if (pending.size > 0)
  53334. {
  53335. var dynamicTree = this.tree;
  53336. var staticTree = this.staticTree;
  53337. bodies = pending.entries;
  53338. len = bodies.length;
  53339. for (i = 0; i < len; i++)
  53340. {
  53341. body = bodies[i];
  53342. if (body.physicsType === CONST.DYNAMIC_BODY)
  53343. {
  53344. dynamicTree.remove(body);
  53345. dynamic.delete(body);
  53346. late.delete(body);
  53347. }
  53348. else if (body.physicsType === CONST.STATIC_BODY)
  53349. {
  53350. staticTree.remove(body);
  53351. staticBodies.delete(body);
  53352. }
  53353. body.world = undefined;
  53354. body.gameObject = undefined;
  53355. }
  53356. pending.clear();
  53357. }
  53358. },
  53359. /**
  53360. * Calculates a Body's velocity and updates its position.
  53361. *
  53362. * @method Phaser.Physics.Arcade.World#updateMotion
  53363. * @since 3.0.0
  53364. *
  53365. * @param {Phaser.Physics.Arcade.Body} body - The Body to be updated.
  53366. * @param {number} delta - The delta value to be used in the motion calculations, in seconds.
  53367. */
  53368. updateMotion: function (body, delta)
  53369. {
  53370. if (body.allowRotation)
  53371. {
  53372. this.computeAngularVelocity(body, delta);
  53373. }
  53374. this.computeVelocity(body, delta);
  53375. },
  53376. /**
  53377. * Calculates a Body's angular velocity.
  53378. *
  53379. * @method Phaser.Physics.Arcade.World#computeAngularVelocity
  53380. * @since 3.10.0
  53381. *
  53382. * @param {Phaser.Physics.Arcade.Body} body - The Body to compute the velocity for.
  53383. * @param {number} delta - The delta value to be used in the calculation, in seconds.
  53384. */
  53385. computeAngularVelocity: function (body, delta)
  53386. {
  53387. var velocity = body.angularVelocity;
  53388. var acceleration = body.angularAcceleration;
  53389. var drag = body.angularDrag;
  53390. var max = body.maxAngular;
  53391. if (acceleration)
  53392. {
  53393. velocity += acceleration * delta;
  53394. }
  53395. else if (body.allowDrag && drag)
  53396. {
  53397. drag *= delta;
  53398. if (FuzzyGreaterThan(velocity - drag, 0, 0.1))
  53399. {
  53400. velocity -= drag;
  53401. }
  53402. else if (FuzzyLessThan(velocity + drag, 0, 0.1))
  53403. {
  53404. velocity += drag;
  53405. }
  53406. else
  53407. {
  53408. velocity = 0;
  53409. }
  53410. }
  53411. velocity = Clamp(velocity, -max, max);
  53412. var velocityDelta = velocity - body.angularVelocity;
  53413. body.angularVelocity += velocityDelta;
  53414. body.rotation += (body.angularVelocity * delta);
  53415. },
  53416. /**
  53417. * Calculates a Body's per-axis velocity.
  53418. *
  53419. * @method Phaser.Physics.Arcade.World#computeVelocity
  53420. * @since 3.0.0
  53421. *
  53422. * @param {Phaser.Physics.Arcade.Body} body - The Body to compute the velocity for.
  53423. * @param {number} delta - The delta value to be used in the calculation, in seconds.
  53424. */
  53425. computeVelocity: function (body, delta)
  53426. {
  53427. var velocityX = body.velocity.x;
  53428. var accelerationX = body.acceleration.x;
  53429. var dragX = body.drag.x;
  53430. var maxX = body.maxVelocity.x;
  53431. var velocityY = body.velocity.y;
  53432. var accelerationY = body.acceleration.y;
  53433. var dragY = body.drag.y;
  53434. var maxY = body.maxVelocity.y;
  53435. var speed = body.speed;
  53436. var maxSpeed = body.maxSpeed;
  53437. var allowDrag = body.allowDrag;
  53438. var useDamping = body.useDamping;
  53439. if (body.allowGravity)
  53440. {
  53441. velocityX += (this.gravity.x + body.gravity.x) * delta;
  53442. velocityY += (this.gravity.y + body.gravity.y) * delta;
  53443. }
  53444. if (accelerationX)
  53445. {
  53446. velocityX += accelerationX * delta;
  53447. }
  53448. else if (allowDrag && dragX)
  53449. {
  53450. if (useDamping)
  53451. {
  53452. // Damping based deceleration
  53453. velocityX *= dragX;
  53454. if (FuzzyEqual(speed, 0, 0.001))
  53455. {
  53456. velocityX = 0;
  53457. }
  53458. }
  53459. else
  53460. {
  53461. // Linear deceleration
  53462. dragX *= delta;
  53463. if (FuzzyGreaterThan(velocityX - dragX, 0, 0.01))
  53464. {
  53465. velocityX -= dragX;
  53466. }
  53467. else if (FuzzyLessThan(velocityX + dragX, 0, 0.01))
  53468. {
  53469. velocityX += dragX;
  53470. }
  53471. else
  53472. {
  53473. velocityX = 0;
  53474. }
  53475. }
  53476. }
  53477. if (accelerationY)
  53478. {
  53479. velocityY += accelerationY * delta;
  53480. }
  53481. else if (allowDrag && dragY)
  53482. {
  53483. if (useDamping)
  53484. {
  53485. // Damping based deceleration
  53486. velocityY *= dragY;
  53487. if (FuzzyEqual(speed, 0, 0.001))
  53488. {
  53489. velocityY = 0;
  53490. }
  53491. }
  53492. else
  53493. {
  53494. // Linear deceleration
  53495. dragY *= delta;
  53496. if (FuzzyGreaterThan(velocityY - dragY, 0, 0.01))
  53497. {
  53498. velocityY -= dragY;
  53499. }
  53500. else if (FuzzyLessThan(velocityY + dragY, 0, 0.01))
  53501. {
  53502. velocityY += dragY;
  53503. }
  53504. else
  53505. {
  53506. velocityY = 0;
  53507. }
  53508. }
  53509. }
  53510. velocityX = Clamp(velocityX, -maxX, maxX);
  53511. velocityY = Clamp(velocityY, -maxY, maxY);
  53512. body.velocity.set(velocityX, velocityY);
  53513. if (maxSpeed > -1 && body.velocity.length() > maxSpeed)
  53514. {
  53515. body.velocity.normalize().scale(maxSpeed);
  53516. }
  53517. },
  53518. /**
  53519. * Separates two Bodies.
  53520. *
  53521. * @method Phaser.Physics.Arcade.World#separate
  53522. * @fires Phaser.Physics.Arcade.Events#COLLIDE
  53523. * @fires Phaser.Physics.Arcade.Events#OVERLAP
  53524. * @since 3.0.0
  53525. *
  53526. * @param {Phaser.Physics.Arcade.Body} body1 - The first Body to be separated.
  53527. * @param {Phaser.Physics.Arcade.Body} body2 - The second Body to be separated.
  53528. * @param {ArcadePhysicsCallback} [processCallback] - The process callback.
  53529. * @param {*} [callbackContext] - The context in which to invoke the callback.
  53530. * @param {boolean} [overlapOnly] - If this a collide or overlap check?
  53531. *
  53532. * @return {boolean} True if separation occurred, otherwise false.
  53533. */
  53534. separate: function (body1, body2, processCallback, callbackContext, overlapOnly)
  53535. {
  53536. if (
  53537. !body1.enable ||
  53538. !body2.enable ||
  53539. body1.checkCollision.none ||
  53540. body2.checkCollision.none ||
  53541. !this.intersects(body1, body2))
  53542. {
  53543. return false;
  53544. }
  53545. // They overlap. Is there a custom process callback? If it returns true then we can carry on, otherwise we should abort.
  53546. if (processCallback && processCallback.call(callbackContext, body1.gameObject, body2.gameObject) === false)
  53547. {
  53548. return false;
  53549. }
  53550. // Circle vs. Circle quick bail out
  53551. if (body1.isCircle && body2.isCircle)
  53552. {
  53553. return this.separateCircle(body1, body2, overlapOnly);
  53554. }
  53555. // We define the behavior of bodies in a collision circle and rectangle
  53556. // If a collision occurs in the corner points of the rectangle, the body behave like circles
  53557. // Either body1 or body2 is a circle
  53558. if (body1.isCircle !== body2.isCircle)
  53559. {
  53560. var bodyRect = (body1.isCircle) ? body2 : body1;
  53561. var bodyCircle = (body1.isCircle) ? body1 : body2;
  53562. var rect = {
  53563. x: bodyRect.x,
  53564. y: bodyRect.y,
  53565. right: bodyRect.right,
  53566. bottom: bodyRect.bottom
  53567. };
  53568. var circle = bodyCircle.center;
  53569. if (circle.y < rect.y || circle.y > rect.bottom)
  53570. {
  53571. if (circle.x < rect.x || circle.x > rect.right)
  53572. {
  53573. return this.separateCircle(body1, body2, overlapOnly);
  53574. }
  53575. }
  53576. }
  53577. var resultX = false;
  53578. var resultY = false;
  53579. // Do we separate on x or y first?
  53580. if (this.forceX || Math.abs(this.gravity.y + body1.gravity.y) < Math.abs(this.gravity.x + body1.gravity.x))
  53581. {
  53582. resultX = SeparateX(body1, body2, overlapOnly, this.OVERLAP_BIAS);
  53583. // Are they still intersecting? Let's do the other axis then
  53584. if (this.intersects(body1, body2))
  53585. {
  53586. resultY = SeparateY(body1, body2, overlapOnly, this.OVERLAP_BIAS);
  53587. }
  53588. }
  53589. else
  53590. {
  53591. resultY = SeparateY(body1, body2, overlapOnly, this.OVERLAP_BIAS);
  53592. // Are they still intersecting? Let's do the other axis then
  53593. if (this.intersects(body1, body2))
  53594. {
  53595. resultX = SeparateX(body1, body2, overlapOnly, this.OVERLAP_BIAS);
  53596. }
  53597. }
  53598. var result = (resultX || resultY);
  53599. if (result)
  53600. {
  53601. if (overlapOnly)
  53602. {
  53603. if (body1.onOverlap || body2.onOverlap)
  53604. {
  53605. this.emit(Events.OVERLAP, body1.gameObject, body2.gameObject, body1, body2);
  53606. }
  53607. }
  53608. else
  53609. {
  53610. if (this._late)
  53611. {
  53612. this.late.set(body1);
  53613. this.late.set(body2);
  53614. }
  53615. if (body1.onCollide || body2.onCollide)
  53616. {
  53617. this.emit(Events.COLLIDE, body1.gameObject, body2.gameObject, body1, body2);
  53618. }
  53619. }
  53620. }
  53621. return result;
  53622. },
  53623. /**
  53624. * Separates two Bodies, when both are circular.
  53625. *
  53626. * @method Phaser.Physics.Arcade.World#separateCircle
  53627. * @fires Phaser.Physics.Arcade.Events#COLLIDE
  53628. * @fires Phaser.Physics.Arcade.Events#OVERLAP
  53629. * @since 3.0.0
  53630. *
  53631. * @param {Phaser.Physics.Arcade.Body} body1 - The first Body to be separated.
  53632. * @param {Phaser.Physics.Arcade.Body} body2 - The second Body to be separated.
  53633. * @param {boolean} [overlapOnly] - If this a collide or overlap check?
  53634. * @param {number} [bias] - A small value added to the calculations.
  53635. *
  53636. * @return {boolean} True if separation occurred, otherwise false.
  53637. */
  53638. separateCircle: function (body1, body2, overlapOnly, bias)
  53639. {
  53640. // Set the bounding box overlap values into the bodies themselves (hence we don't use the return values here)
  53641. GetOverlapX(body1, body2, false, bias);
  53642. GetOverlapY(body1, body2, false, bias);
  53643. var dx = body2.center.x - body1.center.x;
  53644. var dy = body2.center.y - body1.center.y;
  53645. var angleCollision = Math.atan2(dy, dx);
  53646. var overlap = 0;
  53647. if (body1.isCircle !== body2.isCircle)
  53648. {
  53649. var rect = {
  53650. x: (body2.isCircle) ? body1.position.x : body2.position.x,
  53651. y: (body2.isCircle) ? body1.position.y : body2.position.y,
  53652. right: (body2.isCircle) ? body1.right : body2.right,
  53653. bottom: (body2.isCircle) ? body1.bottom : body2.bottom
  53654. };
  53655. var circle = {
  53656. x: (body1.isCircle) ? body1.center.x : body2.center.x,
  53657. y: (body1.isCircle) ? body1.center.y : body2.center.y,
  53658. radius: (body1.isCircle) ? body1.halfWidth : body2.halfWidth
  53659. };
  53660. if (circle.y < rect.y)
  53661. {
  53662. if (circle.x < rect.x)
  53663. {
  53664. overlap = DistanceBetween(circle.x, circle.y, rect.x, rect.y) - circle.radius;
  53665. }
  53666. else if (circle.x > rect.right)
  53667. {
  53668. overlap = DistanceBetween(circle.x, circle.y, rect.right, rect.y) - circle.radius;
  53669. }
  53670. }
  53671. else if (circle.y > rect.bottom)
  53672. {
  53673. if (circle.x < rect.x)
  53674. {
  53675. overlap = DistanceBetween(circle.x, circle.y, rect.x, rect.bottom) - circle.radius;
  53676. }
  53677. else if (circle.x > rect.right)
  53678. {
  53679. overlap = DistanceBetween(circle.x, circle.y, rect.right, rect.bottom) - circle.radius;
  53680. }
  53681. }
  53682. overlap *= -1;
  53683. }
  53684. else
  53685. {
  53686. overlap = (body1.halfWidth + body2.halfWidth) - DistanceBetween(body1.center.x, body1.center.y, body2.center.x, body2.center.y);
  53687. }
  53688. // Can't separate two immovable bodies, or a body with its own custom separation logic
  53689. if (overlapOnly || overlap === 0 || (body1.immovable && body2.immovable) || body1.customSeparateX || body2.customSeparateX)
  53690. {
  53691. if (overlap !== 0 && (body1.onOverlap || body2.onOverlap))
  53692. {
  53693. this.emit(Events.OVERLAP, body1.gameObject, body2.gameObject, body1, body2);
  53694. }
  53695. // return true if there was some overlap, otherwise false
  53696. return (overlap !== 0);
  53697. }
  53698. // Transform the velocity vector to the coordinate system oriented along the direction of impact.
  53699. // This is done to eliminate the vertical component of the velocity
  53700. var b1vx = body1.velocity.x;
  53701. var b1vy = body1.velocity.y;
  53702. var b1mass = body1.mass;
  53703. var b2vx = body2.velocity.x;
  53704. var b2vy = body2.velocity.y;
  53705. var b2mass = body2.mass;
  53706. var v1 = {
  53707. x: b1vx * Math.cos(angleCollision) + b1vy * Math.sin(angleCollision),
  53708. y: b1vx * Math.sin(angleCollision) - b1vy * Math.cos(angleCollision)
  53709. };
  53710. var v2 = {
  53711. x: b2vx * Math.cos(angleCollision) + b2vy * Math.sin(angleCollision),
  53712. y: b2vx * Math.sin(angleCollision) - b2vy * Math.cos(angleCollision)
  53713. };
  53714. // We expect the new velocity after impact
  53715. var tempVel1 = ((b1mass - b2mass) * v1.x + 2 * b2mass * v2.x) / (b1mass + b2mass);
  53716. var tempVel2 = (2 * b1mass * v1.x + (b2mass - b1mass) * v2.x) / (b1mass + b2mass);
  53717. // We convert the vector to the original coordinate system and multiplied by factor of rebound
  53718. if (!body1.immovable)
  53719. {
  53720. body1.velocity.x = (tempVel1 * Math.cos(angleCollision) - v1.y * Math.sin(angleCollision)) * body1.bounce.x;
  53721. body1.velocity.y = (v1.y * Math.cos(angleCollision) + tempVel1 * Math.sin(angleCollision)) * body1.bounce.y;
  53722. // Reset local var
  53723. b1vx = body1.velocity.x;
  53724. b1vy = body1.velocity.y;
  53725. }
  53726. if (!body2.immovable)
  53727. {
  53728. body2.velocity.x = (tempVel2 * Math.cos(angleCollision) - v2.y * Math.sin(angleCollision)) * body2.bounce.x;
  53729. body2.velocity.y = (v2.y * Math.cos(angleCollision) + tempVel2 * Math.sin(angleCollision)) * body2.bounce.y;
  53730. // Reset local var
  53731. b2vx = body2.velocity.x;
  53732. b2vy = body2.velocity.y;
  53733. }
  53734. // When the collision angle is almost perpendicular to the total initial velocity vector
  53735. // (collision on a tangent) vector direction can be determined incorrectly.
  53736. // This code fixes the problem
  53737. if (Math.abs(angleCollision) < Math.PI / 2)
  53738. {
  53739. if ((b1vx > 0) && !body1.immovable && (b2vx > b1vx))
  53740. {
  53741. body1.velocity.x *= -1;
  53742. }
  53743. else if ((b2vx < 0) && !body2.immovable && (b1vx < b2vx))
  53744. {
  53745. body2.velocity.x *= -1;
  53746. }
  53747. else if ((b1vy > 0) && !body1.immovable && (b2vy > b1vy))
  53748. {
  53749. body1.velocity.y *= -1;
  53750. }
  53751. else if ((b2vy < 0) && !body2.immovable && (b1vy < b2vy))
  53752. {
  53753. body2.velocity.y *= -1;
  53754. }
  53755. }
  53756. else if (Math.abs(angleCollision) > Math.PI / 2)
  53757. {
  53758. if ((b1vx < 0) && !body1.immovable && (b2vx < b1vx))
  53759. {
  53760. body1.velocity.x *= -1;
  53761. }
  53762. else if ((b2vx > 0) && !body2.immovable && (b1vx > b2vx))
  53763. {
  53764. body2.velocity.x *= -1;
  53765. }
  53766. else if ((b1vy < 0) && !body1.immovable && (b2vy < b1vy))
  53767. {
  53768. body1.velocity.y *= -1;
  53769. }
  53770. else if ((b2vy > 0) && !body2.immovable && (b1vx > b2vy))
  53771. {
  53772. body2.velocity.y *= -1;
  53773. }
  53774. }
  53775. var delta = this._frameTime;
  53776. if (!body1.immovable)
  53777. {
  53778. body1.x += (body1.velocity.x * delta) - overlap * Math.cos(angleCollision);
  53779. body1.y += (body1.velocity.y * delta) - overlap * Math.sin(angleCollision);
  53780. }
  53781. if (!body2.immovable)
  53782. {
  53783. body2.x += (body2.velocity.x * delta) + overlap * Math.cos(angleCollision);
  53784. body2.y += (body2.velocity.y * delta) + overlap * Math.sin(angleCollision);
  53785. }
  53786. if (body1.onCollide || body2.onCollide)
  53787. {
  53788. this.emit(Events.COLLIDE, body1.gameObject, body2.gameObject, body1, body2);
  53789. }
  53790. // sync changes back to the bodies
  53791. body1.postUpdate();
  53792. body2.postUpdate();
  53793. return true;
  53794. },
  53795. /**
  53796. * Checks to see if two Bodies intersect at all.
  53797. *
  53798. * @method Phaser.Physics.Arcade.World#intersects
  53799. * @since 3.0.0
  53800. *
  53801. * @param {Phaser.Physics.Arcade.Body} body1 - The first body to check.
  53802. * @param {Phaser.Physics.Arcade.Body} body2 - The second body to check.
  53803. *
  53804. * @return {boolean} True if the two bodies intersect, otherwise false.
  53805. */
  53806. intersects: function (body1, body2)
  53807. {
  53808. if (body1 === body2)
  53809. {
  53810. return false;
  53811. }
  53812. if (!body1.isCircle && !body2.isCircle)
  53813. {
  53814. // Rect vs. Rect
  53815. return !(
  53816. body1.right <= body2.position.x ||
  53817. body1.bottom <= body2.position.y ||
  53818. body1.position.x >= body2.right ||
  53819. body1.position.y >= body2.bottom
  53820. );
  53821. }
  53822. else if (body1.isCircle)
  53823. {
  53824. if (body2.isCircle)
  53825. {
  53826. // Circle vs. Circle
  53827. return DistanceBetween(body1.center.x, body1.center.y, body2.center.x, body2.center.y) <= (body1.halfWidth + body2.halfWidth);
  53828. }
  53829. else
  53830. {
  53831. // Circle vs. Rect
  53832. return this.circleBodyIntersects(body1, body2);
  53833. }
  53834. }
  53835. else
  53836. {
  53837. // Rect vs. Circle
  53838. return this.circleBodyIntersects(body2, body1);
  53839. }
  53840. },
  53841. /**
  53842. * Tests if a circular Body intersects with another Body.
  53843. *
  53844. * @method Phaser.Physics.Arcade.World#circleBodyIntersects
  53845. * @since 3.0.0
  53846. *
  53847. * @param {Phaser.Physics.Arcade.Body} circle - The circular body to test.
  53848. * @param {Phaser.Physics.Arcade.Body} body - The rectangular body to test.
  53849. *
  53850. * @return {boolean} True if the two bodies intersect, otherwise false.
  53851. */
  53852. circleBodyIntersects: function (circle, body)
  53853. {
  53854. var x = Clamp(circle.center.x, body.left, body.right);
  53855. var y = Clamp(circle.center.y, body.top, body.bottom);
  53856. var dx = (circle.center.x - x) * (circle.center.x - x);
  53857. var dy = (circle.center.y - y) * (circle.center.y - y);
  53858. return (dx + dy) <= (circle.halfWidth * circle.halfWidth);
  53859. },
  53860. /**
  53861. * Tests if Game Objects overlap.
  53862. *
  53863. * @method Phaser.Physics.Arcade.World#overlap
  53864. * @since 3.0.0
  53865. *
  53866. * @param {ArcadeColliderType} object1 - The first object or array of objects to check.
  53867. * @param {ArcadeColliderType} [object2] - The second object or array of objects to check, or `undefined`.
  53868. * @param {ArcadePhysicsCallback} [overlapCallback] - An optional callback function that is called if the objects overlap.
  53869. * @param {ArcadePhysicsCallback} [processCallback] - An optional callback function that lets you perform additional checks against the two objects if they overlap. If this is set then `overlapCallback` will only be called if this callback returns `true`.
  53870. * @param {*} [callbackContext] - The context in which to run the callbacks.
  53871. *
  53872. * @return {boolean} True if at least one Game Object overlaps another.
  53873. */
  53874. overlap: function (object1, object2, overlapCallback, processCallback, callbackContext)
  53875. {
  53876. if (overlapCallback === undefined) { overlapCallback = null; }
  53877. if (processCallback === undefined) { processCallback = null; }
  53878. if (callbackContext === undefined) { callbackContext = overlapCallback; }
  53879. return this.collideObjects(object1, object2, overlapCallback, processCallback, callbackContext, true);
  53880. },
  53881. /**
  53882. * Performs a collision check and separation between the two physics enabled objects given, which can be single
  53883. * Game Objects, arrays of Game Objects, Physics Groups, arrays of Physics Groups or normal Groups.
  53884. *
  53885. * If you don't require separation then use {@link #overlap} instead.
  53886. *
  53887. * If two Groups or arrays are passed, each member of one will be tested against each member of the other.
  53888. *
  53889. * If one Group **only** is passed (as `object1`), each member of the Group will be collided against the other members.
  53890. *
  53891. * Two callbacks can be provided. The `collideCallback` is invoked if a collision occurs and the two colliding
  53892. * objects are passed to it.
  53893. *
  53894. * Arcade Physics uses the Projection Method of collision resolution and separation. While it's fast and suitable
  53895. * for 'arcade' style games it lacks stability when multiple objects are in close proximity or resting upon each other.
  53896. * The separation that stops two objects penetrating may create a new penetration against a different object. If you
  53897. * require a high level of stability please consider using an alternative physics system, such as Matter.js.
  53898. *
  53899. * @method Phaser.Physics.Arcade.World#collide
  53900. * @since 3.0.0
  53901. *
  53902. * @param {ArcadeColliderType} object1 - The first object or array of objects to check.
  53903. * @param {ArcadeColliderType} [object2] - The second object or array of objects to check, or `undefined`.
  53904. * @param {ArcadePhysicsCallback} [collideCallback] - An optional callback function that is called if the objects collide.
  53905. * @param {ArcadePhysicsCallback} [processCallback] - An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`.
  53906. * @param {any} [callbackContext] - The context in which to run the callbacks.
  53907. *
  53908. * @return {boolean} `true` if any overlapping Game Objects were separated, otherwise `false`.
  53909. */
  53910. collide: function (object1, object2, collideCallback, processCallback, callbackContext)
  53911. {
  53912. if (collideCallback === undefined) { collideCallback = null; }
  53913. if (processCallback === undefined) { processCallback = null; }
  53914. if (callbackContext === undefined) { callbackContext = collideCallback; }
  53915. return this.collideObjects(object1, object2, collideCallback, processCallback, callbackContext, false);
  53916. },
  53917. /**
  53918. * Internal helper function. Please use Phaser.Physics.Arcade.World#collide instead.
  53919. *
  53920. * @method Phaser.Physics.Arcade.World#collideObjects
  53921. * @private
  53922. * @since 3.0.0
  53923. *
  53924. * @param {ArcadeColliderType} object1 - The first object to check for collision.
  53925. * @param {ArcadeColliderType} object2 - The second object to check for collision.
  53926. * @param {ArcadePhysicsCallback} collideCallback - The callback to invoke when the two objects collide.
  53927. * @param {ArcadePhysicsCallback} processCallback - The callback to invoke when the two objects collide. Must return a boolean.
  53928. * @param {any} callbackContext - The scope in which to call the callbacks.
  53929. * @param {boolean} overlapOnly - Whether this is a collision or overlap check.
  53930. *
  53931. * @return {boolean} True if any objects overlap (with `overlapOnly`); or true if any overlapping objects were separated.
  53932. */
  53933. collideObjects: function (object1, object2, collideCallback, processCallback, callbackContext, overlapOnly)
  53934. {
  53935. var i;
  53936. if (object1.isParent && object1.physicsType === undefined)
  53937. {
  53938. object1 = object1.children.entries;
  53939. }
  53940. if (object2 && object2.isParent && object2.physicsType === undefined)
  53941. {
  53942. object2 = object2.children.entries;
  53943. }
  53944. var object1isArray = Array.isArray(object1);
  53945. var object2isArray = Array.isArray(object2);
  53946. this._total = 0;
  53947. if (!object1isArray && !object2isArray)
  53948. {
  53949. // Neither of them are arrays - do this first as it's the most common use-case
  53950. this.collideHandler(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  53951. }
  53952. else if (!object1isArray && object2isArray)
  53953. {
  53954. // Object 2 is an Array
  53955. for (i = 0; i < object2.length; i++)
  53956. {
  53957. this.collideHandler(object1, object2[i], collideCallback, processCallback, callbackContext, overlapOnly);
  53958. }
  53959. }
  53960. else if (object1isArray && !object2isArray)
  53961. {
  53962. // Object 1 is an Array
  53963. for (i = 0; i < object1.length; i++)
  53964. {
  53965. this.collideHandler(object1[i], object2, collideCallback, processCallback, callbackContext, overlapOnly);
  53966. }
  53967. }
  53968. else
  53969. {
  53970. // They're both arrays
  53971. for (i = 0; i < object1.length; i++)
  53972. {
  53973. for (var j = 0; j < object2.length; j++)
  53974. {
  53975. this.collideHandler(object1[i], object2[j], collideCallback, processCallback, callbackContext, overlapOnly);
  53976. }
  53977. }
  53978. }
  53979. return (this._total > 0);
  53980. },
  53981. /**
  53982. * Internal helper function. Please use Phaser.Physics.Arcade.World#collide and Phaser.Physics.Arcade.World#overlap instead.
  53983. *
  53984. * @method Phaser.Physics.Arcade.World#collideHandler
  53985. * @private
  53986. * @since 3.0.0
  53987. *
  53988. * @param {ArcadeColliderType} object1 - The first object or array of objects to check.
  53989. * @param {ArcadeColliderType} object2 - The second object or array of objects to check, or `undefined`.
  53990. * @param {ArcadePhysicsCallback} collideCallback - An optional callback function that is called if the objects collide.
  53991. * @param {ArcadePhysicsCallback} processCallback - An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`.
  53992. * @param {any} callbackContext - The context in which to run the callbacks.
  53993. * @param {boolean} overlapOnly - Whether this is a collision or overlap check.
  53994. *
  53995. * @return {boolean} True if any objects overlap (with `overlapOnly`); or true if any overlapping objects were separated.
  53996. */
  53997. collideHandler: function (object1, object2, collideCallback, processCallback, callbackContext, overlapOnly)
  53998. {
  53999. // Collide Group with Self
  54000. // Only collide valid objects
  54001. if (object2 === undefined && object1.isParent)
  54002. {
  54003. return this.collideGroupVsGroup(object1, object1, collideCallback, processCallback, callbackContext, overlapOnly);
  54004. }
  54005. // If neither of the objects are set then bail out
  54006. if (!object1 || !object2)
  54007. {
  54008. return false;
  54009. }
  54010. // A Body
  54011. if (object1.body)
  54012. {
  54013. if (object2.body)
  54014. {
  54015. return this.collideSpriteVsSprite(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  54016. }
  54017. else if (object2.isParent)
  54018. {
  54019. return this.collideSpriteVsGroup(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  54020. }
  54021. else if (object2.isTilemap)
  54022. {
  54023. return this.collideSpriteVsTilemapLayer(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  54024. }
  54025. }
  54026. // GROUPS
  54027. else if (object1.isParent)
  54028. {
  54029. if (object2.body)
  54030. {
  54031. return this.collideSpriteVsGroup(object2, object1, collideCallback, processCallback, callbackContext, overlapOnly);
  54032. }
  54033. else if (object2.isParent)
  54034. {
  54035. return this.collideGroupVsGroup(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  54036. }
  54037. else if (object2.isTilemap)
  54038. {
  54039. return this.collideGroupVsTilemapLayer(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  54040. }
  54041. }
  54042. // TILEMAP LAYERS
  54043. else if (object1.isTilemap)
  54044. {
  54045. if (object2.body)
  54046. {
  54047. return this.collideSpriteVsTilemapLayer(object2, object1, collideCallback, processCallback, callbackContext, overlapOnly);
  54048. }
  54049. else if (object2.isParent)
  54050. {
  54051. return this.collideGroupVsTilemapLayer(object2, object1, collideCallback, processCallback, callbackContext, overlapOnly);
  54052. }
  54053. }
  54054. },
  54055. /**
  54056. * Internal handler for Sprite vs. Sprite collisions.
  54057. * Please use Phaser.Physics.Arcade.World#collide instead.
  54058. *
  54059. * @method Phaser.Physics.Arcade.World#collideSpriteVsSprite
  54060. * @private
  54061. * @since 3.0.0
  54062. *
  54063. * @param {Phaser.GameObjects.GameObject} sprite1 - The first object to check for collision.
  54064. * @param {Phaser.GameObjects.GameObject} sprite2 - The second object to check for collision.
  54065. * @param {ArcadePhysicsCallback} [collideCallback] - An optional callback function that is called if the objects collide.
  54066. * @param {ArcadePhysicsCallback} [processCallback] - An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`.
  54067. * @param {any} [callbackContext] - The context in which to run the callbacks.
  54068. * @param {boolean} overlapOnly - Whether this is a collision or overlap check.
  54069. *
  54070. * @return {boolean} True if any objects overlap (with `overlapOnly`); or true if any overlapping objects were separated.
  54071. */
  54072. collideSpriteVsSprite: function (sprite1, sprite2, collideCallback, processCallback, callbackContext, overlapOnly)
  54073. {
  54074. if (!sprite1.body || !sprite2.body)
  54075. {
  54076. return false;
  54077. }
  54078. if (this.separate(sprite1.body, sprite2.body, processCallback, callbackContext, overlapOnly))
  54079. {
  54080. if (collideCallback)
  54081. {
  54082. collideCallback.call(callbackContext, sprite1, sprite2);
  54083. }
  54084. this._total++;
  54085. }
  54086. return true;
  54087. },
  54088. /**
  54089. * Internal handler for Sprite vs. Group collisions.
  54090. * Please use Phaser.Physics.Arcade.World#collide instead.
  54091. *
  54092. * @method Phaser.Physics.Arcade.World#collideSpriteVsGroup
  54093. * @private
  54094. * @since 3.0.0
  54095. *
  54096. * @param {Phaser.GameObjects.GameObject} sprite - The first object to check for collision.
  54097. * @param {Phaser.GameObjects.Group} group - The second object to check for collision.
  54098. * @param {ArcadePhysicsCallback} collideCallback - The callback to invoke when the two objects collide.
  54099. * @param {ArcadePhysicsCallback} processCallback - The callback to invoke when the two objects collide. Must return a boolean.
  54100. * @param {any} callbackContext - The scope in which to call the callbacks.
  54101. * @param {boolean} overlapOnly - Whether this is a collision or overlap check.
  54102. *
  54103. * @return {boolean} `true` if the Sprite collided with the given Group, otherwise `false`.
  54104. */
  54105. collideSpriteVsGroup: function (sprite, group, collideCallback, processCallback, callbackContext, overlapOnly)
  54106. {
  54107. var bodyA = sprite.body;
  54108. if (group.length === 0 || !bodyA || !bodyA.enable)
  54109. {
  54110. return;
  54111. }
  54112. // Does sprite collide with anything?
  54113. var i;
  54114. var len;
  54115. var bodyB;
  54116. if (this.useTree)
  54117. {
  54118. var minMax = this.treeMinMax;
  54119. minMax.minX = bodyA.left;
  54120. minMax.minY = bodyA.top;
  54121. minMax.maxX = bodyA.right;
  54122. minMax.maxY = bodyA.bottom;
  54123. var results = (group.physicsType === CONST.DYNAMIC_BODY) ? this.tree.search(minMax) : this.staticTree.search(minMax);
  54124. len = results.length;
  54125. for (i = 0; i < len; i++)
  54126. {
  54127. bodyB = results[i];
  54128. if (bodyA === bodyB || !group.contains(bodyB.gameObject))
  54129. {
  54130. // Skip if comparing against itself, or if bodyB isn't actually part of the Group
  54131. continue;
  54132. }
  54133. if (this.separate(bodyA, bodyB, processCallback, callbackContext, overlapOnly))
  54134. {
  54135. if (collideCallback)
  54136. {
  54137. collideCallback.call(callbackContext, bodyA.gameObject, bodyB.gameObject);
  54138. }
  54139. this._total++;
  54140. }
  54141. }
  54142. }
  54143. else
  54144. {
  54145. var children = group.getChildren();
  54146. var skipIndex = group.children.entries.indexOf(sprite);
  54147. len = children.length;
  54148. for (i = 0; i < len; i++)
  54149. {
  54150. bodyB = children[i].body;
  54151. if (!bodyB || i === skipIndex || !bodyB.enable)
  54152. {
  54153. continue;
  54154. }
  54155. if (this.separate(bodyA, bodyB, processCallback, callbackContext, overlapOnly))
  54156. {
  54157. if (collideCallback)
  54158. {
  54159. collideCallback.call(callbackContext, bodyA.gameObject, bodyB.gameObject);
  54160. }
  54161. this._total++;
  54162. }
  54163. }
  54164. }
  54165. },
  54166. /**
  54167. * Internal handler for Group vs. Tilemap collisions.
  54168. * Please use Phaser.Physics.Arcade.World#collide instead.
  54169. *
  54170. * @method Phaser.Physics.Arcade.World#collideGroupVsTilemapLayer
  54171. * @private
  54172. * @since 3.0.0
  54173. *
  54174. * @param {Phaser.GameObjects.Group} group - The first object to check for collision.
  54175. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer - The second object to check for collision.
  54176. * @param {ArcadePhysicsCallback} [collideCallback] - An optional callback function that is called if the objects collide.
  54177. * @param {ArcadePhysicsCallback} [processCallback] - An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`.
  54178. * @param {any} [callbackContext] - The context in which to run the callbacks.
  54179. * @param {boolean} overlapOnly - Whether this is a collision or overlap check.
  54180. *
  54181. * @return {boolean} True if any objects overlap (with `overlapOnly`); or true if any overlapping objects were separated.
  54182. */
  54183. collideGroupVsTilemapLayer: function (group, tilemapLayer, collideCallback, processCallback, callbackContext, overlapOnly)
  54184. {
  54185. var children = group.getChildren();
  54186. if (children.length === 0)
  54187. {
  54188. return false;
  54189. }
  54190. var didCollide = false;
  54191. for (var i = 0; i < children.length; i++)
  54192. {
  54193. if (children[i].body)
  54194. {
  54195. if (this.collideSpriteVsTilemapLayer(children[i], tilemapLayer, collideCallback, processCallback, callbackContext, overlapOnly))
  54196. {
  54197. didCollide = true;
  54198. }
  54199. }
  54200. }
  54201. return didCollide;
  54202. },
  54203. /**
  54204. * Internal handler for Sprite vs. Tilemap collisions.
  54205. * Please use Phaser.Physics.Arcade.World#collide instead.
  54206. *
  54207. * @method Phaser.Physics.Arcade.World#collideSpriteVsTilemapLayer
  54208. * @fires Phaser.Physics.Arcade.Events#TILE_COLLIDE
  54209. * @fires Phaser.Physics.Arcade.Events#TILE_OVERLAP
  54210. * @since 3.0.0
  54211. *
  54212. * @param {Phaser.GameObjects.GameObject} sprite - The first object to check for collision.
  54213. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer - The second object to check for collision.
  54214. * @param {ArcadePhysicsCallback} [collideCallback] - An optional callback function that is called if the objects collide.
  54215. * @param {ArcadePhysicsCallback} [processCallback] - An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`.
  54216. * @param {any} [callbackContext] - The context in which to run the callbacks.
  54217. * @param {boolean} [overlapOnly] - Whether this is a collision or overlap check.
  54218. *
  54219. * @return {boolean} True if any objects overlap (with `overlapOnly`); or true if any overlapping objects were separated.
  54220. */
  54221. collideSpriteVsTilemapLayer: function (sprite, tilemapLayer, collideCallback, processCallback, callbackContext, overlapOnly)
  54222. {
  54223. var body = sprite.body;
  54224. if (!body.enable)
  54225. {
  54226. return false;
  54227. }
  54228. var x = body.position.x;
  54229. var y = body.position.y;
  54230. var w = body.width;
  54231. var h = body.height;
  54232. // TODO: this logic should be encapsulated within the Tilemap API at some point.
  54233. // If the maps base tile size differs from the layer's tile size, we need to adjust the
  54234. // selection area by the difference between the two.
  54235. var layerData = tilemapLayer.layer;
  54236. if (layerData.tileWidth > layerData.baseTileWidth)
  54237. {
  54238. // The x origin of a tile is the left side, so x and width need to be adjusted.
  54239. var xDiff = (layerData.tileWidth - layerData.baseTileWidth) * tilemapLayer.scaleX;
  54240. x -= xDiff;
  54241. w += xDiff;
  54242. }
  54243. if (layerData.tileHeight > layerData.baseTileHeight)
  54244. {
  54245. // The y origin of a tile is the bottom side, so just the height needs to be adjusted.
  54246. var yDiff = (layerData.tileHeight - layerData.baseTileHeight) * tilemapLayer.scaleY;
  54247. h += yDiff;
  54248. }
  54249. var mapData = tilemapLayer.getTilesWithinWorldXY(x, y, w, h);
  54250. if (mapData.length === 0)
  54251. {
  54252. return false;
  54253. }
  54254. var tile;
  54255. var tileWorldRect = { left: 0, right: 0, top: 0, bottom: 0 };
  54256. for (var i = 0; i < mapData.length; i++)
  54257. {
  54258. tile = mapData[i];
  54259. tileWorldRect.left = tilemapLayer.tileToWorldX(tile.x);
  54260. tileWorldRect.top = tilemapLayer.tileToWorldY(tile.y);
  54261. // If the map's base tile size differs from the layer's tile size, only the top of the rect
  54262. // needs to be adjusted since its origin is (0, 1).
  54263. if (tile.baseHeight !== tile.height)
  54264. {
  54265. tileWorldRect.top -= (tile.height - tile.baseHeight) * tilemapLayer.scaleY;
  54266. }
  54267. tileWorldRect.right = tileWorldRect.left + tile.width * tilemapLayer.scaleX;
  54268. tileWorldRect.bottom = tileWorldRect.top + tile.height * tilemapLayer.scaleY;
  54269. if (TileIntersectsBody(tileWorldRect, body)
  54270. && (!processCallback || processCallback.call(callbackContext, sprite, tile))
  54271. && ProcessTileCallbacks(tile, sprite)
  54272. && (overlapOnly || SeparateTile(i, body, tile, tileWorldRect, tilemapLayer, this.TILE_BIAS)))
  54273. {
  54274. this._total++;
  54275. if (collideCallback)
  54276. {
  54277. collideCallback.call(callbackContext, sprite, tile);
  54278. }
  54279. if (overlapOnly && body.onOverlap)
  54280. {
  54281. this.emit(Events.TILE_OVERLAP, body.gameObject, tile, body);
  54282. }
  54283. else if (body.onCollide)
  54284. {
  54285. this.emit(Events.TILE_COLLIDE, body.gameObject, tile, body);
  54286. }
  54287. // sync changes back to the body
  54288. body.postUpdate();
  54289. }
  54290. }
  54291. },
  54292. /**
  54293. * Internal helper for Group vs. Group collisions.
  54294. * Please use Phaser.Physics.Arcade.World#collide instead.
  54295. *
  54296. * @method Phaser.Physics.Arcade.World#collideGroupVsGroup
  54297. * @private
  54298. * @since 3.0.0
  54299. *
  54300. * @param {Phaser.GameObjects.Group} group1 - The first object to check for collision.
  54301. * @param {Phaser.GameObjects.Group} group2 - The second object to check for collision.
  54302. * @param {ArcadePhysicsCallback} [collideCallback] - An optional callback function that is called if the objects collide.
  54303. * @param {ArcadePhysicsCallback} [processCallback] - An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`.
  54304. * @param {any} [callbackContext] - The context in which to run the callbacks.
  54305. * @param {boolean} overlapOnly - Whether this is a collision or overlap check.
  54306. *
  54307. * @return {boolean} True if any objects overlap (with `overlapOnly`); or true if any overlapping objects were separated.
  54308. */
  54309. collideGroupVsGroup: function (group1, group2, collideCallback, processCallback, callbackContext, overlapOnly)
  54310. {
  54311. if (group1.length === 0 || group2.length === 0)
  54312. {
  54313. return;
  54314. }
  54315. var children = group1.getChildren();
  54316. for (var i = 0; i < children.length; i++)
  54317. {
  54318. this.collideSpriteVsGroup(children[i], group2, collideCallback, processCallback, callbackContext, overlapOnly);
  54319. }
  54320. },
  54321. /**
  54322. * Wrap an object's coordinates (or several objects' coordinates) within {@link Phaser.Physics.Arcade.World#bounds}.
  54323. *
  54324. * If the object is outside any boundary edge (left, top, right, bottom), it will be moved to the same offset from the opposite edge (the interior).
  54325. *
  54326. * @method Phaser.Physics.Arcade.World#wrap
  54327. * @since 3.3.0
  54328. *
  54329. * @param {*} object - A Game Object, a Group, an object with `x` and `y` coordinates, or an array of such objects.
  54330. * @param {number} [padding=0] - An amount added to each boundary edge during the operation.
  54331. */
  54332. wrap: function (object, padding)
  54333. {
  54334. if (object.body)
  54335. {
  54336. this.wrapObject(object, padding);
  54337. }
  54338. else if (object.getChildren)
  54339. {
  54340. this.wrapArray(object.getChildren(), padding);
  54341. }
  54342. else if (Array.isArray(object))
  54343. {
  54344. this.wrapArray(object, padding);
  54345. }
  54346. else
  54347. {
  54348. this.wrapObject(object, padding);
  54349. }
  54350. },
  54351. /**
  54352. * Wrap each object's coordinates within {@link Phaser.Physics.Arcade.World#bounds}.
  54353. *
  54354. * @method Phaser.Physics.Arcade.World#wrapArray
  54355. * @since 3.3.0
  54356. *
  54357. * @param {Array.<*>} objects - An array of objects to be wrapped.
  54358. * @param {number} [padding=0] - An amount added to the boundary.
  54359. */
  54360. wrapArray: function (objects, padding)
  54361. {
  54362. for (var i = 0; i < objects.length; i++)
  54363. {
  54364. this.wrapObject(objects[i], padding);
  54365. }
  54366. },
  54367. /**
  54368. * Wrap an object's coordinates within {@link Phaser.Physics.Arcade.World#bounds}.
  54369. *
  54370. * @method Phaser.Physics.Arcade.World#wrapObject
  54371. * @since 3.3.0
  54372. *
  54373. * @param {*} object - A Game Object, a Physics Body, or any object with `x` and `y` coordinates
  54374. * @param {number} [padding=0] - An amount added to the boundary.
  54375. */
  54376. wrapObject: function (object, padding)
  54377. {
  54378. if (padding === undefined) { padding = 0; }
  54379. object.x = Wrap(object.x, this.bounds.left - padding, this.bounds.right + padding);
  54380. object.y = Wrap(object.y, this.bounds.top - padding, this.bounds.bottom + padding);
  54381. },
  54382. /**
  54383. * Shuts down the simulation, clearing physics data and removing listeners.
  54384. *
  54385. * @method Phaser.Physics.Arcade.World#shutdown
  54386. * @since 3.0.0
  54387. */
  54388. shutdown: function ()
  54389. {
  54390. this.tree.clear();
  54391. this.staticTree.clear();
  54392. this.bodies.clear();
  54393. this.staticBodies.clear();
  54394. this.late.clear();
  54395. this.colliders.destroy();
  54396. this.removeAllListeners();
  54397. },
  54398. /**
  54399. * Shuts down the simulation and disconnects it from the current scene.
  54400. *
  54401. * @method Phaser.Physics.Arcade.World#destroy
  54402. * @since 3.0.0
  54403. */
  54404. destroy: function ()
  54405. {
  54406. this.shutdown();
  54407. this.scene = null;
  54408. }
  54409. });
  54410. module.exports = World;
  54411. /***/ }),
  54412. /* 251 */
  54413. /***/ (function(module, exports, __webpack_require__) {
  54414. /**
  54415. * @author Richard Davey <rich@photonstorm.com>
  54416. * @copyright 2019 Photon Storm Ltd.
  54417. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  54418. */
  54419. var ArcadeSprite = __webpack_require__(111);
  54420. var Class = __webpack_require__(0);
  54421. var CONST = __webpack_require__(38);
  54422. var Group = __webpack_require__(94);
  54423. var IsPlainObject = __webpack_require__(8);
  54424. /**
  54425. * @classdesc
  54426. * An Arcade Physics Static Group object.
  54427. *
  54428. * All Game Objects created by this Group will automatically be given static Arcade Physics bodies.
  54429. *
  54430. * Its dynamic counterpart is {@link Phaser.Physics.Arcade.Group}.
  54431. *
  54432. * @class StaticGroup
  54433. * @extends Phaser.GameObjects.Group
  54434. * @memberof Phaser.Physics.Arcade
  54435. * @constructor
  54436. * @since 3.0.0
  54437. *
  54438. * @param {Phaser.Physics.Arcade.World} world - The physics simulation.
  54439. * @param {Phaser.Scene} scene - The scene this group belongs to.
  54440. * @param {(Phaser.GameObjects.GameObject[]|GroupConfig|GroupCreateConfig)} [children] - Game Objects to add to this group; or the `config` argument.
  54441. * @param {GroupConfig|GroupCreateConfig} [config] - Settings for this group.
  54442. */
  54443. var StaticPhysicsGroup = new Class({
  54444. Extends: Group,
  54445. initialize:
  54446. function StaticPhysicsGroup (world, scene, children, config)
  54447. {
  54448. if (!children && !config)
  54449. {
  54450. config = {
  54451. createCallback: this.createCallbackHandler,
  54452. removeCallback: this.removeCallbackHandler,
  54453. createMultipleCallback: this.createMultipleCallbackHandler,
  54454. classType: ArcadeSprite
  54455. };
  54456. }
  54457. else if (IsPlainObject(children))
  54458. {
  54459. // children is a plain object, so swizzle them:
  54460. config = children;
  54461. children = null;
  54462. config.createCallback = this.createCallbackHandler;
  54463. config.removeCallback = this.removeCallbackHandler;
  54464. config.createMultipleCallback = this.createMultipleCallbackHandler;
  54465. config.classType = ArcadeSprite;
  54466. }
  54467. else if (Array.isArray(children) && IsPlainObject(children[0]))
  54468. {
  54469. // children is an array of plain objects
  54470. config = children;
  54471. children = null;
  54472. config.forEach(function (singleConfig)
  54473. {
  54474. singleConfig.createCallback = this.createCallbackHandler;
  54475. singleConfig.removeCallback = this.removeCallbackHandler;
  54476. singleConfig.createMultipleCallback = this.createMultipleCallbackHandler;
  54477. singleConfig.classType = ArcadeSprite;
  54478. });
  54479. }
  54480. /**
  54481. * The physics simulation.
  54482. *
  54483. * @name Phaser.Physics.Arcade.StaticGroup#world
  54484. * @type {Phaser.Physics.Arcade.World}
  54485. * @since 3.0.0
  54486. */
  54487. this.world = world;
  54488. /**
  54489. * The scene this group belongs to.
  54490. *
  54491. * @name Phaser.Physics.Arcade.StaticGroup#physicsType
  54492. * @type {integer}
  54493. * @default Phaser.Physics.Arcade.STATIC_BODY
  54494. * @since 3.0.0
  54495. */
  54496. this.physicsType = CONST.STATIC_BODY;
  54497. Group.call(this, scene, children, config);
  54498. },
  54499. /**
  54500. * Adds a static physics body to the new group member (if it lacks one) and adds it to the simulation.
  54501. *
  54502. * @method Phaser.Physics.Arcade.StaticGroup#createCallbackHandler
  54503. * @since 3.0.0
  54504. *
  54505. * @param {Phaser.GameObjects.GameObject} child - The new group member.
  54506. *
  54507. * @see Phaser.Physics.Arcade.World#enableBody
  54508. */
  54509. createCallbackHandler: function (child)
  54510. {
  54511. if (!child.body)
  54512. {
  54513. this.world.enableBody(child, CONST.STATIC_BODY);
  54514. }
  54515. },
  54516. /**
  54517. * Disables the group member's physics body, removing it from the simulation.
  54518. *
  54519. * @method Phaser.Physics.Arcade.StaticGroup#removeCallbackHandler
  54520. * @since 3.0.0
  54521. *
  54522. * @param {Phaser.GameObjects.GameObject} child - The group member being removed.
  54523. *
  54524. * @see Phaser.Physics.Arcade.World#disableBody
  54525. */
  54526. removeCallbackHandler: function (child)
  54527. {
  54528. if (child.body)
  54529. {
  54530. this.world.disableBody(child);
  54531. }
  54532. },
  54533. /**
  54534. * Refreshes the group.
  54535. *
  54536. * @method Phaser.Physics.Arcade.StaticGroup#createMultipleCallbackHandler
  54537. * @since 3.0.0
  54538. *
  54539. * @param {Phaser.GameObjects.GameObject[]} entries - The newly created group members.
  54540. *
  54541. * @see Phaser.Physics.Arcade.StaticGroup#refresh
  54542. */
  54543. createMultipleCallbackHandler: function ()
  54544. {
  54545. this.refresh();
  54546. },
  54547. /**
  54548. * Resets each Body to the position of its parent Game Object.
  54549. * Body sizes aren't changed (use {@link Phaser.Physics.Arcade.Components.Enable#refreshBody} for that).
  54550. *
  54551. * @method Phaser.Physics.Arcade.StaticGroup#refresh
  54552. * @since 3.0.0
  54553. *
  54554. * @return {Phaser.Physics.Arcade.StaticGroup} This group.
  54555. *
  54556. * @see Phaser.Physics.Arcade.StaticBody#reset
  54557. */
  54558. refresh: function ()
  54559. {
  54560. var children = this.children.entries;
  54561. for (var i = 0; i < children.length; i++)
  54562. {
  54563. children[i].body.reset();
  54564. }
  54565. return this;
  54566. }
  54567. });
  54568. module.exports = StaticPhysicsGroup;
  54569. /***/ }),
  54570. /* 252 */
  54571. /***/ (function(module, exports, __webpack_require__) {
  54572. /**
  54573. * @author Richard Davey <rich@photonstorm.com>
  54574. * @copyright 2019 Photon Storm Ltd.
  54575. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  54576. */
  54577. var ArcadeSprite = __webpack_require__(111);
  54578. var Class = __webpack_require__(0);
  54579. var CONST = __webpack_require__(38);
  54580. var GetFastValue = __webpack_require__(2);
  54581. var Group = __webpack_require__(94);
  54582. var IsPlainObject = __webpack_require__(8);
  54583. /**
  54584. * @typedef {object} PhysicsGroupConfig
  54585. * @extends GroupConfig
  54586. *
  54587. * @property {boolean} [collideWorldBounds=false] - Sets {@link Phaser.Physics.Arcade.Body#collideWorldBounds}.
  54588. * @property {number} [accelerationX=0] - Sets {@link Phaser.Physics.Arcade.Body#acceleration acceleration.x}.
  54589. * @property {number} [accelerationY=0] - Sets {@link Phaser.Physics.Arcade.Body#acceleration acceleration.y}.
  54590. * @property {boolean} [allowDrag=true] - Sets {@link Phaser.Physics.Arcade.Body#allowDrag}.
  54591. * @property {boolean} [allowGravity=true] - Sets {@link Phaser.Physics.Arcade.Body#allowGravity}.
  54592. * @property {boolean} [allowRotation=true] - Sets {@link Phaser.Physics.Arcade.Body#allowRotation}.
  54593. * @property {number} [bounceX=0] - Sets {@link Phaser.Physics.Arcade.Body#bounce bounce.x}.
  54594. * @property {number} [bounceY=0] - Sets {@link Phaser.Physics.Arcade.Body#bounce bounce.y}.
  54595. * @property {number} [dragX=0] - Sets {@link Phaser.Physics.Arcade.Body#drag drag.x}.
  54596. * @property {number} [dragY=0] - Sets {@link Phaser.Physics.Arcade.Body#drag drag.y}.
  54597. * @property {boolean} [enable=true] - Sets {@link Phaser.Physics.Arcade.Body#enable enable}.
  54598. * @property {number} [gravityX=0] - Sets {@link Phaser.Physics.Arcade.Body#gravity gravity.x}.
  54599. * @property {number} [gravityY=0] - Sets {@link Phaser.Physics.Arcade.Body#gravity gravity.y}.
  54600. * @property {number} [frictionX=0] - Sets {@link Phaser.Physics.Arcade.Body#friction friction.x}.
  54601. * @property {number} [frictionY=0] - Sets {@link Phaser.Physics.Arcade.Body#friction friction.y}.
  54602. * @property {number} [velocityX=0] - Sets {@link Phaser.Physics.Arcade.Body#velocity velocity.x}.
  54603. * @property {number} [velocityY=0] - Sets {@link Phaser.Physics.Arcade.Body#velocity velocity.y}.
  54604. * @property {number} [angularVelocity=0] - Sets {@link Phaser.Physics.Arcade.Body#angularVelocity}.
  54605. * @property {number} [angularAcceleration=0] - Sets {@link Phaser.Physics.Arcade.Body#angularAcceleration}.
  54606. * @property {number} [angularDrag=0] - Sets {@link Phaser.Physics.Arcade.Body#angularDrag}.
  54607. * @property {number} [mass=0] - Sets {@link Phaser.Physics.Arcade.Body#mass}.
  54608. * @property {boolean} [immovable=false] - Sets {@link Phaser.Physics.Arcade.Body#immovable}.
  54609. */
  54610. /**
  54611. * @typedef {object} PhysicsGroupDefaults
  54612. *
  54613. * @property {boolean} setCollideWorldBounds - As {@link Phaser.Physics.Arcade.Body#setCollideWorldBounds}.
  54614. * @property {number} setAccelerationX - As {@link Phaser.Physics.Arcade.Body#setAccelerationX}.
  54615. * @property {number} setAccelerationY - As {@link Phaser.Physics.Arcade.Body#setAccelerationY}.
  54616. * @property {boolean} setAllowDrag - As {@link Phaser.Physics.Arcade.Body#setAllowDrag}.
  54617. * @property {boolean} setAllowGravity - As {@link Phaser.Physics.Arcade.Body#setAllowGravity}.
  54618. * @property {boolean} setAllowRotation - As {@link Phaser.Physics.Arcade.Body#setAllowRotation}.
  54619. * @property {number} setBounceX - As {@link Phaser.Physics.Arcade.Body#setBounceX}.
  54620. * @property {number} setBounceY - As {@link Phaser.Physics.Arcade.Body#setBounceY}.
  54621. * @property {number} setDragX - As {@link Phaser.Physics.Arcade.Body#setDragX}.
  54622. * @property {number} setDragY - As {@link Phaser.Physics.Arcade.Body#setDragY}.
  54623. * @property {boolean} setEnable - As {@link Phaser.Physics.Arcade.Body#setEnable}.
  54624. * @property {number} setGravityX - As {@link Phaser.Physics.Arcade.Body#setGravityX}.
  54625. * @property {number} setGravityY - As {@link Phaser.Physics.Arcade.Body#setGravityY}.
  54626. * @property {number} setFrictionX - As {@link Phaser.Physics.Arcade.Body#setFrictionX}.
  54627. * @property {number} setFrictionY - As {@link Phaser.Physics.Arcade.Body#setFrictionY}.
  54628. * @property {number} setVelocityX - As {@link Phaser.Physics.Arcade.Body#setVelocityX}.
  54629. * @property {number} setVelocityY - As {@link Phaser.Physics.Arcade.Body#setVelocityY}.
  54630. * @property {number} setAngularVelocity - As {@link Phaser.Physics.Arcade.Body#setAngularVelocity}.
  54631. * @property {number} setAngularAcceleration - As {@link Phaser.Physics.Arcade.Body#setAngularAcceleration}.
  54632. * @property {number} setAngularDrag - As {@link Phaser.Physics.Arcade.Body#setAngularDrag}.
  54633. * @property {number} setMass - As {@link Phaser.Physics.Arcade.Body#setMass}.
  54634. * @property {boolean} setImmovable - As {@link Phaser.Physics.Arcade.Body#setImmovable}.
  54635. */
  54636. /**
  54637. * @classdesc
  54638. * An Arcade Physics Group object.
  54639. *
  54640. * All Game Objects created by this Group will automatically be given dynamic Arcade Physics bodies.
  54641. *
  54642. * Its static counterpart is {@link Phaser.Physics.Arcade.StaticGroup}.
  54643. *
  54644. * @class Group
  54645. * @extends Phaser.GameObjects.Group
  54646. * @memberof Phaser.Physics.Arcade
  54647. * @constructor
  54648. * @since 3.0.0
  54649. *
  54650. * @param {Phaser.Physics.Arcade.World} world - The physics simulation.
  54651. * @param {Phaser.Scene} scene - The scene this group belongs to.
  54652. * @param {(Phaser.GameObjects.GameObject[]|PhysicsGroupConfig|GroupCreateConfig)} [children] - Game Objects to add to this group; or the `config` argument.
  54653. * @param {PhysicsGroupConfig|GroupCreateConfig} [config] - Settings for this group.
  54654. */
  54655. var PhysicsGroup = new Class({
  54656. Extends: Group,
  54657. initialize:
  54658. function PhysicsGroup (world, scene, children, config)
  54659. {
  54660. if (!children && !config)
  54661. {
  54662. config = {
  54663. createCallback: this.createCallbackHandler,
  54664. removeCallback: this.removeCallbackHandler
  54665. };
  54666. }
  54667. else if (IsPlainObject(children))
  54668. {
  54669. // children is a plain object, so swizzle them:
  54670. config = children;
  54671. children = null;
  54672. config.createCallback = this.createCallbackHandler;
  54673. config.removeCallback = this.removeCallbackHandler;
  54674. }
  54675. else if (Array.isArray(children) && IsPlainObject(children[0]))
  54676. {
  54677. // children is an array of plain objects
  54678. config = children;
  54679. children = null;
  54680. config.forEach(function (singleConfig)
  54681. {
  54682. singleConfig.createCallback = this.createCallbackHandler;
  54683. singleConfig.removeCallback = this.removeCallbackHandler;
  54684. });
  54685. }
  54686. else
  54687. {
  54688. // config is not defined and children is not a plain object nor an array of plain objects
  54689. config = {
  54690. createCallback: this.createCallbackHandler,
  54691. removeCallback: this.removeCallbackHandler
  54692. };
  54693. }
  54694. /**
  54695. * The physics simulation.
  54696. *
  54697. * @name Phaser.Physics.Arcade.Group#world
  54698. * @type {Phaser.Physics.Arcade.World}
  54699. * @since 3.0.0
  54700. */
  54701. this.world = world;
  54702. /**
  54703. * The class to create new Group members from.
  54704. *
  54705. * This should be either `Phaser.Physics.Arcade.Image`, `Phaser.Physics.Arcade.Sprite`, or a class extending one of those.
  54706. *
  54707. * @name Phaser.Physics.Arcade.Group#classType
  54708. * @type {GroupClassTypeConstructor}
  54709. * @default ArcadeSprite
  54710. */
  54711. config.classType = GetFastValue(config, 'classType', ArcadeSprite);
  54712. /**
  54713. * The physics type of the Group's members.
  54714. *
  54715. * @name Phaser.Physics.Arcade.Group#physicsType
  54716. * @type {integer}
  54717. * @default Phaser.Physics.Arcade.DYNAMIC_BODY
  54718. * @since 3.0.0
  54719. */
  54720. this.physicsType = CONST.DYNAMIC_BODY;
  54721. /**
  54722. * Default physics properties applied to Game Objects added to the Group or created by the Group. Derived from the `config` argument.
  54723. *
  54724. * @name Phaser.Physics.Arcade.Group#defaults
  54725. * @type {PhysicsGroupDefaults}
  54726. * @since 3.0.0
  54727. */
  54728. this.defaults = {
  54729. setCollideWorldBounds: GetFastValue(config, 'collideWorldBounds', false),
  54730. setAccelerationX: GetFastValue(config, 'accelerationX', 0),
  54731. setAccelerationY: GetFastValue(config, 'accelerationY', 0),
  54732. setAllowDrag: GetFastValue(config, 'allowDrag', true),
  54733. setAllowGravity: GetFastValue(config, 'allowGravity', true),
  54734. setAllowRotation: GetFastValue(config, 'allowRotation', true),
  54735. setBounceX: GetFastValue(config, 'bounceX', 0),
  54736. setBounceY: GetFastValue(config, 'bounceY', 0),
  54737. setDragX: GetFastValue(config, 'dragX', 0),
  54738. setDragY: GetFastValue(config, 'dragY', 0),
  54739. setEnable: GetFastValue(config, 'enable', true),
  54740. setGravityX: GetFastValue(config, 'gravityX', 0),
  54741. setGravityY: GetFastValue(config, 'gravityY', 0),
  54742. setFrictionX: GetFastValue(config, 'frictionX', 0),
  54743. setFrictionY: GetFastValue(config, 'frictionY', 0),
  54744. setVelocityX: GetFastValue(config, 'velocityX', 0),
  54745. setVelocityY: GetFastValue(config, 'velocityY', 0),
  54746. setAngularVelocity: GetFastValue(config, 'angularVelocity', 0),
  54747. setAngularAcceleration: GetFastValue(config, 'angularAcceleration', 0),
  54748. setAngularDrag: GetFastValue(config, 'angularDrag', 0),
  54749. setMass: GetFastValue(config, 'mass', 1),
  54750. setImmovable: GetFastValue(config, 'immovable', false)
  54751. };
  54752. Group.call(this, scene, children, config);
  54753. },
  54754. /**
  54755. * Enables a Game Object's Body and assigns `defaults`. Called when a Group member is added or created.
  54756. *
  54757. * @method Phaser.Physics.Arcade.Group#createCallbackHandler
  54758. * @since 3.0.0
  54759. *
  54760. * @param {Phaser.GameObjects.GameObject} child - The Game Object being added.
  54761. */
  54762. createCallbackHandler: function (child)
  54763. {
  54764. if (!child.body)
  54765. {
  54766. this.world.enableBody(child, CONST.DYNAMIC_BODY);
  54767. }
  54768. var body = child.body;
  54769. for (var key in this.defaults)
  54770. {
  54771. body[key](this.defaults[key]);
  54772. }
  54773. },
  54774. /**
  54775. * Disables a Game Object's Body. Called when a Group member is removed.
  54776. *
  54777. * @method Phaser.Physics.Arcade.Group#removeCallbackHandler
  54778. * @since 3.0.0
  54779. *
  54780. * @param {Phaser.GameObjects.GameObject} child - The Game Object being removed.
  54781. */
  54782. removeCallbackHandler: function (child)
  54783. {
  54784. if (child.body)
  54785. {
  54786. this.world.disableBody(child);
  54787. }
  54788. },
  54789. /**
  54790. * Sets the velocity of each Group member.
  54791. *
  54792. * @method Phaser.Physics.Arcade.Group#setVelocity
  54793. * @since 3.0.0
  54794. *
  54795. * @param {number} x - The horizontal velocity.
  54796. * @param {number} y - The vertical velocity.
  54797. * @param {number} [step=0] - The velocity increment. When set, the first member receives velocity (x, y), the second (x + step, y + step), and so on.
  54798. *
  54799. * @return {Phaser.Physics.Arcade.Group} This Physics Group object.
  54800. */
  54801. setVelocity: function (x, y, step)
  54802. {
  54803. if (step === undefined) { step = 0; }
  54804. var items = this.getChildren();
  54805. for (var i = 0; i < items.length; i++)
  54806. {
  54807. items[i].body.velocity.set(x + (i * step), y + (i * step));
  54808. }
  54809. return this;
  54810. },
  54811. /**
  54812. * Sets the horizontal velocity of each Group member.
  54813. *
  54814. * @method Phaser.Physics.Arcade.Group#setVelocityX
  54815. * @since 3.0.0
  54816. *
  54817. * @param {number} value - The velocity value.
  54818. * @param {number} [step=0] - The velocity increment. When set, the first member receives velocity (x), the second (x + step), and so on.
  54819. *
  54820. * @return {Phaser.Physics.Arcade.Group} This Physics Group object.
  54821. */
  54822. setVelocityX: function (value, step)
  54823. {
  54824. if (step === undefined) { step = 0; }
  54825. var items = this.getChildren();
  54826. for (var i = 0; i < items.length; i++)
  54827. {
  54828. items[i].body.velocity.x = value + (i * step);
  54829. }
  54830. return this;
  54831. },
  54832. /**
  54833. * Sets the vertical velocity of each Group member.
  54834. *
  54835. * @method Phaser.Physics.Arcade.Group#setVelocityY
  54836. * @since 3.0.0
  54837. *
  54838. * @param {number} value - The velocity value.
  54839. * @param {number} [step=0] - The velocity increment. When set, the first member receives velocity (y), the second (y + step), and so on.
  54840. *
  54841. * @return {Phaser.Physics.Arcade.Group} This Physics Group object.
  54842. */
  54843. setVelocityY: function (value, step)
  54844. {
  54845. if (step === undefined) { step = 0; }
  54846. var items = this.getChildren();
  54847. for (var i = 0; i < items.length; i++)
  54848. {
  54849. items[i].body.velocity.y = value + (i * step);
  54850. }
  54851. return this;
  54852. }
  54853. });
  54854. module.exports = PhysicsGroup;
  54855. /***/ }),
  54856. /* 253 */
  54857. /***/ (function(module, exports, __webpack_require__) {
  54858. /**
  54859. * @author Richard Davey <rich@photonstorm.com>
  54860. * @copyright 2019 Photon Storm Ltd.
  54861. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  54862. */
  54863. /**
  54864. * @namespace Phaser.Physics.Arcade.Components
  54865. */
  54866. module.exports = {
  54867. Acceleration: __webpack_require__(575),
  54868. Angular: __webpack_require__(574),
  54869. Bounce: __webpack_require__(573),
  54870. Debug: __webpack_require__(572),
  54871. Drag: __webpack_require__(571),
  54872. Enable: __webpack_require__(570),
  54873. Friction: __webpack_require__(569),
  54874. Gravity: __webpack_require__(568),
  54875. Immovable: __webpack_require__(567),
  54876. Mass: __webpack_require__(566),
  54877. Size: __webpack_require__(565),
  54878. Velocity: __webpack_require__(564)
  54879. };
  54880. /***/ }),
  54881. /* 254 */
  54882. /***/ (function(module, exports, __webpack_require__) {
  54883. /**
  54884. * @author Richard Davey <rich@photonstorm.com>
  54885. * @copyright 2019 Photon Storm Ltd.
  54886. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  54887. */
  54888. var Class = __webpack_require__(0);
  54889. var Components = __webpack_require__(253);
  54890. var Image = __webpack_require__(93);
  54891. /**
  54892. * @classdesc
  54893. * An Arcade Physics Image is an Image with an Arcade Physics body and related components.
  54894. * The body can be dynamic or static.
  54895. *
  54896. * The main difference between an Arcade Image and an Arcade Sprite is that you cannot animate an Arcade Image.
  54897. *
  54898. * @class Image
  54899. * @extends Phaser.GameObjects.Image
  54900. * @memberof Phaser.Physics.Arcade
  54901. * @constructor
  54902. * @since 3.0.0
  54903. *
  54904. * @extends Phaser.Physics.Arcade.Components.Acceleration
  54905. * @extends Phaser.Physics.Arcade.Components.Angular
  54906. * @extends Phaser.Physics.Arcade.Components.Bounce
  54907. * @extends Phaser.Physics.Arcade.Components.Debug
  54908. * @extends Phaser.Physics.Arcade.Components.Drag
  54909. * @extends Phaser.Physics.Arcade.Components.Enable
  54910. * @extends Phaser.Physics.Arcade.Components.Friction
  54911. * @extends Phaser.Physics.Arcade.Components.Gravity
  54912. * @extends Phaser.Physics.Arcade.Components.Immovable
  54913. * @extends Phaser.Physics.Arcade.Components.Mass
  54914. * @extends Phaser.Physics.Arcade.Components.Size
  54915. * @extends Phaser.Physics.Arcade.Components.Velocity
  54916. * @extends Phaser.GameObjects.Components.Alpha
  54917. * @extends Phaser.GameObjects.Components.BlendMode
  54918. * @extends Phaser.GameObjects.Components.Depth
  54919. * @extends Phaser.GameObjects.Components.Flip
  54920. * @extends Phaser.GameObjects.Components.GetBounds
  54921. * @extends Phaser.GameObjects.Components.Origin
  54922. * @extends Phaser.GameObjects.Components.Pipeline
  54923. * @extends Phaser.GameObjects.Components.ScaleMode
  54924. * @extends Phaser.GameObjects.Components.ScrollFactor
  54925. * @extends Phaser.GameObjects.Components.Size
  54926. * @extends Phaser.GameObjects.Components.Texture
  54927. * @extends Phaser.GameObjects.Components.Tint
  54928. * @extends Phaser.GameObjects.Components.Transform
  54929. * @extends Phaser.GameObjects.Components.Visible
  54930. *
  54931. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  54932. * @param {number} x - The horizontal position of this Game Object in the world.
  54933. * @param {number} y - The vertical position of this Game Object in the world.
  54934. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  54935. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  54936. */
  54937. var ArcadeImage = new Class({
  54938. Extends: Image,
  54939. Mixins: [
  54940. Components.Acceleration,
  54941. Components.Angular,
  54942. Components.Bounce,
  54943. Components.Debug,
  54944. Components.Drag,
  54945. Components.Enable,
  54946. Components.Friction,
  54947. Components.Gravity,
  54948. Components.Immovable,
  54949. Components.Mass,
  54950. Components.Size,
  54951. Components.Velocity
  54952. ],
  54953. initialize:
  54954. function ArcadeImage (scene, x, y, texture, frame)
  54955. {
  54956. Image.call(this, scene, x, y, texture, frame);
  54957. /**
  54958. * This Game Object's Physics Body.
  54959. *
  54960. * @name Phaser.Physics.Arcade.Image#body
  54961. * @type {?(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)}
  54962. * @default null
  54963. * @since 3.0.0
  54964. */
  54965. this.body = null;
  54966. }
  54967. });
  54968. module.exports = ArcadeImage;
  54969. /***/ }),
  54970. /* 255 */
  54971. /***/ (function(module, exports, __webpack_require__) {
  54972. /**
  54973. * @author Richard Davey <rich@photonstorm.com>
  54974. * @copyright 2019 Photon Storm Ltd.
  54975. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  54976. */
  54977. var ArcadeImage = __webpack_require__(254);
  54978. var ArcadeSprite = __webpack_require__(111);
  54979. var Class = __webpack_require__(0);
  54980. var CONST = __webpack_require__(38);
  54981. var PhysicsGroup = __webpack_require__(252);
  54982. var StaticPhysicsGroup = __webpack_require__(251);
  54983. /**
  54984. * @classdesc
  54985. * The Arcade Physics Factory allows you to easily create Arcade Physics enabled Game Objects.
  54986. * Objects that are created by this Factory are automatically added to the physics world.
  54987. *
  54988. * @class Factory
  54989. * @memberof Phaser.Physics.Arcade
  54990. * @constructor
  54991. * @since 3.0.0
  54992. *
  54993. * @param {Phaser.Physics.Arcade.World} world - The Arcade Physics World instance.
  54994. */
  54995. var Factory = new Class({
  54996. initialize:
  54997. function Factory (world)
  54998. {
  54999. /**
  55000. * A reference to the Arcade Physics World.
  55001. *
  55002. * @name Phaser.Physics.Arcade.Factory#world
  55003. * @type {Phaser.Physics.Arcade.World}
  55004. * @since 3.0.0
  55005. */
  55006. this.world = world;
  55007. /**
  55008. * A reference to the Scene this Arcade Physics instance belongs to.
  55009. *
  55010. * @name Phaser.Physics.Arcade.Factory#scene
  55011. * @type {Phaser.Scene}
  55012. * @since 3.0.0
  55013. */
  55014. this.scene = world.scene;
  55015. /**
  55016. * A reference to the Scene.Systems this Arcade Physics instance belongs to.
  55017. *
  55018. * @name Phaser.Physics.Arcade.Factory#sys
  55019. * @type {Phaser.Scenes.Systems}
  55020. * @since 3.0.0
  55021. */
  55022. this.sys = world.scene.sys;
  55023. },
  55024. /**
  55025. * Creates a new Arcade Physics Collider object.
  55026. *
  55027. * @method Phaser.Physics.Arcade.Factory#collider
  55028. * @since 3.0.0
  55029. *
  55030. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object1 - The first object to check for collision.
  55031. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object2 - The second object to check for collision.
  55032. * @param {ArcadePhysicsCallback} [collideCallback] - The callback to invoke when the two objects collide.
  55033. * @param {ArcadePhysicsCallback} [processCallback] - The callback to invoke when the two objects collide. Must return a boolean.
  55034. * @param {*} [callbackContext] - The scope in which to call the callbacks.
  55035. *
  55036. * @return {Phaser.Physics.Arcade.Collider} The Collider that was created.
  55037. */
  55038. collider: function (object1, object2, collideCallback, processCallback, callbackContext)
  55039. {
  55040. return this.world.addCollider(object1, object2, collideCallback, processCallback, callbackContext);
  55041. },
  55042. /**
  55043. * Creates a new Arcade Physics Collider Overlap object.
  55044. *
  55045. * @method Phaser.Physics.Arcade.Factory#overlap
  55046. * @since 3.0.0
  55047. *
  55048. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object1 - The first object to check for overlap.
  55049. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object2 - The second object to check for overlap.
  55050. * @param {ArcadePhysicsCallback} [collideCallback] - The callback to invoke when the two objects collide.
  55051. * @param {ArcadePhysicsCallback} [processCallback] - The callback to invoke when the two objects collide. Must return a boolean.
  55052. * @param {*} [callbackContext] - The scope in which to call the callbacks.
  55053. *
  55054. * @return {Phaser.Physics.Arcade.Collider} The Collider that was created.
  55055. */
  55056. overlap: function (object1, object2, collideCallback, processCallback, callbackContext)
  55057. {
  55058. return this.world.addOverlap(object1, object2, collideCallback, processCallback, callbackContext);
  55059. },
  55060. /**
  55061. * Adds an Arcade Physics Body to the given Game Object.
  55062. *
  55063. * @method Phaser.Physics.Arcade.Factory#existing
  55064. * @since 3.0.0
  55065. *
  55066. * @param {Phaser.GameObjects.GameObject} gameObject - A Game Object.
  55067. * @param {boolean} [isStatic=false] - Create a Static body (true) or Dynamic body (false).
  55068. *
  55069. * @return {Phaser.GameObjects.GameObject} The Game Object.
  55070. */
  55071. existing: function (gameObject, isStatic)
  55072. {
  55073. var type = (isStatic) ? CONST.STATIC_BODY : CONST.DYNAMIC_BODY;
  55074. this.world.enableBody(gameObject, type);
  55075. return gameObject;
  55076. },
  55077. /**
  55078. * Creates a new Arcade Image object with a Static body.
  55079. *
  55080. * @method Phaser.Physics.Arcade.Factory#staticImage
  55081. * @since 3.0.0
  55082. *
  55083. * @param {number} x - The horizontal position of this Game Object in the world.
  55084. * @param {number} y - The vertical position of this Game Object in the world.
  55085. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  55086. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  55087. *
  55088. * @return {Phaser.Physics.Arcade.Image} The Image object that was created.
  55089. */
  55090. staticImage: function (x, y, key, frame)
  55091. {
  55092. var image = new ArcadeImage(this.scene, x, y, key, frame);
  55093. this.sys.displayList.add(image);
  55094. this.world.enableBody(image, CONST.STATIC_BODY);
  55095. return image;
  55096. },
  55097. /**
  55098. * Creates a new Arcade Image object with a Dynamic body.
  55099. *
  55100. * @method Phaser.Physics.Arcade.Factory#image
  55101. * @since 3.0.0
  55102. *
  55103. * @param {number} x - The horizontal position of this Game Object in the world.
  55104. * @param {number} y - The vertical position of this Game Object in the world.
  55105. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  55106. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  55107. *
  55108. * @return {Phaser.Physics.Arcade.Image} The Image object that was created.
  55109. */
  55110. image: function (x, y, key, frame)
  55111. {
  55112. var image = new ArcadeImage(this.scene, x, y, key, frame);
  55113. this.sys.displayList.add(image);
  55114. this.world.enableBody(image, CONST.DYNAMIC_BODY);
  55115. return image;
  55116. },
  55117. /**
  55118. * Creates a new Arcade Sprite object with a Static body.
  55119. *
  55120. * @method Phaser.Physics.Arcade.Factory#staticSprite
  55121. * @since 3.0.0
  55122. *
  55123. * @param {number} x - The horizontal position of this Game Object in the world.
  55124. * @param {number} y - The vertical position of this Game Object in the world.
  55125. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  55126. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  55127. *
  55128. * @return {Phaser.Physics.Arcade.Sprite} The Sprite object that was created.
  55129. */
  55130. staticSprite: function (x, y, key, frame)
  55131. {
  55132. var sprite = new ArcadeSprite(this.scene, x, y, key, frame);
  55133. this.sys.displayList.add(sprite);
  55134. this.sys.updateList.add(sprite);
  55135. this.world.enableBody(sprite, CONST.STATIC_BODY);
  55136. return sprite;
  55137. },
  55138. /**
  55139. * Creates a new Arcade Sprite object with a Dynamic body.
  55140. *
  55141. * @method Phaser.Physics.Arcade.Factory#sprite
  55142. * @since 3.0.0
  55143. *
  55144. * @param {number} x - The horizontal position of this Game Object in the world.
  55145. * @param {number} y - The vertical position of this Game Object in the world.
  55146. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  55147. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  55148. *
  55149. * @return {Phaser.Physics.Arcade.Sprite} The Sprite object that was created.
  55150. */
  55151. sprite: function (x, y, key, frame)
  55152. {
  55153. var sprite = new ArcadeSprite(this.scene, x, y, key, frame);
  55154. this.sys.displayList.add(sprite);
  55155. this.sys.updateList.add(sprite);
  55156. this.world.enableBody(sprite, CONST.DYNAMIC_BODY);
  55157. return sprite;
  55158. },
  55159. /**
  55160. * Creates a Static Physics Group object.
  55161. * All Game Objects created by this Group will automatically be static Arcade Physics objects.
  55162. *
  55163. * @method Phaser.Physics.Arcade.Factory#staticGroup
  55164. * @since 3.0.0
  55165. *
  55166. * @param {(Phaser.GameObjects.GameObject[]|GroupConfig|GroupCreateConfig)} [children] - Game Objects to add to this group; or the `config` argument.
  55167. * @param {GroupConfig|GroupCreateConfig} [config] - Settings for this group.
  55168. *
  55169. * @return {Phaser.Physics.Arcade.StaticGroup} The Static Group object that was created.
  55170. */
  55171. staticGroup: function (children, config)
  55172. {
  55173. return this.sys.updateList.add(new StaticPhysicsGroup(this.world, this.world.scene, children, config));
  55174. },
  55175. /**
  55176. * Creates a Physics Group object.
  55177. * All Game Objects created by this Group will automatically be dynamic Arcade Physics objects.
  55178. *
  55179. * @method Phaser.Physics.Arcade.Factory#group
  55180. * @since 3.0.0
  55181. *
  55182. * @param {(Phaser.GameObjects.GameObject[]|PhysicsGroupConfig|GroupCreateConfig)} [children] - Game Objects to add to this group; or the `config` argument.
  55183. * @param {PhysicsGroupConfig|GroupCreateConfig} [config] - Settings for this group.
  55184. *
  55185. * @return {Phaser.Physics.Arcade.Group} The Group object that was created.
  55186. */
  55187. group: function (children, config)
  55188. {
  55189. return this.sys.updateList.add(new PhysicsGroup(this.world, this.world.scene, children, config));
  55190. },
  55191. /**
  55192. * Destroys this Factory.
  55193. *
  55194. * @method Phaser.Physics.Arcade.Factory#destroy
  55195. * @since 3.5.0
  55196. */
  55197. destroy: function ()
  55198. {
  55199. this.world = null;
  55200. this.scene = null;
  55201. this.sys = null;
  55202. }
  55203. });
  55204. module.exports = Factory;
  55205. /***/ }),
  55206. /* 256 */
  55207. /***/ (function(module, exports, __webpack_require__) {
  55208. /**
  55209. * @author Richard Davey <rich@photonstorm.com>
  55210. * @copyright 2019 Photon Storm Ltd.
  55211. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  55212. */
  55213. var Class = __webpack_require__(0);
  55214. var CONST = __webpack_require__(15);
  55215. var File = __webpack_require__(22);
  55216. var FileTypesManager = __webpack_require__(7);
  55217. var GetFastValue = __webpack_require__(2);
  55218. var IsPlainObject = __webpack_require__(8);
  55219. /**
  55220. * @typedef {object} Phaser.Loader.FileTypes.TextFileConfig
  55221. *
  55222. * @property {string} key - The key of the file. Must be unique within both the Loader and the Text Cache.
  55223. * @property {string} [url] - The absolute or relative URL to load the file from.
  55224. * @property {string} [extension='txt'] - The default file extension to use if no url is provided.
  55225. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  55226. */
  55227. /**
  55228. * @classdesc
  55229. * A single Text File suitable for loading by the Loader.
  55230. *
  55231. * These are created when you use the Phaser.Loader.LoaderPlugin#text method and are not typically created directly.
  55232. *
  55233. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#text.
  55234. *
  55235. * @class TextFile
  55236. * @extends Phaser.Loader.File
  55237. * @memberof Phaser.Loader.FileTypes
  55238. * @constructor
  55239. * @since 3.0.0
  55240. *
  55241. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  55242. * @param {(string|Phaser.Loader.FileTypes.TextFileConfig)} key - The key to use for this file, or a file configuration object.
  55243. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt".
  55244. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  55245. */
  55246. var TextFile = new Class({
  55247. Extends: File,
  55248. initialize:
  55249. function TextFile (loader, key, url, xhrSettings)
  55250. {
  55251. var extension = 'txt';
  55252. if (IsPlainObject(key))
  55253. {
  55254. var config = key;
  55255. key = GetFastValue(config, 'key');
  55256. url = GetFastValue(config, 'url');
  55257. xhrSettings = GetFastValue(config, 'xhrSettings');
  55258. extension = GetFastValue(config, 'extension', extension);
  55259. }
  55260. var fileConfig = {
  55261. type: 'text',
  55262. cache: loader.cacheManager.text,
  55263. extension: extension,
  55264. responseType: 'text',
  55265. key: key,
  55266. url: url,
  55267. xhrSettings: xhrSettings
  55268. };
  55269. File.call(this, loader, fileConfig);
  55270. },
  55271. /**
  55272. * Called automatically by Loader.nextFile.
  55273. * This method controls what extra work this File does with its loaded data.
  55274. *
  55275. * @method Phaser.Loader.FileTypes.TextFile#onProcess
  55276. * @since 3.7.0
  55277. */
  55278. onProcess: function ()
  55279. {
  55280. this.state = CONST.FILE_PROCESSING;
  55281. this.data = this.xhrLoader.responseText;
  55282. this.onProcessComplete();
  55283. }
  55284. });
  55285. /**
  55286. * Adds a Text file, or array of Text files, to the current load queue.
  55287. *
  55288. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  55289. *
  55290. * ```javascript
  55291. * function preload ()
  55292. * {
  55293. * this.load.text('story', 'files/IntroStory.txt');
  55294. * }
  55295. * ```
  55296. *
  55297. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  55298. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  55299. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  55300. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  55301. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  55302. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  55303. * loaded.
  55304. *
  55305. * The key must be a unique String. It is used to add the file to the global Text Cache upon a successful load.
  55306. * The key should be unique both in terms of files being loaded and files already present in the Text Cache.
  55307. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  55308. * then remove it from the Text Cache first, before loading a new one.
  55309. *
  55310. * Instead of passing arguments you can pass a configuration object, such as:
  55311. *
  55312. * ```javascript
  55313. * this.load.text({
  55314. * key: 'story',
  55315. * url: 'files/IntroStory.txt'
  55316. * });
  55317. * ```
  55318. *
  55319. * See the documentation for `Phaser.Loader.FileTypes.TextFileConfig` for more details.
  55320. *
  55321. * Once the file has finished loading you can access it from its Cache using its key:
  55322. *
  55323. * ```javascript
  55324. * this.load.text('story', 'files/IntroStory.txt');
  55325. * // and later in your game ...
  55326. * var data = this.cache.text.get('story');
  55327. * ```
  55328. *
  55329. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  55330. * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and
  55331. * this is what you would use to retrieve the text from the Text Cache.
  55332. *
  55333. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  55334. *
  55335. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story"
  55336. * and no URL is given then the Loader will set the URL to be "story.txt". It will always add `.txt` as the extension, although
  55337. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  55338. *
  55339. * Note: The ability to load this type of file will only be available if the Text File type has been built into Phaser.
  55340. * It is available in the default build but can be excluded from custom builds.
  55341. *
  55342. * @method Phaser.Loader.LoaderPlugin#text
  55343. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  55344. * @since 3.0.0
  55345. *
  55346. * @param {(string|Phaser.Loader.FileTypes.TextFileConfig|Phaser.Loader.FileTypes.TextFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  55347. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt".
  55348. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  55349. *
  55350. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  55351. */
  55352. FileTypesManager.register('text', function (key, url, xhrSettings)
  55353. {
  55354. if (Array.isArray(key))
  55355. {
  55356. for (var i = 0; i < key.length; i++)
  55357. {
  55358. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  55359. this.addFile(new TextFile(this, key[i]));
  55360. }
  55361. }
  55362. else
  55363. {
  55364. this.addFile(new TextFile(this, key, url, xhrSettings));
  55365. }
  55366. return this;
  55367. });
  55368. module.exports = TextFile;
  55369. /***/ }),
  55370. /* 257 */
  55371. /***/ (function(module, exports, __webpack_require__) {
  55372. /**
  55373. * @author Richard Davey <rich@photonstorm.com>
  55374. * @copyright 2019 Photon Storm Ltd.
  55375. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  55376. */
  55377. var Class = __webpack_require__(0);
  55378. var Events = __webpack_require__(75);
  55379. var File = __webpack_require__(22);
  55380. var GetFastValue = __webpack_require__(2);
  55381. var GetURL = __webpack_require__(152);
  55382. var IsPlainObject = __webpack_require__(8);
  55383. /**
  55384. * @classdesc
  55385. * A single Audio File suitable for loading by the Loader.
  55386. *
  55387. * These are created when you use the Phaser.Loader.LoaderPlugin#audio method and are not typically created directly.
  55388. *
  55389. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audio.
  55390. *
  55391. * @class HTML5AudioFile
  55392. * @extends Phaser.Loader.File
  55393. * @memberof Phaser.Loader.FileTypes
  55394. * @constructor
  55395. * @since 3.0.0
  55396. *
  55397. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  55398. * @param {(string|Phaser.Loader.FileTypes.AudioFileConfig)} key - The key to use for this file, or a file configuration object.
  55399. * @param {string} [urlConfig] - The absolute or relative URL to load this file from.
  55400. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  55401. */
  55402. var HTML5AudioFile = new Class({
  55403. Extends: File,
  55404. initialize:
  55405. function HTML5AudioFile (loader, key, urlConfig, audioConfig)
  55406. {
  55407. if (IsPlainObject(key))
  55408. {
  55409. var config = key;
  55410. key = GetFastValue(config, 'key');
  55411. audioConfig = GetFastValue(config, 'config', audioConfig);
  55412. }
  55413. var fileConfig = {
  55414. type: 'audio',
  55415. cache: loader.cacheManager.audio,
  55416. extension: urlConfig.type,
  55417. key: key,
  55418. url: urlConfig.url,
  55419. config: audioConfig
  55420. };
  55421. File.call(this, loader, fileConfig);
  55422. // New properties specific to this class
  55423. this.locked = 'ontouchstart' in window;
  55424. this.loaded = false;
  55425. this.filesLoaded = 0;
  55426. this.filesTotal = 0;
  55427. },
  55428. /**
  55429. * Called when the file finishes loading.
  55430. *
  55431. * @method Phaser.Loader.FileTypes.HTML5AudioFile#onLoad
  55432. * @since 3.0.0
  55433. */
  55434. onLoad: function ()
  55435. {
  55436. if (this.loaded)
  55437. {
  55438. return;
  55439. }
  55440. this.loaded = true;
  55441. this.loader.nextFile(this, true);
  55442. },
  55443. /**
  55444. * Called if the file errors while loading.
  55445. *
  55446. * @method Phaser.Loader.FileTypes.HTML5AudioFile#onError
  55447. * @since 3.0.0
  55448. */
  55449. onError: function ()
  55450. {
  55451. for (var i = 0; i < this.data.length; i++)
  55452. {
  55453. var audio = this.data[i];
  55454. audio.oncanplaythrough = null;
  55455. audio.onerror = null;
  55456. }
  55457. this.loader.nextFile(this, false);
  55458. },
  55459. /**
  55460. * Called during the file load progress. Is sent a DOM ProgressEvent.
  55461. *
  55462. * @method Phaser.Loader.FileTypes.HTML5AudioFile#onProgress
  55463. * @fires Phaser.Loader.Events#FILE_PROGRESS
  55464. * @since 3.0.0
  55465. */
  55466. onProgress: function (event)
  55467. {
  55468. var audio = event.target;
  55469. audio.oncanplaythrough = null;
  55470. audio.onerror = null;
  55471. this.filesLoaded++;
  55472. this.percentComplete = Math.min((this.filesLoaded / this.filesTotal), 1);
  55473. this.loader.emit(Events.FILE_PROGRESS, this, this.percentComplete);
  55474. if (this.filesLoaded === this.filesTotal)
  55475. {
  55476. this.onLoad();
  55477. }
  55478. },
  55479. /**
  55480. * Called by the Loader, starts the actual file downloading.
  55481. * During the load the methods onLoad, onError and onProgress are called, based on the XHR events.
  55482. * You shouldn't normally call this method directly, it's meant to be invoked by the Loader.
  55483. *
  55484. * @method Phaser.Loader.FileTypes.HTML5AudioFile#load
  55485. * @since 3.0.0
  55486. */
  55487. load: function ()
  55488. {
  55489. this.data = [];
  55490. var instances = (this.config && this.config.instances) || 1;
  55491. this.filesTotal = instances;
  55492. this.filesLoaded = 0;
  55493. this.percentComplete = 0;
  55494. for (var i = 0; i < instances; i++)
  55495. {
  55496. var audio = new Audio();
  55497. audio.dataset.name = this.key + ('0' + i).slice(-2);
  55498. audio.dataset.used = 'false';
  55499. if (this.locked)
  55500. {
  55501. audio.dataset.locked = 'true';
  55502. }
  55503. else
  55504. {
  55505. audio.dataset.locked = 'false';
  55506. audio.preload = 'auto';
  55507. audio.oncanplaythrough = this.onProgress.bind(this);
  55508. audio.onerror = this.onError.bind(this);
  55509. }
  55510. this.data.push(audio);
  55511. }
  55512. for (i = 0; i < this.data.length; i++)
  55513. {
  55514. audio = this.data[i];
  55515. audio.src = GetURL(this, this.loader.baseURL);
  55516. if (!this.locked)
  55517. {
  55518. audio.load();
  55519. }
  55520. }
  55521. if (this.locked)
  55522. {
  55523. // This is super-dangerous but works. Race condition potential high.
  55524. // Is there another way?
  55525. setTimeout(this.onLoad.bind(this));
  55526. }
  55527. }
  55528. });
  55529. module.exports = HTML5AudioFile;
  55530. /***/ }),
  55531. /* 258 */
  55532. /***/ (function(module, exports, __webpack_require__) {
  55533. /**
  55534. * @author Richard Davey <rich@photonstorm.com>
  55535. * @copyright 2019 Photon Storm Ltd.
  55536. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  55537. */
  55538. var Class = __webpack_require__(0);
  55539. var CONST = __webpack_require__(28);
  55540. var File = __webpack_require__(22);
  55541. var FileTypesManager = __webpack_require__(7);
  55542. var GetFastValue = __webpack_require__(2);
  55543. var HTML5AudioFile = __webpack_require__(257);
  55544. var IsPlainObject = __webpack_require__(8);
  55545. /**
  55546. * @typedef {object} Phaser.Loader.FileTypes.AudioFileConfig
  55547. *
  55548. * @property {string} key - The key of the file. Must be unique within the Loader and Audio Cache.
  55549. * @property {string} [urlConfig] - The absolute or relative URL to load the file from.
  55550. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  55551. * @property {AudioContext} [audioContext] - The AudioContext this file will use to process itself.
  55552. */
  55553. /**
  55554. * @classdesc
  55555. * A single Audio File suitable for loading by the Loader.
  55556. *
  55557. * These are created when you use the Phaser.Loader.LoaderPlugin#audio method and are not typically created directly.
  55558. *
  55559. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audio.
  55560. *
  55561. * @class AudioFile
  55562. * @extends Phaser.Loader.File
  55563. * @memberof Phaser.Loader.FileTypes
  55564. * @constructor
  55565. * @since 3.0.0
  55566. *
  55567. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  55568. * @param {(string|Phaser.Loader.FileTypes.AudioFileConfig)} key - The key to use for this file, or a file configuration object.
  55569. * @param {any} [urlConfig] - The absolute or relative URL to load this file from in a config object.
  55570. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  55571. * @param {AudioContext} [audioContext] - The AudioContext this file will use to process itself.
  55572. */
  55573. var AudioFile = new Class({
  55574. Extends: File,
  55575. initialize:
  55576. // URL is an object created by AudioFile.findAudioURL
  55577. function AudioFile (loader, key, urlConfig, xhrSettings, audioContext)
  55578. {
  55579. if (IsPlainObject(key))
  55580. {
  55581. var config = key;
  55582. key = GetFastValue(config, 'key');
  55583. xhrSettings = GetFastValue(config, 'xhrSettings');
  55584. audioContext = GetFastValue(config, 'context', audioContext);
  55585. }
  55586. var fileConfig = {
  55587. type: 'audio',
  55588. cache: loader.cacheManager.audio,
  55589. extension: urlConfig.type,
  55590. responseType: 'arraybuffer',
  55591. key: key,
  55592. url: urlConfig.url,
  55593. xhrSettings: xhrSettings,
  55594. config: { context: audioContext }
  55595. };
  55596. File.call(this, loader, fileConfig);
  55597. },
  55598. /**
  55599. * Called automatically by Loader.nextFile.
  55600. * This method controls what extra work this File does with its loaded data.
  55601. *
  55602. * @method Phaser.Loader.FileTypes.AudioFile#onProcess
  55603. * @since 3.0.0
  55604. */
  55605. onProcess: function ()
  55606. {
  55607. this.state = CONST.FILE_PROCESSING;
  55608. var _this = this;
  55609. // interesting read https://github.com/WebAudio/web-audio-api/issues/1305
  55610. this.config.context.decodeAudioData(this.xhrLoader.response,
  55611. function (audioBuffer)
  55612. {
  55613. _this.data = audioBuffer;
  55614. _this.onProcessComplete();
  55615. },
  55616. function (e)
  55617. {
  55618. // eslint-disable-next-line no-console
  55619. console.error('Error decoding audio: ' + this.key + ' - ', e ? e.message : null);
  55620. _this.onProcessError();
  55621. }
  55622. );
  55623. this.config.context = null;
  55624. }
  55625. });
  55626. AudioFile.create = function (loader, key, urls, config, xhrSettings)
  55627. {
  55628. var game = loader.systems.game;
  55629. var audioConfig = game.config.audio;
  55630. var deviceAudio = game.device.audio;
  55631. // url may be inside key, which may be an object
  55632. if (IsPlainObject(key))
  55633. {
  55634. urls = GetFastValue(key, 'url', []);
  55635. config = GetFastValue(key, 'config', {});
  55636. }
  55637. var urlConfig = AudioFile.getAudioURL(game, urls);
  55638. if (!urlConfig)
  55639. {
  55640. return null;
  55641. }
  55642. // https://developers.google.com/web/updates/2012/02/HTML5-audio-and-the-Web-Audio-API-are-BFFs
  55643. // var stream = GetFastValue(config, 'stream', false);
  55644. if (deviceAudio.webAudio && !(audioConfig && audioConfig.disableWebAudio))
  55645. {
  55646. return new AudioFile(loader, key, urlConfig, xhrSettings, game.sound.context);
  55647. }
  55648. else
  55649. {
  55650. return new HTML5AudioFile(loader, key, urlConfig, config);
  55651. }
  55652. };
  55653. AudioFile.getAudioURL = function (game, urls)
  55654. {
  55655. if (!Array.isArray(urls))
  55656. {
  55657. urls = [ urls ];
  55658. }
  55659. for (var i = 0; i < urls.length; i++)
  55660. {
  55661. var url = GetFastValue(urls[i], 'url', urls[i]);
  55662. if (url.indexOf('blob:') === 0 || url.indexOf('data:') === 0)
  55663. {
  55664. return url;
  55665. }
  55666. var audioType = url.match(/\.([a-zA-Z0-9]+)($|\?)/);
  55667. audioType = GetFastValue(urls[i], 'type', (audioType) ? audioType[1] : '').toLowerCase();
  55668. if (game.device.audio[audioType])
  55669. {
  55670. return {
  55671. url: url,
  55672. type: audioType
  55673. };
  55674. }
  55675. }
  55676. return null;
  55677. };
  55678. /**
  55679. * Adds an Audio or HTML5Audio file, or array of audio files, to the current load queue.
  55680. *
  55681. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  55682. *
  55683. * ```javascript
  55684. * function preload ()
  55685. * {
  55686. * this.load.audio('title', [ 'music/Title.ogg', 'music/Title.mp3', 'music/Title.m4a' ]);
  55687. * }
  55688. * ```
  55689. *
  55690. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  55691. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  55692. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  55693. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  55694. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  55695. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  55696. * loaded.
  55697. *
  55698. * The key must be a unique String. It is used to add the file to the global Audio Cache upon a successful load.
  55699. * The key should be unique both in terms of files being loaded and files already present in the Audio Cache.
  55700. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  55701. * then remove it from the Audio Cache first, before loading a new one.
  55702. *
  55703. * Instead of passing arguments you can pass a configuration object, such as:
  55704. *
  55705. * ```javascript
  55706. * this.load.audio({
  55707. * key: 'title',
  55708. * url: [ 'music/Title.ogg', 'music/Title.mp3', 'music/Title.m4a' ]
  55709. * });
  55710. * ```
  55711. *
  55712. * See the documentation for `Phaser.Loader.FileTypes.AudioFileConfig` for more details.
  55713. *
  55714. * The URLs can be relative or absolute. If the URLs are relative the `Loader.baseURL` and `Loader.path` values will be prepended to them.
  55715. *
  55716. * Due to different browsers supporting different audio file types you should usually provide your audio files in a variety of formats.
  55717. * ogg, mp3 and m4a are the most common. If you provide an array of URLs then the Loader will determine which _one_ file to load based on
  55718. * browser support.
  55719. *
  55720. * If audio has been disabled in your game, either via the game config, or lack of support from the device, then no audio will be loaded.
  55721. *
  55722. * Note: The ability to load this type of file will only be available if the Audio File type has been built into Phaser.
  55723. * It is available in the default build but can be excluded from custom builds.
  55724. *
  55725. * @method Phaser.Loader.LoaderPlugin#audio
  55726. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  55727. * @since 3.0.0
  55728. *
  55729. * @param {(string|Phaser.Loader.FileTypes.AudioFileConfig|Phaser.Loader.FileTypes.AudioFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  55730. * @param {(string|string[])} [urls] - The absolute or relative URL to load the audio files from.
  55731. * @param {any} [config] - An object containing an `instances` property for HTML5Audio. Defaults to 1.
  55732. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  55733. *
  55734. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  55735. */
  55736. FileTypesManager.register('audio', function (key, urls, config, xhrSettings)
  55737. {
  55738. var game = this.systems.game;
  55739. var audioConfig = game.config.audio;
  55740. var deviceAudio = game.device.audio;
  55741. if ((audioConfig && audioConfig.noAudio) || (!deviceAudio.webAudio && !deviceAudio.audioData))
  55742. {
  55743. // Sounds are disabled, so skip loading audio
  55744. return this;
  55745. }
  55746. var audioFile;
  55747. if (Array.isArray(key))
  55748. {
  55749. for (var i = 0; i < key.length; i++)
  55750. {
  55751. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  55752. audioFile = AudioFile.create(this, key[i]);
  55753. if (audioFile)
  55754. {
  55755. this.addFile(audioFile);
  55756. }
  55757. }
  55758. }
  55759. else
  55760. {
  55761. audioFile = AudioFile.create(this, key, urls, config, xhrSettings);
  55762. if (audioFile)
  55763. {
  55764. this.addFile(audioFile);
  55765. }
  55766. }
  55767. return this;
  55768. });
  55769. module.exports = AudioFile;
  55770. /***/ }),
  55771. /* 259 */
  55772. /***/ (function(module, exports, __webpack_require__) {
  55773. /**
  55774. * @author Richard Davey <rich@photonstorm.com>
  55775. * @copyright 2019 Photon Storm Ltd.
  55776. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  55777. */
  55778. var MergeXHRSettings = __webpack_require__(151);
  55779. /**
  55780. * Creates a new XMLHttpRequest (xhr) object based on the given File and XHRSettings
  55781. * and starts the download of it. It uses the Files own XHRSettings and merges them
  55782. * with the global XHRSettings object to set the xhr values before download.
  55783. *
  55784. * @function Phaser.Loader.XHRLoader
  55785. * @since 3.0.0
  55786. *
  55787. * @param {Phaser.Loader.File} file - The File to download.
  55788. * @param {XHRSettingsObject} globalXHRSettings - The global XHRSettings object.
  55789. *
  55790. * @return {XMLHttpRequest} The XHR object.
  55791. */
  55792. var XHRLoader = function (file, globalXHRSettings)
  55793. {
  55794. var config = MergeXHRSettings(globalXHRSettings, file.xhrSettings);
  55795. var xhr = new XMLHttpRequest();
  55796. xhr.open('GET', file.src, config.async, config.user, config.password);
  55797. xhr.responseType = file.xhrSettings.responseType;
  55798. xhr.timeout = config.timeout;
  55799. if (config.header && config.headerValue)
  55800. {
  55801. xhr.setRequestHeader(config.header, config.headerValue);
  55802. }
  55803. if (config.requestedWith)
  55804. {
  55805. xhr.setRequestHeader('X-Requested-With', config.requestedWith);
  55806. }
  55807. if (config.overrideMimeType)
  55808. {
  55809. xhr.overrideMimeType(config.overrideMimeType);
  55810. }
  55811. // After a successful request, the xhr.response property will contain the requested data as a DOMString, ArrayBuffer, Blob, or Document (depending on what was set for responseType.)
  55812. xhr.onload = file.onLoad.bind(file, xhr);
  55813. xhr.onerror = file.onError.bind(file, xhr);
  55814. xhr.onprogress = file.onProgress.bind(file);
  55815. // This is the only standard method, the ones above are browser additions (maybe not universal?)
  55816. // xhr.onreadystatechange
  55817. xhr.send();
  55818. return xhr;
  55819. };
  55820. module.exports = XHRLoader;
  55821. /***/ }),
  55822. /* 260 */
  55823. /***/ (function(module, exports, __webpack_require__) {
  55824. /**
  55825. * @author Richard Davey <rich@photonstorm.com>
  55826. * @copyright 2019 Photon Storm Ltd.
  55827. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  55828. */
  55829. var Class = __webpack_require__(0);
  55830. var Events = __webpack_require__(113);
  55831. var GetFastValue = __webpack_require__(2);
  55832. var ProcessKeyCombo = __webpack_require__(611);
  55833. var ResetKeyCombo = __webpack_require__(609);
  55834. /**
  55835. * @callback KeyboardKeydownCallback
  55836. *
  55837. * @param {KeyboardEvent} event - The Keyboard Event.
  55838. */
  55839. /**
  55840. * @typedef {object} KeyComboConfig
  55841. *
  55842. * @property {boolean} [resetOnWrongKey=true] - If they press the wrong key do we reset the combo?
  55843. * @property {number} [maxKeyDelay=0] - The max delay in ms between each key press. Above this the combo is reset. 0 means disabled.
  55844. * @property {boolean} [resetOnMatch=false] - If previously matched and they press the first key of the combo again, will it reset?
  55845. * @property {boolean} [deleteOnMatch=false] - If the combo matches, will it delete itself?
  55846. */
  55847. /**
  55848. * @classdesc
  55849. * A KeyCombo will listen for a specific string of keys from the Keyboard, and when it receives them
  55850. * it will emit a `keycombomatch` event from the Keyboard Manager.
  55851. *
  55852. * The keys to be listened for can be defined as:
  55853. *
  55854. * A string (i.e. 'ATARI')
  55855. * An array of either integers (key codes) or strings, or a mixture of both
  55856. * An array of objects (such as Key objects) with a public 'keyCode' property
  55857. *
  55858. * For example, to listen for the Konami code (up, up, down, down, left, right, left, right, b, a, enter)
  55859. * you could pass the following array of key codes:
  55860. *
  55861. * ```javascript
  55862. * this.input.keyboard.createCombo([ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ], { resetOnMatch: true });
  55863. *
  55864. * this.input.keyboard.on('keycombomatch', function (event) {
  55865. * console.log('Konami Code entered!');
  55866. * });
  55867. * ```
  55868. *
  55869. * Or, to listen for the user entering the word PHASER:
  55870. *
  55871. * ```javascript
  55872. * this.input.keyboard.createCombo('PHASER');
  55873. * ```
  55874. *
  55875. * @class KeyCombo
  55876. * @memberof Phaser.Input.Keyboard
  55877. * @constructor
  55878. * @listens Phaser.Input.Keyboard.Events#ANY_KEY_DOWN
  55879. * @since 3.0.0
  55880. *
  55881. * @param {Phaser.Input.Keyboard.KeyboardPlugin} keyboardPlugin - A reference to the Keyboard Plugin.
  55882. * @param {(string|integer[]|object[])} keys - The keys that comprise this combo.
  55883. * @param {KeyComboConfig} [config] - A Key Combo configuration object.
  55884. */
  55885. var KeyCombo = new Class({
  55886. initialize:
  55887. function KeyCombo (keyboardPlugin, keys, config)
  55888. {
  55889. if (config === undefined) { config = {}; }
  55890. // Can't have a zero or single length combo (string or array based)
  55891. if (keys.length < 2)
  55892. {
  55893. return false;
  55894. }
  55895. /**
  55896. * A reference to the Keyboard Manager
  55897. *
  55898. * @name Phaser.Input.Keyboard.KeyCombo#manager
  55899. * @type {Phaser.Input.Keyboard.KeyboardPlugin}
  55900. * @since 3.0.0
  55901. */
  55902. this.manager = keyboardPlugin;
  55903. /**
  55904. * A flag that controls if this Key Combo is actively processing keys or not.
  55905. *
  55906. * @name Phaser.Input.Keyboard.KeyCombo#enabled
  55907. * @type {boolean}
  55908. * @default true
  55909. * @since 3.0.0
  55910. */
  55911. this.enabled = true;
  55912. /**
  55913. * An array of the keycodes that comprise this combo.
  55914. *
  55915. * @name Phaser.Input.Keyboard.KeyCombo#keyCodes
  55916. * @type {array}
  55917. * @default []
  55918. * @since 3.0.0
  55919. */
  55920. this.keyCodes = [];
  55921. // if 'keys' is a string we need to get the keycode of each character in it
  55922. for (var i = 0; i < keys.length; i++)
  55923. {
  55924. var char = keys[i];
  55925. if (typeof char === 'string')
  55926. {
  55927. this.keyCodes.push(char.toUpperCase().charCodeAt(0));
  55928. }
  55929. else if (typeof char === 'number')
  55930. {
  55931. this.keyCodes.push(char);
  55932. }
  55933. else if (char.hasOwnProperty('keyCode'))
  55934. {
  55935. this.keyCodes.push(char.keyCode);
  55936. }
  55937. }
  55938. /**
  55939. * The current keyCode the combo is waiting for.
  55940. *
  55941. * @name Phaser.Input.Keyboard.KeyCombo#current
  55942. * @type {integer}
  55943. * @since 3.0.0
  55944. */
  55945. this.current = this.keyCodes[0];
  55946. /**
  55947. * The current index of the key being waited for in the 'keys' string.
  55948. *
  55949. * @name Phaser.Input.Keyboard.KeyCombo#index
  55950. * @type {integer}
  55951. * @default 0
  55952. * @since 3.0.0
  55953. */
  55954. this.index = 0;
  55955. /**
  55956. * The length of this combo (in keycodes)
  55957. *
  55958. * @name Phaser.Input.Keyboard.KeyCombo#size
  55959. * @type {number}
  55960. * @since 3.0.0
  55961. */
  55962. this.size = this.keyCodes.length;
  55963. /**
  55964. * The time the previous key in the combo was matched.
  55965. *
  55966. * @name Phaser.Input.Keyboard.KeyCombo#timeLastMatched
  55967. * @type {number}
  55968. * @default 0
  55969. * @since 3.0.0
  55970. */
  55971. this.timeLastMatched = 0;
  55972. /**
  55973. * Has this Key Combo been matched yet?
  55974. *
  55975. * @name Phaser.Input.Keyboard.KeyCombo#matched
  55976. * @type {boolean}
  55977. * @default false
  55978. * @since 3.0.0
  55979. */
  55980. this.matched = false;
  55981. /**
  55982. * The time the entire combo was matched.
  55983. *
  55984. * @name Phaser.Input.Keyboard.KeyCombo#timeMatched
  55985. * @type {number}
  55986. * @default 0
  55987. * @since 3.0.0
  55988. */
  55989. this.timeMatched = 0;
  55990. /**
  55991. * If they press the wrong key do we reset the combo?
  55992. *
  55993. * @name Phaser.Input.Keyboard.KeyCombo#resetOnWrongKey
  55994. * @type {boolean}
  55995. * @default 0
  55996. * @since 3.0.0
  55997. */
  55998. this.resetOnWrongKey = GetFastValue(config, 'resetOnWrongKey', true);
  55999. /**
  56000. * The max delay in ms between each key press. Above this the combo is reset. 0 means disabled.
  56001. *
  56002. * @name Phaser.Input.Keyboard.KeyCombo#maxKeyDelay
  56003. * @type {integer}
  56004. * @default 0
  56005. * @since 3.0.0
  56006. */
  56007. this.maxKeyDelay = GetFastValue(config, 'maxKeyDelay', 0);
  56008. /**
  56009. * If previously matched and they press the first key of the combo again, will it reset?
  56010. *
  56011. * @name Phaser.Input.Keyboard.KeyCombo#resetOnMatch
  56012. * @type {boolean}
  56013. * @default false
  56014. * @since 3.0.0
  56015. */
  56016. this.resetOnMatch = GetFastValue(config, 'resetOnMatch', false);
  56017. /**
  56018. * If the combo matches, will it delete itself?
  56019. *
  56020. * @name Phaser.Input.Keyboard.KeyCombo#deleteOnMatch
  56021. * @type {boolean}
  56022. * @default false
  56023. * @since 3.0.0
  56024. */
  56025. this.deleteOnMatch = GetFastValue(config, 'deleteOnMatch', false);
  56026. var _this = this;
  56027. var onKeyDownHandler = function (event)
  56028. {
  56029. if (_this.matched || !_this.enabled)
  56030. {
  56031. return;
  56032. }
  56033. var matched = ProcessKeyCombo(event, _this);
  56034. if (matched)
  56035. {
  56036. _this.manager.emit(Events.COMBO_MATCH, _this, event);
  56037. if (_this.resetOnMatch)
  56038. {
  56039. ResetKeyCombo(_this);
  56040. }
  56041. else if (_this.deleteOnMatch)
  56042. {
  56043. _this.destroy();
  56044. }
  56045. }
  56046. };
  56047. /**
  56048. * The internal Key Down handler.
  56049. *
  56050. * @name Phaser.Input.Keyboard.KeyCombo#onKeyDown
  56051. * @private
  56052. * @type {KeyboardKeydownCallback}
  56053. * @fires Phaser.Input.Keyboard.Events#COMBO_MATCH
  56054. * @since 3.0.0
  56055. */
  56056. this.onKeyDown = onKeyDownHandler;
  56057. this.manager.on(Events.ANY_KEY_DOWN, this.onKeyDown);
  56058. },
  56059. /**
  56060. * How far complete is this combo? A value between 0 and 1.
  56061. *
  56062. * @name Phaser.Input.Keyboard.KeyCombo#progress
  56063. * @type {number}
  56064. * @readonly
  56065. * @since 3.0.0
  56066. */
  56067. progress: {
  56068. get: function ()
  56069. {
  56070. return this.index / this.size;
  56071. }
  56072. },
  56073. /**
  56074. * Destroys this Key Combo and all of its references.
  56075. *
  56076. * @method Phaser.Input.Keyboard.KeyCombo#destroy
  56077. * @since 3.0.0
  56078. */
  56079. destroy: function ()
  56080. {
  56081. this.enabled = false;
  56082. this.keyCodes = [];
  56083. this.manager.off(Events.ANY_KEY_DOWN, this.onKeyDown);
  56084. this.manager = null;
  56085. }
  56086. });
  56087. module.exports = KeyCombo;
  56088. /***/ }),
  56089. /* 261 */
  56090. /***/ (function(module, exports, __webpack_require__) {
  56091. /**
  56092. * @author Richard Davey <rich@photonstorm.com>
  56093. * @copyright 2019 Photon Storm Ltd.
  56094. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  56095. */
  56096. var Class = __webpack_require__(0);
  56097. var EventEmitter = __webpack_require__(11);
  56098. var Events = __webpack_require__(113);
  56099. /**
  56100. * @classdesc
  56101. * A generic Key object which can be passed to the Process functions (and so on)
  56102. * keycode must be an integer
  56103. *
  56104. * @class Key
  56105. * @extends Phaser.Events.EventEmitter
  56106. * @memberof Phaser.Input.Keyboard
  56107. * @constructor
  56108. * @since 3.0.0
  56109. *
  56110. * @param {integer} keyCode - The keycode of this key.
  56111. */
  56112. var Key = new Class({
  56113. Extends: EventEmitter,
  56114. initialize:
  56115. function Key (keyCode)
  56116. {
  56117. EventEmitter.call(this);
  56118. /**
  56119. * The keycode of this key.
  56120. *
  56121. * @name Phaser.Input.Keyboard.Key#keyCode
  56122. * @type {integer}
  56123. * @since 3.0.0
  56124. */
  56125. this.keyCode = keyCode;
  56126. /**
  56127. * The original DOM event.
  56128. *
  56129. * @name Phaser.Input.Keyboard.Key#originalEvent
  56130. * @type {KeyboardEvent}
  56131. * @since 3.0.0
  56132. */
  56133. this.originalEvent = undefined;
  56134. /**
  56135. * Can this Key be processed?
  56136. *
  56137. * @name Phaser.Input.Keyboard.Key#enabled
  56138. * @type {boolean}
  56139. * @default true
  56140. * @since 3.0.0
  56141. */
  56142. this.enabled = true;
  56143. /**
  56144. * The "down" state of the key. This will remain `true` for as long as the keyboard thinks this key is held down.
  56145. *
  56146. * @name Phaser.Input.Keyboard.Key#isDown
  56147. * @type {boolean}
  56148. * @default false
  56149. * @since 3.0.0
  56150. */
  56151. this.isDown = false;
  56152. /**
  56153. * The "up" state of the key. This will remain `true` for as long as the keyboard thinks this key is up.
  56154. *
  56155. * @name Phaser.Input.Keyboard.Key#isUp
  56156. * @type {boolean}
  56157. * @default true
  56158. * @since 3.0.0
  56159. */
  56160. this.isUp = true;
  56161. /**
  56162. * The down state of the ALT key, if pressed at the same time as this key.
  56163. *
  56164. * @name Phaser.Input.Keyboard.Key#altKey
  56165. * @type {boolean}
  56166. * @default false
  56167. * @since 3.0.0
  56168. */
  56169. this.altKey = false;
  56170. /**
  56171. * The down state of the CTRL key, if pressed at the same time as this key.
  56172. *
  56173. * @name Phaser.Input.Keyboard.Key#ctrlKey
  56174. * @type {boolean}
  56175. * @default false
  56176. * @since 3.0.0
  56177. */
  56178. this.ctrlKey = false;
  56179. /**
  56180. * The down state of the SHIFT key, if pressed at the same time as this key.
  56181. *
  56182. * @name Phaser.Input.Keyboard.Key#shiftKey
  56183. * @type {boolean}
  56184. * @default false
  56185. * @since 3.0.0
  56186. */
  56187. this.shiftKey = false;
  56188. /**
  56189. * The down state of the Meta key, if pressed at the same time as this key.
  56190. * On a Mac the Meta Key is the Command key. On Windows keyboards, it's the Windows key.
  56191. *
  56192. * @name Phaser.Input.Keyboard.Key#metaKey
  56193. * @type {boolean}
  56194. * @default false
  56195. * @since 3.16.0
  56196. */
  56197. this.metaKey = false;
  56198. /**
  56199. * The location of the modifier key. 0 for standard (or unknown), 1 for left, 2 for right, 3 for numpad.
  56200. *
  56201. * @name Phaser.Input.Keyboard.Key#location
  56202. * @type {number}
  56203. * @default 0
  56204. * @since 3.0.0
  56205. */
  56206. this.location = 0;
  56207. /**
  56208. * The timestamp when the key was last pressed down.
  56209. *
  56210. * @name Phaser.Input.Keyboard.Key#timeDown
  56211. * @type {number}
  56212. * @default 0
  56213. * @since 3.0.0
  56214. */
  56215. this.timeDown = 0;
  56216. /**
  56217. * The number of milliseconds this key was held down for in the previous down - up sequence.
  56218. *
  56219. * @name Phaser.Input.Keyboard.Key#duration
  56220. * @type {number}
  56221. * @default 0
  56222. * @since 3.0.0
  56223. */
  56224. this.duration = 0;
  56225. /**
  56226. * The timestamp when the key was last released.
  56227. *
  56228. * @name Phaser.Input.Keyboard.Key#timeUp
  56229. * @type {number}
  56230. * @default 0
  56231. * @since 3.0.0
  56232. */
  56233. this.timeUp = 0;
  56234. /**
  56235. * When a key is held down should it continuously fire the `down` event each time it repeats?
  56236. *
  56237. * By default it will emit the `down` event just once, but if you wish to receive the event
  56238. * for each repeat as well, enable this property.
  56239. *
  56240. * @name Phaser.Input.Keyboard.Key#emitOnRepeat
  56241. * @type {boolean}
  56242. * @default false
  56243. * @since 3.16.0
  56244. */
  56245. this.emitOnRepeat = false;
  56246. /**
  56247. * If a key is held down this holds down the number of times the key has 'repeated'.
  56248. *
  56249. * @name Phaser.Input.Keyboard.Key#repeats
  56250. * @type {number}
  56251. * @default 0
  56252. * @since 3.0.0
  56253. */
  56254. this.repeats = 0;
  56255. /**
  56256. * True if the key has just been pressed (NOTE: requires to be reset, see justDown getter)
  56257. *
  56258. * @name Phaser.Input.Keyboard.Key#_justDown
  56259. * @type {boolean}
  56260. * @private
  56261. * @default false
  56262. * @since 3.0.0
  56263. */
  56264. this._justDown = false;
  56265. /**
  56266. * True if the key has just been pressed (NOTE: requires to be reset, see justDown getter)
  56267. *
  56268. * @name Phaser.Input.Keyboard.Key#_justUp
  56269. * @type {boolean}
  56270. * @private
  56271. * @default false
  56272. * @since 3.0.0
  56273. */
  56274. this._justUp = false;
  56275. /**
  56276. * Internal tick counter.
  56277. *
  56278. * @name Phaser.Input.Keyboard.Key#_tick
  56279. * @type {number}
  56280. * @private
  56281. * @since 3.11.0
  56282. */
  56283. this._tick = -1;
  56284. },
  56285. /**
  56286. * Controls if this Key will continuously emit a `down` event while being held down (true),
  56287. * or emit the event just once, on first press, and then skip future events (false).
  56288. *
  56289. * @method Phaser.Input.Keyboard.Key#setEmitOnRepeat
  56290. * @since 3.16.0
  56291. *
  56292. * @param {boolean} value - Emit `down` events on repeated key down actions, or just once?
  56293. *
  56294. * @return {Phaser.Input.Keyboard.Key} This Key instance.
  56295. */
  56296. setEmitOnRepeat: function (value)
  56297. {
  56298. this.emitOnRepeat = value;
  56299. return this;
  56300. },
  56301. /**
  56302. * Processes the Key Down action for this Key.
  56303. * Called automatically by the Keyboard Plugin.
  56304. *
  56305. * @method Phaser.Input.Keyboard.Key#onDown
  56306. * @fires Phaser.Input.Keyboard.Events#DOWN
  56307. * @since 3.16.0
  56308. *
  56309. * @param {KeyboardEvent} event - The native DOM Keyboard event.
  56310. */
  56311. onDown: function (event)
  56312. {
  56313. this.originalEvent = event;
  56314. if (!this.enabled)
  56315. {
  56316. return;
  56317. }
  56318. this.altKey = event.altKey;
  56319. this.ctrlKey = event.ctrlKey;
  56320. this.shiftKey = event.shiftKey;
  56321. this.metaKey = event.metaKey;
  56322. this.location = event.location;
  56323. this.repeats++;
  56324. if (!this.isDown)
  56325. {
  56326. this.isDown = true;
  56327. this.isUp = false;
  56328. this.timeDown = event.timeStamp;
  56329. this.duration = 0;
  56330. this._justDown = true;
  56331. this._justUp = false;
  56332. this.emit(Events.DOWN, this, event);
  56333. }
  56334. else if (this.emitOnRepeat)
  56335. {
  56336. this.emit(Events.DOWN, this, event);
  56337. }
  56338. },
  56339. /**
  56340. * Processes the Key Up action for this Key.
  56341. * Called automatically by the Keyboard Plugin.
  56342. *
  56343. * @method Phaser.Input.Keyboard.Key#onUp
  56344. * @fires Phaser.Input.Keyboard.Events#UP
  56345. * @since 3.16.0
  56346. *
  56347. * @param {KeyboardEvent} event - The native DOM Keyboard event.
  56348. */
  56349. onUp: function (event)
  56350. {
  56351. this.originalEvent = event;
  56352. if (!this.enabled)
  56353. {
  56354. return;
  56355. }
  56356. this.isDown = false;
  56357. this.isUp = true;
  56358. this.timeUp = event.timeStamp;
  56359. this.duration = this.timeUp - this.timeDown;
  56360. this.repeats = 0;
  56361. this._justDown = false;
  56362. this._justUp = true;
  56363. this._tick = -1;
  56364. this.emit(Events.UP, this, event);
  56365. },
  56366. /**
  56367. * Resets this Key object back to its default un-pressed state.
  56368. *
  56369. * @method Phaser.Input.Keyboard.Key#reset
  56370. * @since 3.6.0
  56371. *
  56372. * @return {Phaser.Input.Keyboard.Key} This Key instance.
  56373. */
  56374. reset: function ()
  56375. {
  56376. this.preventDefault = true;
  56377. this.enabled = true;
  56378. this.isDown = false;
  56379. this.isUp = true;
  56380. this.altKey = false;
  56381. this.ctrlKey = false;
  56382. this.shiftKey = false;
  56383. this.metaKey = false;
  56384. this.timeDown = 0;
  56385. this.duration = 0;
  56386. this.timeUp = 0;
  56387. this.repeats = 0;
  56388. this._justDown = false;
  56389. this._justUp = false;
  56390. this._tick = -1;
  56391. return this;
  56392. },
  56393. /**
  56394. * Removes any bound event handlers and removes local references.
  56395. *
  56396. * @method Phaser.Input.Keyboard.Key#destroy
  56397. * @since 3.16.0
  56398. */
  56399. destroy: function ()
  56400. {
  56401. this.removeAllListeners();
  56402. this.originalEvent = null;
  56403. }
  56404. });
  56405. module.exports = Key;
  56406. /***/ }),
  56407. /* 262 */
  56408. /***/ (function(module, exports, __webpack_require__) {
  56409. /**
  56410. * @author Richard Davey <rich@photonstorm.com>
  56411. * @copyright 2019 Photon Storm Ltd.
  56412. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  56413. */
  56414. var Axis = __webpack_require__(264);
  56415. var Button = __webpack_require__(263);
  56416. var Class = __webpack_require__(0);
  56417. var EventEmitter = __webpack_require__(11);
  56418. var Vector2 = __webpack_require__(3);
  56419. /**
  56420. * @classdesc
  56421. * A single Gamepad.
  56422. *
  56423. * These are created, updated and managed by the Gamepad Plugin.
  56424. *
  56425. * @class Gamepad
  56426. * @extends Phaser.Events.EventEmitter
  56427. * @memberof Phaser.Input.Gamepad
  56428. * @constructor
  56429. * @since 3.0.0
  56430. *
  56431. * @param {Phaser.Input.Gamepad.GamepadPlugin} manager - A reference to the Gamepad Plugin.
  56432. * @param {Pad} pad - The Gamepad object, as extracted from GamepadEvent.
  56433. */
  56434. var Gamepad = new Class({
  56435. Extends: EventEmitter,
  56436. initialize:
  56437. function Gamepad (manager, pad)
  56438. {
  56439. EventEmitter.call(this);
  56440. /**
  56441. * A reference to the Gamepad Plugin.
  56442. *
  56443. * @name Phaser.Input.Gamepad.Gamepad#manager
  56444. * @type {Phaser.Input.Gamepad.GamepadPlugin}
  56445. * @since 3.0.0
  56446. */
  56447. this.manager = manager;
  56448. /**
  56449. * A reference to the native Gamepad object that is connected to the browser.
  56450. *
  56451. * @name Phaser.Input.Gamepad.Gamepad#pad
  56452. * @type {any}
  56453. * @since 3.10.0
  56454. */
  56455. this.pad = pad;
  56456. /**
  56457. * A string containing some information about the controller.
  56458. *
  56459. * This is not strictly specified, but in Firefox it will contain three pieces of information
  56460. * separated by dashes (-): two 4-digit hexadecimal strings containing the USB vendor and
  56461. * product id of the controller, and the name of the controller as provided by the driver.
  56462. * In Chrome it will contain the name of the controller as provided by the driver,
  56463. * followed by vendor and product 4-digit hexadecimal strings.
  56464. *
  56465. * @name Phaser.Input.Gamepad.Gamepad#id
  56466. * @type {string}
  56467. * @since 3.0.0
  56468. */
  56469. this.id = pad.id;
  56470. /**
  56471. * An integer that is unique for each Gamepad currently connected to the system.
  56472. * This can be used to distinguish multiple controllers.
  56473. * Note that disconnecting a device and then connecting a new device may reuse the previous index.
  56474. *
  56475. * @name Phaser.Input.Gamepad.Gamepad#index
  56476. * @type {number}
  56477. * @since 3.0.0
  56478. */
  56479. this.index = pad.index;
  56480. var buttons = [];
  56481. for (var i = 0; i < pad.buttons.length; i++)
  56482. {
  56483. buttons.push(new Button(this, i));
  56484. }
  56485. /**
  56486. * An array of Gamepad Button objects, corresponding to the different buttons available on the Gamepad.
  56487. *
  56488. * @name Phaser.Input.Gamepad.Gamepad#buttons
  56489. * @type {Phaser.Input.Gamepad.Button[]}
  56490. * @since 3.0.0
  56491. */
  56492. this.buttons = buttons;
  56493. var axes = [];
  56494. for (i = 0; i < pad.axes.length; i++)
  56495. {
  56496. axes.push(new Axis(this, i));
  56497. }
  56498. /**
  56499. * An array of Gamepad Axis objects, corresponding to the different axes available on the Gamepad, if any.
  56500. *
  56501. * @name Phaser.Input.Gamepad.Gamepad#axes
  56502. * @type {Phaser.Input.Gamepad.Axis[]}
  56503. * @since 3.0.0
  56504. */
  56505. this.axes = axes;
  56506. /**
  56507. * The Gamepad's Haptic Actuator (Vibration / Rumble support).
  56508. * This is highly experimental and only set if both present on the device,
  56509. * and exposed by both the hardware and browser.
  56510. *
  56511. * @name Phaser.Input.Gamepad.Gamepad#vibration
  56512. * @type {GamepadHapticActuator}
  56513. * @since 3.10.0
  56514. */
  56515. this.vibration = pad.vibrationActuator;
  56516. // https://w3c.github.io/gamepad/#remapping
  56517. var _noButton = { value: 0, pressed: false };
  56518. /**
  56519. * A reference to the Left Button in the Left Cluster.
  56520. *
  56521. * @name Phaser.Input.Gamepad.Gamepad#_LCLeft
  56522. * @type {Phaser.Input.Gamepad.Button}
  56523. * @private
  56524. * @since 3.10.0
  56525. */
  56526. this._LCLeft = (buttons[14]) ? buttons[14] : _noButton;
  56527. /**
  56528. * A reference to the Right Button in the Left Cluster.
  56529. *
  56530. * @name Phaser.Input.Gamepad.Gamepad#_LCRight
  56531. * @type {Phaser.Input.Gamepad.Button}
  56532. * @private
  56533. * @since 3.10.0
  56534. */
  56535. this._LCRight = (buttons[15]) ? buttons[15] : _noButton;
  56536. /**
  56537. * A reference to the Top Button in the Left Cluster.
  56538. *
  56539. * @name Phaser.Input.Gamepad.Gamepad#_LCTop
  56540. * @type {Phaser.Input.Gamepad.Button}
  56541. * @private
  56542. * @since 3.10.0
  56543. */
  56544. this._LCTop = (buttons[12]) ? buttons[12] : _noButton;
  56545. /**
  56546. * A reference to the Bottom Button in the Left Cluster.
  56547. *
  56548. * @name Phaser.Input.Gamepad.Gamepad#_LCBottom
  56549. * @type {Phaser.Input.Gamepad.Button}
  56550. * @private
  56551. * @since 3.10.0
  56552. */
  56553. this._LCBottom = (buttons[13]) ? buttons[13] : _noButton;
  56554. /**
  56555. * A reference to the Left Button in the Right Cluster.
  56556. *
  56557. * @name Phaser.Input.Gamepad.Gamepad#_RCLeft
  56558. * @type {Phaser.Input.Gamepad.Button}
  56559. * @private
  56560. * @since 3.10.0
  56561. */
  56562. this._RCLeft = (buttons[2]) ? buttons[2] : _noButton;
  56563. /**
  56564. * A reference to the Right Button in the Right Cluster.
  56565. *
  56566. * @name Phaser.Input.Gamepad.Gamepad#_RCRight
  56567. * @type {Phaser.Input.Gamepad.Button}
  56568. * @private
  56569. * @since 3.10.0
  56570. */
  56571. this._RCRight = (buttons[1]) ? buttons[1] : _noButton;
  56572. /**
  56573. * A reference to the Top Button in the Right Cluster.
  56574. *
  56575. * @name Phaser.Input.Gamepad.Gamepad#_RCTop
  56576. * @type {Phaser.Input.Gamepad.Button}
  56577. * @private
  56578. * @since 3.10.0
  56579. */
  56580. this._RCTop = (buttons[3]) ? buttons[3] : _noButton;
  56581. /**
  56582. * A reference to the Bottom Button in the Right Cluster.
  56583. *
  56584. * @name Phaser.Input.Gamepad.Gamepad#_RCBottom
  56585. * @type {Phaser.Input.Gamepad.Button}
  56586. * @private
  56587. * @since 3.10.0
  56588. */
  56589. this._RCBottom = (buttons[0]) ? buttons[0] : _noButton;
  56590. /**
  56591. * A reference to the Top Left Front Button (L1 Shoulder Button)
  56592. *
  56593. * @name Phaser.Input.Gamepad.Gamepad#_FBLeftTop
  56594. * @type {Phaser.Input.Gamepad.Button}
  56595. * @private
  56596. * @since 3.10.0
  56597. */
  56598. this._FBLeftTop = (buttons[4]) ? buttons[4] : _noButton;
  56599. /**
  56600. * A reference to the Bottom Left Front Button (L2 Shoulder Button)
  56601. *
  56602. * @name Phaser.Input.Gamepad.Gamepad#_FBLeftBottom
  56603. * @type {Phaser.Input.Gamepad.Button}
  56604. * @private
  56605. * @since 3.10.0
  56606. */
  56607. this._FBLeftBottom = (buttons[6]) ? buttons[6] : _noButton;
  56608. /**
  56609. * A reference to the Top Right Front Button (R1 Shoulder Button)
  56610. *
  56611. * @name Phaser.Input.Gamepad.Gamepad#_FBRightTop
  56612. * @type {Phaser.Input.Gamepad.Button}
  56613. * @private
  56614. * @since 3.10.0
  56615. */
  56616. this._FBRightTop = (buttons[5]) ? buttons[5] : _noButton;
  56617. /**
  56618. * A reference to the Bottom Right Front Button (R2 Shoulder Button)
  56619. *
  56620. * @name Phaser.Input.Gamepad.Gamepad#_FBRightBottom
  56621. * @type {Phaser.Input.Gamepad.Button}
  56622. * @private
  56623. * @since 3.10.0
  56624. */
  56625. this._FBRightBottom = (buttons[7]) ? buttons[7] : _noButton;
  56626. var _noAxis = { value: 0 };
  56627. /**
  56628. * A reference to the Horizontal Axis for the Left Stick.
  56629. *
  56630. * @name Phaser.Input.Gamepad.Gamepad#_HAxisLeft
  56631. * @type {Phaser.Input.Gamepad.Button}
  56632. * @private
  56633. * @since 3.10.0
  56634. */
  56635. this._HAxisLeft = (axes[0]) ? axes[0] : _noAxis;
  56636. /**
  56637. * A reference to the Vertical Axis for the Left Stick.
  56638. *
  56639. * @name Phaser.Input.Gamepad.Gamepad#_VAxisLeft
  56640. * @type {Phaser.Input.Gamepad.Button}
  56641. * @private
  56642. * @since 3.10.0
  56643. */
  56644. this._VAxisLeft = (axes[1]) ? axes[1] : _noAxis;
  56645. /**
  56646. * A reference to the Horizontal Axis for the Right Stick.
  56647. *
  56648. * @name Phaser.Input.Gamepad.Gamepad#_HAxisRight
  56649. * @type {Phaser.Input.Gamepad.Button}
  56650. * @private
  56651. * @since 3.10.0
  56652. */
  56653. this._HAxisRight = (axes[2]) ? axes[2] : _noAxis;
  56654. /**
  56655. * A reference to the Vertical Axis for the Right Stick.
  56656. *
  56657. * @name Phaser.Input.Gamepad.Gamepad#_VAxisRight
  56658. * @type {Phaser.Input.Gamepad.Button}
  56659. * @private
  56660. * @since 3.10.0
  56661. */
  56662. this._VAxisRight = (axes[3]) ? axes[3] : _noAxis;
  56663. /**
  56664. * A Vector2 containing the most recent values from the Gamepad's left axis stick.
  56665. * This is updated automatically as part of the Gamepad.update cycle.
  56666. * The H Axis is mapped to the `Vector2.x` property, and the V Axis to the `Vector2.y` property.
  56667. * The values are based on the Axis thresholds.
  56668. * If the Gamepad does not have a left axis stick, the values will always be zero.
  56669. *
  56670. * @name Phaser.Input.Gamepad.Gamepad#leftStick
  56671. * @type {Phaser.Math.Vector2}
  56672. * @since 3.10.0
  56673. */
  56674. this.leftStick = new Vector2();
  56675. /**
  56676. * A Vector2 containing the most recent values from the Gamepad's right axis stick.
  56677. * This is updated automatically as part of the Gamepad.update cycle.
  56678. * The H Axis is mapped to the `Vector2.x` property, and the V Axis to the `Vector2.y` property.
  56679. * The values are based on the Axis thresholds.
  56680. * If the Gamepad does not have a right axis stick, the values will always be zero.
  56681. *
  56682. * @name Phaser.Input.Gamepad.Gamepad#rightStick
  56683. * @type {Phaser.Math.Vector2}
  56684. * @since 3.10.0
  56685. */
  56686. this.rightStick = new Vector2();
  56687. },
  56688. /**
  56689. * Gets the total number of axis this Gamepad claims to support.
  56690. *
  56691. * @method Phaser.Input.Gamepad.Gamepad#getAxisTotal
  56692. * @since 3.10.0
  56693. *
  56694. * @return {integer} The total number of axes this Gamepad claims to support.
  56695. */
  56696. getAxisTotal: function ()
  56697. {
  56698. return this.axes.length;
  56699. },
  56700. /**
  56701. * Gets the value of an axis based on the given index.
  56702. * The index must be valid within the range of axes supported by this Gamepad.
  56703. * The return value will be a float between 0 and 1.
  56704. *
  56705. * @method Phaser.Input.Gamepad.Gamepad#getAxisValue
  56706. * @since 3.10.0
  56707. *
  56708. * @param {integer} index - The index of the axes to get the value for.
  56709. *
  56710. * @return {number} The value of the axis, between 0 and 1.
  56711. */
  56712. getAxisValue: function (index)
  56713. {
  56714. return this.axes[index].getValue();
  56715. },
  56716. /**
  56717. * Sets the threshold value of all axis on this Gamepad.
  56718. * The value is a float between 0 and 1 and is the amount below which the axis is considered as not having been moved.
  56719. *
  56720. * @method Phaser.Input.Gamepad.Gamepad#setAxisThreshold
  56721. * @since 3.10.0
  56722. *
  56723. * @param {number} value - A value between 0 and 1.
  56724. */
  56725. setAxisThreshold: function (value)
  56726. {
  56727. for (var i = 0; i < this.axes.length; i++)
  56728. {
  56729. this.axes[i].threshold = value;
  56730. }
  56731. },
  56732. /**
  56733. * Gets the total number of buttons this Gamepad claims to have.
  56734. *
  56735. * @method Phaser.Input.Gamepad.Gamepad#getButtonTotal
  56736. * @since 3.10.0
  56737. *
  56738. * @return {integer} The total number of buttons this Gamepad claims to have.
  56739. */
  56740. getButtonTotal: function ()
  56741. {
  56742. return this.buttons.length;
  56743. },
  56744. /**
  56745. * Gets the value of a button based on the given index.
  56746. * The index must be valid within the range of buttons supported by this Gamepad.
  56747. *
  56748. * The return value will be either 0 or 1 for an analogue button, or a float between 0 and 1
  56749. * for a pressure-sensitive digital button, such as the shoulder buttons on a Dual Shock.
  56750. *
  56751. * @method Phaser.Input.Gamepad.Gamepad#getButtonValue
  56752. * @since 3.10.0
  56753. *
  56754. * @param {integer} index - The index of the button to get the value for.
  56755. *
  56756. * @return {number} The value of the button, between 0 and 1.
  56757. */
  56758. getButtonValue: function (index)
  56759. {
  56760. return this.buttons[index].value;
  56761. },
  56762. /**
  56763. * Returns if the button is pressed down or not.
  56764. * The index must be valid within the range of buttons supported by this Gamepad.
  56765. *
  56766. * @method Phaser.Input.Gamepad.Gamepad#isButtonDown
  56767. * @since 3.10.0
  56768. *
  56769. * @param {integer} index - The index of the button to get the value for.
  56770. *
  56771. * @return {boolean} `true` if the button is considered as being pressed down, otherwise `false`.
  56772. */
  56773. isButtonDown: function (index)
  56774. {
  56775. return this.buttons[index].pressed;
  56776. },
  56777. /**
  56778. * Internal update handler for this Gamepad.
  56779. * Called automatically by the Gamepad Manager as part of its update.
  56780. *
  56781. * @method Phaser.Input.Gamepad.Gamepad#update
  56782. * @private
  56783. * @since 3.0.0
  56784. */
  56785. update: function (pad)
  56786. {
  56787. var i;
  56788. // Sync the button values
  56789. var localButtons = this.buttons;
  56790. var gamepadButtons = pad.buttons;
  56791. var len = localButtons.length;
  56792. for (i = 0; i < len; i++)
  56793. {
  56794. localButtons[i].update(gamepadButtons[i].value);
  56795. }
  56796. // Sync the axis values
  56797. var localAxes = this.axes;
  56798. var gamepadAxes = pad.axes;
  56799. len = localAxes.length;
  56800. for (i = 0; i < len; i++)
  56801. {
  56802. localAxes[i].update(gamepadAxes[i]);
  56803. }
  56804. if (len >= 2)
  56805. {
  56806. this.leftStick.set(localAxes[0].getValue(), localAxes[1].getValue());
  56807. if (len >= 4)
  56808. {
  56809. this.rightStick.set(localAxes[2].getValue(), localAxes[3].getValue());
  56810. }
  56811. }
  56812. },
  56813. /**
  56814. * Destroys this Gamepad instance, its buttons and axes, and releases external references it holds.
  56815. *
  56816. * @method Phaser.Input.Gamepad.Gamepad#destroy
  56817. * @since 3.10.0
  56818. */
  56819. destroy: function ()
  56820. {
  56821. this.removeAllListeners();
  56822. this.manager = null;
  56823. this.pad = null;
  56824. var i;
  56825. for (i = 0; i < this.buttons.length; i++)
  56826. {
  56827. this.buttons[i].destroy();
  56828. }
  56829. for (i = 0; i < this.axes.length; i++)
  56830. {
  56831. this.axes[i].destroy();
  56832. }
  56833. this.buttons = [];
  56834. this.axes = [];
  56835. },
  56836. /**
  56837. * Is this Gamepad currently connected or not?
  56838. *
  56839. * @name Phaser.Input.Gamepad.Gamepad#connected
  56840. * @type {boolean}
  56841. * @default true
  56842. * @since 3.0.0
  56843. */
  56844. connected: {
  56845. get: function ()
  56846. {
  56847. return this.pad.connected;
  56848. }
  56849. },
  56850. /**
  56851. * A timestamp containing the most recent time this Gamepad was updated.
  56852. *
  56853. * @name Phaser.Input.Gamepad.Gamepad#timestamp
  56854. * @type {number}
  56855. * @since 3.0.0
  56856. */
  56857. timestamp: {
  56858. get: function ()
  56859. {
  56860. return this.pad.timestamp;
  56861. }
  56862. },
  56863. /**
  56864. * Is the Gamepad's Left button being pressed?
  56865. * If the Gamepad doesn't have this button it will always return false.
  56866. * This is the d-pad left button under standard Gamepad mapping.
  56867. *
  56868. * @name Phaser.Input.Gamepad.Gamepad#left
  56869. * @type {boolean}
  56870. * @since 3.10.0
  56871. */
  56872. left: {
  56873. get: function ()
  56874. {
  56875. return this._LCLeft.pressed;
  56876. }
  56877. },
  56878. /**
  56879. * Is the Gamepad's Right button being pressed?
  56880. * If the Gamepad doesn't have this button it will always return false.
  56881. * This is the d-pad right button under standard Gamepad mapping.
  56882. *
  56883. * @name Phaser.Input.Gamepad.Gamepad#right
  56884. * @type {boolean}
  56885. * @since 3.10.0
  56886. */
  56887. right: {
  56888. get: function ()
  56889. {
  56890. return this._LCRight.pressed;
  56891. }
  56892. },
  56893. /**
  56894. * Is the Gamepad's Up button being pressed?
  56895. * If the Gamepad doesn't have this button it will always return false.
  56896. * This is the d-pad up button under standard Gamepad mapping.
  56897. *
  56898. * @name Phaser.Input.Gamepad.Gamepad#up
  56899. * @type {boolean}
  56900. * @since 3.10.0
  56901. */
  56902. up: {
  56903. get: function ()
  56904. {
  56905. return this._LCTop.pressed;
  56906. }
  56907. },
  56908. /**
  56909. * Is the Gamepad's Down button being pressed?
  56910. * If the Gamepad doesn't have this button it will always return false.
  56911. * This is the d-pad down button under standard Gamepad mapping.
  56912. *
  56913. * @name Phaser.Input.Gamepad.Gamepad#down
  56914. * @type {boolean}
  56915. * @since 3.10.0
  56916. */
  56917. down: {
  56918. get: function ()
  56919. {
  56920. return this._LCBottom.pressed;
  56921. }
  56922. },
  56923. /**
  56924. * Is the Gamepad's bottom button in the right button cluster being pressed?
  56925. * If the Gamepad doesn't have this button it will always return false.
  56926. * On a Dual Shock controller it's the X button.
  56927. * On an XBox controller it's the A button.
  56928. *
  56929. * @name Phaser.Input.Gamepad.Gamepad#A
  56930. * @type {boolean}
  56931. * @since 3.10.0
  56932. */
  56933. A: {
  56934. get: function ()
  56935. {
  56936. return this._RCBottom.pressed;
  56937. }
  56938. },
  56939. /**
  56940. * Is the Gamepad's top button in the right button cluster being pressed?
  56941. * If the Gamepad doesn't have this button it will always return false.
  56942. * On a Dual Shock controller it's the Triangle button.
  56943. * On an XBox controller it's the Y button.
  56944. *
  56945. * @name Phaser.Input.Gamepad.Gamepad#Y
  56946. * @type {boolean}
  56947. * @since 3.10.0
  56948. */
  56949. Y: {
  56950. get: function ()
  56951. {
  56952. return this._RCTop.pressed;
  56953. }
  56954. },
  56955. /**
  56956. * Is the Gamepad's left button in the right button cluster being pressed?
  56957. * If the Gamepad doesn't have this button it will always return false.
  56958. * On a Dual Shock controller it's the Square button.
  56959. * On an XBox controller it's the X button.
  56960. *
  56961. * @name Phaser.Input.Gamepad.Gamepad#X
  56962. * @type {boolean}
  56963. * @since 3.10.0
  56964. */
  56965. X: {
  56966. get: function ()
  56967. {
  56968. return this._RCLeft.pressed;
  56969. }
  56970. },
  56971. /**
  56972. * Is the Gamepad's right button in the right button cluster being pressed?
  56973. * If the Gamepad doesn't have this button it will always return false.
  56974. * On a Dual Shock controller it's the Circle button.
  56975. * On an XBox controller it's the B button.
  56976. *
  56977. * @name Phaser.Input.Gamepad.Gamepad#B
  56978. * @type {boolean}
  56979. * @since 3.10.0
  56980. */
  56981. B: {
  56982. get: function ()
  56983. {
  56984. return this._RCRight.pressed;
  56985. }
  56986. },
  56987. /**
  56988. * Returns the value of the Gamepad's top left shoulder button.
  56989. * If the Gamepad doesn't have this button it will always return zero.
  56990. * The value is a float between 0 and 1, corresponding to how depressed the button is.
  56991. * On a Dual Shock controller it's the L1 button.
  56992. * On an XBox controller it's the LB button.
  56993. *
  56994. * @name Phaser.Input.Gamepad.Gamepad#L1
  56995. * @type {number}
  56996. * @since 3.10.0
  56997. */
  56998. L1: {
  56999. get: function ()
  57000. {
  57001. return this._FBLeftTop.value;
  57002. }
  57003. },
  57004. /**
  57005. * Returns the value of the Gamepad's bottom left shoulder button.
  57006. * If the Gamepad doesn't have this button it will always return zero.
  57007. * The value is a float between 0 and 1, corresponding to how depressed the button is.
  57008. * On a Dual Shock controller it's the L2 button.
  57009. * On an XBox controller it's the LT button.
  57010. *
  57011. * @name Phaser.Input.Gamepad.Gamepad#L2
  57012. * @type {number}
  57013. * @since 3.10.0
  57014. */
  57015. L2: {
  57016. get: function ()
  57017. {
  57018. return this._FBLeftBottom.value;
  57019. }
  57020. },
  57021. /**
  57022. * Returns the value of the Gamepad's top right shoulder button.
  57023. * If the Gamepad doesn't have this button it will always return zero.
  57024. * The value is a float between 0 and 1, corresponding to how depressed the button is.
  57025. * On a Dual Shock controller it's the R1 button.
  57026. * On an XBox controller it's the RB button.
  57027. *
  57028. * @name Phaser.Input.Gamepad.Gamepad#R1
  57029. * @type {number}
  57030. * @since 3.10.0
  57031. */
  57032. R1: {
  57033. get: function ()
  57034. {
  57035. return this._FBRightTop.value;
  57036. }
  57037. },
  57038. /**
  57039. * Returns the value of the Gamepad's bottom right shoulder button.
  57040. * If the Gamepad doesn't have this button it will always return zero.
  57041. * The value is a float between 0 and 1, corresponding to how depressed the button is.
  57042. * On a Dual Shock controller it's the R2 button.
  57043. * On an XBox controller it's the RT button.
  57044. *
  57045. * @name Phaser.Input.Gamepad.Gamepad#R2
  57046. * @type {number}
  57047. * @since 3.10.0
  57048. */
  57049. R2: {
  57050. get: function ()
  57051. {
  57052. return this._FBRightBottom.value;
  57053. }
  57054. }
  57055. });
  57056. module.exports = Gamepad;
  57057. /***/ }),
  57058. /* 263 */
  57059. /***/ (function(module, exports, __webpack_require__) {
  57060. /**
  57061. * @author Richard Davey <rich@photonstorm.com>
  57062. * @copyright 2019 Photon Storm Ltd.
  57063. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57064. */
  57065. var Class = __webpack_require__(0);
  57066. var Events = __webpack_require__(153);
  57067. /**
  57068. * @classdesc
  57069. * Contains information about a specific button on a Gamepad.
  57070. * Button objects are created automatically by the Gamepad as they are needed.
  57071. *
  57072. * @class Button
  57073. * @memberof Phaser.Input.Gamepad
  57074. * @constructor
  57075. * @since 3.0.0
  57076. *
  57077. * @param {Phaser.Input.Gamepad.Gamepad} pad - A reference to the Gamepad that this Button belongs to.
  57078. * @param {integer} index - The index of this Button.
  57079. */
  57080. var Button = new Class({
  57081. initialize:
  57082. function Button (pad, index)
  57083. {
  57084. /**
  57085. * A reference to the Gamepad that this Button belongs to.
  57086. *
  57087. * @name Phaser.Input.Gamepad.Button#pad
  57088. * @type {Phaser.Input.Gamepad.Gamepad}
  57089. * @since 3.0.0
  57090. */
  57091. this.pad = pad;
  57092. /**
  57093. * An event emitter to use to emit the button events.
  57094. *
  57095. * @name Phaser.Input.Gamepad.Button#events
  57096. * @type {Phaser.Events.EventEmitter}
  57097. * @since 3.0.0
  57098. */
  57099. this.events = pad.manager;
  57100. /**
  57101. * The index of this Button.
  57102. *
  57103. * @name Phaser.Input.Gamepad.Button#index
  57104. * @type {integer}
  57105. * @since 3.0.0
  57106. */
  57107. this.index = index;
  57108. /**
  57109. * Between 0 and 1.
  57110. *
  57111. * @name Phaser.Input.Gamepad.Button#value
  57112. * @type {number}
  57113. * @default 0
  57114. * @since 3.0.0
  57115. */
  57116. this.value = 0;
  57117. /**
  57118. * Can be set for analogue buttons to enable a 'pressure' threshold,
  57119. * before a button is considered as being 'pressed'.
  57120. *
  57121. * @name Phaser.Input.Gamepad.Button#threshold
  57122. * @type {number}
  57123. * @default 1
  57124. * @since 3.0.0
  57125. */
  57126. this.threshold = 1;
  57127. /**
  57128. * Is the Button being pressed down or not?
  57129. *
  57130. * @name Phaser.Input.Gamepad.Button#pressed
  57131. * @type {boolean}
  57132. * @default false
  57133. * @since 3.0.0
  57134. */
  57135. this.pressed = false;
  57136. },
  57137. /**
  57138. * Internal update handler for this Button.
  57139. * Called automatically by the Gamepad as part of its update.
  57140. *
  57141. * @method Phaser.Input.Gamepad.Button#update
  57142. * @fires Phaser.Input.Gamepad.Events#BUTTON_DOWN
  57143. * @fires Phaser.Input.Gamepad.Events#BUTTON_UP
  57144. * @fires Phaser.Input.Gamepad.Events#GAMEPAD_BUTTON_DOWN
  57145. * @fires Phaser.Input.Gamepad.Events#GAMEPAD_BUTTON_UP
  57146. * @private
  57147. * @since 3.0.0
  57148. *
  57149. * @param {number} value - The value of the button. Between 0 and 1.
  57150. */
  57151. update: function (value)
  57152. {
  57153. this.value = value;
  57154. var pad = this.pad;
  57155. var index = this.index;
  57156. if (value >= this.threshold)
  57157. {
  57158. if (!this.pressed)
  57159. {
  57160. this.pressed = true;
  57161. this.events.emit(Events.BUTTON_DOWN, pad, this, value);
  57162. this.pad.emit(Events.GAMEPAD_BUTTON_DOWN, index, value, this);
  57163. }
  57164. }
  57165. else if (this.pressed)
  57166. {
  57167. this.pressed = false;
  57168. this.events.emit(Events.BUTTON_UP, pad, this, value);
  57169. this.pad.emit(Events.GAMEPAD_BUTTON_UP, index, value, this);
  57170. }
  57171. },
  57172. /**
  57173. * Destroys this Button instance and releases external references it holds.
  57174. *
  57175. * @method Phaser.Input.Gamepad.Button#destroy
  57176. * @since 3.10.0
  57177. */
  57178. destroy: function ()
  57179. {
  57180. this.pad = null;
  57181. this.events = null;
  57182. }
  57183. });
  57184. module.exports = Button;
  57185. /***/ }),
  57186. /* 264 */
  57187. /***/ (function(module, exports, __webpack_require__) {
  57188. /**
  57189. * @author Richard Davey <rich@photonstorm.com>
  57190. * @copyright 2019 Photon Storm Ltd.
  57191. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57192. */
  57193. var Class = __webpack_require__(0);
  57194. /**
  57195. * @classdesc
  57196. * Contains information about a specific Gamepad Axis.
  57197. * Axis objects are created automatically by the Gamepad as they are needed.
  57198. *
  57199. * @class Axis
  57200. * @memberof Phaser.Input.Gamepad
  57201. * @constructor
  57202. * @since 3.0.0
  57203. *
  57204. * @param {Phaser.Input.Gamepad.Gamepad} pad - A reference to the Gamepad that this Axis belongs to.
  57205. * @param {integer} index - The index of this Axis.
  57206. */
  57207. var Axis = new Class({
  57208. initialize:
  57209. function Axis (pad, index)
  57210. {
  57211. /**
  57212. * A reference to the Gamepad that this Axis belongs to.
  57213. *
  57214. * @name Phaser.Input.Gamepad.Axis#pad
  57215. * @type {Phaser.Input.Gamepad.Gamepad}
  57216. * @since 3.0.0
  57217. */
  57218. this.pad = pad;
  57219. /**
  57220. * An event emitter to use to emit the axis events.
  57221. *
  57222. * @name Phaser.Input.Gamepad.Axis#events
  57223. * @type {Phaser.Events.EventEmitter}
  57224. * @since 3.0.0
  57225. */
  57226. this.events = pad.events;
  57227. /**
  57228. * The index of this Axis.
  57229. *
  57230. * @name Phaser.Input.Gamepad.Axis#index
  57231. * @type {integer}
  57232. * @since 3.0.0
  57233. */
  57234. this.index = index;
  57235. /**
  57236. * The raw axis value, between -1 and 1 with 0 being dead center.
  57237. * Use the method `getValue` to get a normalized value with the threshold applied.
  57238. *
  57239. * @name Phaser.Input.Gamepad.Axis#value
  57240. * @type {number}
  57241. * @default 0
  57242. * @since 3.0.0
  57243. */
  57244. this.value = 0;
  57245. /**
  57246. * Movement tolerance threshold below which axis values are ignored in `getValue`.
  57247. *
  57248. * @name Phaser.Input.Gamepad.Axis#threshold
  57249. * @type {number}
  57250. * @default 0.1
  57251. * @since 3.0.0
  57252. */
  57253. this.threshold = 0.1;
  57254. },
  57255. /**
  57256. * Internal update handler for this Axis.
  57257. * Called automatically by the Gamepad as part of its update.
  57258. *
  57259. * @method Phaser.Input.Gamepad.Axis#update
  57260. * @private
  57261. * @since 3.0.0
  57262. *
  57263. * @param {number} value - The value of the axis movement.
  57264. */
  57265. update: function (value)
  57266. {
  57267. this.value = value;
  57268. },
  57269. /**
  57270. * Applies the `threshold` value to the axis and returns it.
  57271. *
  57272. * @method Phaser.Input.Gamepad.Axis#getValue
  57273. * @since 3.0.0
  57274. *
  57275. * @return {number} The axis value, adjusted for the movement threshold.
  57276. */
  57277. getValue: function ()
  57278. {
  57279. return (Math.abs(this.value) < this.threshold) ? 0 : this.value;
  57280. },
  57281. /**
  57282. * Destroys this Axis instance and releases external references it holds.
  57283. *
  57284. * @method Phaser.Input.Gamepad.Axis#destroy
  57285. * @since 3.10.0
  57286. */
  57287. destroy: function ()
  57288. {
  57289. this.pad = null;
  57290. this.events = null;
  57291. }
  57292. });
  57293. module.exports = Axis;
  57294. /***/ }),
  57295. /* 265 */
  57296. /***/ (function(module, exports) {
  57297. /**
  57298. * @author Richard Davey <rich@photonstorm.com>
  57299. * @copyright 2019 Photon Storm Ltd.
  57300. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57301. */
  57302. /**
  57303. * @callback HitAreaCallback
  57304. *
  57305. * @param {any} hitArea - The hit area object.
  57306. * @param {number} x - The translated x coordinate of the hit test event.
  57307. * @param {number} y - The translated y coordinate of the hit test event.
  57308. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that invoked the hit test.
  57309. *
  57310. * @return {boolean} `true` if the coordinates fall within the space of the hitArea, otherwise `false`.
  57311. */
  57312. /**
  57313. * @typedef {object} Phaser.Input.InteractiveObject
  57314. *
  57315. * @property {Phaser.GameObjects.GameObject} gameObject - The Game Object to which this Interactive Object is bound.
  57316. * @property {boolean} enabled - Is this Interactive Object currently enabled for input events?
  57317. * @property {boolean} draggable - Is this Interactive Object draggable? Enable with `InputPlugin.setDraggable`.
  57318. * @property {boolean} dropZone - Is this Interactive Object a drag-targets drop zone? Set when the object is created.
  57319. * @property {(boolean|string)} cursor - Should this Interactive Object change the cursor (via css) when over? (desktop only)
  57320. * @property {?Phaser.GameObjects.GameObject} target - An optional drop target for a draggable Interactive Object.
  57321. * @property {Phaser.Cameras.Scene2D.Camera} camera - The most recent Camera to be tested against this Interactive Object.
  57322. * @property {any} hitArea - The hit area for this Interactive Object. Typically a geometry shape, like a Rectangle or Circle.
  57323. * @property {HitAreaCallback} hitAreaCallback - The 'contains' check callback that the hit area shape will use for all hit tests.
  57324. * @property {number} localX - The x coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  57325. * @property {number} localY - The y coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  57326. * @property {(0|1|2)} dragState - The current drag state of this Interactive Object. 0 = Not being dragged, 1 = being checked for drag, or 2 = being actively dragged.
  57327. * @property {number} dragStartX - The x coordinate that the Pointer started dragging this Interactive Object from.
  57328. * @property {number} dragStartY - The y coordinate that the Pointer started dragging this Interactive Object from.
  57329. * @property {number} dragX - The x coordinate that this Interactive Object is currently being dragged to.
  57330. * @property {number} dragY - The y coordinate that this Interactive Object is currently being dragged to.
  57331. */
  57332. /**
  57333. * Creates a new Interactive Object.
  57334. *
  57335. * This is called automatically by the Input Manager when you enable a Game Object for input.
  57336. *
  57337. * The resulting Interactive Object is mapped to the Game Object's `input` property.
  57338. *
  57339. * @function Phaser.Input.CreateInteractiveObject
  57340. * @since 3.0.0
  57341. *
  57342. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to which this Interactive Object is bound.
  57343. * @param {any} hitArea - The hit area for this Interactive Object. Typically a geometry shape, like a Rectangle or Circle.
  57344. * @param {HitAreaCallback} hitAreaCallback - The 'contains' check callback that the hit area shape will use for all hit tests.
  57345. *
  57346. * @return {Phaser.Input.InteractiveObject} The new Interactive Object.
  57347. */
  57348. var CreateInteractiveObject = function (gameObject, hitArea, hitAreaCallback)
  57349. {
  57350. return {
  57351. gameObject: gameObject,
  57352. enabled: true,
  57353. draggable: false,
  57354. dropZone: false,
  57355. cursor: false,
  57356. target: null,
  57357. camera: null,
  57358. hitArea: hitArea,
  57359. hitAreaCallback: hitAreaCallback,
  57360. localX: 0,
  57361. localY: 0,
  57362. // 0 = Not being dragged
  57363. // 1 = Being checked for dragging
  57364. // 2 = Being dragged
  57365. dragState: 0,
  57366. dragStartX: 0,
  57367. dragStartY: 0,
  57368. dragX: 0,
  57369. dragY: 0
  57370. };
  57371. };
  57372. module.exports = CreateInteractiveObject;
  57373. /***/ }),
  57374. /* 266 */
  57375. /***/ (function(module, exports, __webpack_require__) {
  57376. /**
  57377. * @author Richard Davey <rich@photonstorm.com>
  57378. * @copyright 2019 Photon Storm Ltd.
  57379. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57380. */
  57381. var Point = __webpack_require__(6);
  57382. // The three angle bisectors of a triangle meet in one point called the incenter.
  57383. // It is the center of the incircle, the circle inscribed in the triangle.
  57384. function getLength (x1, y1, x2, y2)
  57385. {
  57386. var x = x1 - x2;
  57387. var y = y1 - y2;
  57388. var magnitude = (x * x) + (y * y);
  57389. return Math.sqrt(magnitude);
  57390. }
  57391. /**
  57392. * Calculates the position of the incenter of a Triangle object. This is the point where its three angle bisectors meet and it's also the center of the incircle, which is the circle inscribed in the triangle.
  57393. *
  57394. * @function Phaser.Geom.Triangle.InCenter
  57395. * @since 3.0.0
  57396. *
  57397. * @generic {Phaser.Geom.Point} O - [out,$return]
  57398. *
  57399. * @param {Phaser.Geom.Triangle} triangle - The Triangle to find the incenter of.
  57400. * @param {Phaser.Geom.Point} [out] - An optional Point in which to store the coordinates.
  57401. *
  57402. * @return {Phaser.Geom.Point} Point (x, y) of the center pixel of the triangle.
  57403. */
  57404. var InCenter = function (triangle, out)
  57405. {
  57406. if (out === undefined) { out = new Point(); }
  57407. var x1 = triangle.x1;
  57408. var y1 = triangle.y1;
  57409. var x2 = triangle.x2;
  57410. var y2 = triangle.y2;
  57411. var x3 = triangle.x3;
  57412. var y3 = triangle.y3;
  57413. var d1 = getLength(x3, y3, x2, y2);
  57414. var d2 = getLength(x1, y1, x3, y3);
  57415. var d3 = getLength(x2, y2, x1, y1);
  57416. var p = d1 + d2 + d3;
  57417. out.x = (x1 * d1 + x2 * d2 + x3 * d3) / p;
  57418. out.y = (y1 * d1 + y2 * d2 + y3 * d3) / p;
  57419. return out;
  57420. };
  57421. module.exports = InCenter;
  57422. /***/ }),
  57423. /* 267 */
  57424. /***/ (function(module, exports) {
  57425. /**
  57426. * @author Richard Davey <rich@photonstorm.com>
  57427. * @copyright 2019 Photon Storm Ltd.
  57428. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57429. */
  57430. /**
  57431. * Moves each point (vertex) of a Triangle by a given offset, thus moving the entire Triangle by that offset.
  57432. *
  57433. * @function Phaser.Geom.Triangle.Offset
  57434. * @since 3.0.0
  57435. *
  57436. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  57437. *
  57438. * @param {Phaser.Geom.Triangle} triangle - The Triangle to move.
  57439. * @param {number} x - The horizontal offset (distance) by which to move each point. Can be positive or negative.
  57440. * @param {number} y - The vertical offset (distance) by which to move each point. Can be positive or negative.
  57441. *
  57442. * @return {Phaser.Geom.Triangle} The modified Triangle.
  57443. */
  57444. var Offset = function (triangle, x, y)
  57445. {
  57446. triangle.x1 += x;
  57447. triangle.y1 += y;
  57448. triangle.x2 += x;
  57449. triangle.y2 += y;
  57450. triangle.x3 += x;
  57451. triangle.y3 += y;
  57452. return triangle;
  57453. };
  57454. module.exports = Offset;
  57455. /***/ }),
  57456. /* 268 */
  57457. /***/ (function(module, exports, __webpack_require__) {
  57458. /**
  57459. * @author Richard Davey <rich@photonstorm.com>
  57460. * @copyright 2019 Photon Storm Ltd.
  57461. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57462. */
  57463. var Point = __webpack_require__(6);
  57464. // The three medians (the lines drawn from the vertices to the bisectors of the opposite sides)
  57465. // meet in the centroid or center of mass (center of gravity).
  57466. // The centroid divides each median in a ratio of 2:1
  57467. /**
  57468. * Calculates the position of a Triangle's centroid, which is also its center of mass (center of gravity).
  57469. *
  57470. * The centroid is the point in a Triangle at which its three medians (the lines drawn from the vertices to the bisectors of the opposite sides) meet. It divides each one in a 2:1 ratio.
  57471. *
  57472. * @function Phaser.Geom.Triangle.Centroid
  57473. * @since 3.0.0
  57474. *
  57475. * @generic {Phaser.Geom.Point} O - [out,$return]
  57476. *
  57477. * @param {Phaser.Geom.Triangle} triangle - The Triangle to use.
  57478. * @param {(Phaser.Geom.Point|object)} [out] - An object to store the coordinates in.
  57479. *
  57480. * @return {(Phaser.Geom.Point|object)} The `out` object with modified `x` and `y` properties, or a new Point if none was provided.
  57481. */
  57482. var Centroid = function (triangle, out)
  57483. {
  57484. if (out === undefined) { out = new Point(); }
  57485. out.x = (triangle.x1 + triangle.x2 + triangle.x3) / 3;
  57486. out.y = (triangle.y1 + triangle.y2 + triangle.y3) / 3;
  57487. return out;
  57488. };
  57489. module.exports = Centroid;
  57490. /***/ }),
  57491. /* 269 */
  57492. /***/ (function(module, exports) {
  57493. /**
  57494. * @author Richard Davey <rich@photonstorm.com>
  57495. * @copyright 2019 Photon Storm Ltd.
  57496. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57497. */
  57498. /**
  57499. * Tests if one rectangle fully contains another.
  57500. *
  57501. * @function Phaser.Geom.Rectangle.ContainsRect
  57502. * @since 3.0.0
  57503. *
  57504. * @param {Phaser.Geom.Rectangle} rectA - The first rectangle.
  57505. * @param {Phaser.Geom.Rectangle} rectB - The second rectangle.
  57506. *
  57507. * @return {boolean} True only if rectA fully contains rectB.
  57508. */
  57509. var ContainsRect = function (rectA, rectB)
  57510. {
  57511. // Volume check (if rectB volume > rectA then rectA cannot contain it)
  57512. if ((rectB.width * rectB.height) > (rectA.width * rectA.height))
  57513. {
  57514. return false;
  57515. }
  57516. return (
  57517. (rectB.x > rectA.x && rectB.x < rectA.right) &&
  57518. (rectB.right > rectA.x && rectB.right < rectA.right) &&
  57519. (rectB.y > rectA.y && rectB.y < rectA.bottom) &&
  57520. (rectB.bottom > rectA.y && rectB.bottom < rectA.bottom)
  57521. );
  57522. };
  57523. module.exports = ContainsRect;
  57524. /***/ }),
  57525. /* 270 */
  57526. /***/ (function(module, exports, __webpack_require__) {
  57527. /**
  57528. * @author Richard Davey <rich@photonstorm.com>
  57529. * @copyright 2019 Photon Storm Ltd.
  57530. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57531. */
  57532. var Rectangle = __webpack_require__(10);
  57533. Rectangle.Area = __webpack_require__(675);
  57534. Rectangle.Ceil = __webpack_require__(674);
  57535. Rectangle.CeilAll = __webpack_require__(673);
  57536. Rectangle.CenterOn = __webpack_require__(189);
  57537. Rectangle.Clone = __webpack_require__(672);
  57538. Rectangle.Contains = __webpack_require__(42);
  57539. Rectangle.ContainsPoint = __webpack_require__(671);
  57540. Rectangle.ContainsRect = __webpack_require__(269);
  57541. Rectangle.CopyFrom = __webpack_require__(670);
  57542. Rectangle.Decompose = __webpack_require__(275);
  57543. Rectangle.Equals = __webpack_require__(669);
  57544. Rectangle.FitInside = __webpack_require__(668);
  57545. Rectangle.FitOutside = __webpack_require__(667);
  57546. Rectangle.Floor = __webpack_require__(666);
  57547. Rectangle.FloorAll = __webpack_require__(665);
  57548. Rectangle.FromPoints = __webpack_require__(180);
  57549. Rectangle.GetAspectRatio = __webpack_require__(155);
  57550. Rectangle.GetCenter = __webpack_require__(664);
  57551. Rectangle.GetPoint = __webpack_require__(204);
  57552. Rectangle.GetPoints = __webpack_require__(430);
  57553. Rectangle.GetSize = __webpack_require__(663);
  57554. Rectangle.Inflate = __webpack_require__(662);
  57555. Rectangle.Intersection = __webpack_require__(661);
  57556. Rectangle.MarchingAnts = __webpack_require__(419);
  57557. Rectangle.MergePoints = __webpack_require__(660);
  57558. Rectangle.MergeRect = __webpack_require__(659);
  57559. Rectangle.MergeXY = __webpack_require__(658);
  57560. Rectangle.Offset = __webpack_require__(657);
  57561. Rectangle.OffsetPoint = __webpack_require__(656);
  57562. Rectangle.Overlaps = __webpack_require__(655);
  57563. Rectangle.Perimeter = __webpack_require__(135);
  57564. Rectangle.PerimeterPoint = __webpack_require__(654);
  57565. Rectangle.Random = __webpack_require__(201);
  57566. Rectangle.RandomOutside = __webpack_require__(653);
  57567. Rectangle.SameDimensions = __webpack_require__(652);
  57568. Rectangle.Scale = __webpack_require__(651);
  57569. Rectangle.Union = __webpack_require__(313);
  57570. module.exports = Rectangle;
  57571. /***/ }),
  57572. /* 271 */
  57573. /***/ (function(module, exports) {
  57574. /**
  57575. * @author Richard Davey <rich@photonstorm.com>
  57576. * @copyright 2019 Photon Storm Ltd.
  57577. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57578. */
  57579. /**
  57580. * Calculates the square of magnitude of given point.(Can be used for fast magnitude calculation of point)
  57581. *
  57582. * @function Phaser.Geom.Point.GetMagnitudeSq
  57583. * @since 3.0.0
  57584. *
  57585. * @param {Phaser.Geom.Point} point - Returns square of the magnitude/length of given point.
  57586. *
  57587. * @return {number} Returns square of the magnitude of given point.
  57588. */
  57589. var GetMagnitudeSq = function (point)
  57590. {
  57591. return (point.x * point.x) + (point.y * point.y);
  57592. };
  57593. module.exports = GetMagnitudeSq;
  57594. /***/ }),
  57595. /* 272 */
  57596. /***/ (function(module, exports) {
  57597. /**
  57598. * @author Richard Davey <rich@photonstorm.com>
  57599. * @copyright 2019 Photon Storm Ltd.
  57600. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57601. */
  57602. /**
  57603. * Calculate the magnitude of the point, which equivalent to the length of the line from the origin to this point.
  57604. *
  57605. * @function Phaser.Geom.Point.GetMagnitude
  57606. * @since 3.0.0
  57607. *
  57608. * @param {Phaser.Geom.Point} point - The point to calculate the magnitude for
  57609. *
  57610. * @return {number} The resulting magnitude
  57611. */
  57612. var GetMagnitude = function (point)
  57613. {
  57614. return Math.sqrt((point.x * point.x) + (point.y * point.y));
  57615. };
  57616. module.exports = GetMagnitude;
  57617. /***/ }),
  57618. /* 273 */
  57619. /***/ (function(module, exports, __webpack_require__) {
  57620. /**
  57621. * @author Richard Davey <rich@photonstorm.com>
  57622. * @copyright 2019 Photon Storm Ltd.
  57623. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57624. */
  57625. var MATH_CONST = __webpack_require__(20);
  57626. var Wrap = __webpack_require__(57);
  57627. var Angle = __webpack_require__(73);
  57628. /**
  57629. * Get the angle of the normal of the given line in radians.
  57630. *
  57631. * @function Phaser.Geom.Line.NormalAngle
  57632. * @since 3.0.0
  57633. *
  57634. * @param {Phaser.Geom.Line} line - The line to calculate the angle of the normal of.
  57635. *
  57636. * @return {number} The angle of the normal of the line in radians.
  57637. */
  57638. var NormalAngle = function (line)
  57639. {
  57640. var angle = Angle(line) - MATH_CONST.TAU;
  57641. return Wrap(angle, -Math.PI, Math.PI);
  57642. };
  57643. module.exports = NormalAngle;
  57644. /***/ }),
  57645. /* 274 */
  57646. /***/ (function(module, exports) {
  57647. /**
  57648. * @author Richard Davey <rich@photonstorm.com>
  57649. * @copyright 2019 Photon Storm Ltd.
  57650. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57651. */
  57652. /**
  57653. * Decomposes a Triangle into an array of its points.
  57654. *
  57655. * @function Phaser.Geom.Triangle.Decompose
  57656. * @since 3.0.0
  57657. *
  57658. * @param {Phaser.Geom.Triangle} triangle - The Triangle to decompose.
  57659. * @param {array} [out] - An array to store the points into.
  57660. *
  57661. * @return {array} The provided `out` array, or a new array if none was provided, with three objects with `x` and `y` properties representing each point of the Triangle appended to it.
  57662. */
  57663. var Decompose = function (triangle, out)
  57664. {
  57665. if (out === undefined) { out = []; }
  57666. out.push({ x: triangle.x1, y: triangle.y1 });
  57667. out.push({ x: triangle.x2, y: triangle.y2 });
  57668. out.push({ x: triangle.x3, y: triangle.y3 });
  57669. return out;
  57670. };
  57671. module.exports = Decompose;
  57672. /***/ }),
  57673. /* 275 */
  57674. /***/ (function(module, exports) {
  57675. /**
  57676. * @author Richard Davey <rich@photonstorm.com>
  57677. * @copyright 2019 Photon Storm Ltd.
  57678. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57679. */
  57680. /**
  57681. * Create an array of points for each corner of a Rectangle
  57682. * If an array is specified, each point object will be added to the end of the array, otherwise a new array will be created.
  57683. *
  57684. * @function Phaser.Geom.Rectangle.Decompose
  57685. * @since 3.0.0
  57686. *
  57687. * @param {Phaser.Geom.Rectangle} rect - The Rectangle object to be decomposed.
  57688. * @param {array} [out] - If provided, each point will be added to this array.
  57689. *
  57690. * @return {array} Will return the array you specified or a new array containing the points of the Rectangle.
  57691. */
  57692. var Decompose = function (rect, out)
  57693. {
  57694. if (out === undefined) { out = []; }
  57695. out.push({ x: rect.x, y: rect.y });
  57696. out.push({ x: rect.right, y: rect.y });
  57697. out.push({ x: rect.right, y: rect.bottom });
  57698. out.push({ x: rect.x, y: rect.bottom });
  57699. return out;
  57700. };
  57701. module.exports = Decompose;
  57702. /***/ }),
  57703. /* 276 */
  57704. /***/ (function(module, exports) {
  57705. /**
  57706. * @author Richard Davey <rich@photonstorm.com>
  57707. * @author Florian Mertens
  57708. * @copyright 2019 Photon Storm Ltd.
  57709. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57710. */
  57711. /**
  57712. * Checks if the a Point falls between the two end-points of a Line, based on the given line thickness.
  57713. *
  57714. * Assumes that the line end points are circular, not square.
  57715. *
  57716. * @function Phaser.Geom.Intersects.PointToLine
  57717. * @since 3.0.0
  57718. *
  57719. * @param {(Phaser.Geom.Point|any)} point - The point, or point-like object to check.
  57720. * @param {Phaser.Geom.Line} line - The line segment to test for intersection on.
  57721. * @param {number} [lineThickness=1] - The line thickness. Assumes that the line end points are circular.
  57722. *
  57723. * @return {boolean} `true` if the Point falls on the Line, otherwise `false`.
  57724. */
  57725. var PointToLine = function (point, line, lineThickness)
  57726. {
  57727. if (lineThickness === undefined) { lineThickness = 1; }
  57728. var x1 = line.x1;
  57729. var y1 = line.y1;
  57730. var x2 = line.x2;
  57731. var y2 = line.y2;
  57732. var px = point.x;
  57733. var py = point.y;
  57734. var L2 = (((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
  57735. if (L2 === 0)
  57736. {
  57737. return false;
  57738. }
  57739. var r = (((px - x1) * (x2 - x1)) + ((py - y1) * (y2 - y1))) / L2;
  57740. // Assume line thickness is circular
  57741. if (r < 0)
  57742. {
  57743. // Outside line1
  57744. return (Math.sqrt(((x1 - px) * (x1 - px)) + ((y1 - py) * (y1 - py))) <= lineThickness);
  57745. }
  57746. else if ((r >= 0) && (r <= 1))
  57747. {
  57748. // On the line segment
  57749. var s = (((y1 - py) * (x2 - x1)) - ((x1 - px) * (y2 - y1))) / L2;
  57750. return (Math.abs(s) * Math.sqrt(L2) <= lineThickness);
  57751. }
  57752. else
  57753. {
  57754. // Outside line2
  57755. return (Math.sqrt(((x2 - px) * (x2 - px)) + ((y2 - py) * (y2 - py))) <= lineThickness);
  57756. }
  57757. };
  57758. module.exports = PointToLine;
  57759. /***/ }),
  57760. /* 277 */
  57761. /***/ (function(module, exports, __webpack_require__) {
  57762. /**
  57763. * @author Richard Davey <rich@photonstorm.com>
  57764. * @copyright 2019 Photon Storm Ltd.
  57765. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57766. */
  57767. var Contains = __webpack_require__(43);
  57768. var Point = __webpack_require__(6);
  57769. var tmp = new Point();
  57770. /**
  57771. * Checks for intersection between the line segment and circle.
  57772. *
  57773. * Based on code by [Matt DesLauriers](https://github.com/mattdesl/line-circle-collision/blob/master/LICENSE.md).
  57774. *
  57775. * @function Phaser.Geom.Intersects.LineToCircle
  57776. * @since 3.0.0
  57777. *
  57778. * @param {Phaser.Geom.Line} line - The line segment to check.
  57779. * @param {Phaser.Geom.Circle} circle - The circle to check against the line.
  57780. * @param {(Phaser.Geom.Point|any)} [nearest] - An optional Point-like object. If given the closest point on the Line where the circle intersects will be stored in this object.
  57781. *
  57782. * @return {boolean} `true` if the two objects intersect, otherwise `false`.
  57783. */
  57784. var LineToCircle = function (line, circle, nearest)
  57785. {
  57786. if (nearest === undefined) { nearest = tmp; }
  57787. if (Contains(circle, line.x1, line.y1))
  57788. {
  57789. nearest.x = line.x1;
  57790. nearest.y = line.y1;
  57791. return true;
  57792. }
  57793. if (Contains(circle, line.x2, line.y2))
  57794. {
  57795. nearest.x = line.x2;
  57796. nearest.y = line.y2;
  57797. return true;
  57798. }
  57799. var dx = line.x2 - line.x1;
  57800. var dy = line.y2 - line.y1;
  57801. var lcx = circle.x - line.x1;
  57802. var lcy = circle.y - line.y1;
  57803. // project lc onto d, resulting in vector p
  57804. var dLen2 = (dx * dx) + (dy * dy);
  57805. var px = dx;
  57806. var py = dy;
  57807. if (dLen2 > 0)
  57808. {
  57809. var dp = ((lcx * dx) + (lcy * dy)) / dLen2;
  57810. px *= dp;
  57811. py *= dp;
  57812. }
  57813. nearest.x = line.x1 + px;
  57814. nearest.y = line.y1 + py;
  57815. // len2 of p
  57816. var pLen2 = (px * px) + (py * py);
  57817. return (
  57818. pLen2 <= dLen2 &&
  57819. ((px * dx) + (py * dy)) >= 0 &&
  57820. Contains(circle, nearest.x, nearest.y)
  57821. );
  57822. };
  57823. module.exports = LineToCircle;
  57824. /***/ }),
  57825. /* 278 */
  57826. /***/ (function(module, exports, __webpack_require__) {
  57827. /**
  57828. * @author Richard Davey <rich@photonstorm.com>
  57829. * @copyright 2019 Photon Storm Ltd.
  57830. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57831. */
  57832. /**
  57833. * @namespace Phaser.Geom.Intersects
  57834. */
  57835. module.exports = {
  57836. CircleToCircle: __webpack_require__(725),
  57837. CircleToRectangle: __webpack_require__(724),
  57838. GetRectangleIntersection: __webpack_require__(723),
  57839. LineToCircle: __webpack_require__(277),
  57840. LineToLine: __webpack_require__(115),
  57841. LineToRectangle: __webpack_require__(722),
  57842. PointToLine: __webpack_require__(276),
  57843. PointToLineSegment: __webpack_require__(721),
  57844. RectangleToRectangle: __webpack_require__(158),
  57845. RectangleToTriangle: __webpack_require__(720),
  57846. RectangleToValues: __webpack_require__(719),
  57847. TriangleToCircle: __webpack_require__(718),
  57848. TriangleToLine: __webpack_require__(717),
  57849. TriangleToTriangle: __webpack_require__(716)
  57850. };
  57851. /***/ }),
  57852. /* 279 */
  57853. /***/ (function(module, exports, __webpack_require__) {
  57854. /**
  57855. * @author Richard Davey <rich@photonstorm.com>
  57856. * @copyright 2019 Photon Storm Ltd.
  57857. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57858. */
  57859. /**
  57860. * @namespace Phaser.Geom
  57861. */
  57862. module.exports = {
  57863. Circle: __webpack_require__(745),
  57864. Ellipse: __webpack_require__(735),
  57865. Intersects: __webpack_require__(278),
  57866. Line: __webpack_require__(715),
  57867. Point: __webpack_require__(694),
  57868. Polygon: __webpack_require__(680),
  57869. Rectangle: __webpack_require__(270),
  57870. Triangle: __webpack_require__(650)
  57871. };
  57872. /***/ }),
  57873. /* 280 */
  57874. /***/ (function(module, exports, __webpack_require__) {
  57875. /**
  57876. * @author Richard Davey <rich@photonstorm.com>
  57877. * @copyright 2019 Photon Storm Ltd.
  57878. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57879. */
  57880. var Class = __webpack_require__(0);
  57881. var Light = __webpack_require__(281);
  57882. var Utils = __webpack_require__(9);
  57883. /**
  57884. * @callback LightForEach
  57885. *
  57886. * @param {Phaser.GameObjects.Light} light - The Light.
  57887. */
  57888. /**
  57889. * @classdesc
  57890. * Manages Lights for a Scene.
  57891. *
  57892. * Affects the rendering of Game Objects using the `Light2D` pipeline.
  57893. *
  57894. * @class LightsManager
  57895. * @memberof Phaser.GameObjects
  57896. * @constructor
  57897. * @since 3.0.0
  57898. */
  57899. var LightsManager = new Class({
  57900. initialize:
  57901. function LightsManager ()
  57902. {
  57903. /**
  57904. * The pool of Lights.
  57905. *
  57906. * Used to recycle removed Lights for a more efficient use of memory.
  57907. *
  57908. * @name Phaser.GameObjects.LightsManager#lightPool
  57909. * @type {Phaser.GameObjects.Light[]}
  57910. * @default []
  57911. * @since 3.0.0
  57912. */
  57913. this.lightPool = [];
  57914. /**
  57915. * The Lights in the Scene.
  57916. *
  57917. * @name Phaser.GameObjects.LightsManager#lights
  57918. * @type {Phaser.GameObjects.Light[]}
  57919. * @default []
  57920. * @since 3.0.0
  57921. */
  57922. this.lights = [];
  57923. /**
  57924. * Lights that have been culled from a Camera's viewport.
  57925. *
  57926. * Lights in this list will not be rendered.
  57927. *
  57928. * @name Phaser.GameObjects.LightsManager#culledLights
  57929. * @type {Phaser.GameObjects.Light[]}
  57930. * @default []
  57931. * @since 3.0.0
  57932. */
  57933. this.culledLights = [];
  57934. /**
  57935. * The ambient color.
  57936. *
  57937. * @name Phaser.GameObjects.LightsManager#ambientColor
  57938. * @type {{ r: number, g: number, b: number }}
  57939. * @since 3.0.0
  57940. */
  57941. this.ambientColor = { r: 0.1, g: 0.1, b: 0.1 };
  57942. /**
  57943. * Whether the Lights Manager is enabled.
  57944. *
  57945. * @name Phaser.GameObjects.LightsManager#active
  57946. * @type {boolean}
  57947. * @default false
  57948. * @since 3.0.0
  57949. */
  57950. this.active = false;
  57951. /**
  57952. * The maximum number of lights that a single Camera and the lights shader can process.
  57953. * Change this via the `maxLights` property in your game config, as it cannot be changed at runtime.
  57954. *
  57955. * @name Phaser.GameObjects.LightsManager#maxLights
  57956. * @type {integer}
  57957. * @readonly
  57958. * @since 3.15.0
  57959. */
  57960. this.maxLights = -1;
  57961. },
  57962. /**
  57963. * Enable the Lights Manager.
  57964. *
  57965. * @method Phaser.GameObjects.LightsManager#enable
  57966. * @since 3.0.0
  57967. *
  57968. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  57969. */
  57970. enable: function ()
  57971. {
  57972. if (this.maxLights === -1)
  57973. {
  57974. this.maxLights = this.scene.sys.game.renderer.config.maxLights;
  57975. }
  57976. this.active = true;
  57977. return this;
  57978. },
  57979. /**
  57980. * Disable the Lights Manager.
  57981. *
  57982. * @method Phaser.GameObjects.LightsManager#disable
  57983. * @since 3.0.0
  57984. *
  57985. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  57986. */
  57987. disable: function ()
  57988. {
  57989. this.active = false;
  57990. return this;
  57991. },
  57992. /**
  57993. * Cull any Lights that aren't visible to the given Camera.
  57994. *
  57995. * Culling Lights improves performance by ensuring that only Lights within a Camera's viewport are rendered.
  57996. *
  57997. * @method Phaser.GameObjects.LightsManager#cull
  57998. * @since 3.0.0
  57999. *
  58000. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to cull Lights for.
  58001. *
  58002. * @return {Phaser.GameObjects.Light[]} The culled Lights.
  58003. */
  58004. cull: function (camera)
  58005. {
  58006. var lights = this.lights;
  58007. var culledLights = this.culledLights;
  58008. var length = lights.length;
  58009. var cameraCenterX = camera.x + camera.width / 2.0;
  58010. var cameraCenterY = camera.y + camera.height / 2.0;
  58011. var cameraRadius = (camera.width + camera.height) / 2.0;
  58012. var point = { x: 0, y: 0 };
  58013. var cameraMatrix = camera.matrix;
  58014. var viewportHeight = this.systems.game.config.height;
  58015. culledLights.length = 0;
  58016. for (var index = 0; index < length && culledLights.length < this.maxLights; index++)
  58017. {
  58018. var light = lights[index];
  58019. cameraMatrix.transformPoint(light.x, light.y, point);
  58020. // We'll just use bounding spheres to test if lights should be rendered
  58021. var dx = cameraCenterX - (point.x - (camera.scrollX * light.scrollFactorX * camera.zoom));
  58022. var dy = cameraCenterY - (viewportHeight - (point.y - (camera.scrollY * light.scrollFactorY) * camera.zoom));
  58023. var distance = Math.sqrt(dx * dx + dy * dy);
  58024. if (distance < light.radius + cameraRadius)
  58025. {
  58026. culledLights.push(lights[index]);
  58027. }
  58028. }
  58029. return culledLights;
  58030. },
  58031. /**
  58032. * Iterate over each Light with a callback.
  58033. *
  58034. * @method Phaser.GameObjects.LightsManager#forEachLight
  58035. * @since 3.0.0
  58036. *
  58037. * @param {LightForEach} callback - The callback that is called with each Light.
  58038. *
  58039. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  58040. */
  58041. forEachLight: function (callback)
  58042. {
  58043. if (!callback)
  58044. {
  58045. return;
  58046. }
  58047. var lights = this.lights;
  58048. var length = lights.length;
  58049. for (var index = 0; index < length; ++index)
  58050. {
  58051. callback(lights[index]);
  58052. }
  58053. return this;
  58054. },
  58055. /**
  58056. * Set the ambient light color.
  58057. *
  58058. * @method Phaser.GameObjects.LightsManager#setAmbientColor
  58059. * @since 3.0.0
  58060. *
  58061. * @param {number} rgb - The integer RGB color of the ambient light.
  58062. *
  58063. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  58064. */
  58065. setAmbientColor: function (rgb)
  58066. {
  58067. var color = Utils.getFloatsFromUintRGB(rgb);
  58068. this.ambientColor.r = color[0];
  58069. this.ambientColor.g = color[1];
  58070. this.ambientColor.b = color[2];
  58071. return this;
  58072. },
  58073. /**
  58074. * Returns the maximum number of Lights allowed to appear at once.
  58075. *
  58076. * @method Phaser.GameObjects.LightsManager#getMaxVisibleLights
  58077. * @since 3.0.0
  58078. *
  58079. * @return {integer} The maximum number of Lights allowed to appear at once.
  58080. */
  58081. getMaxVisibleLights: function ()
  58082. {
  58083. return 10;
  58084. },
  58085. /**
  58086. * Get the number of Lights managed by this Lights Manager.
  58087. *
  58088. * @method Phaser.GameObjects.LightsManager#getLightCount
  58089. * @since 3.0.0
  58090. *
  58091. * @return {integer} The number of Lights managed by this Lights Manager.
  58092. */
  58093. getLightCount: function ()
  58094. {
  58095. return this.lights.length;
  58096. },
  58097. /**
  58098. * Add a Light.
  58099. *
  58100. * @method Phaser.GameObjects.LightsManager#addLight
  58101. * @since 3.0.0
  58102. *
  58103. * @param {number} [x=0] - The horizontal position of the Light.
  58104. * @param {number} [y=0] - The vertical position of the Light.
  58105. * @param {number} [radius=100] - The radius of the Light.
  58106. * @param {number} [rgb=0xffffff] - The integer RGB color of the light.
  58107. * @param {number} [intensity=1] - The intensity of the Light.
  58108. *
  58109. * @return {Phaser.GameObjects.Light} The Light that was added.
  58110. */
  58111. addLight: function (x, y, radius, rgb, intensity)
  58112. {
  58113. var color = null;
  58114. var light = null;
  58115. x = (x === undefined) ? 0.0 : x;
  58116. y = (y === undefined) ? 0.0 : y;
  58117. rgb = (rgb === undefined) ? 0xffffff : rgb;
  58118. radius = (radius === undefined) ? 100.0 : radius;
  58119. intensity = (intensity === undefined) ? 1.0 : intensity;
  58120. color = Utils.getFloatsFromUintRGB(rgb);
  58121. light = null;
  58122. if (this.lightPool.length > 0)
  58123. {
  58124. light = this.lightPool.pop();
  58125. light.set(x, y, radius, color[0], color[1], color[2], intensity);
  58126. }
  58127. else
  58128. {
  58129. light = new Light(x, y, radius, color[0], color[1], color[2], intensity);
  58130. }
  58131. this.lights.push(light);
  58132. return light;
  58133. },
  58134. /**
  58135. * Remove a Light.
  58136. *
  58137. * @method Phaser.GameObjects.LightsManager#removeLight
  58138. * @since 3.0.0
  58139. *
  58140. * @param {Phaser.GameObjects.Light} light - The Light to remove.
  58141. *
  58142. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  58143. */
  58144. removeLight: function (light)
  58145. {
  58146. var index = this.lights.indexOf(light);
  58147. if (index >= 0)
  58148. {
  58149. this.lightPool.push(light);
  58150. this.lights.splice(index, 1);
  58151. }
  58152. return this;
  58153. },
  58154. /**
  58155. * Shut down the Lights Manager.
  58156. *
  58157. * Recycles all active Lights into the Light pool, resets ambient light color and clears the lists of Lights and
  58158. * culled Lights.
  58159. *
  58160. * @method Phaser.GameObjects.LightsManager#shutdown
  58161. * @since 3.0.0
  58162. */
  58163. shutdown: function ()
  58164. {
  58165. while (this.lights.length > 0)
  58166. {
  58167. this.lightPool.push(this.lights.pop());
  58168. }
  58169. this.ambientColor = { r: 0.1, g: 0.1, b: 0.1 };
  58170. this.culledLights.length = 0;
  58171. this.lights.length = 0;
  58172. },
  58173. /**
  58174. * Destroy the Lights Manager.
  58175. *
  58176. * Cleans up all references by calling {@link Phaser.GameObjects.LightsManager#shutdown}.
  58177. *
  58178. * @method Phaser.GameObjects.LightsManager#destroy
  58179. * @since 3.0.0
  58180. */
  58181. destroy: function ()
  58182. {
  58183. this.shutdown();
  58184. }
  58185. });
  58186. module.exports = LightsManager;
  58187. /***/ }),
  58188. /* 281 */
  58189. /***/ (function(module, exports, __webpack_require__) {
  58190. /**
  58191. * @author Richard Davey <rich@photonstorm.com>
  58192. * @copyright 2019 Photon Storm Ltd.
  58193. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  58194. */
  58195. var Class = __webpack_require__(0);
  58196. var Utils = __webpack_require__(9);
  58197. /**
  58198. * @classdesc
  58199. * A 2D point light.
  58200. *
  58201. * These are typically created by a {@link Phaser.GameObjects.LightsManager}, available from within a scene via `this.lights`.
  58202. *
  58203. * Any Game Objects using the Light2D pipeline will then be affected by these Lights.
  58204. *
  58205. * They can also simply be used to represent a point light for your own purposes.
  58206. *
  58207. * @class Light
  58208. * @memberof Phaser.GameObjects
  58209. * @constructor
  58210. * @since 3.0.0
  58211. *
  58212. * @param {number} x - The horizontal position of the light.
  58213. * @param {number} y - The vertical position of the light.
  58214. * @param {number} radius - The radius of the light.
  58215. * @param {number} r - The red color of the light. A value between 0 and 1.
  58216. * @param {number} g - The green color of the light. A value between 0 and 1.
  58217. * @param {number} b - The blue color of the light. A value between 0 and 1.
  58218. * @param {number} intensity - The intensity of the light.
  58219. */
  58220. var Light = new Class({
  58221. initialize:
  58222. function Light (x, y, radius, r, g, b, intensity)
  58223. {
  58224. /**
  58225. * The horizontal position of the light.
  58226. *
  58227. * @name Phaser.GameObjects.Light#x
  58228. * @type {number}
  58229. * @since 3.0.0
  58230. */
  58231. this.x = x;
  58232. /**
  58233. * The vertical position of the light.
  58234. *
  58235. * @name Phaser.GameObjects.Light#y
  58236. * @type {number}
  58237. * @since 3.0.0
  58238. */
  58239. this.y = y;
  58240. /**
  58241. * The radius of the light.
  58242. *
  58243. * @name Phaser.GameObjects.Light#radius
  58244. * @type {number}
  58245. * @since 3.0.0
  58246. */
  58247. this.radius = radius;
  58248. /**
  58249. * The red color of the light. A value between 0 and 1.
  58250. *
  58251. * @name Phaser.GameObjects.Light#r
  58252. * @type {number}
  58253. * @since 3.0.0
  58254. */
  58255. this.r = r;
  58256. /**
  58257. * The green color of the light. A value between 0 and 1.
  58258. *
  58259. * @name Phaser.GameObjects.Light#g
  58260. * @type {number}
  58261. * @since 3.0.0
  58262. */
  58263. this.g = g;
  58264. /**
  58265. * The blue color of the light. A value between 0 and 1.
  58266. *
  58267. * @name Phaser.GameObjects.Light#b
  58268. * @type {number}
  58269. * @since 3.0.0
  58270. */
  58271. this.b = b;
  58272. /**
  58273. * The intensity of the light.
  58274. *
  58275. * @name Phaser.GameObjects.Light#intensity
  58276. * @type {number}
  58277. * @since 3.0.0
  58278. */
  58279. this.intensity = intensity;
  58280. /**
  58281. * The horizontal scroll factor of the light.
  58282. *
  58283. * @name Phaser.GameObjects.Light#scrollFactorX
  58284. * @type {number}
  58285. * @since 3.0.0
  58286. */
  58287. this.scrollFactorX = 1.0;
  58288. /**
  58289. * The vertical scroll factor of the light.
  58290. *
  58291. * @name Phaser.GameObjects.Light#scrollFactorY
  58292. * @type {number}
  58293. * @since 3.0.0
  58294. */
  58295. this.scrollFactorY = 1.0;
  58296. },
  58297. /**
  58298. * Set the properties of the light.
  58299. *
  58300. * Sets both horizontal and vertical scroll factor to 1. Use {@link Phaser.GameObjects.Light#setScrollFactor} to set
  58301. * the scroll factor.
  58302. *
  58303. * @method Phaser.GameObjects.Light#set
  58304. * @since 3.0.0
  58305. *
  58306. * @param {number} x - The horizontal position of the light.
  58307. * @param {number} y - The vertical position of the light.
  58308. * @param {number} radius - The radius of the light.
  58309. * @param {number} r - The red color. A value between 0 and 1.
  58310. * @param {number} g - The green color. A value between 0 and 1.
  58311. * @param {number} b - The blue color. A value between 0 and 1.
  58312. * @param {number} intensity - The intensity of the light.
  58313. *
  58314. * @return {Phaser.GameObjects.Light} This Light object.
  58315. */
  58316. set: function (x, y, radius, r, g, b, intensity)
  58317. {
  58318. this.x = x;
  58319. this.y = y;
  58320. this.radius = radius;
  58321. this.r = r;
  58322. this.g = g;
  58323. this.b = b;
  58324. this.intensity = intensity;
  58325. this.scrollFactorX = 1;
  58326. this.scrollFactorY = 1;
  58327. return this;
  58328. },
  58329. /**
  58330. * Set the scroll factor of the light.
  58331. *
  58332. * @method Phaser.GameObjects.Light#setScrollFactor
  58333. * @since 3.0.0
  58334. *
  58335. * @param {number} x - The horizontal scroll factor of the light.
  58336. * @param {number} y - The vertical scroll factor of the light.
  58337. *
  58338. * @return {Phaser.GameObjects.Light} This Light object.
  58339. */
  58340. setScrollFactor: function (x, y)
  58341. {
  58342. if (x === undefined) { x = 1; }
  58343. if (y === undefined) { y = x; }
  58344. this.scrollFactorX = x;
  58345. this.scrollFactorY = y;
  58346. return this;
  58347. },
  58348. /**
  58349. * Set the color of the light from a single integer RGB value.
  58350. *
  58351. * @method Phaser.GameObjects.Light#setColor
  58352. * @since 3.0.0
  58353. *
  58354. * @param {number} rgb - The integer RGB color of the light.
  58355. *
  58356. * @return {Phaser.GameObjects.Light} This Light object.
  58357. */
  58358. setColor: function (rgb)
  58359. {
  58360. var color = Utils.getFloatsFromUintRGB(rgb);
  58361. this.r = color[0];
  58362. this.g = color[1];
  58363. this.b = color[2];
  58364. return this;
  58365. },
  58366. /**
  58367. * Set the intensity of the light.
  58368. *
  58369. * @method Phaser.GameObjects.Light#setIntensity
  58370. * @since 3.0.0
  58371. *
  58372. * @param {number} intensity - The intensity of the light.
  58373. *
  58374. * @return {Phaser.GameObjects.Light} This Light object.
  58375. */
  58376. setIntensity: function (intensity)
  58377. {
  58378. this.intensity = intensity;
  58379. return this;
  58380. },
  58381. /**
  58382. * Set the position of the light.
  58383. *
  58384. * @method Phaser.GameObjects.Light#setPosition
  58385. * @since 3.0.0
  58386. *
  58387. * @param {number} x - The horizontal position of the light.
  58388. * @param {number} y - The vertical position of the light.
  58389. *
  58390. * @return {Phaser.GameObjects.Light} This Light object.
  58391. */
  58392. setPosition: function (x, y)
  58393. {
  58394. this.x = x;
  58395. this.y = y;
  58396. return this;
  58397. },
  58398. /**
  58399. * Set the radius of the light.
  58400. *
  58401. * @method Phaser.GameObjects.Light#setRadius
  58402. * @since 3.0.0
  58403. *
  58404. * @param {number} radius - The radius of the light.
  58405. *
  58406. * @return {Phaser.GameObjects.Light} This Light object.
  58407. */
  58408. setRadius: function (radius)
  58409. {
  58410. this.radius = radius;
  58411. return this;
  58412. }
  58413. });
  58414. module.exports = Light;
  58415. /***/ }),
  58416. /* 282 */
  58417. /***/ (function(module, exports, __webpack_require__) {
  58418. /**
  58419. * @author Richard Davey <rich@photonstorm.com>
  58420. * @copyright 2019 Photon Storm Ltd.
  58421. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  58422. */
  58423. var Length = __webpack_require__(58);
  58424. var Point = __webpack_require__(6);
  58425. /**
  58426. * Returns an array of evenly spaced points on the perimeter of a Triangle.
  58427. *
  58428. * @function Phaser.Geom.Triangle.GetPoints
  58429. * @since 3.0.0
  58430. *
  58431. * @generic {Phaser.Geom.Point} O - [out,$return]
  58432. *
  58433. * @param {Phaser.Geom.Triangle} triangle - The Triangle to get the points from.
  58434. * @param {integer} quantity - The number of evenly spaced points to return. Set to 0 to return an arbitrary number of points based on the `stepRate`.
  58435. * @param {number} stepRate - If `quantity` is 0, the distance between each returned point.
  58436. * @param {(array|Phaser.Geom.Point[])} [out] - An array to which the points should be appended.
  58437. *
  58438. * @return {(array|Phaser.Geom.Point[])} The modified `out` array, or a new array if none was provided.
  58439. */
  58440. var GetPoints = function (triangle, quantity, stepRate, out)
  58441. {
  58442. if (out === undefined) { out = []; }
  58443. var line1 = triangle.getLineA();
  58444. var line2 = triangle.getLineB();
  58445. var line3 = triangle.getLineC();
  58446. var length1 = Length(line1);
  58447. var length2 = Length(line2);
  58448. var length3 = Length(line3);
  58449. var perimeter = length1 + length2 + length3;
  58450. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  58451. if (!quantity)
  58452. {
  58453. quantity = perimeter / stepRate;
  58454. }
  58455. for (var i = 0; i < quantity; i++)
  58456. {
  58457. var p = perimeter * (i / quantity);
  58458. var localPosition = 0;
  58459. var point = new Point();
  58460. // Which line is it on?
  58461. if (p < length1)
  58462. {
  58463. // Line 1
  58464. localPosition = p / length1;
  58465. point.x = line1.x1 + (line1.x2 - line1.x1) * localPosition;
  58466. point.y = line1.y1 + (line1.y2 - line1.y1) * localPosition;
  58467. }
  58468. else if (p > length1 + length2)
  58469. {
  58470. // Line 3
  58471. p -= length1 + length2;
  58472. localPosition = p / length3;
  58473. point.x = line3.x1 + (line3.x2 - line3.x1) * localPosition;
  58474. point.y = line3.y1 + (line3.y2 - line3.y1) * localPosition;
  58475. }
  58476. else
  58477. {
  58478. // Line 2
  58479. p -= length1;
  58480. localPosition = p / length2;
  58481. point.x = line2.x1 + (line2.x2 - line2.x1) * localPosition;
  58482. point.y = line2.y1 + (line2.y2 - line2.y1) * localPosition;
  58483. }
  58484. out.push(point);
  58485. }
  58486. return out;
  58487. };
  58488. module.exports = GetPoints;
  58489. /***/ }),
  58490. /* 283 */
  58491. /***/ (function(module, exports, __webpack_require__) {
  58492. /**
  58493. * @author Richard Davey <rich@photonstorm.com>
  58494. * @copyright 2019 Photon Storm Ltd.
  58495. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  58496. */
  58497. var Point = __webpack_require__(6);
  58498. var Length = __webpack_require__(58);
  58499. /**
  58500. * Returns a Point from around the perimeter of a Triangle.
  58501. *
  58502. * @function Phaser.Geom.Triangle.GetPoint
  58503. * @since 3.0.0
  58504. *
  58505. * @generic {Phaser.Geom.Point} O - [out,$return]
  58506. *
  58507. * @param {Phaser.Geom.Triangle} triangle - The Triangle to get the point on its perimeter from.
  58508. * @param {number} position - The position along the perimeter of the triangle. A value between 0 and 1.
  58509. * @param {(Phaser.Geom.Point|object)} [out] - An option Point, or Point-like object to store the value in. If not given a new Point will be created.
  58510. *
  58511. * @return {(Phaser.Geom.Point|object)} A Point object containing the given position from the perimeter of the triangle.
  58512. */
  58513. var GetPoint = function (triangle, position, out)
  58514. {
  58515. if (out === undefined) { out = new Point(); }
  58516. var line1 = triangle.getLineA();
  58517. var line2 = triangle.getLineB();
  58518. var line3 = triangle.getLineC();
  58519. if (position <= 0 || position >= 1)
  58520. {
  58521. out.x = line1.x1;
  58522. out.y = line1.y1;
  58523. return out;
  58524. }
  58525. var length1 = Length(line1);
  58526. var length2 = Length(line2);
  58527. var length3 = Length(line3);
  58528. var perimeter = length1 + length2 + length3;
  58529. var p = perimeter * position;
  58530. var localPosition = 0;
  58531. // Which line is it on?
  58532. if (p < length1)
  58533. {
  58534. // Line 1
  58535. localPosition = p / length1;
  58536. out.x = line1.x1 + (line1.x2 - line1.x1) * localPosition;
  58537. out.y = line1.y1 + (line1.y2 - line1.y1) * localPosition;
  58538. }
  58539. else if (p > length1 + length2)
  58540. {
  58541. // Line 3
  58542. p -= length1 + length2;
  58543. localPosition = p / length3;
  58544. out.x = line3.x1 + (line3.x2 - line3.x1) * localPosition;
  58545. out.y = line3.y1 + (line3.y2 - line3.y1) * localPosition;
  58546. }
  58547. else
  58548. {
  58549. // Line 2
  58550. p -= length1;
  58551. localPosition = p / length2;
  58552. out.x = line2.x1 + (line2.x2 - line2.x1) * localPosition;
  58553. out.y = line2.y1 + (line2.y2 - line2.y1) * localPosition;
  58554. }
  58555. return out;
  58556. };
  58557. module.exports = GetPoint;
  58558. /***/ }),
  58559. /* 284 */
  58560. /***/ (function(module, exports, __webpack_require__) {
  58561. /**
  58562. * @author Richard Davey <rich@photonstorm.com>
  58563. * @copyright 2019 Photon Storm Ltd.
  58564. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  58565. */
  58566. var Class = __webpack_require__(0);
  58567. var Shape = __webpack_require__(29);
  58568. var GeomTriangle = __webpack_require__(65);
  58569. var TriangleRender = __webpack_require__(795);
  58570. /**
  58571. * @classdesc
  58572. * The Triangle Shape is a Game Object that can be added to a Scene, Group or Container. You can
  58573. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  58574. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  58575. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  58576. *
  58577. * This shape supports both fill and stroke colors.
  58578. *
  58579. * The Triangle consists of 3 lines, joining up to form a triangular shape. You can control the
  58580. * position of each point of these lines. The triangle is always closed and cannot have an open
  58581. * face. If you require that, consider using a Polygon instead.
  58582. *
  58583. * @class Triangle
  58584. * @extends Phaser.GameObjects.Shape
  58585. * @memberof Phaser.GameObjects
  58586. * @constructor
  58587. * @since 3.13.0
  58588. *
  58589. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  58590. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  58591. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  58592. * @param {number} [x1=0] - The horizontal position of the first point in the triangle.
  58593. * @param {number} [y1=128] - The vertical position of the first point in the triangle.
  58594. * @param {number} [x2=64] - The horizontal position of the second point in the triangle.
  58595. * @param {number} [y2=0] - The vertical position of the second point in the triangle.
  58596. * @param {number} [x3=128] - The horizontal position of the third point in the triangle.
  58597. * @param {number} [y3=128] - The vertical position of the third point in the triangle.
  58598. * @param {number} [fillColor] - The color the triangle will be filled with, i.e. 0xff0000 for red.
  58599. * @param {number} [fillAlpha] - The alpha the triangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  58600. */
  58601. var Triangle = new Class({
  58602. Extends: Shape,
  58603. Mixins: [
  58604. TriangleRender
  58605. ],
  58606. initialize:
  58607. function Triangle (scene, x, y, x1, y1, x2, y2, x3, y3, fillColor, fillAlpha)
  58608. {
  58609. if (x === undefined) { x = 0; }
  58610. if (y === undefined) { y = 0; }
  58611. if (x1 === undefined) { x1 = 0; }
  58612. if (y1 === undefined) { y1 = 128; }
  58613. if (x2 === undefined) { x2 = 64; }
  58614. if (y2 === undefined) { y2 = 0; }
  58615. if (x3 === undefined) { x3 = 128; }
  58616. if (y3 === undefined) { y3 = 128; }
  58617. Shape.call(this, scene, 'Triangle', new GeomTriangle(x1, y1, x2, y2, x3, y3));
  58618. var width = this.geom.right - this.geom.left;
  58619. var height = this.geom.bottom - this.geom.top;
  58620. this.setPosition(x, y);
  58621. this.setSize(width, height);
  58622. if (fillColor !== undefined)
  58623. {
  58624. this.setFillStyle(fillColor, fillAlpha);
  58625. }
  58626. this.updateDisplayOrigin();
  58627. this.updateData();
  58628. },
  58629. /**
  58630. * Sets the data for the lines that make up this Triangle shape.
  58631. *
  58632. * @method Phaser.GameObjects.Triangle#setTo
  58633. * @since 3.13.0
  58634. *
  58635. * @param {number} [x1=0] - The horizontal position of the first point in the triangle.
  58636. * @param {number} [y1=0] - The vertical position of the first point in the triangle.
  58637. * @param {number} [x2=0] - The horizontal position of the second point in the triangle.
  58638. * @param {number} [y2=0] - The vertical position of the second point in the triangle.
  58639. * @param {number} [x3=0] - The horizontal position of the third point in the triangle.
  58640. * @param {number} [y3=0] - The vertical position of the third point in the triangle.
  58641. *
  58642. * @return {this} This Game Object instance.
  58643. */
  58644. setTo: function (x1, y1, x2, y2, x3, y3)
  58645. {
  58646. this.geom.setTo(x1, y1, x2, y2, x3, y3);
  58647. return this.updateData();
  58648. },
  58649. /**
  58650. * Internal method that updates the data and path values.
  58651. *
  58652. * @method Phaser.GameObjects.Triangle#updateData
  58653. * @private
  58654. * @since 3.13.0
  58655. *
  58656. * @return {this} This Game Object instance.
  58657. */
  58658. updateData: function ()
  58659. {
  58660. var path = [];
  58661. var rect = this.geom;
  58662. var line = this._tempLine;
  58663. rect.getLineA(line);
  58664. path.push(line.x1, line.y1, line.x2, line.y2);
  58665. rect.getLineB(line);
  58666. path.push(line.x2, line.y2);
  58667. rect.getLineC(line);
  58668. path.push(line.x2, line.y2);
  58669. this.pathData = path;
  58670. return this;
  58671. }
  58672. });
  58673. module.exports = Triangle;
  58674. /***/ }),
  58675. /* 285 */
  58676. /***/ (function(module, exports, __webpack_require__) {
  58677. /**
  58678. * @author Richard Davey <rich@photonstorm.com>
  58679. * @copyright 2019 Photon Storm Ltd.
  58680. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  58681. */
  58682. var StarRender = __webpack_require__(798);
  58683. var Class = __webpack_require__(0);
  58684. var Earcut = __webpack_require__(71);
  58685. var Shape = __webpack_require__(29);
  58686. /**
  58687. * @classdesc
  58688. * The Star Shape is a Game Object that can be added to a Scene, Group or Container. You can
  58689. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  58690. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  58691. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  58692. *
  58693. * This shape supports both fill and stroke colors.
  58694. *
  58695. * As the name implies, the Star shape will display a star in your game. You can control several
  58696. * aspects of it including the number of points that constitute the star. The default is 5. If
  58697. * you change it to 4 it will render as a diamond. If you increase them, you'll get a more spiky
  58698. * star shape.
  58699. *
  58700. * You can also control the inner and outer radius, which is how 'long' each point of the star is.
  58701. * Modify these values to create more interesting shapes.
  58702. *
  58703. * @class Star
  58704. * @extends Phaser.GameObjects.Shape
  58705. * @memberof Phaser.GameObjects
  58706. * @constructor
  58707. * @since 3.13.0
  58708. *
  58709. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  58710. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  58711. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  58712. * @param {number} [points=5] - The number of points on the star.
  58713. * @param {number} [innerRadius=32] - The inner radius of the star.
  58714. * @param {number} [outerRadius=64] - The outer radius of the star.
  58715. * @param {number} [fillColor] - The color the star will be filled with, i.e. 0xff0000 for red.
  58716. * @param {number} [fillAlpha] - The alpha the star will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  58717. */
  58718. var Star = new Class({
  58719. Extends: Shape,
  58720. Mixins: [
  58721. StarRender
  58722. ],
  58723. initialize:
  58724. function Star (scene, x, y, points, innerRadius, outerRadius, fillColor, fillAlpha)
  58725. {
  58726. if (x === undefined) { x = 0; }
  58727. if (y === undefined) { y = 0; }
  58728. if (points === undefined) { points = 5; }
  58729. if (innerRadius === undefined) { innerRadius = 32; }
  58730. if (outerRadius === undefined) { outerRadius = 64; }
  58731. Shape.call(this, scene, 'Star', null);
  58732. /**
  58733. * Private internal value.
  58734. * The number of points in the star.
  58735. *
  58736. * @name Phaser.GameObjects.Star#_points
  58737. * @type {integer}
  58738. * @private
  58739. * @since 3.13.0
  58740. */
  58741. this._points = points;
  58742. /**
  58743. * Private internal value.
  58744. * The inner radius of the star.
  58745. *
  58746. * @name Phaser.GameObjects.Star#_innerRadius
  58747. * @type {number}
  58748. * @private
  58749. * @since 3.13.0
  58750. */
  58751. this._innerRadius = innerRadius;
  58752. /**
  58753. * Private internal value.
  58754. * The outer radius of the star.
  58755. *
  58756. * @name Phaser.GameObjects.Star#_outerRadius
  58757. * @type {number}
  58758. * @private
  58759. * @since 3.13.0
  58760. */
  58761. this._outerRadius = outerRadius;
  58762. this.setPosition(x, y);
  58763. this.setSize(outerRadius * 2, outerRadius * 2);
  58764. if (fillColor !== undefined)
  58765. {
  58766. this.setFillStyle(fillColor, fillAlpha);
  58767. }
  58768. this.updateDisplayOrigin();
  58769. this.updateData();
  58770. },
  58771. /**
  58772. * Sets the number of points that make up the Star shape.
  58773. * This call can be chained.
  58774. *
  58775. * @method Phaser.GameObjects.Star#setPoints
  58776. * @since 3.13.0
  58777. *
  58778. * @param {integer} value - The amount of points the Star will have.
  58779. *
  58780. * @return {this} This Game Object instance.
  58781. */
  58782. setPoints: function (value)
  58783. {
  58784. this._points = value;
  58785. return this.updateData();
  58786. },
  58787. /**
  58788. * Sets the inner radius of the Star shape.
  58789. * This call can be chained.
  58790. *
  58791. * @method Phaser.GameObjects.Star#setInnerRadius
  58792. * @since 3.13.0
  58793. *
  58794. * @param {number} value - The amount to set the inner radius to.
  58795. *
  58796. * @return {this} This Game Object instance.
  58797. */
  58798. setInnerRadius: function (value)
  58799. {
  58800. this._innerRadius = value;
  58801. return this.updateData();
  58802. },
  58803. /**
  58804. * Sets the outer radius of the Star shape.
  58805. * This call can be chained.
  58806. *
  58807. * @method Phaser.GameObjects.Star#setOuterRadius
  58808. * @since 3.13.0
  58809. *
  58810. * @param {number} value - The amount to set the outer radius to.
  58811. *
  58812. * @return {this} This Game Object instance.
  58813. */
  58814. setOuterRadius: function (value)
  58815. {
  58816. this._outerRadius = value;
  58817. return this.updateData();
  58818. },
  58819. /**
  58820. * The number of points that make up the Star shape.
  58821. *
  58822. * @name Phaser.GameObjects.Star#points
  58823. * @type {integer}
  58824. * @default 5
  58825. * @since 3.13.0
  58826. */
  58827. points: {
  58828. get: function ()
  58829. {
  58830. return this._points;
  58831. },
  58832. set: function (value)
  58833. {
  58834. this._points = value;
  58835. this.updateData();
  58836. }
  58837. },
  58838. /**
  58839. * The inner radius of the Star shape.
  58840. *
  58841. * @name Phaser.GameObjects.Star#innerRadius
  58842. * @type {number}
  58843. * @default 32
  58844. * @since 3.13.0
  58845. */
  58846. innerRadius: {
  58847. get: function ()
  58848. {
  58849. return this._innerRadius;
  58850. },
  58851. set: function (value)
  58852. {
  58853. this._innerRadius = value;
  58854. this.updateData();
  58855. }
  58856. },
  58857. /**
  58858. * The outer radius of the Star shape.
  58859. *
  58860. * @name Phaser.GameObjects.Star#outerRadius
  58861. * @type {number}
  58862. * @default 64
  58863. * @since 3.13.0
  58864. */
  58865. outerRadius: {
  58866. get: function ()
  58867. {
  58868. return this._outerRadius;
  58869. },
  58870. set: function (value)
  58871. {
  58872. this._outerRadius = value;
  58873. this.updateData();
  58874. }
  58875. },
  58876. /**
  58877. * Internal method that updates the data and path values.
  58878. *
  58879. * @method Phaser.GameObjects.Star#updateData
  58880. * @private
  58881. * @since 3.13.0
  58882. *
  58883. * @return {this} This Game Object instance.
  58884. */
  58885. updateData: function ()
  58886. {
  58887. var path = [];
  58888. var points = this._points;
  58889. var innerRadius = this._innerRadius;
  58890. var outerRadius = this._outerRadius;
  58891. var rot = Math.PI / 2 * 3;
  58892. var step = Math.PI / points;
  58893. // So origin 0.5 = the center of the star
  58894. var x = outerRadius;
  58895. var y = outerRadius;
  58896. path.push(x, y + -outerRadius);
  58897. for (var i = 0; i < points; i++)
  58898. {
  58899. path.push(x + Math.cos(rot) * outerRadius, y + Math.sin(rot) * outerRadius);
  58900. rot += step;
  58901. path.push(x + Math.cos(rot) * innerRadius, y + Math.sin(rot) * innerRadius);
  58902. rot += step;
  58903. }
  58904. path.push(x, y + -outerRadius);
  58905. this.pathIndexes = Earcut(path);
  58906. this.pathData = path;
  58907. return this;
  58908. }
  58909. });
  58910. module.exports = Star;
  58911. /***/ }),
  58912. /* 286 */
  58913. /***/ (function(module, exports, __webpack_require__) {
  58914. /**
  58915. * @author Richard Davey <rich@photonstorm.com>
  58916. * @copyright 2019 Photon Storm Ltd.
  58917. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  58918. */
  58919. var Class = __webpack_require__(0);
  58920. var GeomRectangle = __webpack_require__(10);
  58921. var Shape = __webpack_require__(29);
  58922. var RectangleRender = __webpack_require__(801);
  58923. /**
  58924. * @classdesc
  58925. * The Rectangle Shape is a Game Object that can be added to a Scene, Group or Container. You can
  58926. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  58927. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  58928. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  58929. *
  58930. * This shape supports both fill and stroke colors.
  58931. *
  58932. * You can change the size of the rectangle by changing the `width` and `height` properties.
  58933. *
  58934. * @class Rectangle
  58935. * @extends Phaser.GameObjects.Shape
  58936. * @memberof Phaser.GameObjects
  58937. * @constructor
  58938. * @since 3.13.0
  58939. *
  58940. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  58941. * @param {number} x - The horizontal position of this Game Object in the world.
  58942. * @param {number} y - The vertical position of this Game Object in the world.
  58943. * @param {number} [width=128] - The width of the rectangle.
  58944. * @param {number} [height=128] - The height of the rectangle.
  58945. * @param {number} [fillColor] - The color the rectangle will be filled with, i.e. 0xff0000 for red.
  58946. * @param {number} [fillAlpha] - The alpha the rectangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  58947. */
  58948. var Rectangle = new Class({
  58949. Extends: Shape,
  58950. Mixins: [
  58951. RectangleRender
  58952. ],
  58953. initialize:
  58954. function Rectangle (scene, x, y, width, height, fillColor, fillAlpha)
  58955. {
  58956. if (x === undefined) { x = 0; }
  58957. if (y === undefined) { y = 0; }
  58958. if (width === undefined) { width = 128; }
  58959. if (height === undefined) { height = 128; }
  58960. Shape.call(this, scene, 'Rectangle', new GeomRectangle(0, 0, width, height));
  58961. this.setPosition(x, y);
  58962. this.setSize(width, height);
  58963. if (fillColor !== undefined)
  58964. {
  58965. this.setFillStyle(fillColor, fillAlpha);
  58966. }
  58967. this.updateDisplayOrigin();
  58968. this.updateData();
  58969. },
  58970. /**
  58971. * Internal method that updates the data and path values.
  58972. *
  58973. * @method Phaser.GameObjects.Rectangle#updateData
  58974. * @private
  58975. * @since 3.13.0
  58976. *
  58977. * @return {this} This Game Object instance.
  58978. */
  58979. updateData: function ()
  58980. {
  58981. var path = [];
  58982. var rect = this.geom;
  58983. var line = this._tempLine;
  58984. rect.getLineA(line);
  58985. path.push(line.x1, line.y1, line.x2, line.y2);
  58986. rect.getLineB(line);
  58987. path.push(line.x2, line.y2);
  58988. rect.getLineC(line);
  58989. path.push(line.x2, line.y2);
  58990. rect.getLineD(line);
  58991. path.push(line.x2, line.y2);
  58992. this.pathData = path;
  58993. return this;
  58994. }
  58995. });
  58996. module.exports = Rectangle;
  58997. /***/ }),
  58998. /* 287 */
  58999. /***/ (function(module, exports) {
  59000. /**
  59001. * @author Richard Davey <rich@photonstorm.com>
  59002. * @author Igor Ognichenko <ognichenko.igor@gmail.com>
  59003. * @copyright 2019 Photon Storm Ltd.
  59004. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59005. */
  59006. var copy = function (out, a)
  59007. {
  59008. out[0] = a[0];
  59009. out[1] = a[1];
  59010. return out;
  59011. };
  59012. /**
  59013. * Takes a Polygon object and applies Chaikin's smoothing algorithm on its points.
  59014. *
  59015. * @function Phaser.Geom.Polygon.Smooth
  59016. * @since 3.13.0
  59017. *
  59018. * @generic {Phaser.Geom.Polygon} O - [polygon,$return]
  59019. *
  59020. * @param {Phaser.Geom.Polygon} polygon - The polygon to be smoothed. The polygon will be modified in-place and returned.
  59021. *
  59022. * @return {Phaser.Geom.Polygon} The input polygon.
  59023. */
  59024. var Smooth = function (polygon)
  59025. {
  59026. var i;
  59027. var points = [];
  59028. var data = polygon.points;
  59029. for (i = 0; i < data.length; i++)
  59030. {
  59031. points.push([ data[i].x, data[i].y ]);
  59032. }
  59033. var output = [];
  59034. if (points.length > 0)
  59035. {
  59036. output.push(copy([ 0, 0 ], points[0]));
  59037. }
  59038. for (i = 0; i < points.length - 1; i++)
  59039. {
  59040. var p0 = points[i];
  59041. var p1 = points[i + 1];
  59042. var p0x = p0[0];
  59043. var p0y = p0[1];
  59044. var p1x = p1[0];
  59045. var p1y = p1[1];
  59046. output.push([ 0.85 * p0x + 0.15 * p1x, 0.85 * p0y + 0.15 * p1y ]);
  59047. output.push([ 0.15 * p0x + 0.85 * p1x, 0.15 * p0y + 0.85 * p1y ]);
  59048. }
  59049. if (points.length > 1)
  59050. {
  59051. output.push(copy([ 0, 0 ], points[points.length - 1]));
  59052. }
  59053. return polygon.setTo(output);
  59054. };
  59055. module.exports = Smooth;
  59056. /***/ }),
  59057. /* 288 */
  59058. /***/ (function(module, exports, __webpack_require__) {
  59059. /**
  59060. * @author Richard Davey <rich@photonstorm.com>
  59061. * @copyright 2019 Photon Storm Ltd.
  59062. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59063. */
  59064. var Length = __webpack_require__(58);
  59065. var Line = __webpack_require__(59);
  59066. /**
  59067. * Returns the perimeter of the given Polygon.
  59068. *
  59069. * @function Phaser.Geom.Polygon.Perimeter
  59070. * @since 3.12.0
  59071. *
  59072. * @param {Phaser.Geom.Polygon} polygon - The Polygon to get the perimeter of.
  59073. *
  59074. * @return {number} The perimeter of the Polygon.
  59075. */
  59076. var Perimeter = function (polygon)
  59077. {
  59078. var points = polygon.points;
  59079. var perimeter = 0;
  59080. for (var i = 0; i < points.length; i++)
  59081. {
  59082. var pointA = points[i];
  59083. var pointB = points[(i + 1) % points.length];
  59084. var line = new Line(
  59085. pointA.x,
  59086. pointA.y,
  59087. pointB.x,
  59088. pointB.y
  59089. );
  59090. perimeter += Length(line);
  59091. }
  59092. return perimeter;
  59093. };
  59094. module.exports = Perimeter;
  59095. /***/ }),
  59096. /* 289 */
  59097. /***/ (function(module, exports, __webpack_require__) {
  59098. /**
  59099. * @author Richard Davey <rich@photonstorm.com>
  59100. * @copyright 2019 Photon Storm Ltd.
  59101. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59102. */
  59103. var Length = __webpack_require__(58);
  59104. var Line = __webpack_require__(59);
  59105. var Perimeter = __webpack_require__(288);
  59106. /**
  59107. * Returns an array of Point objects containing the coordinates of the points around the perimeter of the Polygon,
  59108. * based on the given quantity or stepRate values.
  59109. *
  59110. * @function Phaser.Geom.Polygon.GetPoints
  59111. * @since 3.12.0
  59112. *
  59113. * @param {Phaser.Geom.Polygon} polygon - The Polygon to get the points from.
  59114. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  59115. * @param {number} [stepRate] - Sets the quantity by getting the perimeter of the Polygon and dividing it by the stepRate.
  59116. * @param {array} [output] - An array to insert the points in to. If not provided a new array will be created.
  59117. *
  59118. * @return {Phaser.Geom.Point[]} An array of Point objects pertaining to the points around the perimeter of the Polygon.
  59119. */
  59120. var GetPoints = function (polygon, quantity, stepRate, out)
  59121. {
  59122. if (out === undefined) { out = []; }
  59123. var points = polygon.points;
  59124. var perimeter = Perimeter(polygon);
  59125. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  59126. if (!quantity)
  59127. {
  59128. quantity = perimeter / stepRate;
  59129. }
  59130. for (var i = 0; i < quantity; i++)
  59131. {
  59132. var position = perimeter * (i / quantity);
  59133. var accumulatedPerimeter = 0;
  59134. for (var j = 0; j < points.length; j++)
  59135. {
  59136. var pointA = points[j];
  59137. var pointB = points[(j + 1) % points.length];
  59138. var line = new Line(
  59139. pointA.x,
  59140. pointA.y,
  59141. pointB.x,
  59142. pointB.y
  59143. );
  59144. var length = Length(line);
  59145. if (position < accumulatedPerimeter || position > accumulatedPerimeter + length)
  59146. {
  59147. accumulatedPerimeter += length;
  59148. continue;
  59149. }
  59150. var point = line.getPoint((position - accumulatedPerimeter) / length);
  59151. out.push(point);
  59152. break;
  59153. }
  59154. }
  59155. return out;
  59156. };
  59157. module.exports = GetPoints;
  59158. /***/ }),
  59159. /* 290 */
  59160. /***/ (function(module, exports, __webpack_require__) {
  59161. /**
  59162. * @author Richard Davey <rich@photonstorm.com>
  59163. * @copyright 2019 Photon Storm Ltd.
  59164. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59165. */
  59166. var Rectangle = __webpack_require__(10);
  59167. /**
  59168. * Calculates the bounding AABB rectangle of a polygon.
  59169. *
  59170. * @function Phaser.Geom.Polygon.GetAABB
  59171. * @since 3.0.0
  59172. *
  59173. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  59174. *
  59175. * @param {Phaser.Geom.Polygon} polygon - The polygon that should be calculated.
  59176. * @param {(Phaser.Geom.Rectangle|object)} [out] - The rectangle or object that has x, y, width, and height properties to store the result. Optional.
  59177. *
  59178. * @return {(Phaser.Geom.Rectangle|object)} The resulting rectangle or object that is passed in with position and dimensions of the polygon's AABB.
  59179. */
  59180. var GetAABB = function (polygon, out)
  59181. {
  59182. if (out === undefined) { out = new Rectangle(); }
  59183. var minX = Infinity;
  59184. var minY = Infinity;
  59185. var maxX = -minX;
  59186. var maxY = -minY;
  59187. var p;
  59188. for (var i = 0; i < polygon.points.length; i++)
  59189. {
  59190. p = polygon.points[i];
  59191. minX = Math.min(minX, p.x);
  59192. minY = Math.min(minY, p.y);
  59193. maxX = Math.max(maxX, p.x);
  59194. maxY = Math.max(maxY, p.y);
  59195. }
  59196. out.x = minX;
  59197. out.y = minY;
  59198. out.width = maxX - minX;
  59199. out.height = maxY - minY;
  59200. return out;
  59201. };
  59202. module.exports = GetAABB;
  59203. /***/ }),
  59204. /* 291 */
  59205. /***/ (function(module, exports, __webpack_require__) {
  59206. /**
  59207. * @author Richard Davey <rich@photonstorm.com>
  59208. * @copyright 2019 Photon Storm Ltd.
  59209. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59210. */
  59211. var PolygonRender = __webpack_require__(804);
  59212. var Class = __webpack_require__(0);
  59213. var Earcut = __webpack_require__(71);
  59214. var GetAABB = __webpack_require__(290);
  59215. var GeomPolygon = __webpack_require__(161);
  59216. var Shape = __webpack_require__(29);
  59217. var Smooth = __webpack_require__(287);
  59218. /**
  59219. * @classdesc
  59220. * The Polygon Shape is a Game Object that can be added to a Scene, Group or Container. You can
  59221. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  59222. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  59223. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  59224. *
  59225. * This shape supports both fill and stroke colors.
  59226. *
  59227. * The Polygon Shape is created by providing a list of points, which are then used to create an
  59228. * internal Polygon geometry object. The points can be set from a variety of formats:
  59229. *
  59230. * - A string containing paired values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'`
  59231. * - An array of Point or Vector2 objects: `[new Phaser.Math.Vec2(x1, y1), ...]`
  59232. * - An array of objects with public x/y properties: `[obj1, obj2, ...]`
  59233. * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]`
  59234. * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]`
  59235. *
  59236. * By default the `x` and `y` coordinates of this Shape refer to the center of it. However, depending
  59237. * on the coordinates of the points provided, the final shape may be rendered offset from its origin.
  59238. *
  59239. * @class Polygon
  59240. * @extends Phaser.GameObjects.Shape
  59241. * @memberof Phaser.GameObjects
  59242. * @constructor
  59243. * @since 3.13.0
  59244. *
  59245. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  59246. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  59247. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  59248. * @param {any} [points] - The points that make up the polygon.
  59249. * @param {number} [fillColor] - The color the polygon will be filled with, i.e. 0xff0000 for red.
  59250. * @param {number} [fillAlpha] - The alpha the polygon will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  59251. */
  59252. var Polygon = new Class({
  59253. Extends: Shape,
  59254. Mixins: [
  59255. PolygonRender
  59256. ],
  59257. initialize:
  59258. function Polygon (scene, x, y, points, fillColor, fillAlpha)
  59259. {
  59260. if (x === undefined) { x = 0; }
  59261. if (y === undefined) { y = 0; }
  59262. Shape.call(this, scene, 'Polygon', new GeomPolygon(points));
  59263. var bounds = GetAABB(this.geom);
  59264. this.setPosition(x, y);
  59265. this.setSize(bounds.width, bounds.height);
  59266. if (fillColor !== undefined)
  59267. {
  59268. this.setFillStyle(fillColor, fillAlpha);
  59269. }
  59270. this.updateDisplayOrigin();
  59271. this.updateData();
  59272. },
  59273. /**
  59274. * Smooths the polygon over the number of iterations specified.
  59275. * The base polygon data will be updated and replaced with the smoothed values.
  59276. * This call can be chained.
  59277. *
  59278. * @method Phaser.GameObjects.Polygon#smooth
  59279. * @since 3.13.0
  59280. *
  59281. * @param {integer} [iterations=1] - The number of times to apply the polygon smoothing.
  59282. *
  59283. * @return {this} This Game Object instance.
  59284. */
  59285. smooth: function (iterations)
  59286. {
  59287. if (iterations === undefined) { iterations = 1; }
  59288. for (var i = 0; i < iterations; i++)
  59289. {
  59290. Smooth(this.geom);
  59291. }
  59292. return this.updateData();
  59293. },
  59294. /**
  59295. * Internal method that updates the data and path values.
  59296. *
  59297. * @method Phaser.GameObjects.Polygon#updateData
  59298. * @private
  59299. * @since 3.13.0
  59300. *
  59301. * @return {this} This Game Object instance.
  59302. */
  59303. updateData: function ()
  59304. {
  59305. var path = [];
  59306. var points = this.geom.points;
  59307. for (var i = 0; i < points.length; i++)
  59308. {
  59309. path.push(points[i].x, points[i].y);
  59310. }
  59311. path.push(points[0].x, points[0].y);
  59312. this.pathIndexes = Earcut(path);
  59313. this.pathData = path;
  59314. return this;
  59315. }
  59316. });
  59317. module.exports = Polygon;
  59318. /***/ }),
  59319. /* 292 */
  59320. /***/ (function(module, exports, __webpack_require__) {
  59321. /**
  59322. * @author Richard Davey <rich@photonstorm.com>
  59323. * @copyright 2019 Photon Storm Ltd.
  59324. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59325. */
  59326. var Class = __webpack_require__(0);
  59327. var Shape = __webpack_require__(29);
  59328. var GeomLine = __webpack_require__(59);
  59329. var LineRender = __webpack_require__(807);
  59330. /**
  59331. * @classdesc
  59332. * The Line Shape is a Game Object that can be added to a Scene, Group or Container. You can
  59333. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  59334. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  59335. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  59336. *
  59337. * This shape supports only stroke colors and cannot be filled.
  59338. *
  59339. * A Line Shape allows you to draw a line between two points in your game. You can control the
  59340. * stroke color and thickness of the line. In WebGL only you can also specify a different
  59341. * thickness for the start and end of the line, allowing you to render lines that taper-off.
  59342. *
  59343. * If you need to draw multiple lines in a sequence you may wish to use the Polygon Shape instead.
  59344. *
  59345. * @class Line
  59346. * @extends Phaser.GameObjects.Shape
  59347. * @memberof Phaser.GameObjects
  59348. * @constructor
  59349. * @since 3.13.0
  59350. *
  59351. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  59352. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  59353. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  59354. * @param {number} [x1=0] - The horizontal position of the start of the line.
  59355. * @param {number} [y1=0] - The vertical position of the start of the line.
  59356. * @param {number} [x2=128] - The horizontal position of the end of the line.
  59357. * @param {number} [y2=0] - The vertical position of the end of the line.
  59358. * @param {number} [strokeColor] - The color the line will be drawn in, i.e. 0xff0000 for red.
  59359. * @param {number} [strokeAlpha] - The alpha the line will be drawn in. You can also set the alpha of the overall Shape using its `alpha` property.
  59360. */
  59361. var Line = new Class({
  59362. Extends: Shape,
  59363. Mixins: [
  59364. LineRender
  59365. ],
  59366. initialize:
  59367. function Line (scene, x, y, x1, y1, x2, y2, strokeColor, strokeAlpha)
  59368. {
  59369. if (x === undefined) { x = 0; }
  59370. if (y === undefined) { y = 0; }
  59371. if (x1 === undefined) { x1 = 0; }
  59372. if (y1 === undefined) { y1 = 0; }
  59373. if (x2 === undefined) { x2 = 128; }
  59374. if (y2 === undefined) { y2 = 0; }
  59375. Shape.call(this, scene, 'Line', new GeomLine(x1, y1, x2, y2));
  59376. var width = this.geom.right - this.geom.left;
  59377. var height = this.geom.bottom - this.geom.top;
  59378. /**
  59379. * The width (or thickness) of the line.
  59380. * See the setLineWidth method for extra details on changing this on WebGL.
  59381. *
  59382. * @name Phaser.GameObjects.Line#lineWidth
  59383. * @type {number}
  59384. * @since 3.13.0
  59385. */
  59386. this.lineWidth = 1;
  59387. /**
  59388. * Private internal value. Holds the start width of the line.
  59389. *
  59390. * @name Phaser.GameObjects.Line#_startWidth
  59391. * @type {number}
  59392. * @private
  59393. * @since 3.13.0
  59394. */
  59395. this._startWidth = 1;
  59396. /**
  59397. * Private internal value. Holds the end width of the line.
  59398. *
  59399. * @name Phaser.GameObjects.Line#_endWidth
  59400. * @type {number}
  59401. * @private
  59402. * @since 3.13.0
  59403. */
  59404. this._endWidth = 1;
  59405. this.setPosition(x, y);
  59406. this.setSize(width, height);
  59407. if (strokeColor !== undefined)
  59408. {
  59409. this.setStrokeStyle(1, strokeColor, strokeAlpha);
  59410. }
  59411. this.updateDisplayOrigin();
  59412. },
  59413. /**
  59414. * Sets the width of the line.
  59415. *
  59416. * When using the WebGL renderer you can have different start and end widths.
  59417. * When using the Canvas renderer only the `startWidth` value is used. The `endWidth` is ignored.
  59418. *
  59419. * This call can be chained.
  59420. *
  59421. * @method Phaser.GameObjects.Line#setLineWidth
  59422. * @since 3.13.0
  59423. *
  59424. * @param {number} startWidth - The start width of the line.
  59425. * @param {number} [endWidth] - The end width of the line. Only used in WebGL.
  59426. *
  59427. * @return {this} This Game Object instance.
  59428. */
  59429. setLineWidth: function (startWidth, endWidth)
  59430. {
  59431. if (endWidth === undefined) { endWidth = startWidth; }
  59432. this._startWidth = startWidth;
  59433. this._endWidth = endWidth;
  59434. this.lineWidth = startWidth;
  59435. return this;
  59436. },
  59437. /**
  59438. * Sets the start and end coordinates of this Line.
  59439. *
  59440. * @method Phaser.GameObjects.Line#setTo
  59441. * @since 3.13.0
  59442. *
  59443. * @param {number} [x1=0] - The horizontal position of the start of the line.
  59444. * @param {number} [y1=0] - The vertical position of the start of the line.
  59445. * @param {number} [x2=0] - The horizontal position of the end of the line.
  59446. * @param {number} [y2=0] - The vertical position of the end of the line.
  59447. *
  59448. * @return {this} This Line object.
  59449. */
  59450. setTo: function (x1, y1, x2, y2)
  59451. {
  59452. this.geom.setTo(x1, y1, x2, y2);
  59453. return this;
  59454. }
  59455. });
  59456. module.exports = Line;
  59457. /***/ }),
  59458. /* 293 */
  59459. /***/ (function(module, exports, __webpack_require__) {
  59460. /**
  59461. * @author Richard Davey <rich@photonstorm.com>
  59462. * @copyright 2019 Photon Storm Ltd.
  59463. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59464. */
  59465. var Class = __webpack_require__(0);
  59466. var IsoTriangleRender = __webpack_require__(810);
  59467. var Shape = __webpack_require__(29);
  59468. /**
  59469. * @classdesc
  59470. * The IsoTriangle Shape is a Game Object that can be added to a Scene, Group or Container. You can
  59471. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  59472. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  59473. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  59474. *
  59475. * This shape supports only fill colors and cannot be stroked.
  59476. *
  59477. * An IsoTriangle is an 'isometric' triangle. Think of it like a pyramid. Each face has a different
  59478. * fill color. You can set the color of the top, left and right faces of the triangle respectively
  59479. * You can also choose which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties.
  59480. *
  59481. * You cannot view an IsoTriangle from under-neath, however you can change the 'angle' by setting
  59482. * the `projection` property. The `reversed` property controls if the IsoTriangle is rendered upside
  59483. * down or not.
  59484. *
  59485. * @class IsoTriangle
  59486. * @extends Phaser.GameObjects.Shape
  59487. * @memberof Phaser.GameObjects
  59488. * @constructor
  59489. * @since 3.13.0
  59490. *
  59491. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  59492. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  59493. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  59494. * @param {number} [size=48] - The width of the iso triangle in pixels. The left and right faces will be exactly half this value.
  59495. * @param {number} [height=32] - The height of the iso triangle. The left and right faces will be this tall. The overall height of the iso triangle will be this value plus half the `size` value.
  59496. * @param {boolean} [reversed=false] - Is the iso triangle upside down?
  59497. * @param {number} [fillTop=0xeeeeee] - The fill color of the top face of the iso triangle.
  59498. * @param {number} [fillLeft=0x999999] - The fill color of the left face of the iso triangle.
  59499. * @param {number} [fillRight=0xcccccc] - The fill color of the right face of the iso triangle.
  59500. */
  59501. var IsoTriangle = new Class({
  59502. Extends: Shape,
  59503. Mixins: [
  59504. IsoTriangleRender
  59505. ],
  59506. initialize:
  59507. function IsoTriangle (scene, x, y, size, height, reversed, fillTop, fillLeft, fillRight)
  59508. {
  59509. if (x === undefined) { x = 0; }
  59510. if (y === undefined) { y = 0; }
  59511. if (size === undefined) { size = 48; }
  59512. if (height === undefined) { height = 32; }
  59513. if (reversed === undefined) { reversed = false; }
  59514. if (fillTop === undefined) { fillTop = 0xeeeeee; }
  59515. if (fillLeft === undefined) { fillLeft = 0x999999; }
  59516. if (fillRight === undefined) { fillRight = 0xcccccc; }
  59517. Shape.call(this, scene, 'IsoTriangle', null);
  59518. /**
  59519. * The projection level of the iso box. Change this to change the 'angle' at which you are looking at the box.
  59520. *
  59521. * @name Phaser.GameObjects.IsoTriangle#projection
  59522. * @type {integer}
  59523. * @default 4
  59524. * @since 3.13.0
  59525. */
  59526. this.projection = 4;
  59527. /**
  59528. * The color used to fill in the top of the iso triangle. This is only used if the triangle is reversed.
  59529. *
  59530. * @name Phaser.GameObjects.IsoTriangle#fillTop
  59531. * @type {number}
  59532. * @since 3.13.0
  59533. */
  59534. this.fillTop = fillTop;
  59535. /**
  59536. * The color used to fill in the left-facing side of the iso triangle.
  59537. *
  59538. * @name Phaser.GameObjects.IsoTriangle#fillLeft
  59539. * @type {number}
  59540. * @since 3.13.0
  59541. */
  59542. this.fillLeft = fillLeft;
  59543. /**
  59544. * The color used to fill in the right-facing side of the iso triangle.
  59545. *
  59546. * @name Phaser.GameObjects.IsoTriangle#fillRight
  59547. * @type {number}
  59548. * @since 3.13.0
  59549. */
  59550. this.fillRight = fillRight;
  59551. /**
  59552. * Controls if the top-face of the iso triangle be rendered.
  59553. *
  59554. * @name Phaser.GameObjects.IsoTriangle#showTop
  59555. * @type {boolean}
  59556. * @default true
  59557. * @since 3.13.0
  59558. */
  59559. this.showTop = true;
  59560. /**
  59561. * Controls if the left-face of the iso triangle be rendered.
  59562. *
  59563. * @name Phaser.GameObjects.IsoTriangle#showLeft
  59564. * @type {boolean}
  59565. * @default true
  59566. * @since 3.13.0
  59567. */
  59568. this.showLeft = true;
  59569. /**
  59570. * Controls if the right-face of the iso triangle be rendered.
  59571. *
  59572. * @name Phaser.GameObjects.IsoTriangle#showRight
  59573. * @type {boolean}
  59574. * @default true
  59575. * @since 3.13.0
  59576. */
  59577. this.showRight = true;
  59578. /**
  59579. * Sets if the iso triangle will be rendered upside down or not.
  59580. *
  59581. * @name Phaser.GameObjects.IsoTriangle#isReversed
  59582. * @type {boolean}
  59583. * @default false
  59584. * @since 3.13.0
  59585. */
  59586. this.isReversed = reversed;
  59587. this.isFilled = true;
  59588. this.setPosition(x, y);
  59589. this.setSize(size, height);
  59590. this.updateDisplayOrigin();
  59591. },
  59592. /**
  59593. * Sets the projection level of the iso triangle. Change this to change the 'angle' at which you are looking at the pyramid.
  59594. * This call can be chained.
  59595. *
  59596. * @method Phaser.GameObjects.IsoTriangle#setProjection
  59597. * @since 3.13.0
  59598. *
  59599. * @param {integer} value - The value to set the projection to.
  59600. *
  59601. * @return {this} This Game Object instance.
  59602. */
  59603. setProjection: function (value)
  59604. {
  59605. this.projection = value;
  59606. return this;
  59607. },
  59608. /**
  59609. * Sets if the iso triangle will be rendered upside down or not.
  59610. * This call can be chained.
  59611. *
  59612. * @method Phaser.GameObjects.IsoTriangle#setReversed
  59613. * @since 3.13.0
  59614. *
  59615. * @param {boolean} reversed - Sets if the iso triangle will be rendered upside down or not.
  59616. *
  59617. * @return {this} This Game Object instance.
  59618. */
  59619. setReversed: function (reversed)
  59620. {
  59621. this.isReversed = reversed;
  59622. return this;
  59623. },
  59624. /**
  59625. * Sets which faces of the iso triangle will be rendered.
  59626. * This call can be chained.
  59627. *
  59628. * @method Phaser.GameObjects.IsoTriangle#setFaces
  59629. * @since 3.13.0
  59630. *
  59631. * @param {boolean} [showTop=true] - Show the top-face of the iso triangle (only if `reversed` is true)
  59632. * @param {boolean} [showLeft=true] - Show the left-face of the iso triangle.
  59633. * @param {boolean} [showRight=true] - Show the right-face of the iso triangle.
  59634. *
  59635. * @return {this} This Game Object instance.
  59636. */
  59637. setFaces: function (showTop, showLeft, showRight)
  59638. {
  59639. if (showTop === undefined) { showTop = true; }
  59640. if (showLeft === undefined) { showLeft = true; }
  59641. if (showRight === undefined) { showRight = true; }
  59642. this.showTop = showTop;
  59643. this.showLeft = showLeft;
  59644. this.showRight = showRight;
  59645. return this;
  59646. },
  59647. /**
  59648. * Sets the fill colors for each face of the iso triangle.
  59649. * This call can be chained.
  59650. *
  59651. * @method Phaser.GameObjects.IsoTriangle#setFillStyle
  59652. * @since 3.13.0
  59653. *
  59654. * @param {number} [fillTop] - The color used to fill the top of the iso triangle.
  59655. * @param {number} [fillLeft] - The color used to fill in the left-facing side of the iso triangle.
  59656. * @param {number} [fillRight] - The color used to fill in the right-facing side of the iso triangle.
  59657. *
  59658. * @return {this} This Game Object instance.
  59659. */
  59660. setFillStyle: function (fillTop, fillLeft, fillRight)
  59661. {
  59662. this.fillTop = fillTop;
  59663. this.fillLeft = fillLeft;
  59664. this.fillRight = fillRight;
  59665. this.isFilled = true;
  59666. return this;
  59667. }
  59668. });
  59669. module.exports = IsoTriangle;
  59670. /***/ }),
  59671. /* 294 */
  59672. /***/ (function(module, exports, __webpack_require__) {
  59673. /**
  59674. * @author Richard Davey <rich@photonstorm.com>
  59675. * @copyright 2019 Photon Storm Ltd.
  59676. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59677. */
  59678. var IsoBoxRender = __webpack_require__(813);
  59679. var Class = __webpack_require__(0);
  59680. var Shape = __webpack_require__(29);
  59681. /**
  59682. * @classdesc
  59683. * The IsoBox Shape is a Game Object that can be added to a Scene, Group or Container. You can
  59684. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  59685. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  59686. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  59687. *
  59688. * This shape supports only fill colors and cannot be stroked.
  59689. *
  59690. * An IsoBox is an 'isometric' rectangle. Each face of it has a different fill color. You can set
  59691. * the color of the top, left and right faces of the rectangle respectively. You can also choose
  59692. * which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties.
  59693. *
  59694. * You cannot view an IsoBox from under-neath, however you can change the 'angle' by setting
  59695. * the `projection` property.
  59696. *
  59697. * @class IsoBox
  59698. * @extends Phaser.GameObjects.Shape
  59699. * @memberof Phaser.GameObjects
  59700. * @constructor
  59701. * @since 3.13.0
  59702. *
  59703. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  59704. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  59705. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  59706. * @param {number} [size=48] - The width of the iso box in pixels. The left and right faces will be exactly half this value.
  59707. * @param {number} [height=32] - The height of the iso box. The left and right faces will be this tall. The overall height of the isobox will be this value plus half the `size` value.
  59708. * @param {number} [fillTop=0xeeeeee] - The fill color of the top face of the iso box.
  59709. * @param {number} [fillLeft=0x999999] - The fill color of the left face of the iso box.
  59710. * @param {number} [fillRight=0xcccccc] - The fill color of the right face of the iso box.
  59711. */
  59712. var IsoBox = new Class({
  59713. Extends: Shape,
  59714. Mixins: [
  59715. IsoBoxRender
  59716. ],
  59717. initialize:
  59718. function IsoBox (scene, x, y, size, height, fillTop, fillLeft, fillRight)
  59719. {
  59720. if (x === undefined) { x = 0; }
  59721. if (y === undefined) { y = 0; }
  59722. if (size === undefined) { size = 48; }
  59723. if (height === undefined) { height = 32; }
  59724. if (fillTop === undefined) { fillTop = 0xeeeeee; }
  59725. if (fillLeft === undefined) { fillLeft = 0x999999; }
  59726. if (fillRight === undefined) { fillRight = 0xcccccc; }
  59727. Shape.call(this, scene, 'IsoBox', null);
  59728. /**
  59729. * The projection level of the iso box. Change this to change the 'angle' at which you are looking at the box.
  59730. *
  59731. * @name Phaser.GameObjects.IsoBox#projection
  59732. * @type {integer}
  59733. * @default 4
  59734. * @since 3.13.0
  59735. */
  59736. this.projection = 4;
  59737. /**
  59738. * The color used to fill in the top of the iso box.
  59739. *
  59740. * @name Phaser.GameObjects.IsoBox#fillTop
  59741. * @type {number}
  59742. * @since 3.13.0
  59743. */
  59744. this.fillTop = fillTop;
  59745. /**
  59746. * The color used to fill in the left-facing side of the iso box.
  59747. *
  59748. * @name Phaser.GameObjects.IsoBox#fillLeft
  59749. * @type {number}
  59750. * @since 3.13.0
  59751. */
  59752. this.fillLeft = fillLeft;
  59753. /**
  59754. * The color used to fill in the right-facing side of the iso box.
  59755. *
  59756. * @name Phaser.GameObjects.IsoBox#fillRight
  59757. * @type {number}
  59758. * @since 3.13.0
  59759. */
  59760. this.fillRight = fillRight;
  59761. /**
  59762. * Controls if the top-face of the iso box be rendered.
  59763. *
  59764. * @name Phaser.GameObjects.IsoBox#showTop
  59765. * @type {boolean}
  59766. * @default true
  59767. * @since 3.13.0
  59768. */
  59769. this.showTop = true;
  59770. /**
  59771. * Controls if the left-face of the iso box be rendered.
  59772. *
  59773. * @name Phaser.GameObjects.IsoBox#showLeft
  59774. * @type {boolean}
  59775. * @default true
  59776. * @since 3.13.0
  59777. */
  59778. this.showLeft = true;
  59779. /**
  59780. * Controls if the right-face of the iso box be rendered.
  59781. *
  59782. * @name Phaser.GameObjects.IsoBox#showRight
  59783. * @type {boolean}
  59784. * @default true
  59785. * @since 3.13.0
  59786. */
  59787. this.showRight = true;
  59788. this.isFilled = true;
  59789. this.setPosition(x, y);
  59790. this.setSize(size, height);
  59791. this.updateDisplayOrigin();
  59792. },
  59793. /**
  59794. * Sets the projection level of the iso box. Change this to change the 'angle' at which you are looking at the box.
  59795. * This call can be chained.
  59796. *
  59797. * @method Phaser.GameObjects.IsoBox#setProjection
  59798. * @since 3.13.0
  59799. *
  59800. * @param {integer} value - The value to set the projection to.
  59801. *
  59802. * @return {this} This Game Object instance.
  59803. */
  59804. setProjection: function (value)
  59805. {
  59806. this.projection = value;
  59807. return this;
  59808. },
  59809. /**
  59810. * Sets which faces of the iso box will be rendered.
  59811. * This call can be chained.
  59812. *
  59813. * @method Phaser.GameObjects.IsoBox#setFaces
  59814. * @since 3.13.0
  59815. *
  59816. * @param {boolean} [showTop=true] - Show the top-face of the iso box.
  59817. * @param {boolean} [showLeft=true] - Show the left-face of the iso box.
  59818. * @param {boolean} [showRight=true] - Show the right-face of the iso box.
  59819. *
  59820. * @return {this} This Game Object instance.
  59821. */
  59822. setFaces: function (showTop, showLeft, showRight)
  59823. {
  59824. if (showTop === undefined) { showTop = true; }
  59825. if (showLeft === undefined) { showLeft = true; }
  59826. if (showRight === undefined) { showRight = true; }
  59827. this.showTop = showTop;
  59828. this.showLeft = showLeft;
  59829. this.showRight = showRight;
  59830. return this;
  59831. },
  59832. /**
  59833. * Sets the fill colors for each face of the iso box.
  59834. * This call can be chained.
  59835. *
  59836. * @method Phaser.GameObjects.IsoBox#setFillStyle
  59837. * @since 3.13.0
  59838. *
  59839. * @param {number} [fillTop] - The color used to fill the top of the iso box.
  59840. * @param {number} [fillLeft] - The color used to fill in the left-facing side of the iso box.
  59841. * @param {number} [fillRight] - The color used to fill in the right-facing side of the iso box.
  59842. *
  59843. * @return {this} This Game Object instance.
  59844. */
  59845. setFillStyle: function (fillTop, fillLeft, fillRight)
  59846. {
  59847. this.fillTop = fillTop;
  59848. this.fillLeft = fillLeft;
  59849. this.fillRight = fillRight;
  59850. this.isFilled = true;
  59851. return this;
  59852. }
  59853. });
  59854. module.exports = IsoBox;
  59855. /***/ }),
  59856. /* 295 */
  59857. /***/ (function(module, exports, __webpack_require__) {
  59858. /**
  59859. * @author Richard Davey <rich@photonstorm.com>
  59860. * @copyright 2019 Photon Storm Ltd.
  59861. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59862. */
  59863. var Class = __webpack_require__(0);
  59864. var Shape = __webpack_require__(29);
  59865. var GridRender = __webpack_require__(816);
  59866. /**
  59867. * @classdesc
  59868. * The Grid Shape is a Game Object that can be added to a Scene, Group or Container. You can
  59869. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  59870. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  59871. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  59872. *
  59873. * This shape supports only fill colors and cannot be stroked.
  59874. *
  59875. * A Grid Shape allows you to display a grid in your game, where you can control the size of the
  59876. * grid as well as the width and height of the grid cells. You can set a fill color for each grid
  59877. * cell as well as an alternate fill color. When the alternate fill color is set then the grid
  59878. * cells will alternate the fill colors as they render, creating a chess-board effect. You can
  59879. * also optionally have an outline fill color. If set, this draws lines between the grid cells
  59880. * in the given color. If you specify an outline color with an alpha of zero, then it will draw
  59881. * the cells spaced out, but without the lines between them.
  59882. *
  59883. * @class Grid
  59884. * @extends Phaser.GameObjects.Shape
  59885. * @memberof Phaser.GameObjects
  59886. * @constructor
  59887. * @since 3.13.0
  59888. *
  59889. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  59890. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  59891. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  59892. * @param {number} [width=128] - The width of the grid.
  59893. * @param {number} [height=128] - The height of the grid.
  59894. * @param {number} [cellWidth=32] - The width of one cell in the grid.
  59895. * @param {number} [cellHeight=32] - The height of one cell in the grid.
  59896. * @param {number} [fillColor] - The color the grid cells will be filled with, i.e. 0xff0000 for red.
  59897. * @param {number} [fillAlpha] - The alpha the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  59898. * @param {number} [outlineFillColor] - The color of the lines between the grid cells. See the `setOutline` method.
  59899. * @param {number} [outlineFillAlpha] - The alpha of the lines between the grid cells.
  59900. */
  59901. var Grid = new Class({
  59902. Extends: Shape,
  59903. Mixins: [
  59904. GridRender
  59905. ],
  59906. initialize:
  59907. function Grid (scene, x, y, width, height, cellWidth, cellHeight, fillColor, fillAlpha, outlineFillColor, outlineFillAlpha)
  59908. {
  59909. if (x === undefined) { x = 0; }
  59910. if (y === undefined) { y = 0; }
  59911. if (width === undefined) { width = 128; }
  59912. if (height === undefined) { height = 128; }
  59913. if (cellWidth === undefined) { cellWidth = 32; }
  59914. if (cellHeight === undefined) { cellHeight = 32; }
  59915. Shape.call(this, scene, 'Grid', null);
  59916. /**
  59917. * The width of each grid cell.
  59918. * Must be a positive value.
  59919. *
  59920. * @name Phaser.GameObjects.Grid#cellWidth
  59921. * @type {number}
  59922. * @since 3.13.0
  59923. */
  59924. this.cellWidth = cellWidth;
  59925. /**
  59926. * The height of each grid cell.
  59927. * Must be a positive value.
  59928. *
  59929. * @name Phaser.GameObjects.Grid#cellHeight
  59930. * @type {number}
  59931. * @since 3.13.0
  59932. */
  59933. this.cellHeight = cellHeight;
  59934. /**
  59935. * Will the grid render its cells in the `fillColor`?
  59936. *
  59937. * @name Phaser.GameObjects.Grid#showCells
  59938. * @type {boolean}
  59939. * @since 3.13.0
  59940. */
  59941. this.showCells = true;
  59942. /**
  59943. * The color of the lines between each grid cell.
  59944. *
  59945. * @name Phaser.GameObjects.Grid#outlineFillColor
  59946. * @type {number}
  59947. * @since 3.13.0
  59948. */
  59949. this.outlineFillColor = 0;
  59950. /**
  59951. * The alpha value for the color of the lines between each grid cell.
  59952. *
  59953. * @name Phaser.GameObjects.Grid#outlineFillAlpha
  59954. * @type {number}
  59955. * @since 3.13.0
  59956. */
  59957. this.outlineFillAlpha = 0;
  59958. /**
  59959. * Will the grid display the lines between each cell when it renders?
  59960. *
  59961. * @name Phaser.GameObjects.Grid#showOutline
  59962. * @type {boolean}
  59963. * @since 3.13.0
  59964. */
  59965. this.showOutline = true;
  59966. /**
  59967. * Will the grid render the alternating cells in the `altFillColor`?
  59968. *
  59969. * @name Phaser.GameObjects.Grid#showAltCells
  59970. * @type {boolean}
  59971. * @since 3.13.0
  59972. */
  59973. this.showAltCells = false;
  59974. /**
  59975. * The color the alternating grid cells will be filled with, i.e. 0xff0000 for red.
  59976. *
  59977. * @name Phaser.GameObjects.Grid#altFillColor
  59978. * @type {number}
  59979. * @since 3.13.0
  59980. */
  59981. this.altFillColor;
  59982. /**
  59983. * The alpha the alternating grid cells will be filled with.
  59984. * You can also set the alpha of the overall Shape using its `alpha` property.
  59985. *
  59986. * @name Phaser.GameObjects.Grid#altFillAlpha
  59987. * @type {number}
  59988. * @since 3.13.0
  59989. */
  59990. this.altFillAlpha;
  59991. this.setPosition(x, y);
  59992. this.setSize(width, height);
  59993. if (fillColor !== undefined)
  59994. {
  59995. this.setFillStyle(fillColor, fillAlpha);
  59996. }
  59997. if (outlineFillColor !== undefined)
  59998. {
  59999. this.setOutlineStyle(outlineFillColor, outlineFillAlpha);
  60000. }
  60001. this.updateDisplayOrigin();
  60002. },
  60003. /**
  60004. * Sets the fill color and alpha level the grid cells will use when rendering.
  60005. *
  60006. * If this method is called with no values then the grid cells will not be rendered,
  60007. * however the grid lines and alternating cells may still be.
  60008. *
  60009. * Also see the `setOutlineStyle` and `setAltFillStyle` methods.
  60010. *
  60011. * This call can be chained.
  60012. *
  60013. * @method Phaser.GameObjects.Grid#setFillStyle
  60014. * @since 3.13.0
  60015. *
  60016. * @param {number} [fillColor] - The color the grid cells will be filled with, i.e. 0xff0000 for red.
  60017. * @param {number} [fillAlpha=1] - The alpha the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  60018. *
  60019. * @return {this} This Game Object instance.
  60020. */
  60021. setFillStyle: function (fillColor, fillAlpha)
  60022. {
  60023. if (fillAlpha === undefined) { fillAlpha = 1; }
  60024. if (fillColor === undefined)
  60025. {
  60026. this.showCells = false;
  60027. }
  60028. else
  60029. {
  60030. this.fillColor = fillColor;
  60031. this.fillAlpha = fillAlpha;
  60032. this.showCells = true;
  60033. }
  60034. return this;
  60035. },
  60036. /**
  60037. * Sets the fill color and alpha level that the alternating grid cells will use.
  60038. *
  60039. * If this method is called with no values then alternating grid cells will not be rendered in a different color.
  60040. *
  60041. * Also see the `setOutlineStyle` and `setFillStyle` methods.
  60042. *
  60043. * This call can be chained.
  60044. *
  60045. * @method Phaser.GameObjects.Grid#setAltFillStyle
  60046. * @since 3.13.0
  60047. *
  60048. * @param {number} [fillColor] - The color the alternating grid cells will be filled with, i.e. 0xff0000 for red.
  60049. * @param {number} [fillAlpha=1] - The alpha the alternating grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  60050. *
  60051. * @return {this} This Game Object instance.
  60052. */
  60053. setAltFillStyle: function (fillColor, fillAlpha)
  60054. {
  60055. if (fillAlpha === undefined) { fillAlpha = 1; }
  60056. if (fillColor === undefined)
  60057. {
  60058. this.showAltCells = false;
  60059. }
  60060. else
  60061. {
  60062. this.altFillColor = fillColor;
  60063. this.altFillAlpha = fillAlpha;
  60064. this.showAltCells = true;
  60065. }
  60066. return this;
  60067. },
  60068. /**
  60069. * Sets the fill color and alpha level that the lines between each grid cell will use.
  60070. *
  60071. * If this method is called with no values then the grid lines will not be rendered at all, however
  60072. * the cells themselves may still be if they have colors set.
  60073. *
  60074. * Also see the `setFillStyle` and `setAltFillStyle` methods.
  60075. *
  60076. * This call can be chained.
  60077. *
  60078. * @method Phaser.GameObjects.Grid#setOutlineStyle
  60079. * @since 3.13.0
  60080. *
  60081. * @param {number} [fillColor] - The color the lines between the grid cells will be filled with, i.e. 0xff0000 for red.
  60082. * @param {number} [fillAlpha=1] - The alpha the lines between the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  60083. *
  60084. * @return {this} This Game Object instance.
  60085. */
  60086. setOutlineStyle: function (fillColor, fillAlpha)
  60087. {
  60088. if (fillAlpha === undefined) { fillAlpha = 1; }
  60089. if (fillColor === undefined)
  60090. {
  60091. this.showOutline = false;
  60092. }
  60093. else
  60094. {
  60095. this.outlineFillColor = fillColor;
  60096. this.outlineFillAlpha = fillAlpha;
  60097. this.showOutline = true;
  60098. }
  60099. return this;
  60100. }
  60101. });
  60102. module.exports = Grid;
  60103. /***/ }),
  60104. /* 296 */
  60105. /***/ (function(module, exports, __webpack_require__) {
  60106. /**
  60107. * @author Richard Davey <rich@photonstorm.com>
  60108. * @copyright 2019 Photon Storm Ltd.
  60109. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60110. */
  60111. var Class = __webpack_require__(0);
  60112. var Earcut = __webpack_require__(71);
  60113. var EllipseRender = __webpack_require__(819);
  60114. var GeomEllipse = __webpack_require__(96);
  60115. var Shape = __webpack_require__(29);
  60116. /**
  60117. * @classdesc
  60118. * The Ellipse Shape is a Game Object that can be added to a Scene, Group or Container. You can
  60119. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  60120. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  60121. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  60122. *
  60123. * This shape supports both fill and stroke colors.
  60124. *
  60125. * When it renders it displays an ellipse shape. You can control the width and height of the ellipse.
  60126. * If the width and height match it will render as a circle. If the width is less than the height,
  60127. * it will look more like an egg shape.
  60128. *
  60129. * The Ellipse shape also has a `smoothness` property and corresponding `setSmoothness` method.
  60130. * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations
  60131. * that take place during construction. Increase and decrease the default value for smoother, or more
  60132. * jagged, shapes.
  60133. *
  60134. * @class Ellipse
  60135. * @extends Phaser.GameObjects.Shape
  60136. * @memberof Phaser.GameObjects
  60137. * @constructor
  60138. * @since 3.13.0
  60139. *
  60140. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  60141. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  60142. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  60143. * @param {number} [width=128] - The width of the ellipse. An ellipse with equal width and height renders as a circle.
  60144. * @param {number} [height=128] - The height of the ellipse. An ellipse with equal width and height renders as a circle.
  60145. * @param {number} [fillColor] - The color the ellipse will be filled with, i.e. 0xff0000 for red.
  60146. * @param {number} [fillAlpha] - The alpha the ellipse will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  60147. */
  60148. var Ellipse = new Class({
  60149. Extends: Shape,
  60150. Mixins: [
  60151. EllipseRender
  60152. ],
  60153. initialize:
  60154. function Ellipse (scene, x, y, width, height, fillColor, fillAlpha)
  60155. {
  60156. if (x === undefined) { x = 0; }
  60157. if (y === undefined) { y = 0; }
  60158. if (width === undefined) { width = 128; }
  60159. if (height === undefined) { height = 128; }
  60160. Shape.call(this, scene, 'Ellipse', new GeomEllipse(width / 2, height / 2, width, height));
  60161. /**
  60162. * Private internal value.
  60163. * The number of points used to draw the curve. Higher values create smoother renders at the cost of more triangles being drawn.
  60164. *
  60165. * @name Phaser.GameObjects.Ellipse#_smoothness
  60166. * @type {integer}
  60167. * @private
  60168. * @since 3.13.0
  60169. */
  60170. this._smoothness = 64;
  60171. this.setPosition(x, y);
  60172. this.width = width;
  60173. this.height = height;
  60174. if (fillColor !== undefined)
  60175. {
  60176. this.setFillStyle(fillColor, fillAlpha);
  60177. }
  60178. this.updateDisplayOrigin();
  60179. this.updateData();
  60180. },
  60181. /**
  60182. * The smoothness of the ellipse. The number of points used when rendering it.
  60183. * Increase this value for a smoother ellipse, at the cost of more polygons being rendered.
  60184. *
  60185. * @name Phaser.GameObjects.Ellipse#smoothness
  60186. * @type {integer}
  60187. * @default 64
  60188. * @since 3.13.0
  60189. */
  60190. smoothness: {
  60191. get: function ()
  60192. {
  60193. return this._smoothness;
  60194. },
  60195. set: function (value)
  60196. {
  60197. this._smoothness = value;
  60198. this.updateData();
  60199. }
  60200. },
  60201. /**
  60202. * Sets the size of the ellipse by changing the underlying geometry data, rather than scaling the object.
  60203. * This call can be chained.
  60204. *
  60205. * @method Phaser.GameObjects.Ellipse#setSize
  60206. * @since 3.13.0
  60207. *
  60208. * @param {number} width - The width of the ellipse.
  60209. * @param {number} height - The height of the ellipse.
  60210. *
  60211. * @return {this} This Game Object instance.
  60212. */
  60213. setSize: function (width, height)
  60214. {
  60215. this.geom.setSize(width, height);
  60216. return this.updateData();
  60217. },
  60218. /**
  60219. * Sets the smoothness of the ellipse. The number of points used when rendering it.
  60220. * Increase this value for a smoother ellipse, at the cost of more polygons being rendered.
  60221. * This call can be chained.
  60222. *
  60223. * @method Phaser.GameObjects.Ellipse#setSmoothness
  60224. * @since 3.13.0
  60225. *
  60226. * @param {integer} value - The value to set the smoothness to.
  60227. *
  60228. * @return {this} This Game Object instance.
  60229. */
  60230. setSmoothness: function (value)
  60231. {
  60232. this._smoothness = value;
  60233. return this.updateData();
  60234. },
  60235. /**
  60236. * Internal method that updates the data and path values.
  60237. *
  60238. * @method Phaser.GameObjects.Ellipse#updateData
  60239. * @private
  60240. * @since 3.13.0
  60241. *
  60242. * @return {this} This Game Object instance.
  60243. */
  60244. updateData: function ()
  60245. {
  60246. var path = [];
  60247. var points = this.geom.getPoints(this._smoothness);
  60248. for (var i = 0; i < points.length; i++)
  60249. {
  60250. path.push(points[i].x, points[i].y);
  60251. }
  60252. path.push(points[0].x, points[0].y);
  60253. this.pathIndexes = Earcut(path);
  60254. this.pathData = path;
  60255. return this;
  60256. }
  60257. });
  60258. module.exports = Ellipse;
  60259. /***/ }),
  60260. /* 297 */
  60261. /***/ (function(module, exports, __webpack_require__) {
  60262. /**
  60263. * @author Richard Davey <rich@photonstorm.com>
  60264. * @copyright 2019 Photon Storm Ltd.
  60265. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60266. */
  60267. var Class = __webpack_require__(0);
  60268. var CurveRender = __webpack_require__(822);
  60269. var Earcut = __webpack_require__(71);
  60270. var Rectangle = __webpack_require__(10);
  60271. var Shape = __webpack_require__(29);
  60272. /**
  60273. * @classdesc
  60274. * The Curve Shape is a Game Object that can be added to a Scene, Group or Container. You can
  60275. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  60276. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  60277. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  60278. *
  60279. * This shape supports both fill and stroke colors.
  60280. *
  60281. * To render a Curve Shape you must first create a `Phaser.Curves.Curve` object, then pass it to
  60282. * the Curve Shape in the constructor.
  60283. *
  60284. * The Curve shape also has a `smoothness` property and corresponding `setSmoothness` method.
  60285. * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations
  60286. * that take place during construction. Increase and decrease the default value for smoother, or more
  60287. * jagged, shapes.
  60288. *
  60289. * @class Curve
  60290. * @extends Phaser.GameObjects.Shape
  60291. * @memberof Phaser.GameObjects
  60292. * @constructor
  60293. * @since 3.13.0
  60294. *
  60295. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  60296. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  60297. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  60298. * @param {Phaser.Curves.Curve} [curve] - The Curve object to use to create the Shape.
  60299. * @param {number} [fillColor] - The color the curve will be filled with, i.e. 0xff0000 for red.
  60300. * @param {number} [fillAlpha] - The alpha the curve will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  60301. */
  60302. var Curve = new Class({
  60303. Extends: Shape,
  60304. Mixins: [
  60305. CurveRender
  60306. ],
  60307. initialize:
  60308. function Curve (scene, x, y, curve, fillColor, fillAlpha)
  60309. {
  60310. if (x === undefined) { x = 0; }
  60311. if (y === undefined) { y = 0; }
  60312. Shape.call(this, scene, 'Curve', curve);
  60313. /**
  60314. * Private internal value.
  60315. * The number of points used to draw the curve. Higher values create smoother renders at the cost of more triangles being drawn.
  60316. *
  60317. * @name Phaser.GameObjects.Curve#_smoothness
  60318. * @type {integer}
  60319. * @private
  60320. * @since 3.13.0
  60321. */
  60322. this._smoothness = 32;
  60323. /**
  60324. * Private internal value.
  60325. * The Curve bounds rectangle.
  60326. *
  60327. * @name Phaser.GameObjects.Curve#_curveBounds
  60328. * @type {Phaser.Geom.Rectangle}
  60329. * @private
  60330. * @since 3.13.0
  60331. */
  60332. this._curveBounds = new Rectangle();
  60333. this.closePath = false;
  60334. this.setPosition(x, y);
  60335. if (fillColor !== undefined)
  60336. {
  60337. this.setFillStyle(fillColor, fillAlpha);
  60338. }
  60339. this.updateData();
  60340. },
  60341. /**
  60342. * The smoothness of the curve. The number of points used when rendering it.
  60343. * Increase this value for smoother curves, at the cost of more polygons being rendered.
  60344. *
  60345. * @name Phaser.GameObjects.Curve#smoothness
  60346. * @type {integer}
  60347. * @default 32
  60348. * @since 3.13.0
  60349. */
  60350. smoothness: {
  60351. get: function ()
  60352. {
  60353. return this._smoothness;
  60354. },
  60355. set: function (value)
  60356. {
  60357. this._smoothness = value;
  60358. this.updateData();
  60359. }
  60360. },
  60361. /**
  60362. * Sets the smoothness of the curve. The number of points used when rendering it.
  60363. * Increase this value for smoother curves, at the cost of more polygons being rendered.
  60364. * This call can be chained.
  60365. *
  60366. * @method Phaser.GameObjects.Curve#setSmoothness
  60367. * @since 3.13.0
  60368. *
  60369. * @param {integer} value - The value to set the smoothness to.
  60370. *
  60371. * @return {this} This Game Object instance.
  60372. */
  60373. setSmoothness: function (value)
  60374. {
  60375. this._smoothness = value;
  60376. return this.updateData();
  60377. },
  60378. /**
  60379. * Internal method that updates the data and path values.
  60380. *
  60381. * @method Phaser.GameObjects.Curve#updateData
  60382. * @private
  60383. * @since 3.13.0
  60384. *
  60385. * @return {this} This Game Object instance.
  60386. */
  60387. updateData: function ()
  60388. {
  60389. var bounds = this._curveBounds;
  60390. var smoothness = this._smoothness;
  60391. // Update the bounds in case the underlying data has changed
  60392. this.geom.getBounds(bounds, smoothness);
  60393. this.setSize(bounds.width, bounds.height);
  60394. this.updateDisplayOrigin();
  60395. var path = [];
  60396. var points = this.geom.getPoints(smoothness);
  60397. for (var i = 0; i < points.length; i++)
  60398. {
  60399. path.push(points[i].x, points[i].y);
  60400. }
  60401. path.push(points[0].x, points[0].y);
  60402. this.pathIndexes = Earcut(path);
  60403. this.pathData = path;
  60404. return this;
  60405. }
  60406. });
  60407. module.exports = Curve;
  60408. /***/ }),
  60409. /* 298 */
  60410. /***/ (function(module, exports, __webpack_require__) {
  60411. /**
  60412. * @author Richard Davey <rich@photonstorm.com>
  60413. * @copyright 2019 Photon Storm Ltd.
  60414. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60415. */
  60416. var ArcRender = __webpack_require__(825);
  60417. var Class = __webpack_require__(0);
  60418. var DegToRad = __webpack_require__(34);
  60419. var Earcut = __webpack_require__(71);
  60420. var GeomCircle = __webpack_require__(77);
  60421. var MATH_CONST = __webpack_require__(20);
  60422. var Shape = __webpack_require__(29);
  60423. /**
  60424. * @classdesc
  60425. * The Arc Shape is a Game Object that can be added to a Scene, Group or Container. You can
  60426. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  60427. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  60428. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  60429. *
  60430. * This shape supports both fill and stroke colors.
  60431. *
  60432. * When it renders it displays an arc shape. You can control the start and end angles of the arc,
  60433. * as well as if the angles are winding clockwise or anti-clockwise. With the default settings
  60434. * it renders as a complete circle. By changing the angles you can create other arc shapes,
  60435. * such as half-circles.
  60436. *
  60437. * Arcs also have an `iterations` property and corresponding `setIterations` method. This allows
  60438. * you to control how smooth the shape renders in WebGL, by controlling the number of iterations
  60439. * that take place during construction.
  60440. *
  60441. * @class Arc
  60442. * @extends Phaser.GameObjects.Shape
  60443. * @memberof Phaser.GameObjects
  60444. * @constructor
  60445. * @since 3.13.0
  60446. *
  60447. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  60448. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  60449. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  60450. * @param {number} [radius=128] - The radius of the arc.
  60451. * @param {integer} [startAngle=0] - The start angle of the arc, in degrees.
  60452. * @param {integer} [endAngle=360] - The end angle of the arc, in degrees.
  60453. * @param {boolean} [anticlockwise=false] - The winding order of the start and end angles.
  60454. * @param {number} [fillColor] - The color the arc will be filled with, i.e. 0xff0000 for red.
  60455. * @param {number} [fillAlpha] - The alpha the arc will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  60456. */
  60457. var Arc = new Class({
  60458. Extends: Shape,
  60459. Mixins: [
  60460. ArcRender
  60461. ],
  60462. initialize:
  60463. function Arc (scene, x, y, radius, startAngle, endAngle, anticlockwise, fillColor, fillAlpha)
  60464. {
  60465. if (x === undefined) { x = 0; }
  60466. if (y === undefined) { y = 0; }
  60467. if (radius === undefined) { radius = 128; }
  60468. if (startAngle === undefined) { startAngle = 0; }
  60469. if (endAngle === undefined) { endAngle = 360; }
  60470. if (anticlockwise === undefined) { anticlockwise = false; }
  60471. Shape.call(this, scene, 'Arc', new GeomCircle(0, 0, radius));
  60472. /**
  60473. * Private internal value. Holds the start angle in degrees.
  60474. *
  60475. * @name Phaser.GameObjects.Arc#_startAngle
  60476. * @type {integer}
  60477. * @private
  60478. * @since 3.13.0
  60479. */
  60480. this._startAngle = startAngle;
  60481. /**
  60482. * Private internal value. Holds the end angle in degrees.
  60483. *
  60484. * @name Phaser.GameObjects.Arc#_endAngle
  60485. * @type {integer}
  60486. * @private
  60487. * @since 3.13.0
  60488. */
  60489. this._endAngle = endAngle;
  60490. /**
  60491. * Private internal value. Holds the winding order of the start and end angles.
  60492. *
  60493. * @name Phaser.GameObjects.Arc#_anticlockwise
  60494. * @type {boolean}
  60495. * @private
  60496. * @since 3.13.0
  60497. */
  60498. this._anticlockwise = anticlockwise;
  60499. /**
  60500. * Private internal value. Holds the number of iterations used when drawing the arc.
  60501. *
  60502. * @name Phaser.GameObjects.Arc#_iterations
  60503. * @type {number}
  60504. * @default 0.01
  60505. * @private
  60506. * @since 3.13.0
  60507. */
  60508. this._iterations = 0.01;
  60509. this.setPosition(x, y);
  60510. this.setSize(this.geom.radius, this.geom.radius);
  60511. if (fillColor !== undefined)
  60512. {
  60513. this.setFillStyle(fillColor, fillAlpha);
  60514. }
  60515. this.updateDisplayOrigin();
  60516. this.updateData();
  60517. },
  60518. /**
  60519. * The number of iterations used when drawing the arc.
  60520. * Increase this value for smoother arcs, at the cost of more polygons being rendered.
  60521. * Modify this value by small amounts, such as 0.01.
  60522. *
  60523. * @name Phaser.GameObjects.Arc#iterations
  60524. * @type {number}
  60525. * @default 0.01
  60526. * @since 3.13.0
  60527. */
  60528. iterations: {
  60529. get: function ()
  60530. {
  60531. return this._iterations;
  60532. },
  60533. set: function (value)
  60534. {
  60535. this._iterations = value;
  60536. this.updateData();
  60537. }
  60538. },
  60539. /**
  60540. * The radius of the arc.
  60541. *
  60542. * @name Phaser.GameObjects.Arc#radius
  60543. * @type {number}
  60544. * @since 3.13.0
  60545. */
  60546. radius: {
  60547. get: function ()
  60548. {
  60549. return this.geom.radius;
  60550. },
  60551. set: function (value)
  60552. {
  60553. this.geom.radius = value;
  60554. this.updateData();
  60555. }
  60556. },
  60557. /**
  60558. * The start angle of the arc, in degrees.
  60559. *
  60560. * @name Phaser.GameObjects.Arc#startAngle
  60561. * @type {integer}
  60562. * @since 3.13.0
  60563. */
  60564. startAngle: {
  60565. get: function ()
  60566. {
  60567. return this._startAngle;
  60568. },
  60569. set: function (value)
  60570. {
  60571. this._startAngle = value;
  60572. this.updateData();
  60573. }
  60574. },
  60575. /**
  60576. * The end angle of the arc, in degrees.
  60577. *
  60578. * @name Phaser.GameObjects.Arc#endAngle
  60579. * @type {integer}
  60580. * @since 3.13.0
  60581. */
  60582. endAngle: {
  60583. get: function ()
  60584. {
  60585. return this._endAngle;
  60586. },
  60587. set: function (value)
  60588. {
  60589. this._endAngle = value;
  60590. this.updateData();
  60591. }
  60592. },
  60593. /**
  60594. * The winding order of the start and end angles.
  60595. *
  60596. * @name Phaser.GameObjects.Arc#anticlockwise
  60597. * @type {boolean}
  60598. * @since 3.13.0
  60599. */
  60600. anticlockwise: {
  60601. get: function ()
  60602. {
  60603. return this._anticlockwise;
  60604. },
  60605. set: function (value)
  60606. {
  60607. this._anticlockwise = value;
  60608. this.updateData();
  60609. }
  60610. },
  60611. /**
  60612. * Sets the radius of the arc.
  60613. * This call can be chained.
  60614. *
  60615. * @method Phaser.GameObjects.Arc#setRadius
  60616. * @since 3.13.0
  60617. *
  60618. * @param {number} value - The value to set the radius to.
  60619. *
  60620. * @return {this} This Game Object instance.
  60621. */
  60622. setRadius: function (value)
  60623. {
  60624. this.radius = value;
  60625. return this;
  60626. },
  60627. /**
  60628. * Sets the number of iterations used when drawing the arc.
  60629. * Increase this value for smoother arcs, at the cost of more polygons being rendered.
  60630. * Modify this value by small amounts, such as 0.01.
  60631. * This call can be chained.
  60632. *
  60633. * @method Phaser.GameObjects.Arc#setIterations
  60634. * @since 3.13.0
  60635. *
  60636. * @param {number} value - The value to set the iterations to.
  60637. *
  60638. * @return {this} This Game Object instance.
  60639. */
  60640. setIterations: function (value)
  60641. {
  60642. if (value === undefined) { value = 0.01; }
  60643. this.iterations = value;
  60644. return this;
  60645. },
  60646. /**
  60647. * Sets the starting angle of the arc, in degrees.
  60648. * This call can be chained.
  60649. *
  60650. * @method Phaser.GameObjects.Arc#setStartAngle
  60651. * @since 3.13.0
  60652. *
  60653. * @param {integer} value - The value to set the starting angle to.
  60654. *
  60655. * @return {this} This Game Object instance.
  60656. */
  60657. setStartAngle: function (angle, anticlockwise)
  60658. {
  60659. this._startAngle = angle;
  60660. if (anticlockwise !== undefined)
  60661. {
  60662. this._anticlockwise = anticlockwise;
  60663. }
  60664. return this.updateData();
  60665. },
  60666. /**
  60667. * Sets the ending angle of the arc, in degrees.
  60668. * This call can be chained.
  60669. *
  60670. * @method Phaser.GameObjects.Arc#setEndAngle
  60671. * @since 3.13.0
  60672. *
  60673. * @param {integer} value - The value to set the ending angle to.
  60674. *
  60675. * @return {this} This Game Object instance.
  60676. */
  60677. setEndAngle: function (angle, anticlockwise)
  60678. {
  60679. this._endAngle = angle;
  60680. if (anticlockwise !== undefined)
  60681. {
  60682. this._anticlockwise = anticlockwise;
  60683. }
  60684. return this.updateData();
  60685. },
  60686. /**
  60687. * Internal method that updates the data and path values.
  60688. *
  60689. * @method Phaser.GameObjects.Arc#updateData
  60690. * @private
  60691. * @since 3.13.0
  60692. *
  60693. * @return {this} This Game Object instance.
  60694. */
  60695. updateData: function ()
  60696. {
  60697. var step = this._iterations;
  60698. var iteration = step;
  60699. var radius = this.geom.radius;
  60700. var startAngle = DegToRad(this._startAngle);
  60701. var endAngle = DegToRad(this._endAngle);
  60702. var anticlockwise = this._anticlockwise;
  60703. var x = radius / 2;
  60704. var y = radius / 2;
  60705. endAngle -= startAngle;
  60706. if (anticlockwise)
  60707. {
  60708. if (endAngle < -MATH_CONST.PI2)
  60709. {
  60710. endAngle = -MATH_CONST.PI2;
  60711. }
  60712. else if (endAngle > 0)
  60713. {
  60714. endAngle = -MATH_CONST.PI2 + endAngle % MATH_CONST.PI2;
  60715. }
  60716. }
  60717. else if (endAngle > MATH_CONST.PI2)
  60718. {
  60719. endAngle = MATH_CONST.PI2;
  60720. }
  60721. else if (endAngle < 0)
  60722. {
  60723. endAngle = MATH_CONST.PI2 + endAngle % MATH_CONST.PI2;
  60724. }
  60725. var path = [ x + Math.cos(startAngle) * radius, y + Math.sin(startAngle) * radius ];
  60726. var ta;
  60727. while (iteration < 1)
  60728. {
  60729. ta = endAngle * iteration + startAngle;
  60730. path.push(x + Math.cos(ta) * radius, y + Math.sin(ta) * radius);
  60731. iteration += step;
  60732. }
  60733. ta = endAngle + startAngle;
  60734. path.push(x + Math.cos(ta) * radius, y + Math.sin(ta) * radius);
  60735. path.push(x + Math.cos(startAngle) * radius, y + Math.sin(startAngle) * radius);
  60736. this.pathIndexes = Earcut(path);
  60737. this.pathData = path;
  60738. return this;
  60739. }
  60740. });
  60741. module.exports = Arc;
  60742. /***/ }),
  60743. /* 299 */
  60744. /***/ (function(module, exports) {
  60745. /**
  60746. * @author Richard Davey <rich@photonstorm.com>
  60747. * @copyright 2019 Photon Storm Ltd.
  60748. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60749. */
  60750. /**
  60751. * Creates and returns an RFC4122 version 4 compliant UUID.
  60752. *
  60753. * The string is in the form: `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx` where each `x` is replaced with a random
  60754. * hexadecimal digit from 0 to f, and `y` is replaced with a random hexadecimal digit from 8 to b.
  60755. *
  60756. * @function Phaser.Utils.String.UUID
  60757. * @since 3.12.0
  60758. *
  60759. * @return {string} The UUID string.
  60760. */
  60761. var UUID = function ()
  60762. {
  60763. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c)
  60764. {
  60765. var r = Math.random() * 16 | 0;
  60766. var v = (c === 'x') ? r : (r & 0x3 | 0x8);
  60767. return v.toString(16);
  60768. });
  60769. };
  60770. module.exports = UUID;
  60771. /***/ }),
  60772. /* 300 */
  60773. /***/ (function(module, exports, __webpack_require__) {
  60774. /**
  60775. * @author Richard Davey <rich@photonstorm.com>
  60776. * @copyright 2019 Photon Storm Ltd.
  60777. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60778. */
  60779. var Class = __webpack_require__(0);
  60780. var DegToRad = __webpack_require__(34);
  60781. var GetBoolean = __webpack_require__(90);
  60782. var GetValue = __webpack_require__(4);
  60783. var Sprite = __webpack_require__(67);
  60784. var TWEEN_CONST = __webpack_require__(89);
  60785. var Vector2 = __webpack_require__(3);
  60786. /**
  60787. * Settings for a PathFollower.
  60788. *
  60789. * @typedef {object} PathConfig
  60790. *
  60791. * @property {number} duration - The duration of the path follow.
  60792. * @property {number} from - The start position of the path follow, between 0 and 1.
  60793. * @property {number} to - The end position of the path follow, between 0 and 1.
  60794. * @property {boolean} [positionOnPath=false] - Whether to position the PathFollower on the Path using its path offset.
  60795. * @property {boolean} [rotateToPath=false] - Should the PathFollower automatically rotate to point in the direction of the Path?
  60796. * @property {number} [rotationOffset=0] - If the PathFollower is rotating to match the Path, this value is added to the rotation value. This allows you to rotate objects to a path but control the angle of the rotation as well.
  60797. * @property {number} [startAt=0] - Current start position of the path follow, between 0 and 1.
  60798. */
  60799. /**
  60800. * @classdesc
  60801. * A PathFollower Game Object.
  60802. *
  60803. * A PathFollower is a Sprite Game Object with some extra helpers to allow it to follow a Path automatically.
  60804. *
  60805. * Anything you can do with a standard Sprite can be done with this PathFollower, such as animate it, tint it,
  60806. * scale it and so on.
  60807. *
  60808. * PathFollowers are bound to a single Path at any one time and can traverse the length of the Path, from start
  60809. * to finish, forwards or backwards, or from any given point on the Path to its end. They can optionally rotate
  60810. * to face the direction of the path, be offset from the path coordinates or rotate independently of the Path.
  60811. *
  60812. * @class PathFollower
  60813. * @extends Phaser.GameObjects.Sprite
  60814. * @memberof Phaser.GameObjects
  60815. * @constructor
  60816. * @since 3.0.0
  60817. *
  60818. * @param {Phaser.Scene} scene - The Scene to which this PathFollower belongs.
  60819. * @param {Phaser.Curves.Path} path - The Path this PathFollower is following. It can only follow one Path at a time.
  60820. * @param {number} x - The horizontal position of this Game Object in the world.
  60821. * @param {number} y - The vertical position of this Game Object in the world.
  60822. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  60823. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  60824. */
  60825. var PathFollower = new Class({
  60826. Extends: Sprite,
  60827. initialize:
  60828. function PathFollower (scene, path, x, y, texture, frame)
  60829. {
  60830. Sprite.call(this, scene, x, y, texture, frame);
  60831. /**
  60832. * The Path this PathFollower is following. It can only follow one Path at a time.
  60833. *
  60834. * @name Phaser.GameObjects.PathFollower#path
  60835. * @type {Phaser.Curves.Path}
  60836. * @since 3.0.0
  60837. */
  60838. this.path = path;
  60839. /**
  60840. * Should the PathFollower automatically rotate to point in the direction of the Path?
  60841. *
  60842. * @name Phaser.GameObjects.PathFollower#rotateToPath
  60843. * @type {boolean}
  60844. * @default false
  60845. * @since 3.0.0
  60846. */
  60847. this.rotateToPath = false;
  60848. /**
  60849. * If the PathFollower is rotating to match the Path (@see Phaser.GameObjects.PathFollower#rotateToPath)
  60850. * this value is added to the rotation value. This allows you to rotate objects to a path but control
  60851. * the angle of the rotation as well.
  60852. *
  60853. * @name Phaser.GameObjects.PathFollower#pathRotationOffset
  60854. * @type {number}
  60855. * @default 0
  60856. * @since 3.0.0
  60857. */
  60858. this.pathRotationOffset = 0;
  60859. /**
  60860. * An additional vector to add to the PathFollowers position, allowing you to offset it from the
  60861. * Path coordinates.
  60862. *
  60863. * @name Phaser.GameObjects.PathFollower#pathOffset
  60864. * @type {Phaser.Math.Vector2}
  60865. * @since 3.0.0
  60866. */
  60867. this.pathOffset = new Vector2(x, y);
  60868. /**
  60869. * A Vector2 that stores the current point of the path the follower is on.
  60870. *
  60871. * @name Phaser.GameObjects.PathFollower#pathVector
  60872. * @type {Phaser.Math.Vector2}
  60873. * @since 3.0.0
  60874. */
  60875. this.pathVector = new Vector2();
  60876. /**
  60877. * The Tween used for following the Path.
  60878. *
  60879. * @name Phaser.GameObjects.PathFollower#pathTween
  60880. * @type {Phaser.Tweens.Tween}
  60881. * @since 3.0.0
  60882. */
  60883. this.pathTween;
  60884. /**
  60885. * Settings for the PathFollower.
  60886. *
  60887. * @name Phaser.GameObjects.PathFollower#pathConfig
  60888. * @type {?PathConfig}
  60889. * @default null
  60890. * @since 3.0.0
  60891. */
  60892. this.pathConfig = null;
  60893. /**
  60894. * Records the direction of the follower so it can change direction.
  60895. *
  60896. * @name Phaser.GameObjects.PathFollower#_prevDirection
  60897. * @type {integer}
  60898. * @private
  60899. * @since 3.0.0
  60900. */
  60901. this._prevDirection = TWEEN_CONST.PLAYING_FORWARD;
  60902. },
  60903. /**
  60904. * Set the Path that this PathFollower should follow.
  60905. *
  60906. * Optionally accepts {@link PathConfig} settings.
  60907. *
  60908. * @method Phaser.GameObjects.PathFollower#setPath
  60909. * @since 3.0.0
  60910. *
  60911. * @param {Phaser.Curves.Path} path - The Path this PathFollower is following. It can only follow one Path at a time.
  60912. * @param {PathConfig} [config] - Settings for the PathFollower.
  60913. *
  60914. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  60915. */
  60916. setPath: function (path, config)
  60917. {
  60918. if (config === undefined) { config = this.pathConfig; }
  60919. var tween = this.pathTween;
  60920. if (tween && tween.isPlaying())
  60921. {
  60922. tween.stop();
  60923. }
  60924. this.path = path;
  60925. if (config)
  60926. {
  60927. this.startFollow(config);
  60928. }
  60929. return this;
  60930. },
  60931. /**
  60932. * Set whether the PathFollower should automatically rotate to point in the direction of the Path.
  60933. *
  60934. * @method Phaser.GameObjects.PathFollower#setRotateToPath
  60935. * @since 3.0.0
  60936. *
  60937. * @param {boolean} value - Whether the PathFollower should automatically rotate to point in the direction of the Path.
  60938. * @param {number} [offset=0] - Rotation offset in degrees.
  60939. *
  60940. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  60941. */
  60942. setRotateToPath: function (value, offset)
  60943. {
  60944. if (offset === undefined) { offset = 0; }
  60945. this.rotateToPath = value;
  60946. this.pathRotationOffset = offset;
  60947. return this;
  60948. },
  60949. /**
  60950. * Is this PathFollower actively following a Path or not?
  60951. *
  60952. * To be considered as `isFollowing` it must be currently moving on a Path, and not paused.
  60953. *
  60954. * @method Phaser.GameObjects.PathFollower#isFollowing
  60955. * @since 3.0.0
  60956. *
  60957. * @return {boolean} `true` is this PathFollower is actively following a Path, otherwise `false`.
  60958. */
  60959. isFollowing: function ()
  60960. {
  60961. var tween = this.pathTween;
  60962. return (tween && tween.isPlaying());
  60963. },
  60964. /**
  60965. * Starts this PathFollower following its given Path.
  60966. *
  60967. * @method Phaser.GameObjects.PathFollower#startFollow
  60968. * @since 3.3.0
  60969. *
  60970. * @param {(number|PathConfig)} [config={}] - The duration of the follow, or a PathFollower config object.
  60971. * @param {number} [startAt=0] - Optional start position of the follow, between 0 and 1.
  60972. *
  60973. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  60974. */
  60975. startFollow: function (config, startAt)
  60976. {
  60977. if (config === undefined) { config = {}; }
  60978. if (startAt === undefined) { startAt = 0; }
  60979. var tween = this.pathTween;
  60980. if (tween && tween.isPlaying())
  60981. {
  60982. tween.stop();
  60983. }
  60984. if (typeof config === 'number')
  60985. {
  60986. config = { duration: config };
  60987. }
  60988. // Override in case they've been specified in the config
  60989. config.from = 0;
  60990. config.to = 1;
  60991. // Can also read extra values out of the config:
  60992. var positionOnPath = GetBoolean(config, 'positionOnPath', false);
  60993. this.rotateToPath = GetBoolean(config, 'rotateToPath', false);
  60994. this.pathRotationOffset = GetValue(config, 'rotationOffset', 0);
  60995. // This works, but it's not an ideal way of doing it as the follower jumps position
  60996. var seek = GetValue(config, 'startAt', startAt);
  60997. if (seek)
  60998. {
  60999. config.onStart = function (tween)
  61000. {
  61001. var tweenData = tween.data[0];
  61002. tweenData.progress = seek;
  61003. tweenData.elapsed = tweenData.duration * seek;
  61004. var v = tweenData.ease(tweenData.progress);
  61005. tweenData.current = tweenData.start + ((tweenData.end - tweenData.start) * v);
  61006. tweenData.target[tweenData.key] = tweenData.current;
  61007. };
  61008. }
  61009. this.pathTween = this.scene.sys.tweens.addCounter(config);
  61010. // The starting point of the path, relative to this follower
  61011. this.path.getStartPoint(this.pathOffset);
  61012. if (positionOnPath)
  61013. {
  61014. this.x = this.pathOffset.x;
  61015. this.y = this.pathOffset.y;
  61016. }
  61017. this.pathOffset.x = this.x - this.pathOffset.x;
  61018. this.pathOffset.y = this.y - this.pathOffset.y;
  61019. this._prevDirection = TWEEN_CONST.PLAYING_FORWARD;
  61020. if (this.rotateToPath)
  61021. {
  61022. // Set the rotation now (in case the tween has a delay on it, etc)
  61023. var nextPoint = this.path.getPoint(0.1);
  61024. this.rotation = Math.atan2(nextPoint.y - this.y, nextPoint.x - this.x) + DegToRad(this.pathRotationOffset);
  61025. }
  61026. this.pathConfig = config;
  61027. return this;
  61028. },
  61029. /**
  61030. * Pauses this PathFollower. It will still continue to render, but it will remain motionless at the
  61031. * point on the Path at which you paused it.
  61032. *
  61033. * @method Phaser.GameObjects.PathFollower#pauseFollow
  61034. * @since 3.3.0
  61035. *
  61036. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  61037. */
  61038. pauseFollow: function ()
  61039. {
  61040. var tween = this.pathTween;
  61041. if (tween && tween.isPlaying())
  61042. {
  61043. tween.pause();
  61044. }
  61045. return this;
  61046. },
  61047. /**
  61048. * Resumes a previously paused PathFollower.
  61049. *
  61050. * If the PathFollower was not paused this has no effect.
  61051. *
  61052. * @method Phaser.GameObjects.PathFollower#resumeFollow
  61053. * @since 3.3.0
  61054. *
  61055. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  61056. */
  61057. resumeFollow: function ()
  61058. {
  61059. var tween = this.pathTween;
  61060. if (tween && tween.isPaused())
  61061. {
  61062. tween.resume();
  61063. }
  61064. return this;
  61065. },
  61066. /**
  61067. * Stops this PathFollower from following the path any longer.
  61068. *
  61069. * This will invoke any 'stop' conditions that may exist on the Path, or for the follower.
  61070. *
  61071. * @method Phaser.GameObjects.PathFollower#stopFollow
  61072. * @since 3.3.0
  61073. *
  61074. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  61075. */
  61076. stopFollow: function ()
  61077. {
  61078. var tween = this.pathTween;
  61079. if (tween && tween.isPlaying())
  61080. {
  61081. tween.stop();
  61082. }
  61083. return this;
  61084. },
  61085. /**
  61086. * Internal update handler that advances this PathFollower along the path.
  61087. *
  61088. * Called automatically by the Scene step, should not typically be called directly.
  61089. *
  61090. * @method Phaser.GameObjects.PathFollower#preUpdate
  61091. * @protected
  61092. * @since 3.0.0
  61093. *
  61094. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  61095. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  61096. */
  61097. preUpdate: function (time, delta)
  61098. {
  61099. this.anims.update(time, delta);
  61100. var tween = this.pathTween;
  61101. if (tween)
  61102. {
  61103. var tweenData = tween.data[0];
  61104. if (tweenData.state !== TWEEN_CONST.PLAYING_FORWARD && tweenData.state !== TWEEN_CONST.PLAYING_BACKWARD)
  61105. {
  61106. // If delayed, etc then bail out
  61107. return;
  61108. }
  61109. var pathVector = this.pathVector;
  61110. this.path.getPoint(tween.getValue(), pathVector);
  61111. pathVector.add(this.pathOffset);
  61112. var oldX = this.x;
  61113. var oldY = this.y;
  61114. this.setPosition(pathVector.x, pathVector.y);
  61115. var speedX = this.x - oldX;
  61116. var speedY = this.y - oldY;
  61117. if (speedX === 0 && speedY === 0)
  61118. {
  61119. // Bail out early
  61120. return;
  61121. }
  61122. if (tweenData.state !== this._prevDirection)
  61123. {
  61124. // We've changed direction, so don't do a rotate this frame
  61125. this._prevDirection = tweenData.state;
  61126. return;
  61127. }
  61128. if (this.rotateToPath)
  61129. {
  61130. this.rotation = Math.atan2(speedY, speedX) + DegToRad(this.pathRotationOffset);
  61131. }
  61132. }
  61133. }
  61134. });
  61135. module.exports = PathFollower;
  61136. /***/ }),
  61137. /* 301 */
  61138. /***/ (function(module, exports, __webpack_require__) {
  61139. /**
  61140. * @author Richard Davey <rich@photonstorm.com>
  61141. * @copyright 2019 Photon Storm Ltd.
  61142. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  61143. */
  61144. var Class = __webpack_require__(0);
  61145. var Vector2 = __webpack_require__(3);
  61146. /**
  61147. * @callback RandomZoneSourceCallback
  61148. *
  61149. * @param {Phaser.Math.Vector2} point - A point to modify.
  61150. */
  61151. /**
  61152. * @typedef {object} RandomZoneSource
  61153. *
  61154. * @property {RandomZoneSourceCallback} getRandomPoint - A function modifying its point argument.
  61155. *
  61156. * @see Phaser.Geom.Circle
  61157. * @see Phaser.Geom.Ellipse
  61158. * @see Phaser.Geom.Line
  61159. * @see Phaser.Geom.Polygon
  61160. * @see Phaser.Geom.Rectangle
  61161. * @see Phaser.Geom.Triangle
  61162. */
  61163. /**
  61164. * @classdesc
  61165. * A zone that places particles randomly within a shape's area.
  61166. *
  61167. * @class RandomZone
  61168. * @memberof Phaser.GameObjects.Particles.Zones
  61169. * @constructor
  61170. * @since 3.0.0
  61171. *
  61172. * @param {RandomZoneSource} source - An object instance with a `getRandomPoint(point)` method.
  61173. */
  61174. var RandomZone = new Class({
  61175. initialize:
  61176. function RandomZone (source)
  61177. {
  61178. /**
  61179. * An object instance with a `getRandomPoint(point)` method.
  61180. *
  61181. * @name Phaser.GameObjects.Particles.Zones.RandomZone#source
  61182. * @type {RandomZoneSource}
  61183. * @since 3.0.0
  61184. */
  61185. this.source = source;
  61186. /**
  61187. * Internal calculation vector.
  61188. *
  61189. * @name Phaser.GameObjects.Particles.Zones.RandomZone#_tempVec
  61190. * @type {Phaser.Math.Vector2}
  61191. * @private
  61192. * @since 3.0.0
  61193. */
  61194. this._tempVec = new Vector2();
  61195. },
  61196. /**
  61197. * Get the next point in the Zone and set its coordinates on the given Particle.
  61198. *
  61199. * @method Phaser.GameObjects.Particles.Zones.RandomZone#getPoint
  61200. * @since 3.0.0
  61201. *
  61202. * @param {Phaser.GameObjects.Particles.Particle} particle - The Particle.
  61203. */
  61204. getPoint: function (particle)
  61205. {
  61206. var vec = this._tempVec;
  61207. this.source.getRandomPoint(vec);
  61208. particle.x = vec.x;
  61209. particle.y = vec.y;
  61210. }
  61211. });
  61212. module.exports = RandomZone;
  61213. /***/ }),
  61214. /* 302 */
  61215. /***/ (function(module, exports) {
  61216. /**
  61217. * @author Richard Davey <rich@photonstorm.com>
  61218. * @copyright 2019 Photon Storm Ltd.
  61219. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  61220. */
  61221. /**
  61222. * Verifies that an object contains at least one of the requested keys
  61223. *
  61224. * @function Phaser.Utils.Objects.HasAny
  61225. * @since 3.0.0
  61226. *
  61227. * @param {object} source - an object on which to check for key existence
  61228. * @param {string[]} keys - an array of keys to search the object for
  61229. *
  61230. * @return {boolean} true if the source object contains at least one of the keys, false otherwise
  61231. */
  61232. var HasAny = function (source, keys)
  61233. {
  61234. for (var i = 0; i < keys.length; i++)
  61235. {
  61236. if (source.hasOwnProperty(keys[i]))
  61237. {
  61238. return true;
  61239. }
  61240. }
  61241. return false;
  61242. };
  61243. module.exports = HasAny;
  61244. /***/ }),
  61245. /* 303 */
  61246. /***/ (function(module, exports, __webpack_require__) {
  61247. /**
  61248. * @author Richard Davey <rich@photonstorm.com>
  61249. * @copyright 2019 Photon Storm Ltd.
  61250. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  61251. */
  61252. var Class = __webpack_require__(0);
  61253. /**
  61254. * @callback EdgeZoneSourceCallback
  61255. *
  61256. * @param {integer} quantity - The number of particles to place on the source edge. If 0, `stepRate` should be used instead.
  61257. * @param {number} [stepRate] - The distance between each particle. When set, `quantity` is implied and should be set to `0`.
  61258. *
  61259. * @return {Phaser.Geom.Point[]} - The points placed on the source edge.
  61260. */
  61261. /**
  61262. * @typedef {object} EdgeZoneSource
  61263. *
  61264. * @property {EdgeZoneSourceCallback} getPoints - A function placing points on the source's edge or edges.
  61265. *
  61266. * @see Phaser.Curves.Curve
  61267. * @see Phaser.Curves.Path
  61268. * @see Phaser.Geom.Circle
  61269. * @see Phaser.Geom.Ellipse
  61270. * @see Phaser.Geom.Line
  61271. * @see Phaser.Geom.Polygon
  61272. * @see Phaser.Geom.Rectangle
  61273. * @see Phaser.Geom.Triangle
  61274. */
  61275. /**
  61276. * @classdesc
  61277. * A zone that places particles on a shape's edges.
  61278. *
  61279. * @class EdgeZone
  61280. * @memberof Phaser.GameObjects.Particles.Zones
  61281. * @constructor
  61282. * @since 3.0.0
  61283. *
  61284. * @param {EdgeZoneSource} source - An object instance with a `getPoints(quantity, stepRate)` method returning an array of points.
  61285. * @param {integer} quantity - The number of particles to place on the source edge. Set to 0 to use `stepRate` instead.
  61286. * @param {number} stepRate - The distance between each particle. When set, `quantity` is implied and should be set to 0.
  61287. * @param {boolean} [yoyo=false] - Whether particles are placed from start to end and then end to start.
  61288. * @param {boolean} [seamless=true] - Whether one endpoint will be removed if it's identical to the other.
  61289. */
  61290. var EdgeZone = new Class({
  61291. initialize:
  61292. function EdgeZone (source, quantity, stepRate, yoyo, seamless)
  61293. {
  61294. if (yoyo === undefined) { yoyo = false; }
  61295. if (seamless === undefined) { seamless = true; }
  61296. /**
  61297. * An object instance with a `getPoints(quantity, stepRate)` method returning an array of points.
  61298. *
  61299. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#source
  61300. * @type {EdgeZoneSource|RandomZoneSource}
  61301. * @since 3.0.0
  61302. */
  61303. this.source = source;
  61304. /**
  61305. * The points placed on the source edge.
  61306. *
  61307. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#points
  61308. * @type {Phaser.Geom.Point[]}
  61309. * @default []
  61310. * @since 3.0.0
  61311. */
  61312. this.points = [];
  61313. /**
  61314. * The number of particles to place on the source edge. Set to 0 to use `stepRate` instead.
  61315. *
  61316. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#quantity
  61317. * @type {integer}
  61318. * @since 3.0.0
  61319. */
  61320. this.quantity = quantity;
  61321. /**
  61322. * The distance between each particle. When set, `quantity` is implied and should be set to 0.
  61323. *
  61324. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#stepRate
  61325. * @type {number}
  61326. * @since 3.0.0
  61327. */
  61328. this.stepRate = stepRate;
  61329. /**
  61330. * Whether particles are placed from start to end and then end to start.
  61331. *
  61332. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#yoyo
  61333. * @type {boolean}
  61334. * @since 3.0.0
  61335. */
  61336. this.yoyo = yoyo;
  61337. /**
  61338. * The counter used for iterating the EdgeZone's points.
  61339. *
  61340. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#counter
  61341. * @type {number}
  61342. * @default -1
  61343. * @since 3.0.0
  61344. */
  61345. this.counter = -1;
  61346. /**
  61347. * Whether one endpoint will be removed if it's identical to the other.
  61348. *
  61349. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#seamless
  61350. * @type {boolean}
  61351. * @since 3.0.0
  61352. */
  61353. this.seamless = seamless;
  61354. /**
  61355. * An internal count of the points belonging to this EdgeZone.
  61356. *
  61357. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#_length
  61358. * @type {number}
  61359. * @private
  61360. * @default 0
  61361. * @since 3.0.0
  61362. */
  61363. this._length = 0;
  61364. /**
  61365. * An internal value used to keep track of the current iteration direction for the EdgeZone's points.
  61366. *
  61367. * 0 = forwards, 1 = backwards
  61368. *
  61369. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#_direction
  61370. * @type {number}
  61371. * @private
  61372. * @default 0
  61373. * @since 3.0.0
  61374. */
  61375. this._direction = 0;
  61376. this.updateSource();
  61377. },
  61378. /**
  61379. * Update the {@link Phaser.GameObjects.Particles.Zones.EdgeZone#points} from the EdgeZone's
  61380. * {@link Phaser.GameObjects.Particles.Zones.EdgeZone#source}.
  61381. *
  61382. * Also updates internal properties.
  61383. *
  61384. * @method Phaser.GameObjects.Particles.Zones.EdgeZone#updateSource
  61385. * @since 3.0.0
  61386. *
  61387. * @return {Phaser.GameObjects.Particles.Zones.EdgeZone} This Edge Zone.
  61388. */
  61389. updateSource: function ()
  61390. {
  61391. this.points = this.source.getPoints(this.quantity, this.stepRate);
  61392. // Remove ends?
  61393. if (this.seamless)
  61394. {
  61395. var a = this.points[0];
  61396. var b = this.points[this.points.length - 1];
  61397. if (a.x === b.x && a.y === b.y)
  61398. {
  61399. this.points.pop();
  61400. }
  61401. }
  61402. var oldLength = this._length;
  61403. this._length = this.points.length;
  61404. // Adjust counter if we now have less points than before
  61405. if (this._length < oldLength && this.counter > this._length)
  61406. {
  61407. this.counter = this._length - 1;
  61408. }
  61409. return this;
  61410. },
  61411. /**
  61412. * Change the EdgeZone's source.
  61413. *
  61414. * @method Phaser.GameObjects.Particles.Zones.EdgeZone#changeSource
  61415. * @since 3.0.0
  61416. *
  61417. * @param {EdgeZoneSource} source - An object instance with a `getPoints(quantity, stepRate)` method returning an array of points.
  61418. *
  61419. * @return {Phaser.GameObjects.Particles.Zones.EdgeZone} This Edge Zone.
  61420. */
  61421. changeSource: function (source)
  61422. {
  61423. this.source = source;
  61424. return this.updateSource();
  61425. },
  61426. /**
  61427. * Get the next point in the Zone and set its coordinates on the given Particle.
  61428. *
  61429. * @method Phaser.GameObjects.Particles.Zones.EdgeZone#getPoint
  61430. * @since 3.0.0
  61431. *
  61432. * @param {Phaser.GameObjects.Particles.Particle} particle - The Particle.
  61433. */
  61434. getPoint: function (particle)
  61435. {
  61436. if (this._direction === 0)
  61437. {
  61438. this.counter++;
  61439. if (this.counter >= this._length)
  61440. {
  61441. if (this.yoyo)
  61442. {
  61443. this._direction = 1;
  61444. this.counter = this._length - 1;
  61445. }
  61446. else
  61447. {
  61448. this.counter = 0;
  61449. }
  61450. }
  61451. }
  61452. else
  61453. {
  61454. this.counter--;
  61455. if (this.counter === -1)
  61456. {
  61457. if (this.yoyo)
  61458. {
  61459. this._direction = 0;
  61460. this.counter = 0;
  61461. }
  61462. else
  61463. {
  61464. this.counter = this._length - 1;
  61465. }
  61466. }
  61467. }
  61468. var point = this.points[this.counter];
  61469. if (point)
  61470. {
  61471. particle.x = point.x;
  61472. particle.y = point.y;
  61473. }
  61474. }
  61475. });
  61476. module.exports = EdgeZone;
  61477. /***/ }),
  61478. /* 304 */
  61479. /***/ (function(module, exports, __webpack_require__) {
  61480. /**
  61481. * @author Richard Davey <rich@photonstorm.com>
  61482. * @copyright 2019 Photon Storm Ltd.
  61483. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  61484. */
  61485. var Class = __webpack_require__(0);
  61486. /**
  61487. * @callback DeathZoneSourceCallback
  61488. *
  61489. * @param {number} x - The x coordinate of the particle to check against this source area.
  61490. * @param {number} y - The y coordinate of the particle to check against this source area.
  61491. *
  61492. * @return {boolean} - True if the coordinates are within the source area.
  61493. */
  61494. /**
  61495. * @typedef {object} DeathZoneSource
  61496. *
  61497. * @property {DeathZoneSourceCallback} contains
  61498. *
  61499. * @see Phaser.Geom.Circle
  61500. * @see Phaser.Geom.Ellipse
  61501. * @see Phaser.Geom.Polygon
  61502. * @see Phaser.Geom.Rectangle
  61503. * @see Phaser.Geom.Triangle
  61504. */
  61505. /**
  61506. * @classdesc
  61507. * A Death Zone.
  61508. *
  61509. * A Death Zone is a special type of zone that will kill a Particle as soon as it either enters, or leaves, the zone.
  61510. *
  61511. * The zone consists of a `source` which could be a Geometric shape, such as a Rectangle or Ellipse, or your own
  61512. * object as long as it includes a `contains` method for which the Particles can be tested against.
  61513. *
  61514. * @class DeathZone
  61515. * @memberof Phaser.GameObjects.Particles.Zones
  61516. * @constructor
  61517. * @since 3.0.0
  61518. *
  61519. * @param {DeathZoneSource} source - An object instance that has a `contains` method that returns a boolean when given `x` and `y` arguments.
  61520. * @param {boolean} killOnEnter - Should the Particle be killed when it enters the zone? `true` or leaves it? `false`
  61521. */
  61522. var DeathZone = new Class({
  61523. initialize:
  61524. function DeathZone (source, killOnEnter)
  61525. {
  61526. /**
  61527. * An object instance that has a `contains` method that returns a boolean when given `x` and `y` arguments.
  61528. * This could be a Geometry shape, such as `Phaser.Geom.Circle`, or your own custom object.
  61529. *
  61530. * @name Phaser.GameObjects.Particles.Zones.DeathZone#source
  61531. * @type {DeathZoneSource}
  61532. * @since 3.0.0
  61533. */
  61534. this.source = source;
  61535. /**
  61536. * Set to `true` if the Particle should be killed if it enters this zone.
  61537. * Set to `false` to kill the Particle if it leaves this zone.
  61538. *
  61539. * @name Phaser.GameObjects.Particles.Zones.DeathZone#killOnEnter
  61540. * @type {boolean}
  61541. * @since 3.0.0
  61542. */
  61543. this.killOnEnter = killOnEnter;
  61544. },
  61545. /**
  61546. * Checks if the given Particle will be killed or not by this zone.
  61547. *
  61548. * @method Phaser.GameObjects.Particles.Zones.DeathZone#willKill
  61549. * @since 3.0.0
  61550. *
  61551. * @param {Phaser.GameObjects.Particles.Particle} particle - The Particle to be checked against this zone.
  61552. *
  61553. * @return {boolean} Return `true` if the Particle is to be killed, otherwise return `false`.
  61554. */
  61555. willKill: function (particle)
  61556. {
  61557. var withinZone = this.source.contains(particle.x, particle.y);
  61558. return (withinZone && this.killOnEnter || !withinZone && !this.killOnEnter);
  61559. }
  61560. });
  61561. module.exports = DeathZone;
  61562. /***/ }),
  61563. /* 305 */
  61564. /***/ (function(module, exports, __webpack_require__) {
  61565. /**
  61566. * @author Richard Davey <rich@photonstorm.com>
  61567. * @copyright 2019 Photon Storm Ltd.
  61568. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  61569. */
  61570. var BlendModes = __webpack_require__(60);
  61571. var Class = __webpack_require__(0);
  61572. var Components = __webpack_require__(13);
  61573. var DeathZone = __webpack_require__(304);
  61574. var EdgeZone = __webpack_require__(303);
  61575. var EmitterOp = __webpack_require__(845);
  61576. var GetFastValue = __webpack_require__(2);
  61577. var GetRandom = __webpack_require__(172);
  61578. var HasAny = __webpack_require__(302);
  61579. var HasValue = __webpack_require__(91);
  61580. var Particle = __webpack_require__(306);
  61581. var RandomZone = __webpack_require__(301);
  61582. var Rectangle = __webpack_require__(10);
  61583. var StableSort = __webpack_require__(118);
  61584. var Vector2 = __webpack_require__(3);
  61585. var Wrap = __webpack_require__(57);
  61586. /**
  61587. * @callback ParticleEmitterCallback
  61588. *
  61589. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle associated with the call.
  61590. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - This particle emitter associated with the call.
  61591. */
  61592. /**
  61593. * @callback ParticleDeathCallback
  61594. *
  61595. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle that died.
  61596. */
  61597. /**
  61598. * @typedef {object} ParticleEmitterBounds
  61599. *
  61600. * @property {number} x - The left edge of the rectangle.
  61601. * @property {number} y - The top edge of the rectangle.
  61602. * @property {number} width - The width of the rectangle.
  61603. * @property {number} height - The height of the rectangle.
  61604. *
  61605. * @see Phaser.GameObjects.Particles.ParticleEmitter#setBounds
  61606. */
  61607. /**
  61608. * @typedef {object} ParticleEmitterBoundsAlt
  61609. *
  61610. * @property {number} x - The left edge of the rectangle.
  61611. * @property {number} y - The top edge of the rectangle.
  61612. * @property {number} w - The width of the rectangle.
  61613. * @property {number} h - The height of the rectangle.
  61614. *
  61615. * @see Phaser.GameObjects.Particles.ParticleEmitter#setBounds
  61616. */
  61617. /**
  61618. * @typedef {object} ParticleEmitterDeathZoneConfig
  61619. *
  61620. * @property {DeathZoneSource} source - A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.DeathZone#source}.
  61621. * @property {string} [type='onEnter'] - 'onEnter' or 'onLeave'.
  61622. */
  61623. /**
  61624. * @typedef {object} ParticleEmitterEdgeZoneConfig
  61625. *
  61626. * @property {EdgeZoneSource} source - A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.EdgeZone#source}.
  61627. * @property {string} type - 'edge'.
  61628. * @property {integer} quantity - The number of particles to place on the source edge. Set to 0 to use `stepRate` instead.
  61629. * @property {number} [stepRate] - The distance between each particle. When set, `quantity` is implied and should be set to 0.
  61630. * @property {boolean} [yoyo=false] - Whether particles are placed from start to end and then end to start.
  61631. * @property {boolean} [seamless=true] - Whether one endpoint will be removed if it's identical to the other.
  61632. */
  61633. /**
  61634. * @typedef {object} ParticleEmitterRandomZoneConfig
  61635. *
  61636. * @property {RandomZoneSource} source - A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.RandomZone#source}.
  61637. * @property {string} [type] - 'random'.
  61638. */
  61639. /**
  61640. * @typedef {object} ParticleEmitterConfig
  61641. *
  61642. * @property {boolean} [active] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#active}.
  61643. * @property {(Phaser.BlendModes|string)} [blendMode] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#blendMode}.
  61644. * @property {*} [callbackScope] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope} and {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope}.
  61645. * @property {boolean} [collideBottom] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideBottom}.
  61646. * @property {boolean} [collideLeft] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideLeft}.
  61647. * @property {boolean} [collideRight] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideRight}.
  61648. * @property {boolean} [collideTop] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideTop}.
  61649. * @property {boolean} [deathCallback] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallback}.
  61650. * @property {*} [deathCallbackScope] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope}.
  61651. * @property {function} [emitCallback] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallback}.
  61652. * @property {*} [emitCallbackScope] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope}.
  61653. * @property {Phaser.GameObjects.GameObject} [follow] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#follow}.
  61654. * @property {number} [frequency] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#frequency}.
  61655. * @property {number} [gravityX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#gravityX}.
  61656. * @property {number} [gravityY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#gravityY}.
  61657. * @property {integer} [maxParticles] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxParticles}.
  61658. * @property {string} [name] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#name}.
  61659. * @property {boolean} [on] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#on}.
  61660. * @property {boolean} [particleBringToTop] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleBringToTop}.
  61661. * @property {Phaser.GameObjects.Particles.Particle} [particleClass] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleClass}.
  61662. * @property {boolean} [radial] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#radial}.
  61663. * @property {number} [timeScale] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#timeScale}.
  61664. * @property {boolean} [trackVisible] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#trackVisible}.
  61665. * @property {boolean} [visible] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#visible}.
  61666. * @property {number|number[]|EmitterOpOnEmitCallback|object} [accelerationX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#accelerationX} (emit only).
  61667. * @property {number|number[]|EmitterOpOnEmitCallback|object} [accelerationY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#accelerationY} (emit only).
  61668. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [alpha] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#alpha}.
  61669. * @property {number|number[]|EmitterOpOnEmitCallback|object} [angle] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#angle} (emit only)
  61670. * @property {number|number[]|EmitterOpOnEmitCallback|object} [bounce] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#bounce} (emit only).
  61671. * @property {number|number[]|EmitterOpOnEmitCallback|object} [delay] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#delay} (emit only).
  61672. * @property {number|number[]|EmitterOpOnEmitCallback|object} [lifespan] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#lifespan} (emit only).
  61673. * @property {number|number[]|EmitterOpOnEmitCallback|object} [maxVelocityX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityX} (emit only).
  61674. * @property {number|number[]|EmitterOpOnEmitCallback|object} [maxVelocityY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityY} (emit only).
  61675. * @property {number|number[]|EmitterOpOnEmitCallback|object} [moveToX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#moveToX} (emit only).
  61676. * @property {number|number[]|EmitterOpOnEmitCallback|object} [moveToY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#moveToY} (emit only).
  61677. * @property {number|number[]|EmitterOpOnEmitCallback|object} [quantity] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity} (emit only).
  61678. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [rotate] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#rotate}.
  61679. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [scale] - As {@link Phaser.GameObjects.Particles.ParticleEmitter#setScale}.
  61680. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [scaleX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#scaleX}.
  61681. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [scaleY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#scaleY}.
  61682. * @property {number|number[]|EmitterOpOnEmitCallback|object} [speed] - As {@link Phaser.GameObjects.Particles.ParticleEmitter#setSpeed} (emit only).
  61683. * @property {number|number[]|EmitterOpOnEmitCallback|object} [speedX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#speedX} (emit only).
  61684. * @property {number|number[]|EmitterOpOnEmitCallback|object} [speedY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#speedY} (emit only).
  61685. * @property {number|number[]|EmitterOpOnEmitCallback|object} [tint] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#tint}.
  61686. * @property {number|number[]|EmitterOpOnEmitCallback|object} [x] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#x} (emit only).
  61687. * @property {number|number[]|EmitterOpOnEmitCallback|object} [y] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#y} (emit only).
  61688. * @property {object} [emitZone] - As {@link Phaser.GameObjects.Particles.ParticleEmitter#setEmitZone}.
  61689. * @property {ParticleEmitterBounds|ParticleEmitterBoundsAlt} [bounds] - As {@link Phaser.GameObjects.Particles.ParticleEmitter#setBounds}.
  61690. * @property {object} [followOffset] - Assigns to {@link Phaser.GameObjects.Particles.ParticleEmitter#followOffset}.
  61691. * @property {number} [followOffset.x] - x-coordinate of the offset.
  61692. * @property {number} [followOffset.y] - y-coordinate of the offset.
  61693. * @property {number|number[]|string|string[]|Phaser.Textures.Frame|Phaser.Textures.Frame[]|ParticleEmitterFrameConfig} [frame] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}.
  61694. */
  61695. /**
  61696. * @typedef {object} ParticleEmitterFrameConfig
  61697. *
  61698. * @property {number|number[]|string|string[]|Phaser.Textures.Frame|Phaser.Textures.Frame[]} [frames] - One or more texture frames.
  61699. * @property {boolean} [cycle] - Whether texture frames will be assigned consecutively (true) or at random (false).
  61700. * @property {integer} [quantity] - The number of consecutive particles receiving each texture frame, when `cycle` is true.
  61701. */
  61702. /**
  61703. * @classdesc
  61704. * A particle emitter represents a single particle stream.
  61705. * It controls a pool of {@link Phaser.GameObjects.Particles.Particle Particles} and is controlled by a {@link Phaser.GameObjects.Particles.ParticleEmitterManager Particle Emitter Manager}.
  61706. *
  61707. * @class ParticleEmitter
  61708. * @memberof Phaser.GameObjects.Particles
  61709. * @constructor
  61710. * @since 3.0.0
  61711. *
  61712. * @extends Phaser.GameObjects.Components.BlendMode
  61713. * @extends Phaser.GameObjects.Components.Mask
  61714. * @extends Phaser.GameObjects.Components.ScrollFactor
  61715. * @extends Phaser.GameObjects.Components.Visible
  61716. *
  61717. * @param {Phaser.GameObjects.Particles.ParticleEmitterManager} manager - The Emitter Manager this Emitter belongs to.
  61718. * @param {ParticleEmitterConfig} config - Settings for this emitter.
  61719. */
  61720. var ParticleEmitter = new Class({
  61721. Mixins: [
  61722. Components.BlendMode,
  61723. Components.Mask,
  61724. Components.ScrollFactor,
  61725. Components.Visible
  61726. ],
  61727. initialize:
  61728. function ParticleEmitter (manager, config)
  61729. {
  61730. /**
  61731. * The Emitter Manager this Emitter belongs to.
  61732. *
  61733. * @name Phaser.GameObjects.Particles.ParticleEmitter#manager
  61734. * @type {Phaser.GameObjects.Particles.ParticleEmitterManager}
  61735. * @since 3.0.0
  61736. */
  61737. this.manager = manager;
  61738. /**
  61739. * The texture assigned to particles.
  61740. *
  61741. * @name Phaser.GameObjects.Particles.ParticleEmitter#texture
  61742. * @type {Phaser.Textures.Texture}
  61743. * @since 3.0.0
  61744. */
  61745. this.texture = manager.texture;
  61746. /**
  61747. * The texture frames assigned to particles.
  61748. *
  61749. * @name Phaser.GameObjects.Particles.ParticleEmitter#frames
  61750. * @type {Phaser.Textures.Frame[]}
  61751. * @since 3.0.0
  61752. */
  61753. this.frames = [ manager.defaultFrame ];
  61754. /**
  61755. * The default texture frame assigned to particles.
  61756. *
  61757. * @name Phaser.GameObjects.Particles.ParticleEmitter#defaultFrame
  61758. * @type {Phaser.Textures.Frame}
  61759. * @since 3.0.0
  61760. */
  61761. this.defaultFrame = manager.defaultFrame;
  61762. /**
  61763. * Names of simple configuration properties.
  61764. *
  61765. * @name Phaser.GameObjects.Particles.ParticleEmitter#configFastMap
  61766. * @type {object}
  61767. * @since 3.0.0
  61768. */
  61769. this.configFastMap = [
  61770. 'active',
  61771. 'blendMode',
  61772. 'collideBottom',
  61773. 'collideLeft',
  61774. 'collideRight',
  61775. 'collideTop',
  61776. 'deathCallback',
  61777. 'deathCallbackScope',
  61778. 'emitCallback',
  61779. 'emitCallbackScope',
  61780. 'follow',
  61781. 'frequency',
  61782. 'gravityX',
  61783. 'gravityY',
  61784. 'maxParticles',
  61785. 'name',
  61786. 'on',
  61787. 'particleBringToTop',
  61788. 'particleClass',
  61789. 'radial',
  61790. 'timeScale',
  61791. 'trackVisible',
  61792. 'visible'
  61793. ];
  61794. /**
  61795. * Names of complex configuration properties.
  61796. *
  61797. * @name Phaser.GameObjects.Particles.ParticleEmitter#configOpMap
  61798. * @type {object}
  61799. * @since 3.0.0
  61800. */
  61801. this.configOpMap = [
  61802. 'accelerationX',
  61803. 'accelerationY',
  61804. 'angle',
  61805. 'alpha',
  61806. 'bounce',
  61807. 'delay',
  61808. 'lifespan',
  61809. 'maxVelocityX',
  61810. 'maxVelocityY',
  61811. 'moveToX',
  61812. 'moveToY',
  61813. 'quantity',
  61814. 'rotate',
  61815. 'scaleX',
  61816. 'scaleY',
  61817. 'speedX',
  61818. 'speedY',
  61819. 'tint',
  61820. 'x',
  61821. 'y'
  61822. ];
  61823. /**
  61824. * The name of this Particle Emitter.
  61825. *
  61826. * Empty by default and never populated by Phaser, this is left for developers to use.
  61827. *
  61828. * @name Phaser.GameObjects.Particles.ParticleEmitter#name
  61829. * @type {string}
  61830. * @default ''
  61831. * @since 3.0.0
  61832. */
  61833. this.name = '';
  61834. /**
  61835. * The Particle Class which will be emitted by this Emitter.
  61836. *
  61837. * @name Phaser.GameObjects.Particles.ParticleEmitter#particleClass
  61838. * @type {Phaser.GameObjects.Particles.Particle}
  61839. * @default Phaser.GameObjects.Particles.Particle
  61840. * @since 3.0.0
  61841. */
  61842. this.particleClass = Particle;
  61843. /**
  61844. * The x-coordinate of the particle origin (where particles will be emitted).
  61845. *
  61846. * @name Phaser.GameObjects.Particles.ParticleEmitter#x
  61847. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61848. * @default 0
  61849. * @since 3.0.0
  61850. * @see Phaser.GameObjects.Particles.ParticleEmitter#setPosition
  61851. */
  61852. this.x = new EmitterOp(config, 'x', 0);
  61853. /**
  61854. * The y-coordinate of the particle origin (where particles will be emitted).
  61855. *
  61856. * @name Phaser.GameObjects.Particles.ParticleEmitter#y
  61857. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61858. * @default 0
  61859. * @since 3.0.0
  61860. * @see Phaser.GameObjects.Particles.ParticleEmitter#setPosition
  61861. */
  61862. this.y = new EmitterOp(config, 'y', 0);
  61863. /**
  61864. * A radial emitter will emit particles in all directions between angle min and max,
  61865. * using {@link Phaser.GameObjects.Particles.ParticleEmitter#speed} as the value. If set to false then this acts as a point Emitter.
  61866. * A point emitter will emit particles only in the direction derived from the speedX and speedY values.
  61867. *
  61868. * @name Phaser.GameObjects.Particles.ParticleEmitter#radial
  61869. * @type {boolean}
  61870. * @default true
  61871. * @since 3.0.0
  61872. * @see Phaser.GameObjects.Particles.ParticleEmitter#setRadial
  61873. */
  61874. this.radial = true;
  61875. /**
  61876. * Horizontal acceleration applied to emitted particles, in pixels per second squared.
  61877. *
  61878. * @name Phaser.GameObjects.Particles.ParticleEmitter#gravityX
  61879. * @type {number}
  61880. * @default 0
  61881. * @since 3.0.0
  61882. * @see Phaser.GameObjects.Particles.ParticleEmitter#setGravity
  61883. */
  61884. this.gravityX = 0;
  61885. /**
  61886. * Vertical acceleration applied to emitted particles, in pixels per second squared.
  61887. *
  61888. * @name Phaser.GameObjects.Particles.ParticleEmitter#gravityY
  61889. * @type {number}
  61890. * @default 0
  61891. * @since 3.0.0
  61892. * @see Phaser.GameObjects.Particles.ParticleEmitter#setGravity
  61893. */
  61894. this.gravityY = 0;
  61895. /**
  61896. * Whether accelerationX and accelerationY are non-zero. Set automatically during configuration.
  61897. *
  61898. * @name Phaser.GameObjects.Particles.ParticleEmitter#acceleration
  61899. * @type {boolean}
  61900. * @default false
  61901. * @since 3.0.0
  61902. */
  61903. this.acceleration = false;
  61904. /**
  61905. * Horizontal acceleration applied to emitted particles, in pixels per second squared.
  61906. *
  61907. * @name Phaser.GameObjects.Particles.ParticleEmitter#accelerationX
  61908. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61909. * @default 0
  61910. * @since 3.0.0
  61911. */
  61912. this.accelerationX = new EmitterOp(config, 'accelerationX', 0, true);
  61913. /**
  61914. * Vertical acceleration applied to emitted particles, in pixels per second squared.
  61915. *
  61916. * @name Phaser.GameObjects.Particles.ParticleEmitter#accelerationY
  61917. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61918. * @default 0
  61919. * @since 3.0.0
  61920. */
  61921. this.accelerationY = new EmitterOp(config, 'accelerationY', 0, true);
  61922. /**
  61923. * The maximum horizontal velocity of emitted particles, in pixels per second squared.
  61924. *
  61925. * @name Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityX
  61926. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61927. * @default 10000
  61928. * @since 3.0.0
  61929. */
  61930. this.maxVelocityX = new EmitterOp(config, 'maxVelocityX', 10000, true);
  61931. /**
  61932. * The maximum vertical velocity of emitted particles, in pixels per second squared.
  61933. *
  61934. * @name Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityY
  61935. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61936. * @default 10000
  61937. * @since 3.0.0
  61938. */
  61939. this.maxVelocityY = new EmitterOp(config, 'maxVelocityY', 10000, true);
  61940. /**
  61941. * The initial horizontal speed of emitted particles, in pixels per second.
  61942. *
  61943. * @name Phaser.GameObjects.Particles.ParticleEmitter#speedX
  61944. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61945. * @default 0
  61946. * @since 3.0.0
  61947. * @see Phaser.GameObjects.Particles.ParticleEmitter#setSpeedX
  61948. */
  61949. this.speedX = new EmitterOp(config, 'speedX', 0, true);
  61950. /**
  61951. * The initial vertical speed of emitted particles, in pixels per second.
  61952. *
  61953. * @name Phaser.GameObjects.Particles.ParticleEmitter#speedY
  61954. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61955. * @default 0
  61956. * @since 3.0.0
  61957. * @see Phaser.GameObjects.Particles.ParticleEmitter#setSpeedY
  61958. */
  61959. this.speedY = new EmitterOp(config, 'speedY', 0, true);
  61960. /**
  61961. * Whether moveToX and moveToY are nonzero. Set automatically during configuration.
  61962. *
  61963. * @name Phaser.GameObjects.Particles.ParticleEmitter#moveTo
  61964. * @type {boolean}
  61965. * @default false
  61966. * @since 3.0.0
  61967. */
  61968. this.moveTo = false;
  61969. /**
  61970. * The x-coordinate emitted particles move toward, when {@link Phaser.GameObjects.Particles.ParticleEmitter#moveTo} is true.
  61971. *
  61972. * @name Phaser.GameObjects.Particles.ParticleEmitter#moveToX
  61973. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61974. * @default 0
  61975. * @since 3.0.0
  61976. */
  61977. this.moveToX = new EmitterOp(config, 'moveToX', 0, true);
  61978. /**
  61979. * The y-coordinate emitted particles move toward, when {@link Phaser.GameObjects.Particles.ParticleEmitter#moveTo} is true.
  61980. *
  61981. * @name Phaser.GameObjects.Particles.ParticleEmitter#moveToY
  61982. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61983. * @default 0
  61984. * @since 3.0.0
  61985. */
  61986. this.moveToY = new EmitterOp(config, 'moveToY', 0, true);
  61987. /**
  61988. * Whether particles will rebound when they meet the emitter bounds.
  61989. *
  61990. * @name Phaser.GameObjects.Particles.ParticleEmitter#bounce
  61991. * @type {Phaser.GameObjects.Particles.EmitterOp}
  61992. * @default 0
  61993. * @since 3.0.0
  61994. */
  61995. this.bounce = new EmitterOp(config, 'bounce', 0, true);
  61996. /**
  61997. * The horizontal scale of emitted particles.
  61998. *
  61999. * @name Phaser.GameObjects.Particles.ParticleEmitter#scaleX
  62000. * @type {Phaser.GameObjects.Particles.EmitterOp}
  62001. * @default 1
  62002. * @since 3.0.0
  62003. * @see Phaser.GameObjects.Particles.ParticleEmitter#setScale
  62004. * @see Phaser.GameObjects.Particles.ParticleEmitter#setScaleX
  62005. */
  62006. this.scaleX = new EmitterOp(config, 'scaleX', 1);
  62007. /**
  62008. * The vertical scale of emitted particles.
  62009. *
  62010. * @name Phaser.GameObjects.Particles.ParticleEmitter#scaleY
  62011. * @type {Phaser.GameObjects.Particles.EmitterOp}
  62012. * @default 1
  62013. * @since 3.0.0
  62014. * @see Phaser.GameObjects.Particles.ParticleEmitter#setScale
  62015. * @see Phaser.GameObjects.Particles.ParticleEmitter#setScaleY
  62016. */
  62017. this.scaleY = new EmitterOp(config, 'scaleY', 1);
  62018. /**
  62019. * Color tint applied to emitted particles. Any alpha component (0xAA000000) is ignored.
  62020. *
  62021. * @name Phaser.GameObjects.Particles.ParticleEmitter#tint
  62022. * @type {Phaser.GameObjects.Particles.EmitterOp}
  62023. * @default 0xffffffff
  62024. * @since 3.0.0
  62025. */
  62026. this.tint = new EmitterOp(config, 'tint', 0xffffffff);
  62027. /**
  62028. * The alpha (transparency) of emitted particles.
  62029. *
  62030. * @name Phaser.GameObjects.Particles.ParticleEmitter#alpha
  62031. * @type {Phaser.GameObjects.Particles.EmitterOp}
  62032. * @default 1
  62033. * @since 3.0.0
  62034. * @see Phaser.GameObjects.Particles.ParticleEmitter#setAlpha
  62035. */
  62036. this.alpha = new EmitterOp(config, 'alpha', 1);
  62037. /**
  62038. * The lifespan of emitted particles, in ms.
  62039. *
  62040. * @name Phaser.GameObjects.Particles.ParticleEmitter#lifespan
  62041. * @type {Phaser.GameObjects.Particles.EmitterOp}
  62042. * @default 1000
  62043. * @since 3.0.0
  62044. * @see Phaser.GameObjects.Particles.ParticleEmitter#setLifespan
  62045. */
  62046. this.lifespan = new EmitterOp(config, 'lifespan', 1000);
  62047. /**
  62048. * The angle of the initial velocity of emitted particles, in degrees.
  62049. *
  62050. * @name Phaser.GameObjects.Particles.ParticleEmitter#angle
  62051. * @type {Phaser.GameObjects.Particles.EmitterOp}
  62052. * @default { min: 0, max: 360 }
  62053. * @since 3.0.0
  62054. * @see Phaser.GameObjects.Particles.ParticleEmitter#setAngle
  62055. */
  62056. this.angle = new EmitterOp(config, 'angle', { min: 0, max: 360 });
  62057. /**
  62058. * The rotation of emitted particles, in degrees.
  62059. *
  62060. * @name Phaser.GameObjects.Particles.ParticleEmitter#rotate
  62061. * @type {Phaser.GameObjects.Particles.EmitterOp}
  62062. * @default 0
  62063. * @since 3.0.0
  62064. */
  62065. this.rotate = new EmitterOp(config, 'rotate', 0);
  62066. /**
  62067. * A function to call when a particle is emitted.
  62068. *
  62069. * @name Phaser.GameObjects.Particles.ParticleEmitter#emitCallback
  62070. * @type {?ParticleEmitterCallback}
  62071. * @default null
  62072. * @since 3.0.0
  62073. */
  62074. this.emitCallback = null;
  62075. /**
  62076. * The calling context for {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallback}.
  62077. *
  62078. * @name Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope
  62079. * @type {?*}
  62080. * @default null
  62081. * @since 3.0.0
  62082. */
  62083. this.emitCallbackScope = null;
  62084. /**
  62085. * A function to call when a particle dies.
  62086. *
  62087. * @name Phaser.GameObjects.Particles.ParticleEmitter#deathCallback
  62088. * @type {?ParticleDeathCallback}
  62089. * @default null
  62090. * @since 3.0.0
  62091. */
  62092. this.deathCallback = null;
  62093. /**
  62094. * The calling context for {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallback}.
  62095. *
  62096. * @name Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope
  62097. * @type {?*}
  62098. * @default null
  62099. * @since 3.0.0
  62100. */
  62101. this.deathCallbackScope = null;
  62102. /**
  62103. * Set to hard limit the amount of particle objects this emitter is allowed to create.
  62104. * 0 means unlimited.
  62105. *
  62106. * @name Phaser.GameObjects.Particles.ParticleEmitter#maxParticles
  62107. * @type {integer}
  62108. * @default 0
  62109. * @since 3.0.0
  62110. */
  62111. this.maxParticles = 0;
  62112. /**
  62113. * How many particles are emitted each time particles are emitted (one explosion or one flow cycle).
  62114. *
  62115. * @name Phaser.GameObjects.Particles.ParticleEmitter#quantity
  62116. * @type {Phaser.GameObjects.Particles.EmitterOp}
  62117. * @default 1
  62118. * @since 3.0.0
  62119. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrequency
  62120. * @see Phaser.GameObjects.Particles.ParticleEmitter#setQuantity
  62121. */
  62122. this.quantity = new EmitterOp(config, 'quantity', 1, true);
  62123. /**
  62124. * How many ms to wait after emission before the particles start updating.
  62125. *
  62126. * @name Phaser.GameObjects.Particles.ParticleEmitter#delay
  62127. * @type {Phaser.GameObjects.Particles.EmitterOp}
  62128. * @default 0
  62129. * @since 3.0.0
  62130. */
  62131. this.delay = new EmitterOp(config, 'delay', 0, true);
  62132. /**
  62133. * For a flow emitter, the time interval (>= 0) between particle flow cycles in ms.
  62134. * A value of 0 means there is one particle flow cycle for each logic update (the maximum flow frequency). This is the default setting.
  62135. * For an exploding emitter, this value will be -1.
  62136. * Calling {@link Phaser.GameObjects.Particles.ParticleEmitter#flow} also puts the emitter in flow mode (frequency >= 0).
  62137. * Calling {@link Phaser.GameObjects.Particles.ParticleEmitter#explode} also puts the emitter in explode mode (frequency = -1).
  62138. *
  62139. * @name Phaser.GameObjects.Particles.ParticleEmitter#frequency
  62140. * @type {number}
  62141. * @default 0
  62142. * @since 3.0.0
  62143. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrequency
  62144. */
  62145. this.frequency = 0;
  62146. /**
  62147. * Controls if the emitter is currently emitting a particle flow (when frequency >= 0).
  62148. * Already alive particles will continue to update until they expire.
  62149. * Controlled by {@link Phaser.GameObjects.Particles.ParticleEmitter#start} and {@link Phaser.GameObjects.Particles.ParticleEmitter#stop}.
  62150. *
  62151. * @name Phaser.GameObjects.Particles.ParticleEmitter#on
  62152. * @type {boolean}
  62153. * @default true
  62154. * @since 3.0.0
  62155. */
  62156. this.on = true;
  62157. /**
  62158. * Newly emitted particles are added to the top of the particle list, i.e. rendered above those already alive.
  62159. * Set to false to send them to the back.
  62160. *
  62161. * @name Phaser.GameObjects.Particles.ParticleEmitter#particleBringToTop
  62162. * @type {boolean}
  62163. * @default true
  62164. * @since 3.0.0
  62165. */
  62166. this.particleBringToTop = true;
  62167. /**
  62168. * The time rate applied to active particles, affecting lifespan, movement, and tweens. Values larger than 1 are faster than normal.
  62169. *
  62170. * @name Phaser.GameObjects.Particles.ParticleEmitter#timeScale
  62171. * @type {number}
  62172. * @default 1
  62173. * @since 3.0.0
  62174. */
  62175. this.timeScale = 1;
  62176. /**
  62177. * An object describing a shape to emit particles from.
  62178. *
  62179. * @name Phaser.GameObjects.Particles.ParticleEmitter#emitZone
  62180. * @type {?Phaser.GameObjects.Particles.Zones.EdgeZone|Phaser.GameObjects.Particles.Zones.RandomZone}
  62181. * @default null
  62182. * @since 3.0.0
  62183. * @see Phaser.GameObjects.Particles.ParticleEmitter#setEmitZone
  62184. */
  62185. this.emitZone = null;
  62186. /**
  62187. * An object describing a shape that deactivates particles when they interact with it.
  62188. *
  62189. * @name Phaser.GameObjects.Particles.ParticleEmitter#deathZone
  62190. * @type {?Phaser.GameObjects.Particles.Zones.DeathZone}
  62191. * @default null
  62192. * @since 3.0.0
  62193. * @see Phaser.GameObjects.Particles.ParticleEmitter#setDeathZone
  62194. */
  62195. this.deathZone = null;
  62196. /**
  62197. * A rectangular boundary constraining particle movement.
  62198. *
  62199. * @name Phaser.GameObjects.Particles.ParticleEmitter#bounds
  62200. * @type {?Phaser.Geom.Rectangle}
  62201. * @default null
  62202. * @since 3.0.0
  62203. * @see Phaser.GameObjects.Particles.ParticleEmitter#setBounds
  62204. */
  62205. this.bounds = null;
  62206. /**
  62207. * Whether particles interact with the left edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}.
  62208. *
  62209. * @name Phaser.GameObjects.Particles.ParticleEmitter#collideLeft
  62210. * @type {boolean}
  62211. * @default true
  62212. * @since 3.0.0
  62213. */
  62214. this.collideLeft = true;
  62215. /**
  62216. * Whether particles interact with the right edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}.
  62217. *
  62218. * @name Phaser.GameObjects.Particles.ParticleEmitter#collideRight
  62219. * @type {boolean}
  62220. * @default true
  62221. * @since 3.0.0
  62222. */
  62223. this.collideRight = true;
  62224. /**
  62225. * Whether particles interact with the top edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}.
  62226. *
  62227. * @name Phaser.GameObjects.Particles.ParticleEmitter#collideTop
  62228. * @type {boolean}
  62229. * @default true
  62230. * @since 3.0.0
  62231. */
  62232. this.collideTop = true;
  62233. /**
  62234. * Whether particles interact with the bottom edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}.
  62235. *
  62236. * @name Phaser.GameObjects.Particles.ParticleEmitter#collideBottom
  62237. * @type {boolean}
  62238. * @default true
  62239. * @since 3.0.0
  62240. */
  62241. this.collideBottom = true;
  62242. /**
  62243. * Whether this emitter updates itself and its particles.
  62244. *
  62245. * Controlled by {@link Phaser.GameObjects.Particles.ParticleEmitter#pause}
  62246. * and {@link Phaser.GameObjects.Particles.ParticleEmitter#resume}.
  62247. *
  62248. * @name Phaser.GameObjects.Particles.ParticleEmitter#active
  62249. * @type {boolean}
  62250. * @default true
  62251. * @since 3.0.0
  62252. */
  62253. this.active = true;
  62254. /**
  62255. * Set this to false to hide any active particles.
  62256. *
  62257. * @name Phaser.GameObjects.Particles.ParticleEmitter#visible
  62258. * @type {boolean}
  62259. * @default true
  62260. * @since 3.0.0
  62261. * @see Phaser.GameObjects.Particles.ParticleEmitter#setVisible
  62262. */
  62263. this.visible = true;
  62264. /**
  62265. * The blend mode of this emitter's particles.
  62266. *
  62267. * @name Phaser.GameObjects.Particles.ParticleEmitter#blendMode
  62268. * @type {integer}
  62269. * @since 3.0.0
  62270. * @see Phaser.GameObjects.Particles.ParticleEmitter#setBlendMode
  62271. */
  62272. this.blendMode = BlendModes.NORMAL;
  62273. /**
  62274. * A Game Object whose position is used as the particle origin.
  62275. *
  62276. * @name Phaser.GameObjects.Particles.ParticleEmitter#follow
  62277. * @type {?Phaser.GameObjects.GameObject}
  62278. * @default null
  62279. * @since 3.0.0
  62280. * @see Phaser.GameObjects.Particles.ParticleEmitter#startFollow
  62281. * @see Phaser.GameObjects.Particles.ParticleEmitter#stopFollow
  62282. */
  62283. this.follow = null;
  62284. /**
  62285. * The offset of the particle origin from the {@link Phaser.GameObjects.Particles.ParticleEmitter#follow} target.
  62286. *
  62287. * @name Phaser.GameObjects.Particles.ParticleEmitter#followOffset
  62288. * @type {Phaser.Math.Vector2}
  62289. * @since 3.0.0
  62290. * @see Phaser.GameObjects.Particles.ParticleEmitter#startFollow
  62291. */
  62292. this.followOffset = new Vector2();
  62293. /**
  62294. * Whether the emitter's {@link Phaser.GameObjects.Particles.ParticleEmitter#visible} state will track
  62295. * the {@link Phaser.GameObjects.Particles.ParticleEmitter#follow} target's visibility state.
  62296. *
  62297. * @name Phaser.GameObjects.Particles.ParticleEmitter#trackVisible
  62298. * @type {boolean}
  62299. * @default false
  62300. * @since 3.0.0
  62301. * @see Phaser.GameObjects.Particles.ParticleEmitter#startFollow
  62302. */
  62303. this.trackVisible = false;
  62304. /**
  62305. * The current texture frame, as an index of {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}.
  62306. *
  62307. * @name Phaser.GameObjects.Particles.ParticleEmitter#currentFrame
  62308. * @type {integer}
  62309. * @default 0
  62310. * @since 3.0.0
  62311. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrame
  62312. */
  62313. this.currentFrame = 0;
  62314. /**
  62315. * Whether texture {@link Phaser.GameObjects.Particles.ParticleEmitter#frames} are selected at random.
  62316. *
  62317. * @name Phaser.GameObjects.Particles.ParticleEmitter#randomFrame
  62318. * @type {boolean}
  62319. * @default true
  62320. * @since 3.0.0
  62321. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrame
  62322. */
  62323. this.randomFrame = true;
  62324. /**
  62325. * The number of consecutive particles that receive a single texture frame (per frame cycle).
  62326. *
  62327. * @name Phaser.GameObjects.Particles.ParticleEmitter#frameQuantity
  62328. * @type {integer}
  62329. * @default 1
  62330. * @since 3.0.0
  62331. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrame
  62332. */
  62333. this.frameQuantity = 1;
  62334. /**
  62335. * Inactive particles.
  62336. *
  62337. * @name Phaser.GameObjects.Particles.ParticleEmitter#dead
  62338. * @type {Phaser.GameObjects.Particles.Particle[]}
  62339. * @private
  62340. * @since 3.0.0
  62341. */
  62342. this.dead = [];
  62343. /**
  62344. * Active particles
  62345. *
  62346. * @name Phaser.GameObjects.Particles.ParticleEmitter#alive
  62347. * @type {Phaser.GameObjects.Particles.Particle[]}
  62348. * @private
  62349. * @since 3.0.0
  62350. */
  62351. this.alive = [];
  62352. /**
  62353. * The time until the next flow cycle.
  62354. *
  62355. * @name Phaser.GameObjects.Particles.ParticleEmitter#_counter
  62356. * @type {number}
  62357. * @private
  62358. * @default 0
  62359. * @since 3.0.0
  62360. */
  62361. this._counter = 0;
  62362. /**
  62363. * Counts up to {@link Phaser.GameObjects.Particles.ParticleEmitter#frameQuantity}.
  62364. *
  62365. * @name Phaser.GameObjects.Particles.ParticleEmitter#_frameCounter
  62366. * @type {integer}
  62367. * @private
  62368. * @default 0
  62369. * @since 3.0.0
  62370. */
  62371. this._frameCounter = 0;
  62372. if (config)
  62373. {
  62374. this.fromJSON(config);
  62375. }
  62376. },
  62377. /**
  62378. * Merges configuration settings into the emitter's current settings.
  62379. *
  62380. * @method Phaser.GameObjects.Particles.ParticleEmitter#fromJSON
  62381. * @since 3.0.0
  62382. *
  62383. * @param {ParticleEmitterConfig} config - Settings for this emitter.
  62384. *
  62385. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62386. */
  62387. fromJSON: function (config)
  62388. {
  62389. if (!config)
  62390. {
  62391. return this;
  62392. }
  62393. // Only update properties from their current state if they exist in the given config
  62394. var i = 0;
  62395. var key = '';
  62396. for (i = 0; i < this.configFastMap.length; i++)
  62397. {
  62398. key = this.configFastMap[i];
  62399. if (HasValue(config, key))
  62400. {
  62401. this[key] = GetFastValue(config, key);
  62402. }
  62403. }
  62404. for (i = 0; i < this.configOpMap.length; i++)
  62405. {
  62406. key = this.configOpMap[i];
  62407. if (HasValue(config, key))
  62408. {
  62409. this[key].loadConfig(config);
  62410. }
  62411. }
  62412. this.acceleration = (this.accelerationX.propertyValue !== 0 || this.accelerationY.propertyValue !== 0);
  62413. this.moveTo = (this.moveToX.propertyValue !== 0 || this.moveToY.propertyValue !== 0);
  62414. // Special 'speed' override
  62415. if (HasValue(config, 'speed'))
  62416. {
  62417. this.speedX.loadConfig(config, 'speed');
  62418. this.speedY = null;
  62419. }
  62420. // If you specify speedX, speedY or moveTo then it changes the emitter from radial to a point emitter
  62421. if (HasAny(config, [ 'speedX', 'speedY' ]) || this.moveTo)
  62422. {
  62423. this.radial = false;
  62424. }
  62425. // Special 'scale' override
  62426. if (HasValue(config, 'scale'))
  62427. {
  62428. this.scaleX.loadConfig(config, 'scale');
  62429. this.scaleY = null;
  62430. }
  62431. if (HasValue(config, 'callbackScope'))
  62432. {
  62433. var callbackScope = GetFastValue(config, 'callbackScope', null);
  62434. this.emitCallbackScope = callbackScope;
  62435. this.deathCallbackScope = callbackScope;
  62436. }
  62437. if (HasValue(config, 'emitZone'))
  62438. {
  62439. this.setEmitZone(config.emitZone);
  62440. }
  62441. if (HasValue(config, 'deathZone'))
  62442. {
  62443. this.setDeathZone(config.deathZone);
  62444. }
  62445. if (HasValue(config, 'bounds'))
  62446. {
  62447. this.setBounds(config.bounds);
  62448. }
  62449. if (HasValue(config, 'followOffset'))
  62450. {
  62451. this.followOffset.setFromObject(GetFastValue(config, 'followOffset', 0));
  62452. }
  62453. if (HasValue(config, 'frame'))
  62454. {
  62455. this.setFrame(config.frame);
  62456. }
  62457. return this;
  62458. },
  62459. /**
  62460. * Creates a description of this emitter suitable for JSON serialization.
  62461. *
  62462. * @method Phaser.GameObjects.Particles.ParticleEmitter#toJSON
  62463. * @since 3.0.0
  62464. *
  62465. * @param {object} [output] - An object to copy output into.
  62466. *
  62467. * @return {object} - The output object.
  62468. */
  62469. toJSON: function (output)
  62470. {
  62471. if (output === undefined) { output = {}; }
  62472. var i = 0;
  62473. var key = '';
  62474. for (i = 0; i < this.configFastMap.length; i++)
  62475. {
  62476. key = this.configFastMap[i];
  62477. output[key] = this[key];
  62478. }
  62479. for (i = 0; i < this.configOpMap.length; i++)
  62480. {
  62481. key = this.configOpMap[i];
  62482. if (this[key])
  62483. {
  62484. output[key] = this[key].toJSON();
  62485. }
  62486. }
  62487. // special handlers
  62488. if (!this.speedY)
  62489. {
  62490. delete output.speedX;
  62491. output.speed = this.speedX.toJSON();
  62492. }
  62493. if (!this.scaleY)
  62494. {
  62495. delete output.scaleX;
  62496. output.scale = this.scaleX.toJSON();
  62497. }
  62498. return output;
  62499. },
  62500. /**
  62501. * Continuously moves the particle origin to follow a Game Object's position.
  62502. *
  62503. * @method Phaser.GameObjects.Particles.ParticleEmitter#startFollow
  62504. * @since 3.0.0
  62505. *
  62506. * @param {Phaser.GameObjects.GameObject} target - The Game Object to follow.
  62507. * @param {number} [offsetX=0] - Horizontal offset of the particle origin from the Game Object.
  62508. * @param {number} [offsetY=0] - Vertical offset of the particle origin from the Game Object.
  62509. * @param {boolean} [trackVisible=false] - Whether the emitter's visible state will track the target's visible state.
  62510. *
  62511. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62512. */
  62513. startFollow: function (target, offsetX, offsetY, trackVisible)
  62514. {
  62515. if (offsetX === undefined) { offsetX = 0; }
  62516. if (offsetY === undefined) { offsetY = 0; }
  62517. if (trackVisible === undefined) { trackVisible = false; }
  62518. this.follow = target;
  62519. this.followOffset.set(offsetX, offsetY);
  62520. this.trackVisible = trackVisible;
  62521. return this;
  62522. },
  62523. /**
  62524. * Stops following a Game Object.
  62525. *
  62526. * @method Phaser.GameObjects.Particles.ParticleEmitter#stopFollow
  62527. * @since 3.0.0
  62528. *
  62529. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62530. */
  62531. stopFollow: function ()
  62532. {
  62533. this.follow = null;
  62534. this.followOffset.set(0, 0);
  62535. this.trackVisible = false;
  62536. return this;
  62537. },
  62538. /**
  62539. * Chooses a texture frame from {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}.
  62540. *
  62541. * @method Phaser.GameObjects.Particles.ParticleEmitter#getFrame
  62542. * @since 3.0.0
  62543. *
  62544. * @return {Phaser.Textures.Frame} The texture frame.
  62545. */
  62546. getFrame: function ()
  62547. {
  62548. if (this.frames.length === 1)
  62549. {
  62550. return this.defaultFrame;
  62551. }
  62552. else if (this.randomFrame)
  62553. {
  62554. return GetRandom(this.frames);
  62555. }
  62556. else
  62557. {
  62558. var frame = this.frames[this.currentFrame];
  62559. this._frameCounter++;
  62560. if (this._frameCounter === this.frameQuantity)
  62561. {
  62562. this._frameCounter = 0;
  62563. this.currentFrame = Wrap(this.currentFrame + 1, 0, this._frameLength);
  62564. }
  62565. return frame;
  62566. }
  62567. },
  62568. // frame: 0
  62569. // frame: 'red'
  62570. // frame: [ 0, 1, 2, 3 ]
  62571. // frame: [ 'red', 'green', 'blue', 'pink', 'white' ]
  62572. // frame: { frames: [ 'red', 'green', 'blue', 'pink', 'white' ], [cycle: bool], [quantity: int] }
  62573. /**
  62574. * Sets a pattern for assigning texture frames to emitted particles.
  62575. *
  62576. * @method Phaser.GameObjects.Particles.ParticleEmitter#setFrame
  62577. * @since 3.0.0
  62578. *
  62579. * @param {(array|string|integer|ParticleEmitterFrameConfig)} frames - One or more texture frames, or a configuration object.
  62580. * @param {boolean} [pickRandom=true] - Whether frames should be assigned at random from `frames`.
  62581. * @param {integer} [quantity=1] - The number of consecutive particles that will receive each frame.
  62582. *
  62583. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62584. */
  62585. setFrame: function (frames, pickRandom, quantity)
  62586. {
  62587. if (pickRandom === undefined) { pickRandom = true; }
  62588. if (quantity === undefined) { quantity = 1; }
  62589. this.randomFrame = pickRandom;
  62590. this.frameQuantity = quantity;
  62591. this.currentFrame = 0;
  62592. this._frameCounter = 0;
  62593. var t = typeof (frames);
  62594. if (Array.isArray(frames) || t === 'string' || t === 'number')
  62595. {
  62596. this.manager.setEmitterFrames(frames, this);
  62597. }
  62598. else if (t === 'object')
  62599. {
  62600. var frameConfig = frames;
  62601. frames = GetFastValue(frameConfig, 'frames', null);
  62602. if (frames)
  62603. {
  62604. this.manager.setEmitterFrames(frames, this);
  62605. }
  62606. var isCycle = GetFastValue(frameConfig, 'cycle', false);
  62607. this.randomFrame = (isCycle) ? false : true;
  62608. this.frameQuantity = GetFastValue(frameConfig, 'quantity', quantity);
  62609. }
  62610. this._frameLength = this.frames.length;
  62611. if (this._frameLength === 1)
  62612. {
  62613. this.frameQuantity = 1;
  62614. this.randomFrame = false;
  62615. }
  62616. return this;
  62617. },
  62618. /**
  62619. * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle movement on or off.
  62620. *
  62621. * @method Phaser.GameObjects.Particles.ParticleEmitter#setRadial
  62622. * @since 3.0.0
  62623. *
  62624. * @param {boolean} [value=true] - Radial mode (true) or point mode (true).
  62625. *
  62626. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62627. */
  62628. setRadial: function (value)
  62629. {
  62630. if (value === undefined) { value = true; }
  62631. this.radial = value;
  62632. return this;
  62633. },
  62634. /**
  62635. * Sets the position of the emitter's particle origin.
  62636. * New particles will be emitted here.
  62637. *
  62638. * @method Phaser.GameObjects.Particles.ParticleEmitter#setPosition
  62639. * @since 3.0.0
  62640. *
  62641. * @param {number|float[]|EmitterOpOnEmitCallback|object} x - The x-coordinate of the particle origin.
  62642. * @param {number|float[]|EmitterOpOnEmitCallback|object} y - The y-coordinate of the particle origin.
  62643. *
  62644. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62645. */
  62646. setPosition: function (x, y)
  62647. {
  62648. this.x.onChange(x);
  62649. this.y.onChange(y);
  62650. return this;
  62651. },
  62652. /**
  62653. * Sets or modifies a rectangular boundary constraining the particles.
  62654. *
  62655. * To remove the boundary, set {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds} to null.
  62656. *
  62657. * @method Phaser.GameObjects.Particles.ParticleEmitter#setBounds
  62658. * @since 3.0.0
  62659. *
  62660. * @param {(number|ParticleEmitterBounds|ParticleEmitterBoundsAlt)} x - The x-coordinate of the left edge of the boundary, or an object representing a rectangle.
  62661. * @param {number} y - The y-coordinate of the top edge of the boundary.
  62662. * @param {number} width - The width of the boundary.
  62663. * @param {number} height - The height of the boundary.
  62664. *
  62665. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62666. */
  62667. setBounds: function (x, y, width, height)
  62668. {
  62669. if (typeof x === 'object')
  62670. {
  62671. var obj = x;
  62672. x = obj.x;
  62673. y = obj.y;
  62674. width = (HasValue(obj, 'w')) ? obj.w : obj.width;
  62675. height = (HasValue(obj, 'h')) ? obj.h : obj.height;
  62676. }
  62677. if (this.bounds)
  62678. {
  62679. this.bounds.setTo(x, y, width, height);
  62680. }
  62681. else
  62682. {
  62683. this.bounds = new Rectangle(x, y, width, height);
  62684. }
  62685. return this;
  62686. },
  62687. /**
  62688. * Sets the initial horizontal speed of emitted particles.
  62689. * Changes the emitter to point mode.
  62690. *
  62691. * @method Phaser.GameObjects.Particles.ParticleEmitter#setSpeedX
  62692. * @since 3.0.0
  62693. *
  62694. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The speed, in pixels per second.
  62695. *
  62696. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62697. */
  62698. setSpeedX: function (value)
  62699. {
  62700. this.speedX.onChange(value);
  62701. // If you specify speedX and Y then it changes the emitter from radial to a point emitter
  62702. this.radial = false;
  62703. return this;
  62704. },
  62705. /**
  62706. * Sets the initial vertical speed of emitted particles.
  62707. * Changes the emitter to point mode.
  62708. *
  62709. * @method Phaser.GameObjects.Particles.ParticleEmitter#setSpeedY
  62710. * @since 3.0.0
  62711. *
  62712. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The speed, in pixels per second.
  62713. *
  62714. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62715. */
  62716. setSpeedY: function (value)
  62717. {
  62718. if (this.speedY)
  62719. {
  62720. this.speedY.onChange(value);
  62721. // If you specify speedX and Y then it changes the emitter from radial to a point emitter
  62722. this.radial = false;
  62723. }
  62724. return this;
  62725. },
  62726. /**
  62727. * Sets the initial radial speed of emitted particles.
  62728. * Changes the emitter to radial mode.
  62729. *
  62730. * @method Phaser.GameObjects.Particles.ParticleEmitter#setSpeed
  62731. * @since 3.0.0
  62732. *
  62733. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The speed, in pixels per second.
  62734. *
  62735. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62736. */
  62737. setSpeed: function (value)
  62738. {
  62739. this.speedX.onChange(value);
  62740. this.speedY = null;
  62741. // If you specify speedX and Y then it changes the emitter from radial to a point emitter
  62742. this.radial = true;
  62743. return this;
  62744. },
  62745. /**
  62746. * Sets the horizontal scale of emitted particles.
  62747. *
  62748. * @method Phaser.GameObjects.Particles.ParticleEmitter#setScaleX
  62749. * @since 3.0.0
  62750. *
  62751. * @param {number|float[]|EmitterOpOnUpdateCallback|object} value - The scale, relative to 1.
  62752. *
  62753. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62754. */
  62755. setScaleX: function (value)
  62756. {
  62757. this.scaleX.onChange(value);
  62758. return this;
  62759. },
  62760. /**
  62761. * Sets the vertical scale of emitted particles.
  62762. *
  62763. * @method Phaser.GameObjects.Particles.ParticleEmitter#setScaleY
  62764. * @since 3.0.0
  62765. *
  62766. * @param {number|float[]|EmitterOpOnUpdateCallback|object} value - The scale, relative to 1.
  62767. *
  62768. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62769. */
  62770. setScaleY: function (value)
  62771. {
  62772. this.scaleY.onChange(value);
  62773. return this;
  62774. },
  62775. /**
  62776. * Sets the scale of emitted particles.
  62777. *
  62778. * @method Phaser.GameObjects.Particles.ParticleEmitter#setScale
  62779. * @since 3.0.0
  62780. *
  62781. * @param {number|float[]|EmitterOpOnUpdateCallback|object} value - The scale, relative to 1.
  62782. *
  62783. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62784. */
  62785. setScale: function (value)
  62786. {
  62787. this.scaleX.onChange(value);
  62788. this.scaleY = null;
  62789. return this;
  62790. },
  62791. /**
  62792. * Sets the horizontal gravity applied to emitted particles.
  62793. *
  62794. * @method Phaser.GameObjects.Particles.ParticleEmitter#setGravityX
  62795. * @since 3.0.0
  62796. *
  62797. * @param {number} value - Acceleration due to gravity, in pixels per second squared.
  62798. *
  62799. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62800. */
  62801. setGravityX: function (value)
  62802. {
  62803. this.gravityX = value;
  62804. return this;
  62805. },
  62806. /**
  62807. * Sets the vertical gravity applied to emitted particles.
  62808. *
  62809. * @method Phaser.GameObjects.Particles.ParticleEmitter#setGravityY
  62810. * @since 3.0.0
  62811. *
  62812. * @param {number} value - Acceleration due to gravity, in pixels per second squared.
  62813. *
  62814. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62815. */
  62816. setGravityY: function (value)
  62817. {
  62818. this.gravityY = value;
  62819. return this;
  62820. },
  62821. /**
  62822. * Sets the gravity applied to emitted particles.
  62823. *
  62824. * @method Phaser.GameObjects.Particles.ParticleEmitter#setGravity
  62825. * @since 3.0.0
  62826. *
  62827. * @param {number} x - Horizontal acceleration due to gravity, in pixels per second squared.
  62828. * @param {number} y - Vertical acceleration due to gravity, in pixels per second squared.
  62829. *
  62830. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62831. */
  62832. setGravity: function (x, y)
  62833. {
  62834. this.gravityX = x;
  62835. this.gravityY = y;
  62836. return this;
  62837. },
  62838. /**
  62839. * Sets the opacity of emitted particles.
  62840. *
  62841. * @method Phaser.GameObjects.Particles.ParticleEmitter#setAlpha
  62842. * @since 3.0.0
  62843. *
  62844. * @param {number|float[]|EmitterOpOnUpdateCallback|object} value - A value between 0 (transparent) and 1 (opaque).
  62845. *
  62846. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62847. */
  62848. setAlpha: function (value)
  62849. {
  62850. this.alpha.onChange(value);
  62851. return this;
  62852. },
  62853. /**
  62854. * Sets the angle of a {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle stream.
  62855. *
  62856. * @method Phaser.GameObjects.Particles.ParticleEmitter#setEmitterAngle
  62857. * @since 3.0.0
  62858. *
  62859. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The angle of the initial velocity of emitted particles.
  62860. *
  62861. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62862. */
  62863. setEmitterAngle: function (value)
  62864. {
  62865. this.angle.onChange(value);
  62866. return this;
  62867. },
  62868. /**
  62869. * Sets the angle of a {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle stream.
  62870. *
  62871. * @method Phaser.GameObjects.Particles.ParticleEmitter#setAngle
  62872. * @since 3.0.0
  62873. *
  62874. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The angle of the initial velocity of emitted particles.
  62875. *
  62876. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62877. */
  62878. setAngle: function (value)
  62879. {
  62880. this.angle.onChange(value);
  62881. return this;
  62882. },
  62883. /**
  62884. * Sets the lifespan of newly emitted particles.
  62885. *
  62886. * @method Phaser.GameObjects.Particles.ParticleEmitter#setLifespan
  62887. * @since 3.0.0
  62888. *
  62889. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The particle lifespan, in ms.
  62890. *
  62891. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62892. */
  62893. setLifespan: function (value)
  62894. {
  62895. this.lifespan.onChange(value);
  62896. return this;
  62897. },
  62898. /**
  62899. * Sets the number of particles released at each flow cycle or explosion.
  62900. *
  62901. * @method Phaser.GameObjects.Particles.ParticleEmitter#setQuantity
  62902. * @since 3.0.0
  62903. *
  62904. * @param {number|float[]|EmitterOpOnEmitCallback|object} quantity - The number of particles to release at each flow cycle or explosion.
  62905. *
  62906. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62907. */
  62908. setQuantity: function (quantity)
  62909. {
  62910. this.quantity.onChange(quantity);
  62911. return this;
  62912. },
  62913. /**
  62914. * Sets the emitter's {@link Phaser.GameObjects.Particles.ParticleEmitter#frequency}
  62915. * and {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity}.
  62916. *
  62917. * @method Phaser.GameObjects.Particles.ParticleEmitter#setFrequency
  62918. * @since 3.0.0
  62919. *
  62920. * @param {number} frequency - The time interval (>= 0) of each flow cycle, in ms; or -1 to put the emitter in explosion mode.
  62921. * @param {number|float[]|EmitterOpOnEmitCallback|object} [quantity] - The number of particles to release at each flow cycle or explosion.
  62922. *
  62923. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62924. */
  62925. setFrequency: function (frequency, quantity)
  62926. {
  62927. this.frequency = frequency;
  62928. this._counter = 0;
  62929. if (quantity)
  62930. {
  62931. this.quantity.onChange(quantity);
  62932. }
  62933. return this;
  62934. },
  62935. /**
  62936. * Sets or removes the {@link Phaser.GameObjects.Particles.ParticleEmitter#emitZone}.
  62937. *
  62938. * An {@link ParticleEmitterEdgeZoneConfig EdgeZone} places particles on its edges. Its {@link EdgeZoneSource source} can be a Curve, Path, Circle, Ellipse, Line, Polygon, Rectangle, or Triangle; or any object with a suitable {@link EdgeZoneSourceCallback getPoints} method.
  62939. *
  62940. * A {@link ParticleEmitterRandomZoneConfig RandomZone} places randomly within its interior. Its {@link RandomZoneSource source} can be a Circle, Ellipse, Line, Polygon, Rectangle, or Triangle; or any object with a suitable {@link RandomZoneSourceCallback getRandomPoint} method.
  62941. *
  62942. * @method Phaser.GameObjects.Particles.ParticleEmitter#setEmitZone
  62943. * @since 3.0.0
  62944. *
  62945. * @param {ParticleEmitterEdgeZoneConfig|ParticleEmitterRandomZoneConfig} [zoneConfig] - An object describing the zone, or `undefined` to remove any current emit zone.
  62946. *
  62947. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62948. */
  62949. setEmitZone: function (zoneConfig)
  62950. {
  62951. if (zoneConfig === undefined)
  62952. {
  62953. this.emitZone = null;
  62954. }
  62955. else
  62956. {
  62957. // Where source = Geom like Circle, or a Path or Curve
  62958. // emitZone: { type: 'random', source: X }
  62959. // emitZone: { type: 'edge', source: X, quantity: 32, [stepRate=0], [yoyo=false], [seamless=true] }
  62960. var type = GetFastValue(zoneConfig, 'type', 'random');
  62961. var source = GetFastValue(zoneConfig, 'source', null);
  62962. switch (type)
  62963. {
  62964. case 'random':
  62965. this.emitZone = new RandomZone(source);
  62966. break;
  62967. case 'edge':
  62968. var quantity = GetFastValue(zoneConfig, 'quantity', 1);
  62969. var stepRate = GetFastValue(zoneConfig, 'stepRate', 0);
  62970. var yoyo = GetFastValue(zoneConfig, 'yoyo', false);
  62971. var seamless = GetFastValue(zoneConfig, 'seamless', true);
  62972. this.emitZone = new EdgeZone(source, quantity, stepRate, yoyo, seamless);
  62973. break;
  62974. }
  62975. }
  62976. return this;
  62977. },
  62978. /**
  62979. * Sets or removes the {@link Phaser.GameObjects.Particles.ParticleEmitter#deathZone}.
  62980. *
  62981. * @method Phaser.GameObjects.Particles.ParticleEmitter#setDeathZone
  62982. * @since 3.0.0
  62983. *
  62984. * @param {ParticleEmitterDeathZoneConfig} [zoneConfig] - An object describing the zone, or `undefined` to remove any current death zone.
  62985. *
  62986. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  62987. */
  62988. setDeathZone: function (zoneConfig)
  62989. {
  62990. if (zoneConfig === undefined)
  62991. {
  62992. this.deathZone = null;
  62993. }
  62994. else
  62995. {
  62996. // Where source = Geom like Circle or Rect that supports a 'contains' function
  62997. // deathZone: { type: 'onEnter', source: X }
  62998. // deathZone: { type: 'onLeave', source: X }
  62999. var type = GetFastValue(zoneConfig, 'type', 'onEnter');
  63000. var source = GetFastValue(zoneConfig, 'source', null);
  63001. if (source && typeof source.contains === 'function')
  63002. {
  63003. var killOnEnter = (type === 'onEnter') ? true : false;
  63004. this.deathZone = new DeathZone(source, killOnEnter);
  63005. }
  63006. }
  63007. return this;
  63008. },
  63009. /**
  63010. * Creates inactive particles and adds them to this emitter's pool.
  63011. *
  63012. * @method Phaser.GameObjects.Particles.ParticleEmitter#reserve
  63013. * @since 3.0.0
  63014. *
  63015. * @param {integer} particleCount - The number of particles to create.
  63016. *
  63017. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63018. */
  63019. reserve: function (particleCount)
  63020. {
  63021. var dead = this.dead;
  63022. for (var i = 0; i < particleCount; i++)
  63023. {
  63024. dead.push(new this.particleClass(this));
  63025. }
  63026. return this;
  63027. },
  63028. /**
  63029. * Gets the number of active (in-use) particles in this emitter.
  63030. *
  63031. * @method Phaser.GameObjects.Particles.ParticleEmitter#getAliveParticleCount
  63032. * @since 3.0.0
  63033. *
  63034. * @return {integer} The number of particles with `active=true`.
  63035. */
  63036. getAliveParticleCount: function ()
  63037. {
  63038. return this.alive.length;
  63039. },
  63040. /**
  63041. * Gets the number of inactive (available) particles in this emitter.
  63042. *
  63043. * @method Phaser.GameObjects.Particles.ParticleEmitter#getDeadParticleCount
  63044. * @since 3.0.0
  63045. *
  63046. * @return {integer} The number of particles with `active=false`.
  63047. */
  63048. getDeadParticleCount: function ()
  63049. {
  63050. return this.dead.length;
  63051. },
  63052. /**
  63053. * Gets the total number of particles in this emitter.
  63054. *
  63055. * @method Phaser.GameObjects.Particles.ParticleEmitter#getParticleCount
  63056. * @since 3.0.0
  63057. *
  63058. * @return {integer} The number of particles, including both alive and dead.
  63059. */
  63060. getParticleCount: function ()
  63061. {
  63062. return this.getAliveParticleCount() + this.getDeadParticleCount();
  63063. },
  63064. /**
  63065. * Whether this emitter is at its limit (if set).
  63066. *
  63067. * @method Phaser.GameObjects.Particles.ParticleEmitter#atLimit
  63068. * @since 3.0.0
  63069. *
  63070. * @return {boolean} Returns `true` if this Emitter is at its limit, or `false` if no limit, or below the `maxParticles` level.
  63071. */
  63072. atLimit: function ()
  63073. {
  63074. return (this.maxParticles > 0 && this.getParticleCount() === this.maxParticles);
  63075. },
  63076. /**
  63077. * Sets a function to call for each newly emitted particle.
  63078. *
  63079. * @method Phaser.GameObjects.Particles.ParticleEmitter#onParticleEmit
  63080. * @since 3.0.0
  63081. *
  63082. * @param {ParticleEmitterCallback} callback - The function.
  63083. * @param {*} [context] - The calling context.
  63084. *
  63085. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63086. */
  63087. onParticleEmit: function (callback, context)
  63088. {
  63089. if (callback === undefined)
  63090. {
  63091. // Clear any previously set callback
  63092. this.emitCallback = null;
  63093. this.emitCallbackScope = null;
  63094. }
  63095. else if (typeof callback === 'function')
  63096. {
  63097. this.emitCallback = callback;
  63098. if (context)
  63099. {
  63100. this.emitCallbackScope = context;
  63101. }
  63102. }
  63103. return this;
  63104. },
  63105. /**
  63106. * Sets a function to call for each particle death.
  63107. *
  63108. * @method Phaser.GameObjects.Particles.ParticleEmitter#onParticleDeath
  63109. * @since 3.0.0
  63110. *
  63111. * @param {ParticleDeathCallback} callback - The function.
  63112. * @param {*} [context] - The function's calling context.
  63113. *
  63114. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63115. */
  63116. onParticleDeath: function (callback, context)
  63117. {
  63118. if (callback === undefined)
  63119. {
  63120. // Clear any previously set callback
  63121. this.deathCallback = null;
  63122. this.deathCallbackScope = null;
  63123. }
  63124. else if (typeof callback === 'function')
  63125. {
  63126. this.deathCallback = callback;
  63127. if (context)
  63128. {
  63129. this.deathCallbackScope = context;
  63130. }
  63131. }
  63132. return this;
  63133. },
  63134. /**
  63135. * Deactivates every particle in this emitter.
  63136. *
  63137. * @method Phaser.GameObjects.Particles.ParticleEmitter#killAll
  63138. * @since 3.0.0
  63139. *
  63140. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63141. */
  63142. killAll: function ()
  63143. {
  63144. var dead = this.dead;
  63145. var alive = this.alive;
  63146. while (alive.length > 0)
  63147. {
  63148. dead.push(alive.pop());
  63149. }
  63150. return this;
  63151. },
  63152. /**
  63153. * Calls a function for each active particle in this emitter.
  63154. *
  63155. * @method Phaser.GameObjects.Particles.ParticleEmitter#forEachAlive
  63156. * @since 3.0.0
  63157. *
  63158. * @param {ParticleEmitterCallback} callback - The function.
  63159. * @param {*} context - The function's calling context.
  63160. *
  63161. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63162. */
  63163. forEachAlive: function (callback, context)
  63164. {
  63165. var alive = this.alive;
  63166. var length = alive.length;
  63167. for (var index = 0; index < length; ++index)
  63168. {
  63169. // Sends the Particle and the Emitter
  63170. callback.call(context, alive[index], this);
  63171. }
  63172. return this;
  63173. },
  63174. /**
  63175. * Calls a function for each inactive particle in this emitter.
  63176. *
  63177. * @method Phaser.GameObjects.Particles.ParticleEmitter#forEachDead
  63178. * @since 3.0.0
  63179. *
  63180. * @param {ParticleEmitterCallback} callback - The function.
  63181. * @param {*} context - The function's calling context.
  63182. *
  63183. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63184. */
  63185. forEachDead: function (callback, context)
  63186. {
  63187. var dead = this.dead;
  63188. var length = dead.length;
  63189. for (var index = 0; index < length; ++index)
  63190. {
  63191. // Sends the Particle and the Emitter
  63192. callback.call(context, dead[index], this);
  63193. }
  63194. return this;
  63195. },
  63196. /**
  63197. * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#on} the emitter and resets the flow counter.
  63198. *
  63199. * If this emitter is in flow mode (frequency >= 0; the default), the particle flow will start (or restart).
  63200. *
  63201. * If this emitter is in explode mode (frequency = -1), nothing will happen.
  63202. * Use {@link Phaser.GameObjects.Particles.ParticleEmitter#explode} or {@link Phaser.GameObjects.Particles.ParticleEmitter#flow} instead.
  63203. *
  63204. * @method Phaser.GameObjects.Particles.ParticleEmitter#start
  63205. * @since 3.0.0
  63206. *
  63207. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63208. */
  63209. start: function ()
  63210. {
  63211. this.on = true;
  63212. this._counter = 0;
  63213. return this;
  63214. },
  63215. /**
  63216. * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#on off} the emitter.
  63217. *
  63218. * @method Phaser.GameObjects.Particles.ParticleEmitter#stop
  63219. * @since 3.11.0
  63220. *
  63221. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63222. */
  63223. stop: function ()
  63224. {
  63225. this.on = false;
  63226. return this;
  63227. },
  63228. /**
  63229. * {@link Phaser.GameObjects.Particles.ParticleEmitter#active Deactivates} the emitter.
  63230. *
  63231. * @method Phaser.GameObjects.Particles.ParticleEmitter#pause
  63232. * @since 3.0.0
  63233. *
  63234. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63235. */
  63236. pause: function ()
  63237. {
  63238. this.active = false;
  63239. return this;
  63240. },
  63241. /**
  63242. * {@link Phaser.GameObjects.Particles.ParticleEmitter#active Activates} the emitter.
  63243. *
  63244. * @method Phaser.GameObjects.Particles.ParticleEmitter#resume
  63245. * @since 3.0.0
  63246. *
  63247. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63248. */
  63249. resume: function ()
  63250. {
  63251. this.active = true;
  63252. return this;
  63253. },
  63254. /**
  63255. * Sorts active particles with {@link Phaser.GameObjects.Particles.ParticleEmitter#depthSortCallback}.
  63256. *
  63257. * @method Phaser.GameObjects.Particles.ParticleEmitter#depthSort
  63258. * @since 3.0.0
  63259. *
  63260. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63261. */
  63262. depthSort: function ()
  63263. {
  63264. StableSort.inplace(this.alive, this.depthSortCallback);
  63265. return this;
  63266. },
  63267. /**
  63268. * Puts the emitter in flow mode (frequency >= 0) and starts (or restarts) a particle flow.
  63269. *
  63270. * To resume a flow at the current frequency and quantity, use {@link Phaser.GameObjects.Particles.ParticleEmitter#start} instead.
  63271. *
  63272. * @method Phaser.GameObjects.Particles.ParticleEmitter#flow
  63273. * @since 3.0.0
  63274. *
  63275. * @param {number} frequency - The time interval (>= 0) of each flow cycle, in ms.
  63276. * @param {number|float[]|EmitterOpOnEmitCallback|object} [count=1] - The number of particles to emit at each flow cycle.
  63277. *
  63278. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  63279. */
  63280. flow: function (frequency, count)
  63281. {
  63282. if (count === undefined) { count = 1; }
  63283. this.frequency = frequency;
  63284. this.quantity.onChange(count);
  63285. return this.start();
  63286. },
  63287. /**
  63288. * Puts the emitter in explode mode (frequency = -1), stopping any current particle flow, and emits several particles all at once.
  63289. *
  63290. * @method Phaser.GameObjects.Particles.ParticleEmitter#explode
  63291. * @since 3.0.0
  63292. *
  63293. * @param {integer} count - The amount of Particles to emit.
  63294. * @param {number} x - The x coordinate to emit the Particles from.
  63295. * @param {number} y - The y coordinate to emit the Particles from.
  63296. *
  63297. * @return {Phaser.GameObjects.Particles.Particle} The most recently emitted Particle.
  63298. */
  63299. explode: function (count, x, y)
  63300. {
  63301. this.frequency = -1;
  63302. return this.emitParticle(count, x, y);
  63303. },
  63304. /**
  63305. * Emits particles at a given position (or the emitter's current position).
  63306. *
  63307. * @method Phaser.GameObjects.Particles.ParticleEmitter#emitParticleAt
  63308. * @since 3.0.0
  63309. *
  63310. * @param {number} [x=this.x] - The x coordinate to emit the Particles from.
  63311. * @param {number} [y=this.x] - The y coordinate to emit the Particles from.
  63312. * @param {integer} [count=this.quantity] - The number of Particles to emit.
  63313. *
  63314. * @return {Phaser.GameObjects.Particles.Particle} The most recently emitted Particle.
  63315. */
  63316. emitParticleAt: function (x, y, count)
  63317. {
  63318. return this.emitParticle(count, x, y);
  63319. },
  63320. /**
  63321. * Emits particles at a given position (or the emitter's current position).
  63322. *
  63323. * @method Phaser.GameObjects.Particles.ParticleEmitter#emitParticle
  63324. * @since 3.0.0
  63325. *
  63326. * @param {integer} [count=this.quantity] - The number of Particles to emit.
  63327. * @param {number} [x=this.x] - The x coordinate to emit the Particles from.
  63328. * @param {number} [y=this.x] - The y coordinate to emit the Particles from.
  63329. *
  63330. * @return {Phaser.GameObjects.Particles.Particle} The most recently emitted Particle.
  63331. *
  63332. * @see Phaser.GameObjects.Particles.Particle#fire
  63333. */
  63334. emitParticle: function (count, x, y)
  63335. {
  63336. if (this.atLimit())
  63337. {
  63338. return;
  63339. }
  63340. if (count === undefined)
  63341. {
  63342. count = this.quantity.onEmit();
  63343. }
  63344. var dead = this.dead;
  63345. for (var i = 0; i < count; i++)
  63346. {
  63347. var particle = dead.pop();
  63348. if (!particle)
  63349. {
  63350. particle = new this.particleClass(this);
  63351. }
  63352. particle.fire(x, y);
  63353. if (this.particleBringToTop)
  63354. {
  63355. this.alive.push(particle);
  63356. }
  63357. else
  63358. {
  63359. this.alive.unshift(particle);
  63360. }
  63361. if (this.emitCallback)
  63362. {
  63363. this.emitCallback.call(this.emitCallbackScope, particle, this);
  63364. }
  63365. if (this.atLimit())
  63366. {
  63367. break;
  63368. }
  63369. }
  63370. return particle;
  63371. },
  63372. /**
  63373. * Updates this emitter and its particles.
  63374. *
  63375. * @method Phaser.GameObjects.Particles.ParticleEmitter#preUpdate
  63376. * @since 3.0.0
  63377. *
  63378. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  63379. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  63380. */
  63381. preUpdate: function (time, delta)
  63382. {
  63383. // Scale the delta
  63384. delta *= this.timeScale;
  63385. var step = (delta / 1000);
  63386. if (this.trackVisible)
  63387. {
  63388. this.visible = this.follow.visible;
  63389. }
  63390. // Any particle processors?
  63391. var processors = this.manager.getProcessors();
  63392. var particles = this.alive;
  63393. var dead = this.dead;
  63394. var i = 0;
  63395. var rip = [];
  63396. var length = particles.length;
  63397. for (i = 0; i < length; i++)
  63398. {
  63399. var particle = particles[i];
  63400. // update returns `true` if the particle is now dead (lifeCurrent <= 0)
  63401. if (particle.update(delta, step, processors))
  63402. {
  63403. rip.push({ index: i, particle: particle });
  63404. }
  63405. }
  63406. // Move dead particles to the dead array
  63407. length = rip.length;
  63408. if (length > 0)
  63409. {
  63410. var deathCallback = this.deathCallback;
  63411. var deathCallbackScope = this.deathCallbackScope;
  63412. for (i = length - 1; i >= 0; i--)
  63413. {
  63414. var entry = rip[i];
  63415. // Remove from particles array
  63416. particles.splice(entry.index, 1);
  63417. // Add to dead array
  63418. dead.push(entry.particle);
  63419. // Callback
  63420. if (deathCallback)
  63421. {
  63422. deathCallback.call(deathCallbackScope, entry.particle);
  63423. }
  63424. entry.particle.resetPosition();
  63425. }
  63426. }
  63427. if (!this.on)
  63428. {
  63429. return;
  63430. }
  63431. if (this.frequency === 0)
  63432. {
  63433. this.emitParticle();
  63434. }
  63435. else if (this.frequency > 0)
  63436. {
  63437. this._counter -= delta;
  63438. if (this._counter <= 0)
  63439. {
  63440. this.emitParticle();
  63441. // counter = frequency - remained from previous delta
  63442. this._counter = (this.frequency - Math.abs(this._counter));
  63443. }
  63444. }
  63445. },
  63446. /**
  63447. * Calculates the difference of two particles, for sorting them by depth.
  63448. *
  63449. * @method Phaser.GameObjects.Particles.ParticleEmitter#depthSortCallback
  63450. * @since 3.0.0
  63451. *
  63452. * @param {object} a - The first particle.
  63453. * @param {object} b - The second particle.
  63454. *
  63455. * @return {integer} The difference of a and b's y coordinates.
  63456. */
  63457. depthSortCallback: function (a, b)
  63458. {
  63459. return a.y - b.y;
  63460. }
  63461. });
  63462. module.exports = ParticleEmitter;
  63463. /***/ }),
  63464. /* 306 */
  63465. /***/ (function(module, exports, __webpack_require__) {
  63466. /**
  63467. * @author Richard Davey <rich@photonstorm.com>
  63468. * @copyright 2019 Photon Storm Ltd.
  63469. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  63470. */
  63471. var Class = __webpack_require__(0);
  63472. var DegToRad = __webpack_require__(34);
  63473. var DistanceBetween = __webpack_require__(56);
  63474. /**
  63475. * @classdesc
  63476. * A Particle is a simple Game Object controlled by a Particle Emitter and Manager, and rendered by the Manager.
  63477. * It uses its own lightweight physics system, and can interact only with its Emitter's bounds and zones.
  63478. *
  63479. * @class Particle
  63480. * @memberof Phaser.GameObjects.Particles
  63481. * @constructor
  63482. * @since 3.0.0
  63483. *
  63484. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The Emitter to which this Particle belongs.
  63485. */
  63486. var Particle = new Class({
  63487. initialize:
  63488. function Particle (emitter)
  63489. {
  63490. /**
  63491. * The Emitter to which this Particle belongs.
  63492. *
  63493. * A Particle can only belong to a single Emitter and is created, updated and destroyed via it.
  63494. *
  63495. * @name Phaser.GameObjects.Particles.Particle#emitter
  63496. * @type {Phaser.GameObjects.Particles.ParticleEmitter}
  63497. * @since 3.0.0
  63498. */
  63499. this.emitter = emitter;
  63500. /**
  63501. * The texture frame used to render this Particle.
  63502. *
  63503. * @name Phaser.GameObjects.Particles.Particle#frame
  63504. * @type {Phaser.Textures.Frame}
  63505. * @default null
  63506. * @since 3.0.0
  63507. */
  63508. this.frame = null;
  63509. /**
  63510. * The x coordinate of this Particle.
  63511. *
  63512. * @name Phaser.GameObjects.Particles.Particle#x
  63513. * @type {number}
  63514. * @default 0
  63515. * @since 3.0.0
  63516. */
  63517. this.x = 0;
  63518. /**
  63519. * The y coordinate of this Particle.
  63520. *
  63521. * @name Phaser.GameObjects.Particles.Particle#y
  63522. * @type {number}
  63523. * @default 0
  63524. * @since 3.0.0
  63525. */
  63526. this.y = 0;
  63527. /**
  63528. * The x velocity of this Particle.
  63529. *
  63530. * @name Phaser.GameObjects.Particles.Particle#velocityX
  63531. * @type {number}
  63532. * @default 0
  63533. * @since 3.0.0
  63534. */
  63535. this.velocityX = 0;
  63536. /**
  63537. * The y velocity of this Particle.
  63538. *
  63539. * @name Phaser.GameObjects.Particles.Particle#velocityY
  63540. * @type {number}
  63541. * @default 0
  63542. * @since 3.0.0
  63543. */
  63544. this.velocityY = 0;
  63545. /**
  63546. * The x acceleration of this Particle.
  63547. *
  63548. * @name Phaser.GameObjects.Particles.Particle#accelerationX
  63549. * @type {number}
  63550. * @default 0
  63551. * @since 3.0.0
  63552. */
  63553. this.accelerationX = 0;
  63554. /**
  63555. * The y acceleration of this Particle.
  63556. *
  63557. * @name Phaser.GameObjects.Particles.Particle#accelerationY
  63558. * @type {number}
  63559. * @default 0
  63560. * @since 3.0.0
  63561. */
  63562. this.accelerationY = 0;
  63563. /**
  63564. * The maximum horizontal velocity this Particle can travel at.
  63565. *
  63566. * @name Phaser.GameObjects.Particles.Particle#maxVelocityX
  63567. * @type {number}
  63568. * @default 10000
  63569. * @since 3.0.0
  63570. */
  63571. this.maxVelocityX = 10000;
  63572. /**
  63573. * The maximum vertical velocity this Particle can travel at.
  63574. *
  63575. * @name Phaser.GameObjects.Particles.Particle#maxVelocityY
  63576. * @type {number}
  63577. * @default 10000
  63578. * @since 3.0.0
  63579. */
  63580. this.maxVelocityY = 10000;
  63581. /**
  63582. * The bounciness, or restitution, of this Particle.
  63583. *
  63584. * @name Phaser.GameObjects.Particles.Particle#bounce
  63585. * @type {number}
  63586. * @default 0
  63587. * @since 3.0.0
  63588. */
  63589. this.bounce = 0;
  63590. /**
  63591. * The horizontal scale of this Particle.
  63592. *
  63593. * @name Phaser.GameObjects.Particles.Particle#scaleX
  63594. * @type {number}
  63595. * @default 1
  63596. * @since 3.0.0
  63597. */
  63598. this.scaleX = 1;
  63599. /**
  63600. * The vertical scale of this Particle.
  63601. *
  63602. * @name Phaser.GameObjects.Particles.Particle#scaleY
  63603. * @type {number}
  63604. * @default 1
  63605. * @since 3.0.0
  63606. */
  63607. this.scaleY = 1;
  63608. /**
  63609. * The alpha value of this Particle.
  63610. *
  63611. * @name Phaser.GameObjects.Particles.Particle#alpha
  63612. * @type {number}
  63613. * @default 1
  63614. * @since 3.0.0
  63615. */
  63616. this.alpha = 1;
  63617. /**
  63618. * The angle of this Particle in degrees.
  63619. *
  63620. * @name Phaser.GameObjects.Particles.Particle#angle
  63621. * @type {number}
  63622. * @default 0
  63623. * @since 3.0.0
  63624. */
  63625. this.angle = 0;
  63626. /**
  63627. * The angle of this Particle in radians.
  63628. *
  63629. * @name Phaser.GameObjects.Particles.Particle#rotation
  63630. * @type {number}
  63631. * @default 0
  63632. * @since 3.0.0
  63633. */
  63634. this.rotation = 0;
  63635. /**
  63636. * The tint applied to this Particle.
  63637. *
  63638. * @name Phaser.GameObjects.Particles.Particle#tint
  63639. * @type {integer}
  63640. * @webglOnly
  63641. * @since 3.0.0
  63642. */
  63643. this.tint = 0xffffff;
  63644. /**
  63645. * The lifespan of this Particle in ms.
  63646. *
  63647. * @name Phaser.GameObjects.Particles.Particle#life
  63648. * @type {number}
  63649. * @default 1000
  63650. * @since 3.0.0
  63651. */
  63652. this.life = 1000;
  63653. /**
  63654. * The current life of this Particle in ms.
  63655. *
  63656. * @name Phaser.GameObjects.Particles.Particle#lifeCurrent
  63657. * @type {number}
  63658. * @default 1000
  63659. * @since 3.0.0
  63660. */
  63661. this.lifeCurrent = 1000;
  63662. /**
  63663. * The delay applied to this Particle upon emission, in ms.
  63664. *
  63665. * @name Phaser.GameObjects.Particles.Particle#delayCurrent
  63666. * @type {number}
  63667. * @default 0
  63668. * @since 3.0.0
  63669. */
  63670. this.delayCurrent = 0;
  63671. /**
  63672. * The normalized lifespan T value, where 0 is the start and 1 is the end.
  63673. *
  63674. * @name Phaser.GameObjects.Particles.Particle#lifeT
  63675. * @type {number}
  63676. * @default 0
  63677. * @since 3.0.0
  63678. */
  63679. this.lifeT = 0;
  63680. /**
  63681. * The data used by the ease equation.
  63682. *
  63683. * @name Phaser.GameObjects.Particles.Particle#data
  63684. * @type {object}
  63685. * @since 3.0.0
  63686. */
  63687. this.data = {
  63688. tint: { min: 0xffffff, max: 0xffffff, current: 0xffffff },
  63689. alpha: { min: 1, max: 1 },
  63690. rotate: { min: 0, max: 0 },
  63691. scaleX: { min: 1, max: 1 },
  63692. scaleY: { min: 1, max: 1 }
  63693. };
  63694. },
  63695. /**
  63696. * Checks to see if this Particle is alive and updating.
  63697. *
  63698. * @method Phaser.GameObjects.Particles.Particle#isAlive
  63699. * @since 3.0.0
  63700. *
  63701. * @return {boolean} `true` if this Particle is alive and updating, otherwise `false`.
  63702. */
  63703. isAlive: function ()
  63704. {
  63705. return (this.lifeCurrent > 0);
  63706. },
  63707. /**
  63708. * Resets the position of this particle back to zero.
  63709. *
  63710. * @method Phaser.GameObjects.Particles.Particle#resetPosition
  63711. * @since 3.16.0
  63712. */
  63713. resetPosition: function ()
  63714. {
  63715. this.x = 0;
  63716. this.y = 0;
  63717. },
  63718. /**
  63719. * Starts this Particle from the given coordinates.
  63720. *
  63721. * @method Phaser.GameObjects.Particles.Particle#fire
  63722. * @since 3.0.0
  63723. *
  63724. * @param {number} x - The x coordinate to launch this Particle from.
  63725. * @param {number} y - The y coordinate to launch this Particle from.
  63726. */
  63727. fire: function (x, y)
  63728. {
  63729. var emitter = this.emitter;
  63730. this.frame = emitter.getFrame();
  63731. if (emitter.emitZone)
  63732. {
  63733. // Updates particle.x and particle.y during this call
  63734. emitter.emitZone.getPoint(this);
  63735. }
  63736. if (x === undefined)
  63737. {
  63738. if (emitter.follow)
  63739. {
  63740. this.x += emitter.follow.x + emitter.followOffset.x;
  63741. }
  63742. this.x += emitter.x.onEmit(this, 'x');
  63743. }
  63744. else
  63745. {
  63746. this.x += x;
  63747. }
  63748. if (y === undefined)
  63749. {
  63750. if (emitter.follow)
  63751. {
  63752. this.y += emitter.follow.y + emitter.followOffset.y;
  63753. }
  63754. this.y += emitter.y.onEmit(this, 'y');
  63755. }
  63756. else
  63757. {
  63758. this.y += y;
  63759. }
  63760. this.life = emitter.lifespan.onEmit(this, 'lifespan');
  63761. this.lifeCurrent = this.life;
  63762. this.lifeT = 0;
  63763. var sx = emitter.speedX.onEmit(this, 'speedX');
  63764. var sy = (emitter.speedY) ? emitter.speedY.onEmit(this, 'speedY') : sx;
  63765. if (emitter.radial)
  63766. {
  63767. var rad = DegToRad(emitter.angle.onEmit(this, 'angle'));
  63768. this.velocityX = Math.cos(rad) * Math.abs(sx);
  63769. this.velocityY = Math.sin(rad) * Math.abs(sy);
  63770. }
  63771. else if (emitter.moveTo)
  63772. {
  63773. var mx = emitter.moveToX.onEmit(this, 'moveToX');
  63774. var my = (emitter.moveToY) ? emitter.moveToY.onEmit(this, 'moveToY') : mx;
  63775. var angle = Math.atan2(my - this.y, mx - this.x);
  63776. var speed = DistanceBetween(this.x, this.y, mx, my) / (this.life / 1000);
  63777. // We know how many pixels we need to move, but how fast?
  63778. // var speed = this.distanceToXY(displayObject, x, y) / (maxTime / 1000);
  63779. this.velocityX = Math.cos(angle) * speed;
  63780. this.velocityY = Math.sin(angle) * speed;
  63781. }
  63782. else
  63783. {
  63784. this.velocityX = sx;
  63785. this.velocityY = sy;
  63786. }
  63787. if (emitter.acceleration)
  63788. {
  63789. this.accelerationX = emitter.accelerationX.onEmit(this, 'accelerationX');
  63790. this.accelerationY = emitter.accelerationY.onEmit(this, 'accelerationY');
  63791. }
  63792. this.maxVelocityX = emitter.maxVelocityX.onEmit(this, 'maxVelocityX');
  63793. this.maxVelocityY = emitter.maxVelocityY.onEmit(this, 'maxVelocityY');
  63794. this.delayCurrent = emitter.delay.onEmit(this, 'delay');
  63795. this.scaleX = emitter.scaleX.onEmit(this, 'scaleX');
  63796. this.scaleY = (emitter.scaleY) ? emitter.scaleY.onEmit(this, 'scaleY') : this.scaleX;
  63797. this.angle = emitter.rotate.onEmit(this, 'rotate');
  63798. this.rotation = DegToRad(this.angle);
  63799. this.bounce = emitter.bounce.onEmit(this, 'bounce');
  63800. this.alpha = emitter.alpha.onEmit(this, 'alpha');
  63801. this.tint = emitter.tint.onEmit(this, 'tint');
  63802. },
  63803. /**
  63804. * An internal method that calculates the velocity of the Particle.
  63805. *
  63806. * @method Phaser.GameObjects.Particles.Particle#computeVelocity
  63807. * @since 3.0.0
  63808. *
  63809. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The Emitter that is updating this Particle.
  63810. * @param {number} delta - The delta time in ms.
  63811. * @param {number} step - The delta value divided by 1000.
  63812. * @param {array} processors - Particle processors (gravity wells).
  63813. */
  63814. computeVelocity: function (emitter, delta, step, processors)
  63815. {
  63816. var vx = this.velocityX;
  63817. var vy = this.velocityY;
  63818. var ax = this.accelerationX;
  63819. var ay = this.accelerationY;
  63820. var mx = this.maxVelocityX;
  63821. var my = this.maxVelocityY;
  63822. vx += (emitter.gravityX * step);
  63823. vy += (emitter.gravityY * step);
  63824. if (ax)
  63825. {
  63826. vx += (ax * step);
  63827. }
  63828. if (ay)
  63829. {
  63830. vy += (ay * step);
  63831. }
  63832. if (vx > mx)
  63833. {
  63834. vx = mx;
  63835. }
  63836. else if (vx < -mx)
  63837. {
  63838. vx = -mx;
  63839. }
  63840. if (vy > my)
  63841. {
  63842. vy = my;
  63843. }
  63844. else if (vy < -my)
  63845. {
  63846. vy = -my;
  63847. }
  63848. this.velocityX = vx;
  63849. this.velocityY = vy;
  63850. // Apply any additional processors
  63851. for (var i = 0; i < processors.length; i++)
  63852. {
  63853. processors[i].update(this, delta, step);
  63854. }
  63855. },
  63856. /**
  63857. * Checks if this Particle is still within the bounds defined by the given Emitter.
  63858. *
  63859. * If not, and depending on the Emitter collision flags, the Particle may either stop or rebound.
  63860. *
  63861. * @method Phaser.GameObjects.Particles.Particle#checkBounds
  63862. * @since 3.0.0
  63863. *
  63864. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The Emitter to check the bounds against.
  63865. */
  63866. checkBounds: function (emitter)
  63867. {
  63868. var bounds = emitter.bounds;
  63869. var bounce = -this.bounce;
  63870. if (this.x < bounds.x && emitter.collideLeft)
  63871. {
  63872. this.x = bounds.x;
  63873. this.velocityX *= bounce;
  63874. }
  63875. else if (this.x > bounds.right && emitter.collideRight)
  63876. {
  63877. this.x = bounds.right;
  63878. this.velocityX *= bounce;
  63879. }
  63880. if (this.y < bounds.y && emitter.collideTop)
  63881. {
  63882. this.y = bounds.y;
  63883. this.velocityY *= bounce;
  63884. }
  63885. else if (this.y > bounds.bottom && emitter.collideBottom)
  63886. {
  63887. this.y = bounds.bottom;
  63888. this.velocityY *= bounce;
  63889. }
  63890. },
  63891. /**
  63892. * The main update method for this Particle.
  63893. *
  63894. * Updates its life values, computes the velocity and repositions the Particle.
  63895. *
  63896. * @method Phaser.GameObjects.Particles.Particle#update
  63897. * @since 3.0.0
  63898. *
  63899. * @param {number} delta - The delta time in ms.
  63900. * @param {number} step - The delta value divided by 1000.
  63901. * @param {array} processors - An optional array of update processors.
  63902. *
  63903. * @return {boolean} Returns `true` if this Particle has now expired and should be removed, otherwise `false` if still active.
  63904. */
  63905. update: function (delta, step, processors)
  63906. {
  63907. if (this.delayCurrent > 0)
  63908. {
  63909. this.delayCurrent -= delta;
  63910. return false;
  63911. }
  63912. var emitter = this.emitter;
  63913. // How far along in life is this particle? (t = 0 to 1)
  63914. var t = 1 - (this.lifeCurrent / this.life);
  63915. this.lifeT = t;
  63916. this.computeVelocity(emitter, delta, step, processors);
  63917. this.x += this.velocityX * step;
  63918. this.y += this.velocityY * step;
  63919. if (emitter.bounds)
  63920. {
  63921. this.checkBounds(emitter);
  63922. }
  63923. if (emitter.deathZone && emitter.deathZone.willKill(this))
  63924. {
  63925. this.lifeCurrent = 0;
  63926. // No need to go any further, particle has been killed
  63927. return true;
  63928. }
  63929. this.scaleX = emitter.scaleX.onUpdate(this, 'scaleX', t, this.scaleX);
  63930. if (emitter.scaleY)
  63931. {
  63932. this.scaleY = emitter.scaleY.onUpdate(this, 'scaleY', t, this.scaleY);
  63933. }
  63934. else
  63935. {
  63936. this.scaleY = this.scaleX;
  63937. }
  63938. this.angle = emitter.rotate.onUpdate(this, 'rotate', t, this.angle);
  63939. this.rotation = DegToRad(this.angle);
  63940. this.alpha = emitter.alpha.onUpdate(this, 'alpha', t, this.alpha);
  63941. this.tint = emitter.tint.onUpdate(this, 'tint', t, this.tint);
  63942. this.lifeCurrent -= delta;
  63943. return (this.lifeCurrent <= 0);
  63944. }
  63945. });
  63946. module.exports = Particle;
  63947. /***/ }),
  63948. /* 307 */
  63949. /***/ (function(module, exports, __webpack_require__) {
  63950. /**
  63951. * @author Richard Davey <rich@photonstorm.com>
  63952. * @copyright 2019 Photon Storm Ltd.
  63953. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  63954. */
  63955. var Class = __webpack_require__(0);
  63956. var GetFastValue = __webpack_require__(2);
  63957. /**
  63958. * @typedef {object} GravityWellConfig
  63959. *
  63960. * @property {number} [x=0] - The x coordinate of the Gravity Well, in world space.
  63961. * @property {number} [y=0] - The y coordinate of the Gravity Well, in world space.
  63962. * @property {number} [power=0] - The strength of the gravity force - larger numbers produce a stronger force.
  63963. * @property {number} [epsilon=100] - The minimum distance for which the gravity force is calculated.
  63964. * @property {number} [gravity=50] - The gravitational force of this Gravity Well.
  63965. */
  63966. /**
  63967. * @classdesc
  63968. * The GravityWell action applies a force on the particle to draw it towards, or repel it from, a single point.
  63969. *
  63970. * The force applied is inversely proportional to the square of the distance from the particle to the point, in accordance with Newton's law of gravity.
  63971. *
  63972. * This simulates the effect of gravity over large distances (as between planets, for example).
  63973. *
  63974. * @class GravityWell
  63975. * @memberof Phaser.GameObjects.Particles
  63976. * @constructor
  63977. * @since 3.0.0
  63978. *
  63979. * @param {(number|GravityWellConfig)} [x=0] - The x coordinate of the Gravity Well, in world space.
  63980. * @param {number} [y=0] - The y coordinate of the Gravity Well, in world space.
  63981. * @param {number} [power=0] - The strength of the gravity force - larger numbers produce a stronger force.
  63982. * @param {number} [epsilon=100] - The minimum distance for which the gravity force is calculated.
  63983. * @param {number} [gravity=50] - The gravitational force of this Gravity Well.
  63984. */
  63985. var GravityWell = new Class({
  63986. initialize:
  63987. function GravityWell (x, y, power, epsilon, gravity)
  63988. {
  63989. if (typeof x === 'object')
  63990. {
  63991. var config = x;
  63992. x = GetFastValue(config, 'x', 0);
  63993. y = GetFastValue(config, 'y', 0);
  63994. power = GetFastValue(config, 'power', 0);
  63995. epsilon = GetFastValue(config, 'epsilon', 100);
  63996. gravity = GetFastValue(config, 'gravity', 50);
  63997. }
  63998. else
  63999. {
  64000. if (x === undefined) { x = 0; }
  64001. if (y === undefined) { y = 0; }
  64002. if (power === undefined) { power = 0; }
  64003. if (epsilon === undefined) { epsilon = 100; }
  64004. if (gravity === undefined) { gravity = 50; }
  64005. }
  64006. /**
  64007. * The x coordinate of the Gravity Well, in world space.
  64008. *
  64009. * @name Phaser.GameObjects.Particles.GravityWell#x
  64010. * @type {number}
  64011. * @since 3.0.0
  64012. */
  64013. this.x = x;
  64014. /**
  64015. * The y coordinate of the Gravity Well, in world space.
  64016. *
  64017. * @name Phaser.GameObjects.Particles.GravityWell#y
  64018. * @type {number}
  64019. * @since 3.0.0
  64020. */
  64021. this.y = y;
  64022. /**
  64023. * The active state of the Gravity Well. An inactive Gravity Well will not influence any particles.
  64024. *
  64025. * @name Phaser.GameObjects.Particles.GravityWell#active
  64026. * @type {boolean}
  64027. * @default true
  64028. * @since 3.0.0
  64029. */
  64030. this.active = true;
  64031. /**
  64032. * Internal gravity value.
  64033. *
  64034. * @name Phaser.GameObjects.Particles.GravityWell#_gravity
  64035. * @type {number}
  64036. * @private
  64037. * @since 3.0.0
  64038. */
  64039. this._gravity = gravity;
  64040. /**
  64041. * Internal power value.
  64042. *
  64043. * @name Phaser.GameObjects.Particles.GravityWell#_power
  64044. * @type {number}
  64045. * @private
  64046. * @default 0
  64047. * @since 3.0.0
  64048. */
  64049. this._power = 0;
  64050. /**
  64051. * Internal epsilon value.
  64052. *
  64053. * @name Phaser.GameObjects.Particles.GravityWell#_epsilon
  64054. * @type {number}
  64055. * @private
  64056. * @default 0
  64057. * @since 3.0.0
  64058. */
  64059. this._epsilon = 0;
  64060. /**
  64061. * The strength of the gravity force - larger numbers produce a stronger force.
  64062. *
  64063. * @name Phaser.GameObjects.Particles.GravityWell#power
  64064. * @type {number}
  64065. * @since 3.0.0
  64066. */
  64067. this.power = power;
  64068. /**
  64069. * The minimum distance for which the gravity force is calculated.
  64070. *
  64071. * @name Phaser.GameObjects.Particles.GravityWell#epsilon
  64072. * @type {number}
  64073. * @since 3.0.0
  64074. */
  64075. this.epsilon = epsilon;
  64076. },
  64077. /**
  64078. * Takes a Particle and updates it based on the properties of this Gravity Well.
  64079. *
  64080. * @method Phaser.GameObjects.Particles.GravityWell#update
  64081. * @since 3.0.0
  64082. *
  64083. * @param {Phaser.GameObjects.Particles.Particle} particle - The Particle to update.
  64084. * @param {number} delta - The delta time in ms.
  64085. * @param {number} step - The delta value divided by 1000.
  64086. */
  64087. update: function (particle, delta)
  64088. {
  64089. var x = this.x - particle.x;
  64090. var y = this.y - particle.y;
  64091. var dSq = x * x + y * y;
  64092. if (dSq === 0)
  64093. {
  64094. return;
  64095. }
  64096. var d = Math.sqrt(dSq);
  64097. if (dSq < this._epsilon)
  64098. {
  64099. dSq = this._epsilon;
  64100. }
  64101. var factor = ((this._power * delta) / (dSq * d)) * 100;
  64102. particle.velocityX += x * factor;
  64103. particle.velocityY += y * factor;
  64104. },
  64105. epsilon: {
  64106. get: function ()
  64107. {
  64108. return Math.sqrt(this._epsilon);
  64109. },
  64110. set: function (value)
  64111. {
  64112. this._epsilon = value * value;
  64113. }
  64114. },
  64115. power: {
  64116. get: function ()
  64117. {
  64118. return this._power / this._gravity;
  64119. },
  64120. set: function (value)
  64121. {
  64122. this._power = value * this._gravity;
  64123. }
  64124. },
  64125. gravity: {
  64126. get: function ()
  64127. {
  64128. return this._gravity;
  64129. },
  64130. set: function (value)
  64131. {
  64132. var pwr = this.power;
  64133. this._gravity = value;
  64134. this.power = pwr;
  64135. }
  64136. }
  64137. });
  64138. module.exports = GravityWell;
  64139. /***/ }),
  64140. /* 308 */
  64141. /***/ (function(module, exports, __webpack_require__) {
  64142. /**
  64143. * @author Richard Davey <rich@photonstorm.com>
  64144. * @copyright 2019 Photon Storm Ltd.
  64145. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64146. */
  64147. var Commands = __webpack_require__(167);
  64148. var SetTransform = __webpack_require__(25);
  64149. /**
  64150. * Renders this Game Object with the Canvas Renderer to the given Camera.
  64151. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  64152. * This method should not be called directly. It is a utility function of the Render module.
  64153. *
  64154. * @method Phaser.GameObjects.Graphics#renderCanvas
  64155. * @since 3.0.0
  64156. * @private
  64157. *
  64158. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  64159. * @param {Phaser.GameObjects.Graphics} src - The Game Object being rendered in this call.
  64160. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  64161. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  64162. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  64163. * @param {CanvasRenderingContext2D} [renderTargetCtx] - The target rendering context.
  64164. * @param {boolean} allowClip - If `true` then path operations will be used instead of fill operations.
  64165. */
  64166. var GraphicsCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix, renderTargetCtx, allowClip)
  64167. {
  64168. var commandBuffer = src.commandBuffer;
  64169. var commandBufferLength = commandBuffer.length;
  64170. var ctx = renderTargetCtx || renderer.currentContext;
  64171. if (commandBufferLength === 0 || !SetTransform(renderer, ctx, src, camera, parentMatrix))
  64172. {
  64173. return;
  64174. }
  64175. var lineAlpha = 1;
  64176. var fillAlpha = 1;
  64177. var lineColor = 0;
  64178. var fillColor = 0;
  64179. var lineWidth = 1;
  64180. var red = 0;
  64181. var green = 0;
  64182. var blue = 0;
  64183. // Reset any currently active paths
  64184. ctx.beginPath();
  64185. for (var index = 0; index < commandBufferLength; ++index)
  64186. {
  64187. var commandID = commandBuffer[index];
  64188. switch (commandID)
  64189. {
  64190. case Commands.ARC:
  64191. ctx.arc(
  64192. commandBuffer[index + 1],
  64193. commandBuffer[index + 2],
  64194. commandBuffer[index + 3],
  64195. commandBuffer[index + 4],
  64196. commandBuffer[index + 5],
  64197. commandBuffer[index + 6]
  64198. );
  64199. // +7 because overshoot is the 7th value, not used in Canvas
  64200. index += 7;
  64201. break;
  64202. case Commands.LINE_STYLE:
  64203. lineWidth = commandBuffer[index + 1];
  64204. lineColor = commandBuffer[index + 2];
  64205. lineAlpha = commandBuffer[index + 3];
  64206. red = ((lineColor & 0xFF0000) >>> 16);
  64207. green = ((lineColor & 0xFF00) >>> 8);
  64208. blue = (lineColor & 0xFF);
  64209. ctx.strokeStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + lineAlpha + ')';
  64210. ctx.lineWidth = lineWidth;
  64211. index += 3;
  64212. break;
  64213. case Commands.FILL_STYLE:
  64214. fillColor = commandBuffer[index + 1];
  64215. fillAlpha = commandBuffer[index + 2];
  64216. red = ((fillColor & 0xFF0000) >>> 16);
  64217. green = ((fillColor & 0xFF00) >>> 8);
  64218. blue = (fillColor & 0xFF);
  64219. ctx.fillStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + fillAlpha + ')';
  64220. index += 2;
  64221. break;
  64222. case Commands.BEGIN_PATH:
  64223. ctx.beginPath();
  64224. break;
  64225. case Commands.CLOSE_PATH:
  64226. ctx.closePath();
  64227. break;
  64228. case Commands.FILL_PATH:
  64229. if (!allowClip)
  64230. {
  64231. ctx.fill();
  64232. }
  64233. break;
  64234. case Commands.STROKE_PATH:
  64235. if (!allowClip)
  64236. {
  64237. ctx.stroke();
  64238. }
  64239. break;
  64240. case Commands.FILL_RECT:
  64241. if (!allowClip)
  64242. {
  64243. ctx.fillRect(
  64244. commandBuffer[index + 1],
  64245. commandBuffer[index + 2],
  64246. commandBuffer[index + 3],
  64247. commandBuffer[index + 4]
  64248. );
  64249. }
  64250. else
  64251. {
  64252. ctx.rect(
  64253. commandBuffer[index + 1],
  64254. commandBuffer[index + 2],
  64255. commandBuffer[index + 3],
  64256. commandBuffer[index + 4]
  64257. );
  64258. }
  64259. index += 4;
  64260. break;
  64261. case Commands.FILL_TRIANGLE:
  64262. ctx.beginPath();
  64263. ctx.moveTo(commandBuffer[index + 1], commandBuffer[index + 2]);
  64264. ctx.lineTo(commandBuffer[index + 3], commandBuffer[index + 4]);
  64265. ctx.lineTo(commandBuffer[index + 5], commandBuffer[index + 6]);
  64266. ctx.closePath();
  64267. if (!allowClip)
  64268. {
  64269. ctx.fill();
  64270. }
  64271. index += 6;
  64272. break;
  64273. case Commands.STROKE_TRIANGLE:
  64274. ctx.beginPath();
  64275. ctx.moveTo(commandBuffer[index + 1], commandBuffer[index + 2]);
  64276. ctx.lineTo(commandBuffer[index + 3], commandBuffer[index + 4]);
  64277. ctx.lineTo(commandBuffer[index + 5], commandBuffer[index + 6]);
  64278. ctx.closePath();
  64279. if (!allowClip)
  64280. {
  64281. ctx.stroke();
  64282. }
  64283. index += 6;
  64284. break;
  64285. case Commands.LINE_TO:
  64286. ctx.lineTo(
  64287. commandBuffer[index + 1],
  64288. commandBuffer[index + 2]
  64289. );
  64290. index += 2;
  64291. break;
  64292. case Commands.MOVE_TO:
  64293. ctx.moveTo(
  64294. commandBuffer[index + 1],
  64295. commandBuffer[index + 2]
  64296. );
  64297. index += 2;
  64298. break;
  64299. case Commands.LINE_FX_TO:
  64300. ctx.lineTo(
  64301. commandBuffer[index + 1],
  64302. commandBuffer[index + 2]
  64303. );
  64304. index += 5;
  64305. break;
  64306. case Commands.MOVE_FX_TO:
  64307. ctx.moveTo(
  64308. commandBuffer[index + 1],
  64309. commandBuffer[index + 2]
  64310. );
  64311. index += 5;
  64312. break;
  64313. case Commands.SAVE:
  64314. ctx.save();
  64315. break;
  64316. case Commands.RESTORE:
  64317. ctx.restore();
  64318. break;
  64319. case Commands.TRANSLATE:
  64320. ctx.translate(
  64321. commandBuffer[index + 1],
  64322. commandBuffer[index + 2]
  64323. );
  64324. index += 2;
  64325. break;
  64326. case Commands.SCALE:
  64327. ctx.scale(
  64328. commandBuffer[index + 1],
  64329. commandBuffer[index + 2]
  64330. );
  64331. index += 2;
  64332. break;
  64333. case Commands.ROTATE:
  64334. ctx.rotate(
  64335. commandBuffer[index + 1]
  64336. );
  64337. index += 1;
  64338. break;
  64339. case Commands.GRADIENT_FILL_STYLE:
  64340. index += 5;
  64341. break;
  64342. case Commands.GRADIENT_LINE_STYLE:
  64343. index += 6;
  64344. break;
  64345. case Commands.SET_TEXTURE:
  64346. index += 2;
  64347. break;
  64348. }
  64349. }
  64350. // Restore the context saved in SetTransform
  64351. ctx.restore();
  64352. };
  64353. module.exports = GraphicsCanvasRenderer;
  64354. /***/ }),
  64355. /* 309 */
  64356. /***/ (function(module, exports) {
  64357. /**
  64358. * @author Richard Davey <rich@photonstorm.com>
  64359. * @copyright 2019 Photon Storm Ltd.
  64360. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64361. */
  64362. /**
  64363. * Returns the circumference of the given Ellipse.
  64364. *
  64365. * @function Phaser.Geom.Ellipse.Circumference
  64366. * @since 3.0.0
  64367. *
  64368. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the circumference of.
  64369. *
  64370. * @return {number} The circumference of th Ellipse.
  64371. */
  64372. var Circumference = function (ellipse)
  64373. {
  64374. var rx = ellipse.width / 2;
  64375. var ry = ellipse.height / 2;
  64376. var h = Math.pow((rx - ry), 2) / Math.pow((rx + ry), 2);
  64377. return (Math.PI * (rx + ry)) * (1 + ((3 * h) / (10 + Math.sqrt(4 - (3 * h)))));
  64378. };
  64379. module.exports = Circumference;
  64380. /***/ }),
  64381. /* 310 */
  64382. /***/ (function(module, exports, __webpack_require__) {
  64383. /**
  64384. * @author Richard Davey <rich@photonstorm.com>
  64385. * @copyright 2019 Photon Storm Ltd.
  64386. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64387. */
  64388. var Circumference = __webpack_require__(309);
  64389. var CircumferencePoint = __webpack_require__(166);
  64390. var FromPercent = __webpack_require__(100);
  64391. var MATH_CONST = __webpack_require__(20);
  64392. /**
  64393. * Returns an array of Point objects containing the coordinates of the points around the circumference of the Ellipse,
  64394. * based on the given quantity or stepRate values.
  64395. *
  64396. * @function Phaser.Geom.Ellipse.GetPoints
  64397. * @since 3.0.0
  64398. *
  64399. * @generic {Phaser.Geom.Point[]} O - [out,$return]
  64400. *
  64401. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the points from.
  64402. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  64403. * @param {number} [stepRate] - Sets the quantity by getting the circumference of the ellipse and dividing it by the stepRate.
  64404. * @param {(array|Phaser.Geom.Point[])} [out] - An array to insert the points in to. If not provided a new array will be created.
  64405. *
  64406. * @return {(array|Phaser.Geom.Point[])} An array of Point objects pertaining to the points around the circumference of the ellipse.
  64407. */
  64408. var GetPoints = function (ellipse, quantity, stepRate, out)
  64409. {
  64410. if (out === undefined) { out = []; }
  64411. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  64412. if (!quantity)
  64413. {
  64414. quantity = Circumference(ellipse) / stepRate;
  64415. }
  64416. for (var i = 0; i < quantity; i++)
  64417. {
  64418. var angle = FromPercent(i / quantity, 0, MATH_CONST.PI2);
  64419. out.push(CircumferencePoint(ellipse, angle));
  64420. }
  64421. return out;
  64422. };
  64423. module.exports = GetPoints;
  64424. /***/ }),
  64425. /* 311 */
  64426. /***/ (function(module, exports, __webpack_require__) {
  64427. /**
  64428. * @author Richard Davey <rich@photonstorm.com>
  64429. * @copyright 2019 Photon Storm Ltd.
  64430. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64431. */
  64432. var CircumferencePoint = __webpack_require__(166);
  64433. var FromPercent = __webpack_require__(100);
  64434. var MATH_CONST = __webpack_require__(20);
  64435. var Point = __webpack_require__(6);
  64436. /**
  64437. * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse
  64438. * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point
  64439. * at 180 degrees around the circle.
  64440. *
  64441. * @function Phaser.Geom.Ellipse.GetPoint
  64442. * @since 3.0.0
  64443. *
  64444. * @generic {Phaser.Geom.Point} O - [out,$return]
  64445. *
  64446. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the circumference point on.
  64447. * @param {number} position - A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the ellipse.
  64448. * @param {(Phaser.Geom.Point|object)} [out] - An object to store the return values in. If not given a Point object will be created.
  64449. *
  64450. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point around the ellipse.
  64451. */
  64452. var GetPoint = function (ellipse, position, out)
  64453. {
  64454. if (out === undefined) { out = new Point(); }
  64455. var angle = FromPercent(position, 0, MATH_CONST.PI2);
  64456. return CircumferencePoint(ellipse, angle, out);
  64457. };
  64458. module.exports = GetPoint;
  64459. /***/ }),
  64460. /* 312 */
  64461. /***/ (function(module, exports, __webpack_require__) {
  64462. /**
  64463. * @author Richard Davey <rich@photonstorm.com>
  64464. * @copyright 2019 Photon Storm Ltd.
  64465. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64466. */
  64467. var Class = __webpack_require__(0);
  64468. var Components = __webpack_require__(13);
  64469. var GameObject = __webpack_require__(18);
  64470. var ExternRender = __webpack_require__(857);
  64471. /**
  64472. * @classdesc
  64473. * An Extern Game Object is a special type of Game Object that allows you to pass
  64474. * rendering off to a 3rd party.
  64475. *
  64476. * When you create an Extern and place it in the display list of a Scene, the renderer will
  64477. * process the list as usual. When it finds an Extern it will flush the current batch,
  64478. * clear down the pipeline and prepare a transform matrix which your render function can
  64479. * take advantage of, if required.
  64480. *
  64481. * The WebGL context is then left is a 'clean' state, ready for you to bind your own shaders,
  64482. * or draw to it, whatever you wish to do. Once you've finished, you should free-up any
  64483. * of your resources. The Extern will then rebind the Phaser pipeline and carry on
  64484. * rendering the display list.
  64485. *
  64486. * Although this object has lots of properties such as Alpha, Blend Mode and Tint, none of
  64487. * them are used during rendering unless you take advantage of them in your own render code.
  64488. *
  64489. * @class Extern
  64490. * @extends Phaser.GameObjects.GameObject
  64491. * @memberof Phaser.GameObjects
  64492. * @constructor
  64493. * @since 3.16.0
  64494. *
  64495. * @extends Phaser.GameObjects.Components.Alpha
  64496. * @extends Phaser.GameObjects.Components.BlendMode
  64497. * @extends Phaser.GameObjects.Components.Depth
  64498. * @extends Phaser.GameObjects.Components.Flip
  64499. * @extends Phaser.GameObjects.Components.Origin
  64500. * @extends Phaser.GameObjects.Components.ScaleMode
  64501. * @extends Phaser.GameObjects.Components.ScrollFactor
  64502. * @extends Phaser.GameObjects.Components.Size
  64503. * @extends Phaser.GameObjects.Components.Texture
  64504. * @extends Phaser.GameObjects.Components.Tint
  64505. * @extends Phaser.GameObjects.Components.Transform
  64506. * @extends Phaser.GameObjects.Components.Visible
  64507. *
  64508. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  64509. */
  64510. var Extern = new Class({
  64511. Extends: GameObject,
  64512. Mixins: [
  64513. Components.Alpha,
  64514. Components.BlendMode,
  64515. Components.Depth,
  64516. Components.Flip,
  64517. Components.Origin,
  64518. Components.ScaleMode,
  64519. Components.ScrollFactor,
  64520. Components.Size,
  64521. Components.Texture,
  64522. Components.Tint,
  64523. Components.Transform,
  64524. Components.Visible,
  64525. ExternRender
  64526. ],
  64527. initialize:
  64528. function Extern (scene)
  64529. {
  64530. GameObject.call(this, scene, 'Extern');
  64531. },
  64532. preUpdate: function ()
  64533. {
  64534. // override this!
  64535. // Arguments: time, delta
  64536. },
  64537. render: function ()
  64538. {
  64539. // override this!
  64540. // Arguments: renderer, camera, calcMatrix
  64541. }
  64542. });
  64543. module.exports = Extern;
  64544. /***/ }),
  64545. /* 313 */
  64546. /***/ (function(module, exports, __webpack_require__) {
  64547. /**
  64548. * @author Richard Davey <rich@photonstorm.com>
  64549. * @copyright 2019 Photon Storm Ltd.
  64550. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64551. */
  64552. var Rectangle = __webpack_require__(10);
  64553. /**
  64554. * Creates a new Rectangle or repositions and/or resizes an existing Rectangle so that it encompasses the two given Rectangles, i.e. calculates their union.
  64555. *
  64556. * @function Phaser.Geom.Rectangle.Union
  64557. * @since 3.0.0
  64558. *
  64559. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  64560. *
  64561. * @param {Phaser.Geom.Rectangle} rectA - The first Rectangle to use.
  64562. * @param {Phaser.Geom.Rectangle} rectB - The second Rectangle to use.
  64563. * @param {Phaser.Geom.Rectangle} [out] - The Rectangle to store the union in.
  64564. *
  64565. * @return {Phaser.Geom.Rectangle} The modified `out` Rectangle, or a new Rectangle if none was provided.
  64566. */
  64567. var Union = function (rectA, rectB, out)
  64568. {
  64569. if (out === undefined) { out = new Rectangle(); }
  64570. // Cache vars so we can use one of the input rects as the output rect
  64571. var x = Math.min(rectA.x, rectB.x);
  64572. var y = Math.min(rectA.y, rectB.y);
  64573. var w = Math.max(rectA.right, rectB.right) - x;
  64574. var h = Math.max(rectA.bottom, rectB.bottom) - y;
  64575. return out.setTo(x, y, w, h);
  64576. };
  64577. module.exports = Union;
  64578. /***/ }),
  64579. /* 314 */
  64580. /***/ (function(module, exports) {
  64581. /**
  64582. * @author Richard Davey <rich@photonstorm.com>
  64583. * @copyright 2019 Photon Storm Ltd.
  64584. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64585. */
  64586. /**
  64587. * Read an integer value from an XML Node.
  64588. *
  64589. * @function getValue
  64590. * @since 3.0.0
  64591. * @private
  64592. *
  64593. * @param {Node} node - The XML Node.
  64594. * @param {string} attribute - The attribute to read.
  64595. *
  64596. * @return {integer} The parsed value.
  64597. */
  64598. function getValue (node, attribute)
  64599. {
  64600. return parseInt(node.getAttribute(attribute), 10);
  64601. }
  64602. /**
  64603. * Parse an XML font to Bitmap Font data for the Bitmap Font cache.
  64604. *
  64605. * @function ParseXMLBitmapFont
  64606. * @since 3.0.0
  64607. * @private
  64608. *
  64609. * @param {XMLDocument} xml - The XML Document to parse the font from.
  64610. * @param {integer} [xSpacing=0] - The x-axis spacing to add between each letter.
  64611. * @param {integer} [ySpacing=0] - The y-axis spacing to add to the line height.
  64612. * @param {Phaser.Textures.Frame} [frame] - The texture frame to take into account while parsing.
  64613. *
  64614. * @return {BitmapFontData} The parsed Bitmap Font data.
  64615. */
  64616. var ParseXMLBitmapFont = function (xml, xSpacing, ySpacing, frame)
  64617. {
  64618. if (xSpacing === undefined) { xSpacing = 0; }
  64619. if (ySpacing === undefined) { ySpacing = 0; }
  64620. var data = {};
  64621. var info = xml.getElementsByTagName('info')[0];
  64622. var common = xml.getElementsByTagName('common')[0];
  64623. data.font = info.getAttribute('face');
  64624. data.size = getValue(info, 'size');
  64625. data.lineHeight = getValue(common, 'lineHeight') + ySpacing;
  64626. data.chars = {};
  64627. var letters = xml.getElementsByTagName('char');
  64628. var adjustForTrim = (frame !== undefined && frame.trimmed);
  64629. if (adjustForTrim)
  64630. {
  64631. var top = frame.height;
  64632. var left = frame.width;
  64633. }
  64634. for (var i = 0; i < letters.length; i++)
  64635. {
  64636. var node = letters[i];
  64637. var charCode = getValue(node, 'id');
  64638. var gx = getValue(node, 'x');
  64639. var gy = getValue(node, 'y');
  64640. var gw = getValue(node, 'width');
  64641. var gh = getValue(node, 'height');
  64642. // Handle frame trim issues
  64643. if (adjustForTrim)
  64644. {
  64645. if (gx < left)
  64646. {
  64647. left = gx;
  64648. }
  64649. if (gy < top)
  64650. {
  64651. top = gy;
  64652. }
  64653. }
  64654. data.chars[charCode] =
  64655. {
  64656. x: gx,
  64657. y: gy,
  64658. width: gw,
  64659. height: gh,
  64660. centerX: Math.floor(gw / 2),
  64661. centerY: Math.floor(gh / 2),
  64662. xOffset: getValue(node, 'xoffset'),
  64663. yOffset: getValue(node, 'yoffset'),
  64664. xAdvance: getValue(node, 'xadvance') + xSpacing,
  64665. data: {},
  64666. kerning: {}
  64667. };
  64668. }
  64669. if (adjustForTrim && top !== 0 && left !== 0)
  64670. {
  64671. // console.log('top and left', top, left, frame.x, frame.y);
  64672. // Now we know the top and left coordinates of the glyphs in the original data
  64673. // so we can work out how much to adjust the glyphs by
  64674. for (var code in data.chars)
  64675. {
  64676. var glyph = data.chars[code];
  64677. glyph.x -= frame.x;
  64678. glyph.y -= frame.y;
  64679. }
  64680. }
  64681. var kernings = xml.getElementsByTagName('kerning');
  64682. for (i = 0; i < kernings.length; i++)
  64683. {
  64684. var kern = kernings[i];
  64685. var first = getValue(kern, 'first');
  64686. var second = getValue(kern, 'second');
  64687. var amount = getValue(kern, 'amount');
  64688. data.chars[second].kerning[first] = amount;
  64689. }
  64690. return data;
  64691. };
  64692. module.exports = ParseXMLBitmapFont;
  64693. /***/ }),
  64694. /* 315 */
  64695. /***/ (function(module, exports, __webpack_require__) {
  64696. /**
  64697. * @author Richard Davey <rich@photonstorm.com>
  64698. * @copyright 2019 Photon Storm Ltd.
  64699. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64700. */
  64701. var GetAdvancedValue = __webpack_require__(12);
  64702. /**
  64703. * Adds an Animation component to a Sprite and populates it based on the given config.
  64704. *
  64705. * @function Phaser.GameObjects.BuildGameObjectAnimation
  64706. * @since 3.0.0
  64707. *
  64708. * @param {Phaser.GameObjects.Sprite} sprite - The sprite to add an Animation component to.
  64709. * @param {object} config - The animation config.
  64710. *
  64711. * @return {Phaser.GameObjects.Sprite} The updated Sprite.
  64712. */
  64713. var BuildGameObjectAnimation = function (sprite, config)
  64714. {
  64715. var animConfig = GetAdvancedValue(config, 'anims', null);
  64716. if (animConfig === null)
  64717. {
  64718. return sprite;
  64719. }
  64720. if (typeof animConfig === 'string')
  64721. {
  64722. // { anims: 'key' }
  64723. sprite.anims.play(animConfig);
  64724. }
  64725. else if (typeof animConfig === 'object')
  64726. {
  64727. // { anims: {
  64728. // key: string
  64729. // startFrame: [string|integer]
  64730. // delay: [float]
  64731. // repeat: [integer]
  64732. // repeatDelay: [float]
  64733. // yoyo: [boolean]
  64734. // play: [boolean]
  64735. // delayedPlay: [boolean]
  64736. // }
  64737. // }
  64738. var anims = sprite.anims;
  64739. var key = GetAdvancedValue(animConfig, 'key', undefined);
  64740. var startFrame = GetAdvancedValue(animConfig, 'startFrame', undefined);
  64741. var delay = GetAdvancedValue(animConfig, 'delay', 0);
  64742. var repeat = GetAdvancedValue(animConfig, 'repeat', 0);
  64743. var repeatDelay = GetAdvancedValue(animConfig, 'repeatDelay', 0);
  64744. var yoyo = GetAdvancedValue(animConfig, 'yoyo', false);
  64745. var play = GetAdvancedValue(animConfig, 'play', false);
  64746. var delayedPlay = GetAdvancedValue(animConfig, 'delayedPlay', 0);
  64747. anims.setDelay(delay);
  64748. anims.setRepeat(repeat);
  64749. anims.setRepeatDelay(repeatDelay);
  64750. anims.setYoyo(yoyo);
  64751. if (play)
  64752. {
  64753. anims.play(key, startFrame);
  64754. }
  64755. else if (delayedPlay > 0)
  64756. {
  64757. anims.delayedPlay(delayedPlay, key, startFrame);
  64758. }
  64759. else
  64760. {
  64761. anims.load(key);
  64762. }
  64763. }
  64764. return sprite;
  64765. };
  64766. module.exports = BuildGameObjectAnimation;
  64767. /***/ }),
  64768. /* 316 */
  64769. /***/ (function(module, exports, __webpack_require__) {
  64770. /**
  64771. * @author Richard Davey <rich@photonstorm.com>
  64772. * @copyright 2019 Photon Storm Ltd.
  64773. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64774. */
  64775. var GetValue = __webpack_require__(4);
  64776. var Shuffle = __webpack_require__(132);
  64777. var BuildChunk = function (a, b, qty)
  64778. {
  64779. var out = [];
  64780. for (var aIndex = 0; aIndex < a.length; aIndex++)
  64781. {
  64782. for (var bIndex = 0; bIndex < b.length; bIndex++)
  64783. {
  64784. for (var i = 0; i < qty; i++)
  64785. {
  64786. out.push({ a: a[aIndex], b: b[bIndex] });
  64787. }
  64788. }
  64789. }
  64790. return out;
  64791. };
  64792. /**
  64793. * Creates an array populated with a range of values, based on the given arguments and configuration object.
  64794. *
  64795. * Range ([a,b,c], [1,2,3]) =
  64796. * a1, a2, a3, b1, b2, b3, c1, c2, c3
  64797. *
  64798. * Range ([a,b], [1,2,3], qty = 3) =
  64799. * a1, a1, a1, a2, a2, a2, a3, a3, a3, b1, b1, b1, b2, b2, b2, b3, b3, b3
  64800. *
  64801. * Range ([a,b,c], [1,2,3], repeat x1) =
  64802. * a1, a2, a3, b1, b2, b3, c1, c2, c3, a1, a2, a3, b1, b2, b3, c1, c2, c3
  64803. *
  64804. * Range ([a,b], [1,2], repeat -1 = endless, max = 14) =
  64805. * Maybe if max is set then repeat goes to -1 automatically?
  64806. * a1, a2, b1, b2, a1, a2, b1, b2, a1, a2, b1, b2, a1, a2 (capped at 14 elements)
  64807. *
  64808. * Range ([a], [1,2,3,4,5], random = true) =
  64809. * a4, a1, a5, a2, a3
  64810. *
  64811. * Range ([a, b], [1,2,3], random = true) =
  64812. * b3, a2, a1, b1, a3, b2
  64813. *
  64814. * Range ([a, b, c], [1,2,3], randomB = true) =
  64815. * a3, a1, a2, b2, b3, b1, c1, c3, c2
  64816. *
  64817. * Range ([a], [1,2,3,4,5], yoyo = true) =
  64818. * a1, a2, a3, a4, a5, a5, a4, a3, a2, a1
  64819. *
  64820. * Range ([a, b], [1,2,3], yoyo = true) =
  64821. * a1, a2, a3, b1, b2, b3, b3, b2, b1, a3, a2, a1
  64822. *
  64823. * @function Phaser.Utils.Array.Range
  64824. * @since 3.0.0
  64825. *
  64826. * @param {array} a - The first array of range elements.
  64827. * @param {array} b - The second array of range elements.
  64828. * @param {object} [options] - A range configuration object. Can contain: repeat, random, randomB, yoyo, max, qty.
  64829. *
  64830. * @return {array} An array of arranged elements.
  64831. */
  64832. var Range = function (a, b, options)
  64833. {
  64834. var max = GetValue(options, 'max', 0);
  64835. var qty = GetValue(options, 'qty', 1);
  64836. var random = GetValue(options, 'random', false);
  64837. var randomB = GetValue(options, 'randomB', false);
  64838. var repeat = GetValue(options, 'repeat', 0);
  64839. var yoyo = GetValue(options, 'yoyo', false);
  64840. var out = [];
  64841. if (randomB)
  64842. {
  64843. Shuffle(b);
  64844. }
  64845. // Endless repeat, so limit by max
  64846. if (repeat === -1)
  64847. {
  64848. if (max === 0)
  64849. {
  64850. repeat = 0;
  64851. }
  64852. else
  64853. {
  64854. // Work out how many repeats we need
  64855. var total = (a.length * b.length) * qty;
  64856. if (yoyo)
  64857. {
  64858. total *= 2;
  64859. }
  64860. repeat = Math.ceil(max / total);
  64861. }
  64862. }
  64863. for (var i = 0; i <= repeat; i++)
  64864. {
  64865. var chunk = BuildChunk(a, b, qty);
  64866. if (random)
  64867. {
  64868. Shuffle(chunk);
  64869. }
  64870. out = out.concat(chunk);
  64871. if (yoyo)
  64872. {
  64873. chunk.reverse();
  64874. out = out.concat(chunk);
  64875. }
  64876. }
  64877. if (max)
  64878. {
  64879. out.splice(max);
  64880. }
  64881. return out;
  64882. };
  64883. module.exports = Range;
  64884. /***/ }),
  64885. /* 317 */
  64886. /***/ (function(module, exports) {
  64887. /**
  64888. * @author Richard Davey <rich@photonstorm.com>
  64889. * @copyright 2019 Photon Storm Ltd.
  64890. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64891. */
  64892. function swap (arr, i, j)
  64893. {
  64894. var tmp = arr[i];
  64895. arr[i] = arr[j];
  64896. arr[j] = tmp;
  64897. }
  64898. function defaultCompare (a, b)
  64899. {
  64900. return a < b ? -1 : a > b ? 1 : 0;
  64901. }
  64902. /**
  64903. * A [Floyd-Rivest](https://en.wikipedia.org/wiki/Floyd%E2%80%93Rivest_algorithm) quick selection algorithm.
  64904. *
  64905. * Rearranges the array items so that all items in the [left, k] range are smaller than all items in [k, right];
  64906. * The k-th element will have the (k - left + 1)th smallest value in [left, right].
  64907. *
  64908. * The array is modified in-place.
  64909. *
  64910. * Based on code by [Vladimir Agafonkin](https://www.npmjs.com/~mourner)
  64911. *
  64912. * @function Phaser.Utils.Array.QuickSelect
  64913. * @since 3.0.0
  64914. *
  64915. * @param {array} arr - The array to sort.
  64916. * @param {integer} k - The k-th element index.
  64917. * @param {integer} [left=0] - The index of the left part of the range.
  64918. * @param {integer} [right] - The index of the right part of the range.
  64919. * @param {function} [compare] - An optional comparison function. Is passed two elements and should return 0, 1 or -1.
  64920. */
  64921. var QuickSelect = function (arr, k, left, right, compare)
  64922. {
  64923. if (left === undefined) { left = 0; }
  64924. if (right === undefined) { right = arr.length - 1; }
  64925. if (compare === undefined) { compare = defaultCompare; }
  64926. while (right > left)
  64927. {
  64928. if (right - left > 600)
  64929. {
  64930. var n = right - left + 1;
  64931. var m = k - left + 1;
  64932. var z = Math.log(n);
  64933. var s = 0.5 * Math.exp(2 * z / 3);
  64934. var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
  64935. var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
  64936. var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
  64937. QuickSelect(arr, k, newLeft, newRight, compare);
  64938. }
  64939. var t = arr[k];
  64940. var i = left;
  64941. var j = right;
  64942. swap(arr, left, k);
  64943. if (compare(arr[right], t) > 0)
  64944. {
  64945. swap(arr, left, right);
  64946. }
  64947. while (i < j)
  64948. {
  64949. swap(arr, i, j);
  64950. i++;
  64951. j--;
  64952. while (compare(arr[i], t) < 0)
  64953. {
  64954. i++;
  64955. }
  64956. while (compare(arr[j], t) > 0)
  64957. {
  64958. j--;
  64959. }
  64960. }
  64961. if (compare(arr[left], t) === 0)
  64962. {
  64963. swap(arr, left, j);
  64964. }
  64965. else
  64966. {
  64967. j++;
  64968. swap(arr, j, right);
  64969. }
  64970. if (j <= k)
  64971. {
  64972. left = j + 1;
  64973. }
  64974. if (k <= j)
  64975. {
  64976. right = j - 1;
  64977. }
  64978. }
  64979. };
  64980. module.exports = QuickSelect;
  64981. /***/ }),
  64982. /* 318 */
  64983. /***/ (function(module, exports) {
  64984. /**
  64985. * @author Richard Davey <rich@photonstorm.com>
  64986. * @copyright 2019 Photon Storm Ltd.
  64987. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64988. */
  64989. /**
  64990. * Transposes the elements of the given matrix (array of arrays).
  64991. *
  64992. * The transpose of a matrix is a new matrix whose rows are the columns of the original.
  64993. *
  64994. * @function Phaser.Utils.Array.Matrix.TransposeMatrix
  64995. * @since 3.0.0
  64996. *
  64997. * @param {array} array - The array matrix to transpose.
  64998. *
  64999. * @return {array} A new array matrix which is a transposed version of the given array.
  65000. */
  65001. var TransposeMatrix = function (array)
  65002. {
  65003. var sourceRowCount = array.length;
  65004. var sourceColCount = array[0].length;
  65005. var result = new Array(sourceColCount);
  65006. for (var i = 0; i < sourceColCount; i++)
  65007. {
  65008. result[i] = new Array(sourceRowCount);
  65009. for (var j = sourceRowCount - 1; j > -1; j--)
  65010. {
  65011. result[i][j] = array[j][i];
  65012. }
  65013. }
  65014. return result;
  65015. };
  65016. module.exports = TransposeMatrix;
  65017. /***/ }),
  65018. /* 319 */
  65019. /***/ (function(module, exports, __webpack_require__) {
  65020. /**
  65021. * @author Richard Davey <rich@photonstorm.com>
  65022. * @copyright 2019 Photon Storm Ltd.
  65023. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  65024. */
  65025. /**
  65026. * @namespace Phaser.Textures.Parsers
  65027. */
  65028. module.exports = {
  65029. AtlasXML: __webpack_require__(910),
  65030. Canvas: __webpack_require__(909),
  65031. Image: __webpack_require__(908),
  65032. JSONArray: __webpack_require__(907),
  65033. JSONHash: __webpack_require__(906),
  65034. SpriteSheet: __webpack_require__(905),
  65035. SpriteSheetFromAtlas: __webpack_require__(904),
  65036. UnityYAML: __webpack_require__(903)
  65037. };
  65038. /***/ }),
  65039. /* 320 */
  65040. /***/ (function(module, exports, __webpack_require__) {
  65041. /**
  65042. * @author Richard Davey <rich@photonstorm.com>
  65043. * @copyright 2019 Photon Storm Ltd.
  65044. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  65045. */
  65046. var CanvasPool = __webpack_require__(24);
  65047. var Class = __webpack_require__(0);
  65048. var IsSizePowerOfTwo = __webpack_require__(127);
  65049. var ScaleModes = __webpack_require__(101);
  65050. /**
  65051. * @classdesc
  65052. * A Texture Source is the encapsulation of the actual source data for a Texture.
  65053. * This is typically an Image Element, loaded from the file system or network, or a Canvas Element.
  65054. *
  65055. * A Texture can contain multiple Texture Sources, which only happens when a multi-atlas is loaded.
  65056. *
  65057. * @class TextureSource
  65058. * @memberof Phaser.Textures
  65059. * @constructor
  65060. * @since 3.0.0
  65061. *
  65062. * @param {Phaser.Textures.Texture} texture - The Texture this TextureSource belongs to.
  65063. * @param {(HTMLImageElement|HTMLCanvasElement)} source - The source image data.
  65064. * @param {integer} [width] - Optional width of the source image. If not given it's derived from the source itself.
  65065. * @param {integer} [height] - Optional height of the source image. If not given it's derived from the source itself.
  65066. */
  65067. var TextureSource = new Class({
  65068. initialize:
  65069. function TextureSource (texture, source, width, height)
  65070. {
  65071. var game = texture.manager.game;
  65072. /**
  65073. * The Texture this TextureSource belongs to.
  65074. *
  65075. * @name Phaser.Textures.TextureSource#renderer
  65076. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  65077. * @since 3.7.0
  65078. */
  65079. this.renderer = game.renderer;
  65080. /**
  65081. * The Texture this TextureSource belongs to.
  65082. *
  65083. * @name Phaser.Textures.TextureSource#texture
  65084. * @type {Phaser.Textures.Texture}
  65085. * @since 3.0.0
  65086. */
  65087. this.texture = texture;
  65088. /**
  65089. * The source of the image data.
  65090. * This is either an Image Element, a Canvas Element or a RenderTexture.
  65091. *
  65092. * @name Phaser.Textures.TextureSource#source
  65093. * @type {(HTMLImageElement|HTMLCanvasElement|Phaser.GameObjects.RenderTexture)}
  65094. * @since 3.12.0
  65095. */
  65096. this.source = source;
  65097. /**
  65098. * The image data.
  65099. * This is either an Image element or a Canvas element.
  65100. *
  65101. * @name Phaser.Textures.TextureSource#image
  65102. * @type {(HTMLImageElement|HTMLCanvasElement)}
  65103. * @since 3.0.0
  65104. */
  65105. this.image = source;
  65106. /**
  65107. * Currently un-used.
  65108. *
  65109. * @name Phaser.Textures.TextureSource#compressionAlgorithm
  65110. * @type {integer}
  65111. * @default null
  65112. * @since 3.0.0
  65113. */
  65114. this.compressionAlgorithm = null;
  65115. /**
  65116. * The resolution of the source image.
  65117. *
  65118. * @name Phaser.Textures.TextureSource#resolution
  65119. * @type {number}
  65120. * @default 1
  65121. * @since 3.0.0
  65122. */
  65123. this.resolution = 1;
  65124. /**
  65125. * The width of the source image. If not specified in the constructor it will check
  65126. * the `naturalWidth` and then `width` properties of the source image.
  65127. *
  65128. * @name Phaser.Textures.TextureSource#width
  65129. * @type {integer}
  65130. * @since 3.0.0
  65131. */
  65132. this.width = width || source.naturalWidth || source.width || 0;
  65133. /**
  65134. * The height of the source image. If not specified in the constructor it will check
  65135. * the `naturalHeight` and then `height` properties of the source image.
  65136. *
  65137. * @name Phaser.Textures.TextureSource#height
  65138. * @type {integer}
  65139. * @since 3.0.0
  65140. */
  65141. this.height = height || source.naturalHeight || source.height || 0;
  65142. /**
  65143. * The Scale Mode the image will use when rendering.
  65144. * Either Linear or Nearest.
  65145. *
  65146. * @name Phaser.Textures.TextureSource#scaleMode
  65147. * @type {number}
  65148. * @since 3.0.0
  65149. */
  65150. this.scaleMode = ScaleModes.DEFAULT;
  65151. /**
  65152. * Is the source image a Canvas Element?
  65153. *
  65154. * @name Phaser.Textures.TextureSource#isCanvas
  65155. * @type {boolean}
  65156. * @since 3.0.0
  65157. */
  65158. this.isCanvas = (source instanceof HTMLCanvasElement);
  65159. /**
  65160. * Is the source image a Render Texture?
  65161. *
  65162. * @name Phaser.Textures.TextureSource#isRenderTexture
  65163. * @type {boolean}
  65164. * @since 3.12.0
  65165. */
  65166. this.isRenderTexture = (source.type === 'RenderTexture');
  65167. /**
  65168. * Are the source image dimensions a power of two?
  65169. *
  65170. * @name Phaser.Textures.TextureSource#isPowerOf2
  65171. * @type {boolean}
  65172. * @since 3.0.0
  65173. */
  65174. this.isPowerOf2 = IsSizePowerOfTwo(this.width, this.height);
  65175. /**
  65176. * The WebGL Texture of the source image.
  65177. *
  65178. * @name Phaser.Textures.TextureSource#glTexture
  65179. * @type {?WebGLTexture}
  65180. * @default null
  65181. * @since 3.0.0
  65182. */
  65183. this.glTexture = null;
  65184. this.init(game);
  65185. },
  65186. /**
  65187. * Creates a WebGL Texture, if required, and sets the Texture filter mode.
  65188. *
  65189. * @method Phaser.Textures.TextureSource#init
  65190. * @since 3.0.0
  65191. *
  65192. * @param {Phaser.Game} game - A reference to the Phaser Game instance.
  65193. */
  65194. init: function (game)
  65195. {
  65196. if (this.renderer)
  65197. {
  65198. if (this.renderer.gl)
  65199. {
  65200. if (this.isCanvas)
  65201. {
  65202. this.glTexture = this.renderer.canvasToTexture(this.image);
  65203. }
  65204. else if (this.isRenderTexture)
  65205. {
  65206. this.image = this.source.canvas;
  65207. this.glTexture = this.renderer.createTextureFromSource(null, this.width, this.height, this.scaleMode);
  65208. }
  65209. else
  65210. {
  65211. this.glTexture = this.renderer.createTextureFromSource(this.image, this.width, this.height, this.scaleMode);
  65212. }
  65213. }
  65214. else if (this.isRenderTexture)
  65215. {
  65216. this.image = this.source.canvas;
  65217. }
  65218. }
  65219. if (!game.config.antialias)
  65220. {
  65221. this.setFilter(1);
  65222. }
  65223. },
  65224. /**
  65225. * Sets the Filter Mode for this Texture.
  65226. *
  65227. * The mode can be either Linear, the default, or Nearest.
  65228. *
  65229. * For pixel-art you should use Nearest.
  65230. *
  65231. * @method Phaser.Textures.TextureSource#setFilter
  65232. * @since 3.0.0
  65233. *
  65234. * @param {Phaser.Textures.FilterMode} filterMode - The Filter Mode.
  65235. */
  65236. setFilter: function (filterMode)
  65237. {
  65238. if (this.renderer.gl)
  65239. {
  65240. this.renderer.setTextureFilter(this.glTexture, filterMode);
  65241. }
  65242. },
  65243. /**
  65244. * If this TextureSource is backed by a Canvas and is running under WebGL,
  65245. * it updates the WebGLTexture using the canvas data.
  65246. *
  65247. * @method Phaser.Textures.TextureSource#update
  65248. * @since 3.7.0
  65249. */
  65250. update: function ()
  65251. {
  65252. if (this.renderer.gl && this.isCanvas)
  65253. {
  65254. this.glTexture = this.renderer.canvasToTexture(this.image, this.glTexture);
  65255. // Update all the Frames using this TextureSource
  65256. /*
  65257. var index = this.texture.getTextureSourceIndex(this);
  65258. var frames = this.texture.getFramesFromTextureSource(index, true);
  65259. for (var i = 0; i < frames.length; i++)
  65260. {
  65261. frames[i].glTexture = this.glTexture;
  65262. }
  65263. */
  65264. }
  65265. },
  65266. /**
  65267. * Destroys this Texture Source and nulls the references.
  65268. *
  65269. * @method Phaser.Textures.TextureSource#destroy
  65270. * @since 3.0.0
  65271. */
  65272. destroy: function ()
  65273. {
  65274. if (this.glTexture)
  65275. {
  65276. this.renderer.deleteTexture(this.glTexture);
  65277. }
  65278. if (this.isCanvas)
  65279. {
  65280. CanvasPool.remove(this.image);
  65281. }
  65282. this.renderer = null;
  65283. this.texture = null;
  65284. this.source = null;
  65285. this.image = null;
  65286. this.glTexture = null;
  65287. }
  65288. });
  65289. module.exports = TextureSource;
  65290. /***/ }),
  65291. /* 321 */
  65292. /***/ (function(module, exports, __webpack_require__) {
  65293. /**
  65294. * @author Richard Davey <rich@photonstorm.com>
  65295. * @copyright 2019 Photon Storm Ltd.
  65296. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  65297. */
  65298. var CanvasPool = __webpack_require__(24);
  65299. var CanvasTexture = __webpack_require__(911);
  65300. var Class = __webpack_require__(0);
  65301. var Color = __webpack_require__(32);
  65302. var CONST = __webpack_require__(28);
  65303. var EventEmitter = __webpack_require__(11);
  65304. var Events = __webpack_require__(126);
  65305. var GameEvents = __webpack_require__(26);
  65306. var GenerateTexture = __webpack_require__(361);
  65307. var GetValue = __webpack_require__(4);
  65308. var Parser = __webpack_require__(319);
  65309. var Texture = __webpack_require__(175);
  65310. /**
  65311. * @callback EachTextureCallback
  65312. *
  65313. * @param {Phaser.Textures.Texture} texture - Each texture in Texture Manager.
  65314. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  65315. */
  65316. /**
  65317. * @classdesc
  65318. * Textures are managed by the global TextureManager. This is a singleton class that is
  65319. * responsible for creating and delivering Textures and their corresponding Frames to Game Objects.
  65320. *
  65321. * Sprites and other Game Objects get the texture data they need from the TextureManager.
  65322. *
  65323. * Access it via `scene.textures`.
  65324. *
  65325. * @class TextureManager
  65326. * @extends Phaser.Events.EventEmitter
  65327. * @memberof Phaser.Textures
  65328. * @constructor
  65329. * @since 3.0.0
  65330. *
  65331. * @param {Phaser.Game} game - The Phaser.Game instance this Texture Manager belongs to.
  65332. */
  65333. var TextureManager = new Class({
  65334. Extends: EventEmitter,
  65335. initialize:
  65336. function TextureManager (game)
  65337. {
  65338. EventEmitter.call(this);
  65339. /**
  65340. * The Game that this TextureManager belongs to.
  65341. *
  65342. * @name Phaser.Textures.TextureManager#game
  65343. * @type {Phaser.Game}
  65344. * @since 3.0.0
  65345. */
  65346. this.game = game;
  65347. /**
  65348. * The name of this manager.
  65349. *
  65350. * @name Phaser.Textures.TextureManager#name
  65351. * @type {string}
  65352. * @since 3.0.0
  65353. */
  65354. this.name = 'TextureManager';
  65355. /**
  65356. * An object that has all of textures that Texture Manager creates.
  65357. * Textures are assigned to keys so we can access to any texture that this object has directly by key value without iteration.
  65358. *
  65359. * @name Phaser.Textures.TextureManager#list
  65360. * @type {object}
  65361. * @default {}
  65362. * @since 3.0.0
  65363. */
  65364. this.list = {};
  65365. /**
  65366. * The temporary canvas element to save an pixel data of an arbitrary texture in getPixel() and getPixelAlpha() method.
  65367. *
  65368. * @name Phaser.Textures.TextureManager#_tempCanvas
  65369. * @type {HTMLCanvasElement}
  65370. * @private
  65371. * @since 3.0.0
  65372. */
  65373. this._tempCanvas = CanvasPool.create2D(this, 1, 1);
  65374. /**
  65375. * The context of the temporary canvas element made to save an pixel data in getPixel() and getPixelAlpha() method.
  65376. *
  65377. * @name Phaser.Textures.TextureManager#_tempContext
  65378. * @type {CanvasRenderingContext2D}
  65379. * @private
  65380. * @since 3.0.0
  65381. */
  65382. this._tempContext = this._tempCanvas.getContext('2d');
  65383. /**
  65384. * An counting value used for emitting 'ready' event after all of managers in game is loaded.
  65385. *
  65386. * @name Phaser.Textures.TextureManager#_pending
  65387. * @type {integer}
  65388. * @private
  65389. * @default 0
  65390. * @since 3.0.0
  65391. */
  65392. this._pending = 0;
  65393. game.events.once(GameEvents.BOOT, this.boot, this);
  65394. },
  65395. /**
  65396. * The Boot Handler called by Phaser.Game when it first starts up.
  65397. *
  65398. * @method Phaser.Textures.TextureManager#boot
  65399. * @private
  65400. * @since 3.0.0
  65401. */
  65402. boot: function ()
  65403. {
  65404. this._pending = 2;
  65405. this.on(Events.LOAD, this.updatePending, this);
  65406. this.on(Events.ERROR, this.updatePending, this);
  65407. this.addBase64('__DEFAULT', this.game.config.defaultImage);
  65408. this.addBase64('__MISSING', this.game.config.missingImage);
  65409. this.game.events.once(GameEvents.DESTROY, this.destroy, this);
  65410. },
  65411. /**
  65412. * After 'onload' or 'onerror' invoked twice, emit 'ready' event.
  65413. *
  65414. * @method Phaser.Textures.TextureManager#updatePending
  65415. * @private
  65416. * @since 3.0.0
  65417. */
  65418. updatePending: function ()
  65419. {
  65420. this._pending--;
  65421. if (this._pending === 0)
  65422. {
  65423. this.off(Events.LOAD);
  65424. this.off(Events.ERROR);
  65425. this.emit(Events.READY);
  65426. }
  65427. },
  65428. /**
  65429. * Checks the given texture key and throws a console.warn if the key is already in use, then returns false.
  65430. * If you wish to avoid the console.warn then use `TextureManager.exists` instead.
  65431. *
  65432. * @method Phaser.Textures.TextureManager#checkKey
  65433. * @since 3.7.0
  65434. *
  65435. * @param {string} key - The texture key to check.
  65436. *
  65437. * @return {boolean} `true` if it's safe to use the texture key, otherwise `false`.
  65438. */
  65439. checkKey: function (key)
  65440. {
  65441. if (this.exists(key))
  65442. {
  65443. // eslint-disable-next-line no-console
  65444. console.error('Texture key already in use: ' + key);
  65445. return false;
  65446. }
  65447. return true;
  65448. },
  65449. /**
  65450. * Removes a Texture from the Texture Manager and destroys it. This will immediately
  65451. * clear all references to it from the Texture Manager, and if it has one, destroy its
  65452. * WebGLTexture. This will emit a `removetexture` event.
  65453. *
  65454. * Note: If you have any Game Objects still using this texture they will start throwing
  65455. * errors the next time they try to render. Make sure that removing the texture is the final
  65456. * step when clearing down to avoid this.
  65457. *
  65458. * @method Phaser.Textures.TextureManager#remove
  65459. * @fires Phaser.Textures.Events#REMOVE
  65460. * @since 3.7.0
  65461. *
  65462. * @param {(string|Phaser.Textures.Texture)} key - The key of the Texture to remove, or a reference to it.
  65463. *
  65464. * @return {Phaser.Textures.TextureManager} The Texture Manager.
  65465. */
  65466. remove: function (key)
  65467. {
  65468. if (typeof key === 'string')
  65469. {
  65470. if (this.exists(key))
  65471. {
  65472. key = this.get(key);
  65473. }
  65474. else
  65475. {
  65476. console.warn('No texture found matching key: ' + key);
  65477. return this;
  65478. }
  65479. }
  65480. // By this point key should be a Texture, if not, the following fails anyway
  65481. if (this.list.hasOwnProperty(key.key))
  65482. {
  65483. delete this.list[key.key];
  65484. key.destroy();
  65485. this.emit(Events.REMOVE, key.key);
  65486. }
  65487. return this;
  65488. },
  65489. /**
  65490. * Adds a new Texture to the Texture Manager created from the given Base64 encoded data.
  65491. *
  65492. * @method Phaser.Textures.TextureManager#addBase64
  65493. * @fires Phaser.Textures.Events#ADD
  65494. * @fires Phaser.Textures.Events#ERROR
  65495. * @fires Phaser.Textures.Events#LOAD
  65496. * @since 3.0.0
  65497. *
  65498. * @param {string} key - The unique string-based key of the Texture.
  65499. * @param {*} data - The Base64 encoded data.
  65500. *
  65501. * @return {this} This Texture Manager instance.
  65502. */
  65503. addBase64: function (key, data)
  65504. {
  65505. if (this.checkKey(key))
  65506. {
  65507. var _this = this;
  65508. var image = new Image();
  65509. image.onerror = function ()
  65510. {
  65511. _this.emit(Events.ERROR, key);
  65512. };
  65513. image.onload = function ()
  65514. {
  65515. var texture = _this.create(key, image);
  65516. Parser.Image(texture, 0);
  65517. _this.emit(Events.ADD, key, texture);
  65518. _this.emit(Events.LOAD, key, texture);
  65519. };
  65520. image.src = data;
  65521. }
  65522. return this;
  65523. },
  65524. /**
  65525. * Gets an existing texture frame and converts it into a base64 encoded image and returns the base64 data.
  65526. *
  65527. * You can also provide the image type and encoder options.
  65528. *
  65529. * @method Phaser.Textures.TextureManager#getBase64
  65530. * @since 3.12.0
  65531. *
  65532. * @param {string} key - The unique string-based key of the Texture.
  65533. * @param {(string|integer)} [frame] - The string-based name, or integer based index, of the Frame to get from the Texture.
  65534. * @param {string} [type='image/png'] - [description]
  65535. * @param {number} [encoderOptions=0.92] - [description]
  65536. *
  65537. * @return {string} The base64 encoded data, or an empty string if the texture frame could not be found.
  65538. */
  65539. getBase64: function (key, frame, type, encoderOptions)
  65540. {
  65541. if (type === undefined) { type = 'image/png'; }
  65542. if (encoderOptions === undefined) { encoderOptions = 0.92; }
  65543. var data = '';
  65544. var textureFrame = this.getFrame(key, frame);
  65545. if (textureFrame)
  65546. {
  65547. var cd = textureFrame.canvasData;
  65548. var canvas = CanvasPool.create2D(this, cd.width, cd.height);
  65549. var ctx = canvas.getContext('2d');
  65550. ctx.drawImage(
  65551. textureFrame.source.image,
  65552. cd.x,
  65553. cd.y,
  65554. cd.width,
  65555. cd.height,
  65556. 0,
  65557. 0,
  65558. cd.width,
  65559. cd.height
  65560. );
  65561. data = canvas.toDataURL(type, encoderOptions);
  65562. CanvasPool.remove(canvas);
  65563. }
  65564. return data;
  65565. },
  65566. /**
  65567. * Adds a new Texture to the Texture Manager created from the given Image element.
  65568. *
  65569. * @method Phaser.Textures.TextureManager#addImage
  65570. * @fires Phaser.Textures.Events#ADD
  65571. * @since 3.0.0
  65572. *
  65573. * @param {string} key - The unique string-based key of the Texture.
  65574. * @param {HTMLImageElement} source - The source Image element.
  65575. * @param {HTMLImageElement|HTMLCanvasElement} [dataSource] - An optional data Image element.
  65576. *
  65577. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65578. */
  65579. addImage: function (key, source, dataSource)
  65580. {
  65581. var texture = null;
  65582. if (this.checkKey(key))
  65583. {
  65584. texture = this.create(key, source);
  65585. Parser.Image(texture, 0);
  65586. if (dataSource)
  65587. {
  65588. texture.setDataSource(dataSource);
  65589. }
  65590. this.emit(Events.ADD, key, texture);
  65591. }
  65592. return texture;
  65593. },
  65594. /**
  65595. * Adds a Render Texture to the Texture Manager using the given key.
  65596. * This allows you to then use the Render Texture as a normal texture for texture based Game Objects like Sprites.
  65597. *
  65598. * @method Phaser.Textures.TextureManager#addRenderTexture
  65599. * @fires Phaser.Textures.Events#ADD
  65600. * @since 3.12.0
  65601. *
  65602. * @param {string} key - The unique string-based key of the Texture.
  65603. * @param {Phaser.GameObjects.RenderTexture} renderTexture - The source Render Texture.
  65604. *
  65605. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65606. */
  65607. addRenderTexture: function (key, renderTexture)
  65608. {
  65609. var texture = null;
  65610. if (this.checkKey(key))
  65611. {
  65612. texture = this.create(key, renderTexture);
  65613. texture.add('__BASE', 0, 0, 0, renderTexture.width, renderTexture.height);
  65614. this.emit(Events.ADD, key, texture);
  65615. }
  65616. return texture;
  65617. },
  65618. /**
  65619. * Creates a new Texture using the given config values.
  65620. * Generated textures consist of a Canvas element to which the texture data is drawn.
  65621. * See the Phaser.Create function for the more direct way to create textures.
  65622. *
  65623. * @method Phaser.Textures.TextureManager#generate
  65624. * @since 3.0.0
  65625. *
  65626. * @param {string} key - The unique string-based key of the Texture.
  65627. * @param {object} config - The configuration object needed to generate the texture.
  65628. *
  65629. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65630. */
  65631. generate: function (key, config)
  65632. {
  65633. if (this.checkKey(key))
  65634. {
  65635. var canvas = CanvasPool.create(this, 1, 1);
  65636. config.canvas = canvas;
  65637. GenerateTexture(config);
  65638. return this.addCanvas(key, canvas);
  65639. }
  65640. else
  65641. {
  65642. return null;
  65643. }
  65644. },
  65645. /**
  65646. * Creates a new Texture using a blank Canvas element of the size given.
  65647. *
  65648. * Canvas elements are automatically pooled and calling this method will
  65649. * extract a free canvas from the CanvasPool, or create one if none are available.
  65650. *
  65651. * @method Phaser.Textures.TextureManager#createCanvas
  65652. * @since 3.0.0
  65653. *
  65654. * @param {string} key - The unique string-based key of the Texture.
  65655. * @param {integer} [width=256] - The width of the Canvas element.
  65656. * @param {integer} [height=256] - The height of the Canvas element.
  65657. *
  65658. * @return {?Phaser.Textures.CanvasTexture} The Canvas Texture that was created, or `null` if the key is already in use.
  65659. */
  65660. createCanvas: function (key, width, height)
  65661. {
  65662. if (width === undefined) { width = 256; }
  65663. if (height === undefined) { height = 256; }
  65664. if (this.checkKey(key))
  65665. {
  65666. var canvas = CanvasPool.create(this, width, height, CONST.CANVAS, true);
  65667. return this.addCanvas(key, canvas);
  65668. }
  65669. return null;
  65670. },
  65671. /**
  65672. * Creates a new Canvas Texture object from an existing Canvas element
  65673. * and adds it to this Texture Manager, unless `skipCache` is true.
  65674. *
  65675. * @method Phaser.Textures.TextureManager#addCanvas
  65676. * @fires Phaser.Textures.Events#ADD
  65677. * @since 3.0.0
  65678. *
  65679. * @param {string} key - The unique string-based key of the Texture.
  65680. * @param {HTMLCanvasElement} source - The Canvas element to form the base of the new Texture.
  65681. * @param {boolean} [skipCache=false] - Skip adding this Texture into the Cache?
  65682. *
  65683. * @return {?Phaser.Textures.CanvasTexture} The Canvas Texture that was created, or `null` if the key is already in use.
  65684. */
  65685. addCanvas: function (key, source, skipCache)
  65686. {
  65687. if (skipCache === undefined) { skipCache = false; }
  65688. var texture = null;
  65689. if (skipCache)
  65690. {
  65691. texture = new CanvasTexture(this, key, source, source.width, source.height);
  65692. }
  65693. else if (this.checkKey(key))
  65694. {
  65695. texture = new CanvasTexture(this, key, source, source.width, source.height);
  65696. this.list[key] = texture;
  65697. this.emit(Events.ADD, key, texture);
  65698. }
  65699. return texture;
  65700. },
  65701. /**
  65702. * Adds a new Texture Atlas to this Texture Manager.
  65703. * It can accept either JSON Array or JSON Hash formats, as exported by Texture Packer and similar software.
  65704. *
  65705. * @method Phaser.Textures.TextureManager#addAtlas
  65706. * @since 3.0.0
  65707. *
  65708. * @param {string} key - The unique string-based key of the Texture.
  65709. * @param {HTMLImageElement} source - The source Image element.
  65710. * @param {object} data - The Texture Atlas data.
  65711. * @param {HTMLImageElement|HTMLCanvasElement|HTMLImageElement[]|HTMLCanvasElement[]} [dataSource] - An optional data Image element.
  65712. *
  65713. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65714. */
  65715. addAtlas: function (key, source, data, dataSource)
  65716. {
  65717. // New Texture Packer format?
  65718. if (Array.isArray(data.textures) || Array.isArray(data.frames))
  65719. {
  65720. return this.addAtlasJSONArray(key, source, data, dataSource);
  65721. }
  65722. else
  65723. {
  65724. return this.addAtlasJSONHash(key, source, data, dataSource);
  65725. }
  65726. },
  65727. /**
  65728. * Adds a Texture Atlas to this Texture Manager.
  65729. * The frame data of the atlas must be stored in an Array within the JSON.
  65730. * This is known as a JSON Array in software such as Texture Packer.
  65731. *
  65732. * @method Phaser.Textures.TextureManager#addAtlasJSONArray
  65733. * @fires Phaser.Textures.Events#ADD
  65734. * @since 3.0.0
  65735. *
  65736. * @param {string} key - The unique string-based key of the Texture.
  65737. * @param {(HTMLImageElement|HTMLImageElement[])} source - The source Image element/s.
  65738. * @param {(object|object[])} data - The Texture Atlas data/s.
  65739. * @param {HTMLImageElement|HTMLCanvasElement|HTMLImageElement[]|HTMLCanvasElement[]} [dataSource] - An optional data Image element.
  65740. *
  65741. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65742. */
  65743. addAtlasJSONArray: function (key, source, data, dataSource)
  65744. {
  65745. var texture = null;
  65746. if (this.checkKey(key))
  65747. {
  65748. texture = this.create(key, source);
  65749. // Multi-Atlas?
  65750. if (Array.isArray(data))
  65751. {
  65752. var singleAtlasFile = (data.length === 1); // multi-pack with one atlas file for all images
  65753. // !! Assumes the textures are in the same order in the source array as in the json data !!
  65754. for (var i = 0; i < texture.source.length; i++)
  65755. {
  65756. var atlasData = singleAtlasFile ? data[0] : data[i];
  65757. Parser.JSONArray(texture, i, atlasData);
  65758. }
  65759. }
  65760. else
  65761. {
  65762. Parser.JSONArray(texture, 0, data);
  65763. }
  65764. if (dataSource)
  65765. {
  65766. texture.setDataSource(dataSource);
  65767. }
  65768. this.emit(Events.ADD, key, texture);
  65769. }
  65770. return texture;
  65771. },
  65772. /**
  65773. * Adds a Texture Atlas to this Texture Manager.
  65774. * The frame data of the atlas must be stored in an Object within the JSON.
  65775. * This is known as a JSON Hash in software such as Texture Packer.
  65776. *
  65777. * @method Phaser.Textures.TextureManager#addAtlasJSONHash
  65778. * @fires Phaser.Textures.Events#ADD
  65779. * @since 3.0.0
  65780. *
  65781. * @param {string} key - The unique string-based key of the Texture.
  65782. * @param {HTMLImageElement} source - The source Image element.
  65783. * @param {object} data - The Texture Atlas data.
  65784. * @param {HTMLImageElement|HTMLCanvasElement|HTMLImageElement[]|HTMLCanvasElement[]} [dataSource] - An optional data Image element.
  65785. *
  65786. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65787. */
  65788. addAtlasJSONHash: function (key, source, data, dataSource)
  65789. {
  65790. var texture = null;
  65791. if (this.checkKey(key))
  65792. {
  65793. texture = this.create(key, source);
  65794. if (Array.isArray(data))
  65795. {
  65796. for (var i = 0; i < data.length; i++)
  65797. {
  65798. Parser.JSONHash(texture, i, data[i]);
  65799. }
  65800. }
  65801. else
  65802. {
  65803. Parser.JSONHash(texture, 0, data);
  65804. }
  65805. if (dataSource)
  65806. {
  65807. texture.setDataSource(dataSource);
  65808. }
  65809. this.emit(Events.ADD, key, texture);
  65810. }
  65811. return texture;
  65812. },
  65813. /**
  65814. * Adds a Texture Atlas to this Texture Manager, where the atlas data is given
  65815. * in the XML format.
  65816. *
  65817. * @method Phaser.Textures.TextureManager#addAtlasXML
  65818. * @fires Phaser.Textures.Events#ADD
  65819. * @since 3.7.0
  65820. *
  65821. * @param {string} key - The unique string-based key of the Texture.
  65822. * @param {HTMLImageElement} source - The source Image element.
  65823. * @param {object} data - The Texture Atlas XML data.
  65824. * @param {HTMLImageElement|HTMLCanvasElement|HTMLImageElement[]|HTMLCanvasElement[]} [dataSource] - An optional data Image element.
  65825. *
  65826. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65827. */
  65828. addAtlasXML: function (key, source, data, dataSource)
  65829. {
  65830. var texture = null;
  65831. if (this.checkKey(key))
  65832. {
  65833. texture = this.create(key, source);
  65834. Parser.AtlasXML(texture, 0, data);
  65835. if (dataSource)
  65836. {
  65837. texture.setDataSource(dataSource);
  65838. }
  65839. this.emit(Events.ADD, key, texture);
  65840. }
  65841. return texture;
  65842. },
  65843. /**
  65844. * Adds a Unity Texture Atlas to this Texture Manager.
  65845. * The data must be in the form of a Unity YAML file.
  65846. *
  65847. * @method Phaser.Textures.TextureManager#addUnityAtlas
  65848. * @fires Phaser.Textures.Events#ADD
  65849. * @since 3.0.0
  65850. *
  65851. * @param {string} key - The unique string-based key of the Texture.
  65852. * @param {HTMLImageElement} source - The source Image element.
  65853. * @param {object} data - The Texture Atlas data.
  65854. * @param {HTMLImageElement|HTMLCanvasElement|HTMLImageElement[]|HTMLCanvasElement[]} [dataSource] - An optional data Image element.
  65855. *
  65856. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65857. */
  65858. addUnityAtlas: function (key, source, data, dataSource)
  65859. {
  65860. var texture = null;
  65861. if (this.checkKey(key))
  65862. {
  65863. texture = this.create(key, source);
  65864. Parser.UnityYAML(texture, 0, data);
  65865. if (dataSource)
  65866. {
  65867. texture.setDataSource(dataSource);
  65868. }
  65869. this.emit(Events.ADD, key, texture);
  65870. }
  65871. return texture;
  65872. },
  65873. /**
  65874. * @typedef {object} SpriteSheetConfig
  65875. *
  65876. * @property {integer} frameWidth - The fixed width of each frame.
  65877. * @property {integer} [frameHeight] - The fixed height of each frame. If not set it will use the frameWidth as the height.
  65878. * @property {integer} [startFrame=0] - Skip a number of frames. Useful when there are multiple sprite sheets in one Texture.
  65879. * @property {integer} [endFrame=-1] - The total number of frames to extract from the Sprite Sheet. The default value of -1 means "extract all frames".
  65880. * @property {integer} [margin=0] - If the frames have been drawn with a margin, specify the amount here.
  65881. * @property {integer} [spacing=0] - If the frames have been drawn with spacing between them, specify the amount here.
  65882. */
  65883. /**
  65884. * Adds a Sprite Sheet to this Texture Manager.
  65885. *
  65886. * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact
  65887. * same size and cannot be trimmed or rotated.
  65888. *
  65889. * @method Phaser.Textures.TextureManager#addSpriteSheet
  65890. * @fires Phaser.Textures.Events#ADD
  65891. * @since 3.0.0
  65892. *
  65893. * @param {string} key - The unique string-based key of the Texture.
  65894. * @param {HTMLImageElement} source - The source Image element.
  65895. * @param {SpriteSheetConfig} config - The configuration object for this Sprite Sheet.
  65896. *
  65897. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65898. */
  65899. addSpriteSheet: function (key, source, config)
  65900. {
  65901. var texture = null;
  65902. if (this.checkKey(key))
  65903. {
  65904. texture = this.create(key, source);
  65905. var width = texture.source[0].width;
  65906. var height = texture.source[0].height;
  65907. Parser.SpriteSheet(texture, 0, 0, 0, width, height, config);
  65908. this.emit(Events.ADD, key, texture);
  65909. }
  65910. return texture;
  65911. },
  65912. /**
  65913. * @typedef {object} SpriteSheetFromAtlasConfig
  65914. *
  65915. * @property {string} atlas - The key of the Texture Atlas in which this Sprite Sheet can be found.
  65916. * @property {string} frame - The key of the Texture Atlas Frame in which this Sprite Sheet can be found.
  65917. * @property {integer} frameWidth - The fixed width of each frame.
  65918. * @property {integer} [frameHeight] - The fixed height of each frame. If not set it will use the frameWidth as the height.
  65919. * @property {integer} [startFrame=0] - Skip a number of frames. Useful when there are multiple sprite sheets in one Texture.
  65920. * @property {integer} [endFrame=-1] - The total number of frames to extract from the Sprite Sheet. The default value of -1 means "extract all frames".
  65921. * @property {integer} [margin=0] - If the frames have been drawn with a margin, specify the amount here.
  65922. * @property {integer} [spacing=0] - If the frames have been drawn with spacing between them, specify the amount here.
  65923. */
  65924. /**
  65925. * Adds a Sprite Sheet to this Texture Manager, where the Sprite Sheet exists as a Frame within a Texture Atlas.
  65926. *
  65927. * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact
  65928. * same size and cannot be trimmed or rotated.
  65929. *
  65930. * @method Phaser.Textures.TextureManager#addSpriteSheetFromAtlas
  65931. * @fires Phaser.Textures.Events#ADD
  65932. * @since 3.0.0
  65933. *
  65934. * @param {string} key - The unique string-based key of the Texture.
  65935. * @param {SpriteSheetFromAtlasConfig} config - The configuration object for this Sprite Sheet.
  65936. *
  65937. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65938. */
  65939. addSpriteSheetFromAtlas: function (key, config)
  65940. {
  65941. if (!this.checkKey(key))
  65942. {
  65943. return null;
  65944. }
  65945. var atlasKey = GetValue(config, 'atlas', null);
  65946. var atlasFrame = GetValue(config, 'frame', null);
  65947. if (!atlasKey || !atlasFrame)
  65948. {
  65949. return;
  65950. }
  65951. var atlas = this.get(atlasKey);
  65952. var sheet = atlas.get(atlasFrame);
  65953. if (sheet)
  65954. {
  65955. var texture = this.create(key, sheet.source.image);
  65956. if (sheet.trimmed)
  65957. {
  65958. // If trimmed we need to help the parser adjust
  65959. Parser.SpriteSheetFromAtlas(texture, sheet, config);
  65960. }
  65961. else
  65962. {
  65963. Parser.SpriteSheet(texture, 0, sheet.cutX, sheet.cutY, sheet.cutWidth, sheet.cutHeight, config);
  65964. }
  65965. this.emit(Events.ADD, key, texture);
  65966. return texture;
  65967. }
  65968. },
  65969. /**
  65970. * Creates a new Texture using the given source and dimensions.
  65971. *
  65972. * @method Phaser.Textures.TextureManager#create
  65973. * @since 3.0.0
  65974. *
  65975. * @param {string} key - The unique string-based key of the Texture.
  65976. * @param {HTMLImageElement} source - The source Image element.
  65977. * @param {integer} width - The width of the Texture.
  65978. * @param {integer} height - The height of the Texture.
  65979. *
  65980. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  65981. */
  65982. create: function (key, source, width, height)
  65983. {
  65984. var texture = null;
  65985. if (this.checkKey(key))
  65986. {
  65987. texture = new Texture(this, key, source, width, height);
  65988. this.list[key] = texture;
  65989. }
  65990. return texture;
  65991. },
  65992. /**
  65993. * Checks the given key to see if a Texture using it exists within this Texture Manager.
  65994. *
  65995. * @method Phaser.Textures.TextureManager#exists
  65996. * @since 3.0.0
  65997. *
  65998. * @param {string} key - The unique string-based key of the Texture.
  65999. *
  66000. * @return {boolean} Returns `true` if a Texture matching the given key exists in this Texture Manager.
  66001. */
  66002. exists: function (key)
  66003. {
  66004. return (this.list.hasOwnProperty(key));
  66005. },
  66006. /**
  66007. * Returns a Texture from the Texture Manager that matches the given key.
  66008. * If the key is undefined it will return the `__DEFAULT` Texture.
  66009. * If the key is given, but not found, it will return the `__MISSING` Texture.
  66010. *
  66011. * @method Phaser.Textures.TextureManager#get
  66012. * @since 3.0.0
  66013. *
  66014. * @param {string} key - The unique string-based key of the Texture.
  66015. *
  66016. * @return {Phaser.Textures.Texture} The Texture that was created.
  66017. */
  66018. get: function (key)
  66019. {
  66020. if (key === undefined) { key = '__DEFAULT'; }
  66021. if (this.list[key])
  66022. {
  66023. return this.list[key];
  66024. }
  66025. else
  66026. {
  66027. return this.list['__MISSING'];
  66028. }
  66029. },
  66030. /**
  66031. * Takes a Texture key and Frame name and returns a clone of that Frame if found.
  66032. *
  66033. * @method Phaser.Textures.TextureManager#cloneFrame
  66034. * @since 3.0.0
  66035. *
  66036. * @param {string} key - The unique string-based key of the Texture.
  66037. * @param {(string|integer)} frame - The string or index of the Frame to be cloned.
  66038. *
  66039. * @return {Phaser.Textures.Frame} A Clone of the given Frame.
  66040. */
  66041. cloneFrame: function (key, frame)
  66042. {
  66043. if (this.list[key])
  66044. {
  66045. return this.list[key].get(frame).clone();
  66046. }
  66047. },
  66048. /**
  66049. * Takes a Texture key and Frame name and returns a reference to that Frame, if found.
  66050. *
  66051. * @method Phaser.Textures.TextureManager#getFrame
  66052. * @since 3.0.0
  66053. *
  66054. * @param {string} key - The unique string-based key of the Texture.
  66055. * @param {(string|integer)} [frame] - The string-based name, or integer based index, of the Frame to get from the Texture.
  66056. *
  66057. * @return {Phaser.Textures.Frame} A Texture Frame object.
  66058. */
  66059. getFrame: function (key, frame)
  66060. {
  66061. if (this.list[key])
  66062. {
  66063. return this.list[key].get(frame);
  66064. }
  66065. },
  66066. /**
  66067. * Returns an array with all of the keys of all Textures in this Texture Manager.
  66068. * The output array will exclude the `__DEFAULT` and `__MISSING` keys.
  66069. *
  66070. * @method Phaser.Textures.TextureManager#getTextureKeys
  66071. * @since 3.0.0
  66072. *
  66073. * @return {string[]} An array containing all of the Texture keys stored in this Texture Manager.
  66074. */
  66075. getTextureKeys: function ()
  66076. {
  66077. var output = [];
  66078. for (var key in this.list)
  66079. {
  66080. if (key !== '__DEFAULT' && key !== '__MISSING')
  66081. {
  66082. output.push(key);
  66083. }
  66084. }
  66085. return output;
  66086. },
  66087. /**
  66088. * Given a Texture and an `x` and `y` coordinate this method will return a new
  66089. * Color object that has been populated with the color and alpha values of the pixel
  66090. * at that location in the Texture.
  66091. *
  66092. * @method Phaser.Textures.TextureManager#getPixel
  66093. * @since 3.0.0
  66094. *
  66095. * @param {integer} x - The x coordinate of the pixel within the Texture.
  66096. * @param {integer} y - The y coordinate of the pixel within the Texture.
  66097. * @param {string} key - The unique string-based key of the Texture.
  66098. * @param {(string|integer)} [frame] - The string or index of the Frame.
  66099. *
  66100. * @return {?Phaser.Display.Color} A Color object populated with the color values of the requested pixel,
  66101. * or `null` if the coordinates were out of bounds.
  66102. */
  66103. getPixel: function (x, y, key, frame)
  66104. {
  66105. var textureFrame = this.getFrame(key, frame);
  66106. if (textureFrame)
  66107. {
  66108. // Adjust for trim (if not trimmed x and y are just zero)
  66109. x -= textureFrame.x;
  66110. y -= textureFrame.y;
  66111. var data = textureFrame.data.cut;
  66112. x += data.x;
  66113. y += data.y;
  66114. if (x >= data.x && x < data.r && y >= data.y && y < data.b)
  66115. {
  66116. var ctx = this._tempContext;
  66117. ctx.clearRect(0, 0, 1, 1);
  66118. ctx.drawImage(textureFrame.source.image, x, y, 1, 1, 0, 0, 1, 1);
  66119. var rgb = ctx.getImageData(0, 0, 1, 1);
  66120. return new Color(rgb.data[0], rgb.data[1], rgb.data[2], rgb.data[3]);
  66121. }
  66122. }
  66123. return null;
  66124. },
  66125. /**
  66126. * Given a Texture and an `x` and `y` coordinate this method will return a value between 0 and 255
  66127. * corresponding to the alpha value of the pixel at that location in the Texture. If the coordinate
  66128. * is out of bounds it will return null.
  66129. *
  66130. * @method Phaser.Textures.TextureManager#getPixelAlpha
  66131. * @since 3.10.0
  66132. *
  66133. * @param {integer} x - The x coordinate of the pixel within the Texture.
  66134. * @param {integer} y - The y coordinate of the pixel within the Texture.
  66135. * @param {string} key - The unique string-based key of the Texture.
  66136. * @param {(string|integer)} [frame] - The string or index of the Frame.
  66137. *
  66138. * @return {integer} A value between 0 and 255, or `null` if the coordinates were out of bounds.
  66139. */
  66140. getPixelAlpha: function (x, y, key, frame)
  66141. {
  66142. var textureFrame = this.getFrame(key, frame);
  66143. if (textureFrame)
  66144. {
  66145. // Adjust for trim (if not trimmed x and y are just zero)
  66146. x -= textureFrame.x;
  66147. y -= textureFrame.y;
  66148. var data = textureFrame.data.cut;
  66149. x += data.x;
  66150. y += data.y;
  66151. if (x >= data.x && x < data.r && y >= data.y && y < data.b)
  66152. {
  66153. var ctx = this._tempContext;
  66154. ctx.clearRect(0, 0, 1, 1);
  66155. ctx.drawImage(textureFrame.source.image, x, y, 1, 1, 0, 0, 1, 1);
  66156. var rgb = ctx.getImageData(0, 0, 1, 1);
  66157. return rgb.data[3];
  66158. }
  66159. }
  66160. return null;
  66161. },
  66162. /**
  66163. * Sets the given Game Objects `texture` and `frame` properties so that it uses
  66164. * the Texture and Frame specified in the `key` and `frame` arguments to this method.
  66165. *
  66166. * @method Phaser.Textures.TextureManager#setTexture
  66167. * @since 3.0.0
  66168. *
  66169. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object the texture would be set on.
  66170. * @param {string} key - The unique string-based key of the Texture.
  66171. * @param {(string|integer)} [frame] - The string or index of the Frame.
  66172. *
  66173. * @return {Phaser.GameObjects.GameObject} The Game Object the texture was set on.
  66174. */
  66175. setTexture: function (gameObject, key, frame)
  66176. {
  66177. if (this.list[key])
  66178. {
  66179. gameObject.texture = this.list[key];
  66180. gameObject.frame = gameObject.texture.get(frame);
  66181. }
  66182. return gameObject;
  66183. },
  66184. /**
  66185. * Changes the key being used by a Texture to the new key provided.
  66186. *
  66187. * The old key is removed, allowing it to be re-used.
  66188. *
  66189. * Game Objects are linked to Textures by a reference to the Texture object, so
  66190. * all existing references will be retained.
  66191. *
  66192. * @method Phaser.Textures.TextureManager#renameTexture
  66193. * @since 3.12.0
  66194. *
  66195. * @param {string} currentKey - The current string-based key of the Texture you wish to rename.
  66196. * @param {string} newKey - The new unique string-based key to use for the Texture.
  66197. *
  66198. * @return {boolean} `true` if the Texture key was successfully renamed, otherwise `false`.
  66199. */
  66200. renameTexture: function (currentKey, newKey)
  66201. {
  66202. var texture = this.get(currentKey);
  66203. if (texture && currentKey !== newKey)
  66204. {
  66205. texture.key = newKey;
  66206. this.list[newKey] = texture;
  66207. delete this.list[currentKey];
  66208. return true;
  66209. }
  66210. return false;
  66211. },
  66212. /**
  66213. * Passes all Textures to the given callback.
  66214. *
  66215. * @method Phaser.Textures.TextureManager#each
  66216. * @since 3.0.0
  66217. *
  66218. * @param {EachTextureCallback} callback - The callback function to be sent the Textures.
  66219. * @param {object} scope - The value to use as `this` when executing the callback.
  66220. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  66221. */
  66222. each: function (callback, scope)
  66223. {
  66224. var args = [ null ];
  66225. for (var i = 1; i < arguments.length; i++)
  66226. {
  66227. args.push(arguments[i]);
  66228. }
  66229. for (var texture in this.list)
  66230. {
  66231. args[0] = this.list[texture];
  66232. callback.apply(scope, args);
  66233. }
  66234. },
  66235. /**
  66236. * Destroys the Texture Manager and all Textures stored within it.
  66237. *
  66238. * @method Phaser.Textures.TextureManager#destroy
  66239. * @since 3.0.0
  66240. */
  66241. destroy: function ()
  66242. {
  66243. for (var texture in this.list)
  66244. {
  66245. this.list[texture].destroy();
  66246. }
  66247. this.list = {};
  66248. this.game = null;
  66249. CanvasPool.remove(this._tempCanvas);
  66250. }
  66251. });
  66252. module.exports = TextureManager;
  66253. /***/ }),
  66254. /* 322 */
  66255. /***/ (function(module, exports, __webpack_require__) {
  66256. /**
  66257. * @author Richard Davey <rich@photonstorm.com>
  66258. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  66259. * @copyright 2019 Photon Storm Ltd.
  66260. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  66261. */
  66262. var BaseSound = __webpack_require__(122);
  66263. var Class = __webpack_require__(0);
  66264. var Events = __webpack_require__(69);
  66265. /**
  66266. * @classdesc
  66267. * Web Audio API implementation of the sound.
  66268. *
  66269. * @class WebAudioSound
  66270. * @extends Phaser.Sound.BaseSound
  66271. * @memberof Phaser.Sound
  66272. * @constructor
  66273. * @since 3.0.0
  66274. *
  66275. * @param {Phaser.Sound.WebAudioSoundManager} manager - Reference to the current sound manager instance.
  66276. * @param {string} key - Asset key for the sound.
  66277. * @param {SoundConfig} [config={}] - An optional config object containing default sound settings.
  66278. */
  66279. var WebAudioSound = new Class({
  66280. Extends: BaseSound,
  66281. initialize:
  66282. function WebAudioSound (manager, key, config)
  66283. {
  66284. if (config === undefined) { config = {}; }
  66285. /**
  66286. * Audio buffer containing decoded data of the audio asset to be played.
  66287. *
  66288. * @name Phaser.Sound.WebAudioSound#audioBuffer
  66289. * @type {AudioBuffer}
  66290. * @private
  66291. * @since 3.0.0
  66292. */
  66293. this.audioBuffer = manager.game.cache.audio.get(key);
  66294. if (!this.audioBuffer)
  66295. {
  66296. // eslint-disable-next-line no-console
  66297. console.warn('Audio cache entry missing: ' + key);
  66298. return;
  66299. }
  66300. /**
  66301. * A reference to an audio source node used for playing back audio from
  66302. * audio data stored in Phaser.Sound.WebAudioSound#audioBuffer.
  66303. *
  66304. * @name Phaser.Sound.WebAudioSound#source
  66305. * @type {AudioBufferSourceNode}
  66306. * @private
  66307. * @default null
  66308. * @since 3.0.0
  66309. */
  66310. this.source = null;
  66311. /**
  66312. * A reference to a second audio source used for gapless looped playback.
  66313. *
  66314. * @name Phaser.Sound.WebAudioSound#loopSource
  66315. * @type {AudioBufferSourceNode}
  66316. * @private
  66317. * @default null
  66318. * @since 3.0.0
  66319. */
  66320. this.loopSource = null;
  66321. /**
  66322. * Gain node responsible for controlling this sound's muting.
  66323. *
  66324. * @name Phaser.Sound.WebAudioSound#muteNode
  66325. * @type {GainNode}
  66326. * @private
  66327. * @since 3.0.0
  66328. */
  66329. this.muteNode = manager.context.createGain();
  66330. /**
  66331. * Gain node responsible for controlling this sound's volume.
  66332. *
  66333. * @name Phaser.Sound.WebAudioSound#volumeNode
  66334. * @type {GainNode}
  66335. * @private
  66336. * @since 3.0.0
  66337. */
  66338. this.volumeNode = manager.context.createGain();
  66339. /**
  66340. * The time at which the sound should have started playback from the beginning.
  66341. * Based on BaseAudioContext.currentTime value.
  66342. *
  66343. * @name Phaser.Sound.WebAudioSound#playTime
  66344. * @type {number}
  66345. * @private
  66346. * @default 0
  66347. * @since 3.0.0
  66348. */
  66349. this.playTime = 0;
  66350. /**
  66351. * The time at which the sound source should have actually started playback.
  66352. * Based on BaseAudioContext.currentTime value.
  66353. *
  66354. * @name Phaser.Sound.WebAudioSound#startTime
  66355. * @type {number}
  66356. * @private
  66357. * @default 0
  66358. * @since 3.0.0
  66359. */
  66360. this.startTime = 0;
  66361. /**
  66362. * The time at which the sound loop source should actually start playback.
  66363. * Based on BaseAudioContext.currentTime value.
  66364. *
  66365. * @name Phaser.Sound.WebAudioSound#loopTime
  66366. * @type {number}
  66367. * @private
  66368. * @default 0
  66369. * @since 3.0.0
  66370. */
  66371. this.loopTime = 0;
  66372. /**
  66373. * An array where we keep track of all rate updates during playback.
  66374. * Array of object types: { time: number, rate: number }
  66375. *
  66376. * @name Phaser.Sound.WebAudioSound#rateUpdates
  66377. * @type {array}
  66378. * @private
  66379. * @default []
  66380. * @since 3.0.0
  66381. */
  66382. this.rateUpdates = [];
  66383. /**
  66384. * Used for keeping track when sound source playback has ended
  66385. * so its state can be updated accordingly.
  66386. *
  66387. * @name Phaser.Sound.WebAudioSound#hasEnded
  66388. * @type {boolean}
  66389. * @private
  66390. * @default false
  66391. * @since 3.0.0
  66392. */
  66393. this.hasEnded = false;
  66394. /**
  66395. * Used for keeping track when sound source has looped
  66396. * so its state can be updated accordingly.
  66397. *
  66398. * @name Phaser.Sound.WebAudioSound#hasLooped
  66399. * @type {boolean}
  66400. * @private
  66401. * @default false
  66402. * @since 3.0.0
  66403. */
  66404. this.hasLooped = false;
  66405. this.muteNode.connect(this.volumeNode);
  66406. this.volumeNode.connect(manager.destination);
  66407. this.duration = this.audioBuffer.duration;
  66408. this.totalDuration = this.audioBuffer.duration;
  66409. BaseSound.call(this, manager, key, config);
  66410. },
  66411. /**
  66412. * Play this sound, or a marked section of it.
  66413. *
  66414. * It always plays the sound from the start. If you want to start playback from a specific time
  66415. * you can set 'seek' setting of the config object, provided to this call, to that value.
  66416. *
  66417. * @method Phaser.Sound.WebAudioSound#play
  66418. * @fires Phaser.Sound.Events#PLAY
  66419. * @since 3.0.0
  66420. *
  66421. * @param {string} [markerName=''] - If you want to play a marker then provide the marker name here, otherwise omit it to play the full sound.
  66422. * @param {SoundConfig} [config] - Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound.
  66423. *
  66424. * @return {boolean} Whether the sound started playing successfully.
  66425. */
  66426. play: function (markerName, config)
  66427. {
  66428. if (!BaseSound.prototype.play.call(this, markerName, config))
  66429. {
  66430. return false;
  66431. }
  66432. // \/\/\/ isPlaying = true, isPaused = false \/\/\/
  66433. this.stopAndRemoveBufferSource();
  66434. this.createAndStartBufferSource();
  66435. this.emit(Events.PLAY, this);
  66436. return true;
  66437. },
  66438. /**
  66439. * Pauses the sound.
  66440. *
  66441. * @method Phaser.Sound.WebAudioSound#pause
  66442. * @fires Phaser.Sound.Events#PAUSE
  66443. * @since 3.0.0
  66444. *
  66445. * @return {boolean} Whether the sound was paused successfully.
  66446. */
  66447. pause: function ()
  66448. {
  66449. if (this.manager.context.currentTime < this.startTime)
  66450. {
  66451. return false;
  66452. }
  66453. if (!BaseSound.prototype.pause.call(this))
  66454. {
  66455. return false;
  66456. }
  66457. // \/\/\/ isPlaying = false, isPaused = true \/\/\/
  66458. this.currentConfig.seek = this.getCurrentTime(); // Equivalent to setting paused time
  66459. this.stopAndRemoveBufferSource();
  66460. this.emit(Events.PAUSE, this);
  66461. return true;
  66462. },
  66463. /**
  66464. * Resumes the sound.
  66465. *
  66466. * @method Phaser.Sound.WebAudioSound#resume
  66467. * @fires Phaser.Sound.Events#RESUME
  66468. * @since 3.0.0
  66469. *
  66470. * @return {boolean} Whether the sound was resumed successfully.
  66471. */
  66472. resume: function ()
  66473. {
  66474. if (this.manager.context.currentTime < this.startTime)
  66475. {
  66476. return false;
  66477. }
  66478. if (!BaseSound.prototype.resume.call(this))
  66479. {
  66480. return false;
  66481. }
  66482. // \/\/\/ isPlaying = true, isPaused = false \/\/\/
  66483. this.createAndStartBufferSource();
  66484. this.emit(Events.RESUME, this);
  66485. return true;
  66486. },
  66487. /**
  66488. * Stop playing this sound.
  66489. *
  66490. * @method Phaser.Sound.WebAudioSound#stop
  66491. * @fires Phaser.Sound.Events#STOP
  66492. * @since 3.0.0
  66493. *
  66494. * @return {boolean} Whether the sound was stopped successfully.
  66495. */
  66496. stop: function ()
  66497. {
  66498. if (!BaseSound.prototype.stop.call(this))
  66499. {
  66500. return false;
  66501. }
  66502. // \/\/\/ isPlaying = false, isPaused = false \/\/\/
  66503. this.stopAndRemoveBufferSource();
  66504. this.emit(Events.STOP, this);
  66505. return true;
  66506. },
  66507. /**
  66508. * Used internally.
  66509. *
  66510. * @method Phaser.Sound.WebAudioSound#createAndStartBufferSource
  66511. * @private
  66512. * @since 3.0.0
  66513. */
  66514. createAndStartBufferSource: function ()
  66515. {
  66516. var seek = this.currentConfig.seek;
  66517. var delay = this.currentConfig.delay;
  66518. var when = this.manager.context.currentTime + delay;
  66519. var offset = (this.currentMarker ? this.currentMarker.start : 0) + seek;
  66520. var duration = this.duration - seek;
  66521. this.playTime = when - seek;
  66522. this.startTime = when;
  66523. this.source = this.createBufferSource();
  66524. this.applyConfig();
  66525. this.source.start(Math.max(0, when), Math.max(0, offset), Math.max(0, duration));
  66526. this.resetConfig();
  66527. },
  66528. /**
  66529. * Used internally.
  66530. *
  66531. * @method Phaser.Sound.WebAudioSound#createAndStartLoopBufferSource
  66532. * @private
  66533. * @since 3.0.0
  66534. */
  66535. createAndStartLoopBufferSource: function ()
  66536. {
  66537. var when = this.getLoopTime();
  66538. var offset = this.currentMarker ? this.currentMarker.start : 0;
  66539. var duration = this.duration;
  66540. this.loopTime = when;
  66541. this.loopSource = this.createBufferSource();
  66542. this.loopSource.playbackRate.setValueAtTime(this.totalRate, 0);
  66543. this.loopSource.start(Math.max(0, when), Math.max(0, offset), Math.max(0, duration));
  66544. },
  66545. /**
  66546. * Used internally.
  66547. *
  66548. * @method Phaser.Sound.WebAudioSound#createBufferSource
  66549. * @private
  66550. * @since 3.0.0
  66551. *
  66552. * @return {AudioBufferSourceNode}
  66553. */
  66554. createBufferSource: function ()
  66555. {
  66556. var _this = this;
  66557. var source = this.manager.context.createBufferSource();
  66558. source.buffer = this.audioBuffer;
  66559. source.connect(this.muteNode);
  66560. source.onended = function (ev)
  66561. {
  66562. if (ev.target === _this.source)
  66563. {
  66564. // sound ended
  66565. if (_this.currentConfig.loop)
  66566. {
  66567. _this.hasLooped = true;
  66568. }
  66569. else
  66570. {
  66571. _this.hasEnded = true;
  66572. }
  66573. }
  66574. // else was stopped
  66575. };
  66576. return source;
  66577. },
  66578. /**
  66579. * Used internally.
  66580. *
  66581. * @method Phaser.Sound.WebAudioSound#stopAndRemoveBufferSource
  66582. * @private
  66583. * @since 3.0.0
  66584. */
  66585. stopAndRemoveBufferSource: function ()
  66586. {
  66587. if (this.source)
  66588. {
  66589. this.source.stop();
  66590. this.source.disconnect();
  66591. this.source = null;
  66592. }
  66593. this.playTime = 0;
  66594. this.startTime = 0;
  66595. this.stopAndRemoveLoopBufferSource();
  66596. },
  66597. /**
  66598. * Used internally.
  66599. *
  66600. * @method Phaser.Sound.WebAudioSound#stopAndRemoveLoopBufferSource
  66601. * @private
  66602. * @since 3.0.0
  66603. */
  66604. stopAndRemoveLoopBufferSource: function ()
  66605. {
  66606. if (this.loopSource)
  66607. {
  66608. this.loopSource.stop();
  66609. this.loopSource.disconnect();
  66610. this.loopSource = null;
  66611. }
  66612. this.loopTime = 0;
  66613. },
  66614. /**
  66615. * Method used internally for applying config values to some of the sound properties.
  66616. *
  66617. * @method Phaser.Sound.WebAudioSound#applyConfig
  66618. * @protected
  66619. * @since 3.0.0
  66620. */
  66621. applyConfig: function ()
  66622. {
  66623. this.rateUpdates.length = 0;
  66624. this.rateUpdates.push({
  66625. time: 0,
  66626. rate: 1
  66627. });
  66628. BaseSound.prototype.applyConfig.call(this);
  66629. },
  66630. /**
  66631. * Update method called automatically by sound manager on every game step.
  66632. *
  66633. * @method Phaser.Sound.WebAudioSound#update
  66634. * @fires Phaser.Sound.Events#COMPLETE
  66635. * @fires Phaser.Sound.Events#LOOPED
  66636. * @protected
  66637. * @since 3.0.0
  66638. *
  66639. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  66640. * @param {number} delta - The delta time elapsed since the last frame.
  66641. */
  66642. // eslint-disable-next-line no-unused-vars
  66643. update: function (time, delta)
  66644. {
  66645. if (this.hasEnded)
  66646. {
  66647. this.hasEnded = false;
  66648. BaseSound.prototype.stop.call(this);
  66649. this.stopAndRemoveBufferSource();
  66650. this.emit(Events.COMPLETE, this);
  66651. }
  66652. else if (this.hasLooped)
  66653. {
  66654. this.hasLooped = false;
  66655. this.source = this.loopSource;
  66656. this.loopSource = null;
  66657. this.playTime = this.startTime = this.loopTime;
  66658. this.rateUpdates.length = 0;
  66659. this.rateUpdates.push({
  66660. time: 0,
  66661. rate: this.totalRate
  66662. });
  66663. this.createAndStartLoopBufferSource();
  66664. this.emit(Events.LOOPED, this);
  66665. }
  66666. },
  66667. /**
  66668. * Calls Phaser.Sound.BaseSound#destroy method
  66669. * and cleans up all Web Audio API related stuff.
  66670. *
  66671. * @method Phaser.Sound.WebAudioSound#destroy
  66672. * @since 3.0.0
  66673. */
  66674. destroy: function ()
  66675. {
  66676. BaseSound.prototype.destroy.call(this);
  66677. this.audioBuffer = null;
  66678. this.stopAndRemoveBufferSource();
  66679. this.muteNode.disconnect();
  66680. this.muteNode = null;
  66681. this.volumeNode.disconnect();
  66682. this.volumeNode = null;
  66683. this.rateUpdates.length = 0;
  66684. this.rateUpdates = null;
  66685. },
  66686. /**
  66687. * Method used internally to calculate total playback rate of the sound.
  66688. *
  66689. * @method Phaser.Sound.WebAudioSound#calculateRate
  66690. * @protected
  66691. * @since 3.0.0
  66692. */
  66693. calculateRate: function ()
  66694. {
  66695. BaseSound.prototype.calculateRate.call(this);
  66696. var now = this.manager.context.currentTime;
  66697. if (this.source && typeof this.totalRate === 'number')
  66698. {
  66699. this.source.playbackRate.setValueAtTime(this.totalRate, now);
  66700. }
  66701. if (this.isPlaying)
  66702. {
  66703. this.rateUpdates.push({
  66704. time: Math.max(this.startTime, now) - this.playTime,
  66705. rate: this.totalRate
  66706. });
  66707. if (this.loopSource)
  66708. {
  66709. this.stopAndRemoveLoopBufferSource();
  66710. this.createAndStartLoopBufferSource();
  66711. }
  66712. }
  66713. },
  66714. /**
  66715. * Method used internally for calculating current playback time of a playing sound.
  66716. *
  66717. * @method Phaser.Sound.WebAudioSound#getCurrentTime
  66718. * @private
  66719. * @since 3.0.0
  66720. */
  66721. getCurrentTime: function ()
  66722. {
  66723. var currentTime = 0;
  66724. for (var i = 0; i < this.rateUpdates.length; i++)
  66725. {
  66726. var nextTime = 0;
  66727. if (i < this.rateUpdates.length - 1)
  66728. {
  66729. nextTime = this.rateUpdates[i + 1].time;
  66730. }
  66731. else
  66732. {
  66733. nextTime = this.manager.context.currentTime - this.playTime;
  66734. }
  66735. currentTime += (nextTime - this.rateUpdates[i].time) * this.rateUpdates[i].rate;
  66736. }
  66737. return currentTime;
  66738. },
  66739. /**
  66740. * Method used internally for calculating the time
  66741. * at witch the loop source should start playing.
  66742. *
  66743. * @method Phaser.Sound.WebAudioSound#getLoopTime
  66744. * @private
  66745. * @since 3.0.0
  66746. */
  66747. getLoopTime: function ()
  66748. {
  66749. var lastRateUpdateCurrentTime = 0;
  66750. for (var i = 0; i < this.rateUpdates.length - 1; i++)
  66751. {
  66752. lastRateUpdateCurrentTime += (this.rateUpdates[i + 1].time - this.rateUpdates[i].time) * this.rateUpdates[i].rate;
  66753. }
  66754. var lastRateUpdate = this.rateUpdates[this.rateUpdates.length - 1];
  66755. return this.playTime + lastRateUpdate.time + (this.duration - lastRateUpdateCurrentTime) / lastRateUpdate.rate;
  66756. },
  66757. /**
  66758. * Rate at which this Sound will be played.
  66759. * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  66760. * and 2.0 doubles the audios playback speed.
  66761. *
  66762. * @name Phaser.Sound.WebAudioSound#rate
  66763. * @type {number}
  66764. * @default 1
  66765. * @fires Phaser.Sound.Events#RATE
  66766. * @since 3.0.0
  66767. */
  66768. rate: {
  66769. get: function ()
  66770. {
  66771. return this.currentConfig.rate;
  66772. },
  66773. set: function (value)
  66774. {
  66775. this.currentConfig.rate = value;
  66776. this.calculateRate();
  66777. this.emit(Events.RATE, this, value);
  66778. }
  66779. },
  66780. /**
  66781. * Sets the playback rate of this Sound.
  66782. *
  66783. * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  66784. * and 2.0 doubles the audios playback speed.
  66785. *
  66786. * @method Phaser.Sound.WebAudioSound#setRate
  66787. * @fires Phaser.Sound.Events#RATE
  66788. * @since 3.3.0
  66789. *
  66790. * @param {number} value - The playback rate at of this Sound.
  66791. *
  66792. * @return {Phaser.Sound.WebAudioSound} This Sound.
  66793. */
  66794. setRate: function (value)
  66795. {
  66796. this.rate = value;
  66797. return this;
  66798. },
  66799. /**
  66800. * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  66801. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  66802. *
  66803. * @name Phaser.Sound.WebAudioSound#detune
  66804. * @type {number}
  66805. * @default 0
  66806. * @fires Phaser.Sound.Events#DETUNE
  66807. * @since 3.0.0
  66808. */
  66809. detune: {
  66810. get: function ()
  66811. {
  66812. return this.currentConfig.detune;
  66813. },
  66814. set: function (value)
  66815. {
  66816. this.currentConfig.detune = value;
  66817. this.calculateRate();
  66818. this.emit(Events.DETUNE, this, value);
  66819. }
  66820. },
  66821. /**
  66822. * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  66823. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  66824. *
  66825. * @method Phaser.Sound.WebAudioSound#setDetune
  66826. * @fires Phaser.Sound.Events#DETUNE
  66827. * @since 3.3.0
  66828. *
  66829. * @param {number} value - The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  66830. *
  66831. * @return {Phaser.Sound.WebAudioSound} This Sound.
  66832. */
  66833. setDetune: function (value)
  66834. {
  66835. this.detune = value;
  66836. return this;
  66837. },
  66838. /**
  66839. * Boolean indicating whether the sound is muted or not.
  66840. * Gets or sets the muted state of this sound.
  66841. *
  66842. * @name Phaser.Sound.WebAudioSound#mute
  66843. * @type {boolean}
  66844. * @default false
  66845. * @fires Phaser.Sound.Events#MUTE
  66846. * @since 3.0.0
  66847. */
  66848. mute: {
  66849. get: function ()
  66850. {
  66851. return (this.muteNode.gain.value === 0);
  66852. },
  66853. set: function (value)
  66854. {
  66855. this.currentConfig.mute = value;
  66856. this.muteNode.gain.setValueAtTime(value ? 0 : 1, 0);
  66857. this.emit(Events.MUTE, this, value);
  66858. }
  66859. },
  66860. /**
  66861. * Sets the muted state of this Sound.
  66862. *
  66863. * @method Phaser.Sound.WebAudioSound#setMute
  66864. * @fires Phaser.Sound.Events#MUTE
  66865. * @since 3.4.0
  66866. *
  66867. * @param {boolean} value - `true` to mute this sound, `false` to unmute it.
  66868. *
  66869. * @return {Phaser.Sound.WebAudioSound} This Sound instance.
  66870. */
  66871. setMute: function (value)
  66872. {
  66873. this.mute = value;
  66874. return this;
  66875. },
  66876. /**
  66877. * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume).
  66878. *
  66879. * @name Phaser.Sound.WebAudioSound#volume
  66880. * @type {number}
  66881. * @default 1
  66882. * @fires Phaser.Sound.Events#VOLUME
  66883. * @since 3.0.0
  66884. */
  66885. volume: {
  66886. get: function ()
  66887. {
  66888. return this.volumeNode.gain.value;
  66889. },
  66890. set: function (value)
  66891. {
  66892. this.currentConfig.volume = value;
  66893. this.volumeNode.gain.setValueAtTime(value, 0);
  66894. this.emit(Events.VOLUME, this, value);
  66895. }
  66896. },
  66897. /**
  66898. * Sets the volume of this Sound.
  66899. *
  66900. * @method Phaser.Sound.WebAudioSound#setVolume
  66901. * @fires Phaser.Sound.Events#VOLUME
  66902. * @since 3.4.0
  66903. *
  66904. * @param {number} value - The volume of the sound.
  66905. *
  66906. * @return {Phaser.Sound.WebAudioSound} This Sound instance.
  66907. */
  66908. setVolume: function (value)
  66909. {
  66910. this.volume = value;
  66911. return this;
  66912. },
  66913. /**
  66914. * Property representing the position of playback for this sound, in seconds.
  66915. * Setting it to a specific value moves current playback to that position.
  66916. * The value given is clamped to the range 0 to current marker duration.
  66917. * Setting seek of a stopped sound has no effect.
  66918. *
  66919. * @name Phaser.Sound.WebAudioSound#seek
  66920. * @type {number}
  66921. * @fires Phaser.Sound.Events#SEEK
  66922. * @since 3.0.0
  66923. */
  66924. seek: {
  66925. get: function ()
  66926. {
  66927. if (this.isPlaying)
  66928. {
  66929. if (this.manager.context.currentTime < this.startTime)
  66930. {
  66931. return this.startTime - this.playTime;
  66932. }
  66933. return this.getCurrentTime();
  66934. }
  66935. else if (this.isPaused)
  66936. {
  66937. return this.currentConfig.seek;
  66938. }
  66939. else
  66940. {
  66941. return 0;
  66942. }
  66943. },
  66944. set: function (value)
  66945. {
  66946. if (this.manager.context.currentTime < this.startTime)
  66947. {
  66948. return;
  66949. }
  66950. if (this.isPlaying || this.isPaused)
  66951. {
  66952. value = Math.min(Math.max(0, value), this.duration);
  66953. this.currentConfig.seek = value;
  66954. if (this.isPlaying)
  66955. {
  66956. this.stopAndRemoveBufferSource();
  66957. this.createAndStartBufferSource();
  66958. }
  66959. this.emit(Events.SEEK, this, value);
  66960. }
  66961. }
  66962. },
  66963. /**
  66964. * Seeks to a specific point in this sound.
  66965. *
  66966. * @method Phaser.Sound.WebAudioSound#setSeek
  66967. * @fires Phaser.Sound.Events#SEEK
  66968. * @since 3.4.0
  66969. *
  66970. * @param {number} value - The point in the sound to seek to.
  66971. *
  66972. * @return {Phaser.Sound.WebAudioSound} This Sound instance.
  66973. */
  66974. setSeek: function (value)
  66975. {
  66976. this.seek = value;
  66977. return this;
  66978. },
  66979. /**
  66980. * Flag indicating whether or not the sound or current sound marker will loop.
  66981. *
  66982. * @name Phaser.Sound.WebAudioSound#loop
  66983. * @type {boolean}
  66984. * @default false
  66985. * @fires Phaser.Sound.Events#LOOP
  66986. * @since 3.0.0
  66987. */
  66988. loop: {
  66989. get: function ()
  66990. {
  66991. return this.currentConfig.loop;
  66992. },
  66993. set: function (value)
  66994. {
  66995. this.currentConfig.loop = value;
  66996. if (this.isPlaying)
  66997. {
  66998. this.stopAndRemoveLoopBufferSource();
  66999. if (value)
  67000. {
  67001. this.createAndStartLoopBufferSource();
  67002. }
  67003. }
  67004. this.emit(Events.LOOP, this, value);
  67005. }
  67006. },
  67007. /**
  67008. * Sets the loop state of this Sound.
  67009. *
  67010. * @method Phaser.Sound.WebAudioSound#setLoop
  67011. * @fires Phaser.Sound.Events#LOOP
  67012. * @since 3.4.0
  67013. *
  67014. * @param {boolean} value - `true` to loop this sound, `false` to not loop it.
  67015. *
  67016. * @return {Phaser.Sound.WebAudioSound} This Sound instance.
  67017. */
  67018. setLoop: function (value)
  67019. {
  67020. this.loop = value;
  67021. return this;
  67022. }
  67023. });
  67024. module.exports = WebAudioSound;
  67025. /***/ }),
  67026. /* 323 */
  67027. /***/ (function(module, exports, __webpack_require__) {
  67028. /**
  67029. * @author Richard Davey <rich@photonstorm.com>
  67030. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  67031. * @copyright 2019 Photon Storm Ltd.
  67032. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  67033. */
  67034. var BaseSoundManager = __webpack_require__(123);
  67035. var Class = __webpack_require__(0);
  67036. var Events = __webpack_require__(69);
  67037. var WebAudioSound = __webpack_require__(322);
  67038. /**
  67039. * @classdesc
  67040. * Web Audio API implementation of the sound manager.
  67041. *
  67042. * @class WebAudioSoundManager
  67043. * @extends Phaser.Sound.BaseSoundManager
  67044. * @memberof Phaser.Sound
  67045. * @constructor
  67046. * @since 3.0.0
  67047. *
  67048. * @param {Phaser.Game} game - Reference to the current game instance.
  67049. */
  67050. var WebAudioSoundManager = new Class({
  67051. Extends: BaseSoundManager,
  67052. initialize:
  67053. function WebAudioSoundManager (game)
  67054. {
  67055. /**
  67056. * The AudioContext being used for playback.
  67057. *
  67058. * @name Phaser.Sound.WebAudioSoundManager#context
  67059. * @type {AudioContext}
  67060. * @private
  67061. * @since 3.0.0
  67062. */
  67063. this.context = this.createAudioContext(game);
  67064. /**
  67065. * Gain node responsible for controlling global muting.
  67066. *
  67067. * @name Phaser.Sound.WebAudioSoundManager#masterMuteNode
  67068. * @type {GainNode}
  67069. * @private
  67070. * @since 3.0.0
  67071. */
  67072. this.masterMuteNode = this.context.createGain();
  67073. /**
  67074. * Gain node responsible for controlling global volume.
  67075. *
  67076. * @name Phaser.Sound.WebAudioSoundManager#masterVolumeNode
  67077. * @type {GainNode}
  67078. * @private
  67079. * @since 3.0.0
  67080. */
  67081. this.masterVolumeNode = this.context.createGain();
  67082. this.masterMuteNode.connect(this.masterVolumeNode);
  67083. this.masterVolumeNode.connect(this.context.destination);
  67084. /**
  67085. * Destination node for connecting individual sounds to.
  67086. *
  67087. * @name Phaser.Sound.WebAudioSoundManager#destination
  67088. * @type {AudioNode}
  67089. * @private
  67090. * @since 3.0.0
  67091. */
  67092. this.destination = this.masterMuteNode;
  67093. this.locked = this.context.state === 'suspended' && ('ontouchstart' in window || 'onclick' in window);
  67094. BaseSoundManager.call(this, game);
  67095. if (this.locked)
  67096. {
  67097. this.unlock();
  67098. }
  67099. },
  67100. /**
  67101. * Method responsible for instantiating and returning AudioContext instance.
  67102. * If an instance of an AudioContext class was provided through the game config,
  67103. * that instance will be returned instead. This can come in handy if you are reloading
  67104. * a Phaser game on a page that never properly refreshes (such as in an SPA project)
  67105. * and you want to reuse already instantiated AudioContext.
  67106. *
  67107. * @method Phaser.Sound.WebAudioSoundManager#createAudioContext
  67108. * @private
  67109. * @since 3.0.0
  67110. *
  67111. * @param {Phaser.Game} game - Reference to the current game instance.
  67112. *
  67113. * @return {AudioContext} The AudioContext instance to be used for playback.
  67114. */
  67115. createAudioContext: function (game)
  67116. {
  67117. var audioConfig = game.config.audio;
  67118. if (audioConfig && audioConfig.context)
  67119. {
  67120. audioConfig.context.resume();
  67121. return audioConfig.context;
  67122. }
  67123. return new AudioContext();
  67124. },
  67125. /**
  67126. * Adds a new sound into the sound manager.
  67127. *
  67128. * @method Phaser.Sound.WebAudioSoundManager#add
  67129. * @since 3.0.0
  67130. *
  67131. * @param {string} key - Asset key for the sound.
  67132. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  67133. *
  67134. * @return {Phaser.Sound.WebAudioSound} The new sound instance.
  67135. */
  67136. add: function (key, config)
  67137. {
  67138. var sound = new WebAudioSound(this, key, config);
  67139. this.sounds.push(sound);
  67140. return sound;
  67141. },
  67142. /**
  67143. * Unlocks Web Audio API on the initial input event.
  67144. *
  67145. * Read more about how this issue is handled here in [this article](https://medium.com/@pgoloskokovic/unlocking-web-audio-the-smarter-way-8858218c0e09).
  67146. *
  67147. * @method Phaser.Sound.WebAudioSoundManager#unlock
  67148. * @since 3.0.0
  67149. */
  67150. unlock: function ()
  67151. {
  67152. var _this = this;
  67153. var unlockHandler = function unlockHandler ()
  67154. {
  67155. if (_this.context)
  67156. {
  67157. _this.context.resume().then(function ()
  67158. {
  67159. document.body.removeEventListener('touchstart', unlockHandler);
  67160. document.body.removeEventListener('touchend', unlockHandler);
  67161. document.body.removeEventListener('click', unlockHandler);
  67162. _this.unlocked = true;
  67163. });
  67164. }
  67165. };
  67166. if (document.body)
  67167. {
  67168. document.body.addEventListener('touchstart', unlockHandler, false);
  67169. document.body.addEventListener('touchend', unlockHandler, false);
  67170. document.body.addEventListener('click', unlockHandler, false);
  67171. }
  67172. },
  67173. /**
  67174. * Method used internally for pausing sound manager if
  67175. * Phaser.Sound.WebAudioSoundManager#pauseOnBlur is set to true.
  67176. *
  67177. * @method Phaser.Sound.WebAudioSoundManager#onBlur
  67178. * @protected
  67179. * @since 3.0.0
  67180. */
  67181. onBlur: function ()
  67182. {
  67183. if (!this.locked)
  67184. {
  67185. this.context.suspend();
  67186. }
  67187. },
  67188. /**
  67189. * Method used internally for resuming sound manager if
  67190. * Phaser.Sound.WebAudioSoundManager#pauseOnBlur is set to true.
  67191. *
  67192. * @method Phaser.Sound.WebAudioSoundManager#onFocus
  67193. * @protected
  67194. * @since 3.0.0
  67195. */
  67196. onFocus: function ()
  67197. {
  67198. if (!this.locked)
  67199. {
  67200. this.context.resume();
  67201. }
  67202. },
  67203. /**
  67204. * Calls Phaser.Sound.BaseSoundManager#destroy method
  67205. * and cleans up all Web Audio API related stuff.
  67206. *
  67207. * @method Phaser.Sound.WebAudioSoundManager#destroy
  67208. * @since 3.0.0
  67209. */
  67210. destroy: function ()
  67211. {
  67212. this.destination = null;
  67213. this.masterVolumeNode.disconnect();
  67214. this.masterVolumeNode = null;
  67215. this.masterMuteNode.disconnect();
  67216. this.masterMuteNode = null;
  67217. if (this.game.config.audio && this.game.config.audio.context)
  67218. {
  67219. this.context.suspend();
  67220. }
  67221. else
  67222. {
  67223. var _this = this;
  67224. this.context.close().then(function ()
  67225. {
  67226. _this.context = null;
  67227. });
  67228. }
  67229. BaseSoundManager.prototype.destroy.call(this);
  67230. },
  67231. /**
  67232. * Sets the muted state of all this Sound Manager.
  67233. *
  67234. * @method Phaser.Sound.WebAudioSoundManager#setMute
  67235. * @fires Phaser.Sound.Events#GLOBAL_MUTE
  67236. * @since 3.3.0
  67237. *
  67238. * @param {boolean} value - `true` to mute all sounds, `false` to unmute them.
  67239. *
  67240. * @return {Phaser.Sound.WebAudioSoundManager} This Sound Manager.
  67241. */
  67242. setMute: function (value)
  67243. {
  67244. this.mute = value;
  67245. return this;
  67246. },
  67247. /**
  67248. * @name Phaser.Sound.WebAudioSoundManager#mute
  67249. * @type {boolean}
  67250. * @fires Phaser.Sound.Events#GLOBAL_MUTE
  67251. * @since 3.0.0
  67252. */
  67253. mute: {
  67254. get: function ()
  67255. {
  67256. return (this.masterMuteNode.gain.value === 0);
  67257. },
  67258. set: function (value)
  67259. {
  67260. this.masterMuteNode.gain.setValueAtTime(value ? 0 : 1, 0);
  67261. this.emit(Events.GLOBAL_MUTE, this, value);
  67262. }
  67263. },
  67264. /**
  67265. * Sets the volume of this Sound Manager.
  67266. *
  67267. * @method Phaser.Sound.WebAudioSoundManager#setVolume
  67268. * @fires Phaser.Sound.Events#GLOBAL_VOLUME
  67269. * @since 3.3.0
  67270. *
  67271. * @param {number} value - The global volume of this Sound Manager.
  67272. *
  67273. * @return {Phaser.Sound.WebAudioSoundManager} This Sound Manager.
  67274. */
  67275. setVolume: function (value)
  67276. {
  67277. this.volume = value;
  67278. return this;
  67279. },
  67280. /**
  67281. * @name Phaser.Sound.WebAudioSoundManager#volume
  67282. * @type {number}
  67283. * @fires Phaser.Sound.Events#GLOBAL_VOLUME
  67284. * @since 3.0.0
  67285. */
  67286. volume: {
  67287. get: function ()
  67288. {
  67289. return this.masterVolumeNode.gain.value;
  67290. },
  67291. set: function (value)
  67292. {
  67293. this.masterVolumeNode.gain.setValueAtTime(value, 0);
  67294. this.emit(Events.GLOBAL_VOLUME, this, value);
  67295. }
  67296. }
  67297. });
  67298. module.exports = WebAudioSoundManager;
  67299. /***/ }),
  67300. /* 324 */
  67301. /***/ (function(module, exports, __webpack_require__) {
  67302. /**
  67303. * @author Richard Davey <rich@photonstorm.com>
  67304. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  67305. * @copyright 2019 Photon Storm Ltd.
  67306. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  67307. */
  67308. var BaseSound = __webpack_require__(122);
  67309. var Class = __webpack_require__(0);
  67310. var EventEmitter = __webpack_require__(11);
  67311. var Extend = __webpack_require__(19);
  67312. /**
  67313. * @classdesc
  67314. * No audio implementation of the sound. It is used if audio has been
  67315. * disabled in the game config or the device doesn't support any audio.
  67316. *
  67317. * It represents a graceful degradation of sound logic that provides
  67318. * minimal functionality and prevents Phaser projects that use audio from
  67319. * breaking on devices that don't support any audio playback technologies.
  67320. *
  67321. * @class NoAudioSound
  67322. * @extends Phaser.Sound.BaseSound
  67323. * @memberof Phaser.Sound
  67324. * @constructor
  67325. * @since 3.0.0
  67326. *
  67327. * @param {Phaser.Sound.NoAudioSoundManager} manager - Reference to the current sound manager instance.
  67328. * @param {string} key - Asset key for the sound.
  67329. * @param {SoundConfig} [config={}] - An optional config object containing default sound settings.
  67330. */
  67331. var NoAudioSound = new Class({
  67332. Extends: EventEmitter,
  67333. initialize:
  67334. function NoAudioSound (manager, key, config)
  67335. {
  67336. if (config === void 0) { config = {}; }
  67337. EventEmitter.call(this);
  67338. this.manager = manager;
  67339. this.key = key;
  67340. this.isPlaying = false;
  67341. this.isPaused = false;
  67342. this.totalRate = 1;
  67343. this.duration = 0;
  67344. this.totalDuration = 0;
  67345. this.config = Extend({
  67346. mute: false,
  67347. volume: 1,
  67348. rate: 1,
  67349. detune: 0,
  67350. seek: 0,
  67351. loop: false,
  67352. delay: 0
  67353. }, config);
  67354. this.currentConfig = this.config;
  67355. this.mute = false;
  67356. this.volume = 1;
  67357. this.rate = 1;
  67358. this.detune = 0;
  67359. this.seek = 0;
  67360. this.loop = false;
  67361. this.markers = {};
  67362. this.currentMarker = null;
  67363. this.pendingRemove = false;
  67364. },
  67365. // eslint-disable-next-line no-unused-vars
  67366. addMarker: function (marker)
  67367. {
  67368. return false;
  67369. },
  67370. // eslint-disable-next-line no-unused-vars
  67371. updateMarker: function (marker)
  67372. {
  67373. return false;
  67374. },
  67375. // eslint-disable-next-line no-unused-vars
  67376. removeMarker: function (markerName)
  67377. {
  67378. return null;
  67379. },
  67380. // eslint-disable-next-line no-unused-vars
  67381. play: function (markerName, config)
  67382. {
  67383. return false;
  67384. },
  67385. pause: function ()
  67386. {
  67387. return false;
  67388. },
  67389. resume: function ()
  67390. {
  67391. return false;
  67392. },
  67393. stop: function ()
  67394. {
  67395. return false;
  67396. },
  67397. destroy: function ()
  67398. {
  67399. this.manager.remove(this);
  67400. BaseSound.prototype.destroy.call(this);
  67401. }
  67402. });
  67403. module.exports = NoAudioSound;
  67404. /***/ }),
  67405. /* 325 */
  67406. /***/ (function(module, exports, __webpack_require__) {
  67407. /**
  67408. * @author Richard Davey <rich@photonstorm.com>
  67409. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  67410. * @copyright 2019 Photon Storm Ltd.
  67411. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  67412. */
  67413. var BaseSoundManager = __webpack_require__(123);
  67414. var Class = __webpack_require__(0);
  67415. var EventEmitter = __webpack_require__(11);
  67416. var NoAudioSound = __webpack_require__(324);
  67417. var NOOP = __webpack_require__(1);
  67418. /**
  67419. * @classdesc
  67420. * No audio implementation of the sound manager. It is used if audio has been
  67421. * disabled in the game config or the device doesn't support any audio.
  67422. *
  67423. * It represents a graceful degradation of sound manager logic that provides
  67424. * minimal functionality and prevents Phaser projects that use audio from
  67425. * breaking on devices that don't support any audio playback technologies.
  67426. *
  67427. * @class NoAudioSoundManager
  67428. * @extends Phaser.Sound.BaseSoundManager
  67429. * @memberof Phaser.Sound
  67430. * @constructor
  67431. * @since 3.0.0
  67432. *
  67433. * @param {Phaser.Game} game - Reference to the current game instance.
  67434. */
  67435. var NoAudioSoundManager = new Class({
  67436. Extends: EventEmitter,
  67437. initialize:
  67438. function NoAudioSoundManager (game)
  67439. {
  67440. EventEmitter.call(this);
  67441. this.game = game;
  67442. this.sounds = [];
  67443. this.mute = false;
  67444. this.volume = 1;
  67445. this.rate = 1;
  67446. this.detune = 0;
  67447. this.pauseOnBlur = true;
  67448. this.locked = false;
  67449. },
  67450. add: function (key, config)
  67451. {
  67452. var sound = new NoAudioSound(this, key, config);
  67453. this.sounds.push(sound);
  67454. return sound;
  67455. },
  67456. addAudioSprite: function (key, config)
  67457. {
  67458. var sound = this.add(key, config);
  67459. sound.spritemap = {};
  67460. return sound;
  67461. },
  67462. // eslint-disable-next-line no-unused-vars
  67463. play: function (key, extra)
  67464. {
  67465. return false;
  67466. },
  67467. // eslint-disable-next-line no-unused-vars
  67468. playAudioSprite: function (key, spriteName, config)
  67469. {
  67470. return false;
  67471. },
  67472. remove: function (sound)
  67473. {
  67474. return BaseSoundManager.prototype.remove.call(this, sound);
  67475. },
  67476. removeByKey: function (key)
  67477. {
  67478. return BaseSoundManager.prototype.removeByKey.call(this, key);
  67479. },
  67480. pauseAll: NOOP,
  67481. resumeAll: NOOP,
  67482. stopAll: NOOP,
  67483. update: NOOP,
  67484. setRate: NOOP,
  67485. setDetune: NOOP,
  67486. setMute: NOOP,
  67487. setVolume: NOOP,
  67488. forEachActiveSound: function (callbackfn, scope)
  67489. {
  67490. BaseSoundManager.prototype.forEachActiveSound.call(this, callbackfn, scope);
  67491. },
  67492. destroy: function ()
  67493. {
  67494. BaseSoundManager.prototype.destroy.call(this);
  67495. }
  67496. });
  67497. module.exports = NoAudioSoundManager;
  67498. /***/ }),
  67499. /* 326 */
  67500. /***/ (function(module, exports, __webpack_require__) {
  67501. /**
  67502. * @author Richard Davey <rich@photonstorm.com>
  67503. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  67504. * @copyright 2019 Photon Storm Ltd.
  67505. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  67506. */
  67507. var BaseSound = __webpack_require__(122);
  67508. var Class = __webpack_require__(0);
  67509. var Events = __webpack_require__(69);
  67510. /**
  67511. * @classdesc
  67512. * HTML5 Audio implementation of the sound.
  67513. *
  67514. * @class HTML5AudioSound
  67515. * @extends Phaser.Sound.BaseSound
  67516. * @memberof Phaser.Sound
  67517. * @constructor
  67518. * @since 3.0.0
  67519. *
  67520. * @param {Phaser.Sound.HTML5AudioSoundManager} manager - Reference to the current sound manager instance.
  67521. * @param {string} key - Asset key for the sound.
  67522. * @param {SoundConfig} [config={}] - An optional config object containing default sound settings.
  67523. */
  67524. var HTML5AudioSound = new Class({
  67525. Extends: BaseSound,
  67526. initialize:
  67527. function HTML5AudioSound (manager, key, config)
  67528. {
  67529. if (config === undefined) { config = {}; }
  67530. /**
  67531. * An array containing all HTML5 Audio tags that could be used for individual
  67532. * sound's playback. Number of instances depends on the config value passed
  67533. * to the Loader#audio method call, default is 1.
  67534. *
  67535. * @name Phaser.Sound.HTML5AudioSound#tags
  67536. * @type {HTMLAudioElement[]}
  67537. * @private
  67538. * @since 3.0.0
  67539. */
  67540. this.tags = manager.game.cache.audio.get(key);
  67541. if (!this.tags)
  67542. {
  67543. // eslint-disable-next-line no-console
  67544. console.warn('Audio cache entry missing: ' + key);
  67545. return;
  67546. }
  67547. /**
  67548. * Reference to an HTML5 Audio tag used for playing sound.
  67549. *
  67550. * @name Phaser.Sound.HTML5AudioSound#audio
  67551. * @type {HTMLAudioElement}
  67552. * @private
  67553. * @default null
  67554. * @since 3.0.0
  67555. */
  67556. this.audio = null;
  67557. /**
  67558. * Timestamp as generated by the Request Animation Frame or SetTimeout
  67559. * representing the time at which the delayed sound playback should start.
  67560. * Set to 0 if sound playback is not delayed.
  67561. *
  67562. * @name Phaser.Sound.HTML5AudioSound#startTime
  67563. * @type {number}
  67564. * @private
  67565. * @default 0
  67566. * @since 3.0.0
  67567. */
  67568. this.startTime = 0;
  67569. /**
  67570. * Audio tag's playback position recorded on previous
  67571. * update method call. Set to 0 if sound is not playing.
  67572. *
  67573. * @name Phaser.Sound.HTML5AudioSound#previousTime
  67574. * @type {number}
  67575. * @private
  67576. * @default 0
  67577. * @since 3.0.0
  67578. */
  67579. this.previousTime = 0;
  67580. this.duration = this.tags[0].duration;
  67581. this.totalDuration = this.tags[0].duration;
  67582. BaseSound.call(this, manager, key, config);
  67583. },
  67584. /**
  67585. * Play this sound, or a marked section of it.
  67586. * It always plays the sound from the start. If you want to start playback from a specific time
  67587. * you can set 'seek' setting of the config object, provided to this call, to that value.
  67588. *
  67589. * @method Phaser.Sound.HTML5AudioSound#play
  67590. * @fires Phaser.Sound.Events#PLAY
  67591. * @since 3.0.0
  67592. *
  67593. * @param {string} [markerName=''] - If you want to play a marker then provide the marker name here, otherwise omit it to play the full sound.
  67594. * @param {SoundConfig} [config] - Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound.
  67595. *
  67596. * @return {boolean} Whether the sound started playing successfully.
  67597. */
  67598. play: function (markerName, config)
  67599. {
  67600. if (this.manager.isLocked(this, 'play', [ markerName, config ]))
  67601. {
  67602. return false;
  67603. }
  67604. if (!BaseSound.prototype.play.call(this, markerName, config))
  67605. {
  67606. return false;
  67607. }
  67608. // \/\/\/ isPlaying = true, isPaused = false \/\/\/
  67609. if (!this.pickAndPlayAudioTag())
  67610. {
  67611. return false;
  67612. }
  67613. this.emit(Events.PLAY, this);
  67614. return true;
  67615. },
  67616. /**
  67617. * Pauses the sound.
  67618. *
  67619. * @method Phaser.Sound.HTML5AudioSound#pause
  67620. * @fires Phaser.Sound.Events#PAUSE
  67621. * @since 3.0.0
  67622. *
  67623. * @return {boolean} Whether the sound was paused successfully.
  67624. */
  67625. pause: function ()
  67626. {
  67627. if (this.manager.isLocked(this, 'pause'))
  67628. {
  67629. return false;
  67630. }
  67631. if (this.startTime > 0)
  67632. {
  67633. return false;
  67634. }
  67635. if (!BaseSound.prototype.pause.call(this))
  67636. {
  67637. return false;
  67638. }
  67639. // \/\/\/ isPlaying = false, isPaused = true \/\/\/
  67640. this.currentConfig.seek = this.audio.currentTime - (this.currentMarker ? this.currentMarker.start : 0);
  67641. this.stopAndReleaseAudioTag();
  67642. this.emit(Events.PAUSE, this);
  67643. return true;
  67644. },
  67645. /**
  67646. * Resumes the sound.
  67647. *
  67648. * @method Phaser.Sound.HTML5AudioSound#resume
  67649. * @fires Phaser.Sound.Events#RESUME
  67650. * @since 3.0.0
  67651. *
  67652. * @return {boolean} Whether the sound was resumed successfully.
  67653. */
  67654. resume: function ()
  67655. {
  67656. if (this.manager.isLocked(this, 'resume'))
  67657. {
  67658. return false;
  67659. }
  67660. if (this.startTime > 0)
  67661. {
  67662. return false;
  67663. }
  67664. if (!BaseSound.prototype.resume.call(this))
  67665. {
  67666. return false;
  67667. }
  67668. // \/\/\/ isPlaying = true, isPaused = false \/\/\/
  67669. if (!this.pickAndPlayAudioTag())
  67670. {
  67671. return false;
  67672. }
  67673. this.emit(Events.RESUME, this);
  67674. return true;
  67675. },
  67676. /**
  67677. * Stop playing this sound.
  67678. *
  67679. * @method Phaser.Sound.HTML5AudioSound#stop
  67680. * @fires Phaser.Sound.Events#STOP
  67681. * @since 3.0.0
  67682. *
  67683. * @return {boolean} Whether the sound was stopped successfully.
  67684. */
  67685. stop: function ()
  67686. {
  67687. if (this.manager.isLocked(this, 'stop'))
  67688. {
  67689. return false;
  67690. }
  67691. if (!BaseSound.prototype.stop.call(this))
  67692. {
  67693. return false;
  67694. }
  67695. // \/\/\/ isPlaying = false, isPaused = false \/\/\/
  67696. this.stopAndReleaseAudioTag();
  67697. this.emit(Events.STOP, this);
  67698. return true;
  67699. },
  67700. /**
  67701. * Used internally to do what the name says.
  67702. *
  67703. * @method Phaser.Sound.HTML5AudioSound#pickAndPlayAudioTag
  67704. * @private
  67705. * @since 3.0.0
  67706. *
  67707. * @return {boolean} Whether the sound was assigned an audio tag successfully.
  67708. */
  67709. pickAndPlayAudioTag: function ()
  67710. {
  67711. if (!this.pickAudioTag())
  67712. {
  67713. this.reset();
  67714. return false;
  67715. }
  67716. var seek = this.currentConfig.seek;
  67717. var delay = this.currentConfig.delay;
  67718. var offset = (this.currentMarker ? this.currentMarker.start : 0) + seek;
  67719. this.previousTime = offset;
  67720. this.audio.currentTime = offset;
  67721. this.applyConfig();
  67722. if (delay === 0)
  67723. {
  67724. this.startTime = 0;
  67725. if (this.audio.paused)
  67726. {
  67727. this.playCatchPromise();
  67728. }
  67729. }
  67730. else
  67731. {
  67732. this.startTime = window.performance.now() + delay * 1000;
  67733. if (!this.audio.paused)
  67734. {
  67735. this.audio.pause();
  67736. }
  67737. }
  67738. this.resetConfig();
  67739. return true;
  67740. },
  67741. /**
  67742. * This method performs the audio tag pooling logic. It first looks for
  67743. * unused audio tag to assign to this sound object. If there are no unused
  67744. * audio tags, based on HTML5AudioSoundManager#override property value, it
  67745. * looks for sound with most advanced playback and hijacks its audio tag or
  67746. * does nothing.
  67747. *
  67748. * @method Phaser.Sound.HTML5AudioSound#pickAudioTag
  67749. * @private
  67750. * @since 3.0.0
  67751. *
  67752. * @return {boolean} Whether the sound was assigned an audio tag successfully.
  67753. */
  67754. pickAudioTag: function ()
  67755. {
  67756. if (this.audio)
  67757. {
  67758. return true;
  67759. }
  67760. for (var i = 0; i < this.tags.length; i++)
  67761. {
  67762. var audio = this.tags[i];
  67763. if (audio.dataset.used === 'false')
  67764. {
  67765. audio.dataset.used = 'true';
  67766. this.audio = audio;
  67767. return true;
  67768. }
  67769. }
  67770. if (!this.manager.override)
  67771. {
  67772. return false;
  67773. }
  67774. var otherSounds = [];
  67775. this.manager.forEachActiveSound(function (sound)
  67776. {
  67777. if (sound.key === this.key && sound.audio)
  67778. {
  67779. otherSounds.push(sound);
  67780. }
  67781. }, this);
  67782. otherSounds.sort(function (a1, a2)
  67783. {
  67784. if (a1.loop === a2.loop)
  67785. {
  67786. // sort by progress
  67787. return (a2.seek / a2.duration) - (a1.seek / a1.duration);
  67788. }
  67789. return a1.loop ? 1 : -1;
  67790. });
  67791. var selectedSound = otherSounds[0];
  67792. this.audio = selectedSound.audio;
  67793. selectedSound.reset();
  67794. selectedSound.audio = null;
  67795. selectedSound.startTime = 0;
  67796. selectedSound.previousTime = 0;
  67797. return true;
  67798. },
  67799. /**
  67800. * Method used for playing audio tag and catching possible exceptions
  67801. * thrown from rejected Promise returned from play method call.
  67802. *
  67803. * @method Phaser.Sound.HTML5AudioSound#playCatchPromise
  67804. * @private
  67805. * @since 3.0.0
  67806. */
  67807. playCatchPromise: function ()
  67808. {
  67809. var playPromise = this.audio.play();
  67810. if (playPromise)
  67811. {
  67812. // eslint-disable-next-line no-unused-vars
  67813. playPromise.catch(function (reason)
  67814. {
  67815. console.warn(reason);
  67816. });
  67817. }
  67818. },
  67819. /**
  67820. * Used internally to do what the name says.
  67821. *
  67822. * @method Phaser.Sound.HTML5AudioSound#stopAndReleaseAudioTag
  67823. * @private
  67824. * @since 3.0.0
  67825. */
  67826. stopAndReleaseAudioTag: function ()
  67827. {
  67828. this.audio.pause();
  67829. this.audio.dataset.used = 'false';
  67830. this.audio = null;
  67831. this.startTime = 0;
  67832. this.previousTime = 0;
  67833. },
  67834. /**
  67835. * Method used internally to reset sound state, usually when stopping sound
  67836. * or when hijacking audio tag from another sound.
  67837. *
  67838. * @method Phaser.Sound.HTML5AudioSound#reset
  67839. * @private
  67840. * @since 3.0.0
  67841. */
  67842. reset: function ()
  67843. {
  67844. BaseSound.prototype.stop.call(this);
  67845. },
  67846. /**
  67847. * Method used internally by sound manager for pausing sound if
  67848. * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true.
  67849. *
  67850. * @method Phaser.Sound.HTML5AudioSoundManager#onBlur
  67851. * @private
  67852. * @since 3.0.0
  67853. */
  67854. onBlur: function ()
  67855. {
  67856. this.isPlaying = false;
  67857. this.isPaused = true;
  67858. this.currentConfig.seek = this.audio.currentTime - (this.currentMarker ? this.currentMarker.start : 0);
  67859. this.currentConfig.delay = Math.max(0, (this.startTime - window.performance.now()) / 1000);
  67860. this.stopAndReleaseAudioTag();
  67861. },
  67862. /**
  67863. * Method used internally by sound manager for resuming sound if
  67864. * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true.
  67865. *
  67866. * @method Phaser.Sound.HTML5AudioSound#onFocus
  67867. * @private
  67868. * @since 3.0.0
  67869. */
  67870. onFocus: function ()
  67871. {
  67872. this.isPlaying = true;
  67873. this.isPaused = false;
  67874. this.pickAndPlayAudioTag();
  67875. },
  67876. /**
  67877. * Update method called automatically by sound manager on every game step.
  67878. *
  67879. * @method Phaser.Sound.HTML5AudioSound#update
  67880. * @fires Phaser.Sound.Events#COMPLETE
  67881. * @fires Phaser.Sound.Events#LOOPED
  67882. * @protected
  67883. * @since 3.0.0
  67884. *
  67885. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  67886. * @param {number} delta - The delta time elapsed since the last frame.
  67887. */
  67888. // eslint-disable-next-line no-unused-vars
  67889. update: function (time, delta)
  67890. {
  67891. if (!this.isPlaying)
  67892. {
  67893. return;
  67894. }
  67895. // handling delayed playback
  67896. if (this.startTime > 0)
  67897. {
  67898. if (this.startTime < time - this.manager.audioPlayDelay)
  67899. {
  67900. this.audio.currentTime += Math.max(0, time - this.startTime) / 1000;
  67901. this.startTime = 0;
  67902. this.previousTime = this.audio.currentTime;
  67903. this.playCatchPromise();
  67904. }
  67905. return;
  67906. }
  67907. // handle looping and ending
  67908. var startTime = this.currentMarker ? this.currentMarker.start : 0;
  67909. var endTime = startTime + this.duration;
  67910. var currentTime = this.audio.currentTime;
  67911. if (this.currentConfig.loop)
  67912. {
  67913. if (currentTime >= endTime - this.manager.loopEndOffset)
  67914. {
  67915. this.audio.currentTime = startTime + Math.max(0, currentTime - endTime);
  67916. currentTime = this.audio.currentTime;
  67917. }
  67918. else if (currentTime < startTime)
  67919. {
  67920. this.audio.currentTime += startTime;
  67921. currentTime = this.audio.currentTime;
  67922. }
  67923. if (currentTime < this.previousTime)
  67924. {
  67925. this.emit(Events.LOOPED, this);
  67926. }
  67927. }
  67928. else if (currentTime >= endTime)
  67929. {
  67930. this.reset();
  67931. this.stopAndReleaseAudioTag();
  67932. this.emit(Events.COMPLETE, this);
  67933. return;
  67934. }
  67935. this.previousTime = currentTime;
  67936. },
  67937. /**
  67938. * Calls Phaser.Sound.BaseSound#destroy method
  67939. * and cleans up all HTML5 Audio related stuff.
  67940. *
  67941. * @method Phaser.Sound.HTML5AudioSound#destroy
  67942. * @since 3.0.0
  67943. */
  67944. destroy: function ()
  67945. {
  67946. BaseSound.prototype.destroy.call(this);
  67947. this.tags = null;
  67948. if (this.audio)
  67949. {
  67950. this.stopAndReleaseAudioTag();
  67951. }
  67952. },
  67953. /**
  67954. * Method used internally to determine mute setting of the sound.
  67955. *
  67956. * @method Phaser.Sound.HTML5AudioSound#updateMute
  67957. * @private
  67958. * @since 3.0.0
  67959. */
  67960. updateMute: function ()
  67961. {
  67962. if (this.audio)
  67963. {
  67964. this.audio.muted = this.currentConfig.mute || this.manager.mute;
  67965. }
  67966. },
  67967. /**
  67968. * Method used internally to calculate total volume of the sound.
  67969. *
  67970. * @method Phaser.Sound.HTML5AudioSound#updateVolume
  67971. * @private
  67972. * @since 3.0.0
  67973. */
  67974. updateVolume: function ()
  67975. {
  67976. if (this.audio)
  67977. {
  67978. this.audio.volume = this.currentConfig.volume * this.manager.volume;
  67979. }
  67980. },
  67981. /**
  67982. * Method used internally to calculate total playback rate of the sound.
  67983. *
  67984. * @method Phaser.Sound.HTML5AudioSound#calculateRate
  67985. * @protected
  67986. * @since 3.0.0
  67987. */
  67988. calculateRate: function ()
  67989. {
  67990. BaseSound.prototype.calculateRate.call(this);
  67991. if (this.audio)
  67992. {
  67993. this.audio.playbackRate = this.totalRate;
  67994. }
  67995. },
  67996. /**
  67997. * Boolean indicating whether the sound is muted or not.
  67998. * Gets or sets the muted state of this sound.
  67999. *
  68000. * @name Phaser.Sound.HTML5AudioSound#mute
  68001. * @type {boolean}
  68002. * @default false
  68003. * @fires Phaser.Sound.Events#MUTE
  68004. * @since 3.0.0
  68005. */
  68006. mute: {
  68007. get: function ()
  68008. {
  68009. return this.currentConfig.mute;
  68010. },
  68011. set: function (value)
  68012. {
  68013. this.currentConfig.mute = value;
  68014. if (this.manager.isLocked(this, 'mute', value))
  68015. {
  68016. return;
  68017. }
  68018. this.updateMute();
  68019. this.emit(Events.MUTE, this, value);
  68020. }
  68021. },
  68022. /**
  68023. * Sets the muted state of this Sound.
  68024. *
  68025. * @method Phaser.Sound.HTML5AudioSound#setMute
  68026. * @fires Phaser.Sound.Events#MUTE
  68027. * @since 3.4.0
  68028. *
  68029. * @param {boolean} value - `true` to mute this sound, `false` to unmute it.
  68030. *
  68031. * @return {Phaser.Sound.HTML5AudioSound} This Sound instance.
  68032. */
  68033. setMute: function (value)
  68034. {
  68035. this.mute = value;
  68036. return this;
  68037. },
  68038. /**
  68039. * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume).
  68040. *
  68041. * @name Phaser.Sound.HTML5AudioSound#volume
  68042. * @type {number}
  68043. * @default 1
  68044. * @fires Phaser.Sound.Events#VOLUME
  68045. * @since 3.0.0
  68046. */
  68047. volume: {
  68048. get: function ()
  68049. {
  68050. return this.currentConfig.volume;
  68051. },
  68052. set: function (value)
  68053. {
  68054. this.currentConfig.volume = value;
  68055. if (this.manager.isLocked(this, 'volume', value))
  68056. {
  68057. return;
  68058. }
  68059. this.updateVolume();
  68060. this.emit(Events.VOLUME, this, value);
  68061. }
  68062. },
  68063. /**
  68064. * Sets the volume of this Sound.
  68065. *
  68066. * @method Phaser.Sound.HTML5AudioSound#setVolume
  68067. * @fires Phaser.Sound.Events#VOLUME
  68068. * @since 3.4.0
  68069. *
  68070. * @param {number} value - The volume of the sound.
  68071. *
  68072. * @return {Phaser.Sound.HTML5AudioSound} This Sound instance.
  68073. */
  68074. setVolume: function (value)
  68075. {
  68076. this.volume = value;
  68077. return this;
  68078. },
  68079. /**
  68080. * Rate at which this Sound will be played.
  68081. * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  68082. * and 2.0 doubles the audios playback speed.
  68083. *
  68084. * @name Phaser.Sound.HTML5AudioSound#rate
  68085. * @type {number}
  68086. * @default 1
  68087. * @fires Phaser.Sound.Events#RATE
  68088. * @since 3.0.0
  68089. */
  68090. rate: {
  68091. get: function ()
  68092. {
  68093. return this.currentConfig.rate;
  68094. },
  68095. set: function (value)
  68096. {
  68097. this.currentConfig.rate = value;
  68098. if (this.manager.isLocked(this, Events.RATE, value))
  68099. {
  68100. return;
  68101. }
  68102. else
  68103. {
  68104. this.calculateRate();
  68105. this.emit(Events.RATE, this, value);
  68106. }
  68107. }
  68108. },
  68109. /**
  68110. * Sets the playback rate of this Sound.
  68111. *
  68112. * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  68113. * and 2.0 doubles the audios playback speed.
  68114. *
  68115. * @method Phaser.Sound.HTML5AudioSound#setRate
  68116. * @fires Phaser.Sound.Events#RATE
  68117. * @since 3.3.0
  68118. *
  68119. * @param {number} value - The playback rate at of this Sound.
  68120. *
  68121. * @return {Phaser.Sound.HTML5AudioSound} This Sound.
  68122. */
  68123. setRate: function (value)
  68124. {
  68125. this.rate = value;
  68126. return this;
  68127. },
  68128. /**
  68129. * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  68130. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  68131. *
  68132. * @name Phaser.Sound.HTML5AudioSound#detune
  68133. * @type {number}
  68134. * @default 0
  68135. * @fires Phaser.Sound.Events#DETUNE
  68136. * @since 3.0.0
  68137. */
  68138. detune: {
  68139. get: function ()
  68140. {
  68141. return this.currentConfig.detune;
  68142. },
  68143. set: function (value)
  68144. {
  68145. this.currentConfig.detune = value;
  68146. if (this.manager.isLocked(this, Events.DETUNE, value))
  68147. {
  68148. return;
  68149. }
  68150. else
  68151. {
  68152. this.calculateRate();
  68153. this.emit(Events.DETUNE, this, value);
  68154. }
  68155. }
  68156. },
  68157. /**
  68158. * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  68159. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  68160. *
  68161. * @method Phaser.Sound.HTML5AudioSound#setDetune
  68162. * @fires Phaser.Sound.Events#DETUNE
  68163. * @since 3.3.0
  68164. *
  68165. * @param {number} value - The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  68166. *
  68167. * @return {Phaser.Sound.HTML5AudioSound} This Sound.
  68168. */
  68169. setDetune: function (value)
  68170. {
  68171. this.detune = value;
  68172. return this;
  68173. },
  68174. /**
  68175. * Property representing the position of playback for this sound, in seconds.
  68176. * Setting it to a specific value moves current playback to that position.
  68177. * The value given is clamped to the range 0 to current marker duration.
  68178. * Setting seek of a stopped sound has no effect.
  68179. *
  68180. * @name Phaser.Sound.HTML5AudioSound#seek
  68181. * @type {number}
  68182. * @fires Phaser.Sound.Events#SEEK
  68183. * @since 3.0.0
  68184. */
  68185. seek: {
  68186. get: function ()
  68187. {
  68188. if (this.isPlaying)
  68189. {
  68190. return this.audio.currentTime - (this.currentMarker ? this.currentMarker.start : 0);
  68191. }
  68192. else if (this.isPaused)
  68193. {
  68194. return this.currentConfig.seek;
  68195. }
  68196. else
  68197. {
  68198. return 0;
  68199. }
  68200. },
  68201. set: function (value)
  68202. {
  68203. if (this.manager.isLocked(this, 'seek', value))
  68204. {
  68205. return;
  68206. }
  68207. if (this.startTime > 0)
  68208. {
  68209. return;
  68210. }
  68211. if (this.isPlaying || this.isPaused)
  68212. {
  68213. value = Math.min(Math.max(0, value), this.duration);
  68214. if (this.isPlaying)
  68215. {
  68216. this.previousTime = value;
  68217. this.audio.currentTime = value;
  68218. }
  68219. else if (this.isPaused)
  68220. {
  68221. this.currentConfig.seek = value;
  68222. }
  68223. this.emit(Events.SEEK, this, value);
  68224. }
  68225. }
  68226. },
  68227. /**
  68228. * Seeks to a specific point in this sound.
  68229. *
  68230. * @method Phaser.Sound.HTML5AudioSound#setSeek
  68231. * @fires Phaser.Sound.Events#SEEK
  68232. * @since 3.4.0
  68233. *
  68234. * @param {number} value - The point in the sound to seek to.
  68235. *
  68236. * @return {Phaser.Sound.HTML5AudioSound} This Sound instance.
  68237. */
  68238. setSeek: function (value)
  68239. {
  68240. this.seek = value;
  68241. return this;
  68242. },
  68243. /**
  68244. * Flag indicating whether or not the sound or current sound marker will loop.
  68245. *
  68246. * @name Phaser.Sound.HTML5AudioSound#loop
  68247. * @type {boolean}
  68248. * @default false
  68249. * @fires Phaser.Sound.Events#LOOP
  68250. * @since 3.0.0
  68251. */
  68252. loop: {
  68253. get: function ()
  68254. {
  68255. return this.currentConfig.loop;
  68256. },
  68257. set: function (value)
  68258. {
  68259. this.currentConfig.loop = value;
  68260. if (this.manager.isLocked(this, 'loop', value))
  68261. {
  68262. return;
  68263. }
  68264. if (this.audio)
  68265. {
  68266. this.audio.loop = value;
  68267. }
  68268. this.emit(Events.LOOP, this, value);
  68269. }
  68270. },
  68271. /**
  68272. * Sets the loop state of this Sound.
  68273. *
  68274. * @method Phaser.Sound.HTML5AudioSound#setLoop
  68275. * @fires Phaser.Sound.Events#LOOP
  68276. * @since 3.4.0
  68277. *
  68278. * @param {boolean} value - `true` to loop this sound, `false` to not loop it.
  68279. *
  68280. * @return {Phaser.Sound.HTML5AudioSound} This Sound instance.
  68281. */
  68282. setLoop: function (value)
  68283. {
  68284. this.loop = value;
  68285. return this;
  68286. }
  68287. });
  68288. module.exports = HTML5AudioSound;
  68289. /***/ }),
  68290. /* 327 */
  68291. /***/ (function(module, exports, __webpack_require__) {
  68292. /**
  68293. * @author Richard Davey <rich@photonstorm.com>
  68294. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  68295. * @copyright 2019 Photon Storm Ltd.
  68296. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68297. */
  68298. var BaseSoundManager = __webpack_require__(123);
  68299. var Class = __webpack_require__(0);
  68300. var Events = __webpack_require__(69);
  68301. var HTML5AudioSound = __webpack_require__(326);
  68302. /**
  68303. * HTML5 Audio implementation of the Sound Manager.
  68304. *
  68305. * @class HTML5AudioSoundManager
  68306. * @extends Phaser.Sound.BaseSoundManager
  68307. * @memberof Phaser.Sound
  68308. * @constructor
  68309. * @since 3.0.0
  68310. *
  68311. * @param {Phaser.Game} game - Reference to the current game instance.
  68312. */
  68313. var HTML5AudioSoundManager = new Class({
  68314. Extends: BaseSoundManager,
  68315. initialize:
  68316. function HTML5AudioSoundManager (game)
  68317. {
  68318. /**
  68319. * Flag indicating whether if there are no idle instances of HTML5 Audio tag,
  68320. * for any particular sound, if one of the used tags should be hijacked and used
  68321. * for succeeding playback or if succeeding Phaser.Sound.HTML5AudioSound#play
  68322. * call should be ignored.
  68323. *
  68324. * @name Phaser.Sound.HTML5AudioSoundManager#override
  68325. * @type {boolean}
  68326. * @default true
  68327. * @since 3.0.0
  68328. */
  68329. this.override = true;
  68330. /**
  68331. * Value representing time difference, in seconds, between calling
  68332. * play method on an audio tag and when it actually starts playing.
  68333. * It is used to achieve more accurate delayed sound playback.
  68334. *
  68335. * You might need to tweak this value to get the desired results
  68336. * since audio play delay varies depending on the browser/platform.
  68337. *
  68338. * @name Phaser.Sound.HTML5AudioSoundManager#audioPlayDelay
  68339. * @type {number}
  68340. * @default 0.1
  68341. * @since 3.0.0
  68342. */
  68343. this.audioPlayDelay = 0.1;
  68344. /**
  68345. * A value by which we should offset the loop end marker of the
  68346. * looping sound to compensate for lag, caused by changing audio
  68347. * tag playback position, in order to achieve gapless looping.
  68348. *
  68349. * You might need to tweak this value to get the desired results
  68350. * since loop lag varies depending on the browser/platform.
  68351. *
  68352. * @name Phaser.Sound.HTML5AudioSoundManager#loopEndOffset
  68353. * @type {number}
  68354. * @default 0.05
  68355. * @since 3.0.0
  68356. */
  68357. this.loopEndOffset = 0.05;
  68358. /**
  68359. * An array for keeping track of all the sounds
  68360. * that were paused when game lost focus.
  68361. *
  68362. * @name Phaser.Sound.HTML5AudioSoundManager#onBlurPausedSounds
  68363. * @type {Phaser.Sound.HTML5AudioSound[]}
  68364. * @private
  68365. * @default []
  68366. * @since 3.0.0
  68367. */
  68368. this.onBlurPausedSounds = [];
  68369. this.locked = 'ontouchstart' in window;
  68370. /**
  68371. * A queue of all actions performed on sound objects while audio was locked.
  68372. * Once the audio gets unlocked, after an explicit user interaction,
  68373. * all actions will be performed in chronological order.
  68374. * Array of object types: { sound: Phaser.Sound.HTML5AudioSound, name: string, value?: * }
  68375. *
  68376. * @name Phaser.Sound.HTML5AudioSoundManager#lockedActionsQueue
  68377. * @type {array}
  68378. * @private
  68379. * @since 3.0.0
  68380. */
  68381. this.lockedActionsQueue = this.locked ? [] : null;
  68382. /**
  68383. * Property that actually holds the value of global mute
  68384. * for HTML5 Audio sound manager implementation.
  68385. *
  68386. * @name Phaser.Sound.HTML5AudioSoundManager#_mute
  68387. * @type {boolean}
  68388. * @private
  68389. * @default false
  68390. * @since 3.0.0
  68391. */
  68392. this._mute = false;
  68393. /**
  68394. * Property that actually holds the value of global volume
  68395. * for HTML5 Audio sound manager implementation.
  68396. *
  68397. * @name Phaser.Sound.HTML5AudioSoundManager#_volume
  68398. * @type {boolean}
  68399. * @private
  68400. * @default 1
  68401. * @since 3.0.0
  68402. */
  68403. this._volume = 1;
  68404. BaseSoundManager.call(this, game);
  68405. },
  68406. /**
  68407. * Adds a new sound into the sound manager.
  68408. *
  68409. * @method Phaser.Sound.HTML5AudioSoundManager#add
  68410. * @since 3.0.0
  68411. *
  68412. * @param {string} key - Asset key for the sound.
  68413. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  68414. *
  68415. * @return {Phaser.Sound.HTML5AudioSound} The new sound instance.
  68416. */
  68417. add: function (key, config)
  68418. {
  68419. var sound = new HTML5AudioSound(this, key, config);
  68420. this.sounds.push(sound);
  68421. return sound;
  68422. },
  68423. /**
  68424. * Unlocks HTML5 Audio loading and playback on mobile
  68425. * devices on the initial explicit user interaction.
  68426. *
  68427. * @method Phaser.Sound.HTML5AudioSoundManager#unlock
  68428. * @since 3.0.0
  68429. */
  68430. unlock: function ()
  68431. {
  68432. this.locked = false;
  68433. var _this = this;
  68434. this.game.cache.audio.entries.each(function (key, tags)
  68435. {
  68436. for (var i = 0; i < tags.length; i++)
  68437. {
  68438. if (tags[i].dataset.locked === 'true')
  68439. {
  68440. _this.locked = true;
  68441. return false;
  68442. }
  68443. }
  68444. return true;
  68445. });
  68446. if (!this.locked)
  68447. {
  68448. return;
  68449. }
  68450. var moved = false;
  68451. var detectMove = function ()
  68452. {
  68453. moved = true;
  68454. };
  68455. var unlock = function ()
  68456. {
  68457. if (moved)
  68458. {
  68459. moved = false;
  68460. return;
  68461. }
  68462. document.body.removeEventListener('touchmove', detectMove);
  68463. document.body.removeEventListener('touchend', unlock);
  68464. var lockedTags = [];
  68465. _this.game.cache.audio.entries.each(function (key, tags)
  68466. {
  68467. for (var i = 0; i < tags.length; i++)
  68468. {
  68469. var tag = tags[i];
  68470. if (tag.dataset.locked === 'true')
  68471. {
  68472. lockedTags.push(tag);
  68473. }
  68474. }
  68475. return true;
  68476. });
  68477. if (lockedTags.length === 0)
  68478. {
  68479. return;
  68480. }
  68481. var lastTag = lockedTags[lockedTags.length - 1];
  68482. lastTag.oncanplaythrough = function ()
  68483. {
  68484. lastTag.oncanplaythrough = null;
  68485. lockedTags.forEach(function (tag)
  68486. {
  68487. tag.dataset.locked = 'false';
  68488. });
  68489. _this.unlocked = true;
  68490. };
  68491. lockedTags.forEach(function (tag)
  68492. {
  68493. tag.load();
  68494. });
  68495. };
  68496. this.once(Events.UNLOCKED, function ()
  68497. {
  68498. this.forEachActiveSound(function (sound)
  68499. {
  68500. if (sound.currentMarker === null && sound.duration === 0)
  68501. {
  68502. sound.duration = sound.tags[0].duration;
  68503. }
  68504. sound.totalDuration = sound.tags[0].duration;
  68505. });
  68506. while (this.lockedActionsQueue.length)
  68507. {
  68508. var lockedAction = this.lockedActionsQueue.shift();
  68509. if (lockedAction.sound[lockedAction.prop].apply)
  68510. {
  68511. lockedAction.sound[lockedAction.prop].apply(lockedAction.sound, lockedAction.value || []);
  68512. }
  68513. else
  68514. {
  68515. lockedAction.sound[lockedAction.prop] = lockedAction.value;
  68516. }
  68517. }
  68518. }, this);
  68519. document.body.addEventListener('touchmove', detectMove, false);
  68520. document.body.addEventListener('touchend', unlock, false);
  68521. },
  68522. /**
  68523. * Method used internally for pausing sound manager if
  68524. * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true.
  68525. *
  68526. * @method Phaser.Sound.HTML5AudioSoundManager#onBlur
  68527. * @protected
  68528. * @since 3.0.0
  68529. */
  68530. onBlur: function ()
  68531. {
  68532. this.forEachActiveSound(function (sound)
  68533. {
  68534. if (sound.isPlaying)
  68535. {
  68536. this.onBlurPausedSounds.push(sound);
  68537. sound.onBlur();
  68538. }
  68539. });
  68540. },
  68541. /**
  68542. * Method used internally for resuming sound manager if
  68543. * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true.
  68544. *
  68545. * @method Phaser.Sound.HTML5AudioSoundManager#onFocus
  68546. * @protected
  68547. * @since 3.0.0
  68548. */
  68549. onFocus: function ()
  68550. {
  68551. this.onBlurPausedSounds.forEach(function (sound)
  68552. {
  68553. sound.onFocus();
  68554. });
  68555. this.onBlurPausedSounds.length = 0;
  68556. },
  68557. /**
  68558. * Calls Phaser.Sound.BaseSoundManager#destroy method
  68559. * and cleans up all HTML5 Audio related stuff.
  68560. *
  68561. * @method Phaser.Sound.HTML5AudioSoundManager#destroy
  68562. * @since 3.0.0
  68563. */
  68564. destroy: function ()
  68565. {
  68566. BaseSoundManager.prototype.destroy.call(this);
  68567. this.onBlurPausedSounds.length = 0;
  68568. this.onBlurPausedSounds = null;
  68569. },
  68570. /**
  68571. * Method used internally by Phaser.Sound.HTML5AudioSound class methods and property setters
  68572. * to check if sound manager is locked and then either perform action immediately or queue it
  68573. * to be performed once the sound manager gets unlocked.
  68574. *
  68575. * @method Phaser.Sound.HTML5AudioSoundManager#isLocked
  68576. * @protected
  68577. * @since 3.0.0
  68578. *
  68579. * @param {Phaser.Sound.HTML5AudioSound} sound - Sound object on which to perform queued action.
  68580. * @param {string} prop - Name of the method to be called or property to be assigned a value to.
  68581. * @param {*} [value] - An optional parameter that either holds an array of arguments to be passed to the method call or value to be set to the property.
  68582. *
  68583. * @return {boolean} Whether the sound manager is locked.
  68584. */
  68585. isLocked: function (sound, prop, value)
  68586. {
  68587. if (sound.tags[0].dataset.locked === 'true')
  68588. {
  68589. this.lockedActionsQueue.push({
  68590. sound: sound,
  68591. prop: prop,
  68592. value: value
  68593. });
  68594. return true;
  68595. }
  68596. return false;
  68597. },
  68598. /**
  68599. * Sets the muted state of all this Sound Manager.
  68600. *
  68601. * @method Phaser.Sound.HTML5AudioSoundManager#setMute
  68602. * @fires Phaser.Sound.Events#GLOBAL_MUTE
  68603. * @since 3.3.0
  68604. *
  68605. * @param {boolean} value - `true` to mute all sounds, `false` to unmute them.
  68606. *
  68607. * @return {Phaser.Sound.HTML5AudioSoundManager} This Sound Manager.
  68608. */
  68609. setMute: function (value)
  68610. {
  68611. this.mute = value;
  68612. return this;
  68613. },
  68614. /**
  68615. * @name Phaser.Sound.HTML5AudioSoundManager#mute
  68616. * @type {boolean}
  68617. * @fires Phaser.Sound.Events#GLOBAL_MUTE
  68618. * @since 3.0.0
  68619. */
  68620. mute: {
  68621. get: function ()
  68622. {
  68623. return this._mute;
  68624. },
  68625. set: function (value)
  68626. {
  68627. this._mute = value;
  68628. this.forEachActiveSound(function (sound)
  68629. {
  68630. sound.updateMute();
  68631. });
  68632. this.emit(Events.GLOBAL_MUTE, this, value);
  68633. }
  68634. },
  68635. /**
  68636. * Sets the volume of this Sound Manager.
  68637. *
  68638. * @method Phaser.Sound.HTML5AudioSoundManager#setVolume
  68639. * @fires Phaser.Sound.Events#GLOBAL_VOLUME
  68640. * @since 3.3.0
  68641. *
  68642. * @param {number} value - The global volume of this Sound Manager.
  68643. *
  68644. * @return {Phaser.Sound.HTML5AudioSoundManager} This Sound Manager.
  68645. */
  68646. setVolume: function (value)
  68647. {
  68648. this.volume = value;
  68649. return this;
  68650. },
  68651. /**
  68652. * @name Phaser.Sound.HTML5AudioSoundManager#volume
  68653. * @type {number}
  68654. * @fires Phaser.Sound.Events#GLOBAL_VOLUME
  68655. * @since 3.0.0
  68656. */
  68657. volume: {
  68658. get: function ()
  68659. {
  68660. return this._volume;
  68661. },
  68662. set: function (value)
  68663. {
  68664. this._volume = value;
  68665. this.forEachActiveSound(function (sound)
  68666. {
  68667. sound.updateVolume();
  68668. });
  68669. this.emit(Events.GLOBAL_VOLUME, this, value);
  68670. }
  68671. }
  68672. });
  68673. module.exports = HTML5AudioSoundManager;
  68674. /***/ }),
  68675. /* 328 */
  68676. /***/ (function(module, exports, __webpack_require__) {
  68677. /**
  68678. * @author Richard Davey <rich@photonstorm.com>
  68679. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  68680. * @copyright 2019 Photon Storm Ltd.
  68681. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68682. */
  68683. var HTML5AudioSoundManager = __webpack_require__(327);
  68684. var NoAudioSoundManager = __webpack_require__(325);
  68685. var WebAudioSoundManager = __webpack_require__(323);
  68686. /**
  68687. * Creates a Web Audio, HTML5 Audio or No Audio Sound Manager based on config and device settings.
  68688. *
  68689. * Be aware of https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
  68690. *
  68691. * @function Phaser.Sound.SoundManagerCreator
  68692. * @since 3.0.0
  68693. *
  68694. * @param {Phaser.Game} game - Reference to the current game instance.
  68695. */
  68696. var SoundManagerCreator = {
  68697. create: function (game)
  68698. {
  68699. var audioConfig = game.config.audio;
  68700. var deviceAudio = game.device.audio;
  68701. if ((audioConfig && audioConfig.noAudio) || (!deviceAudio.webAudio && !deviceAudio.audioData))
  68702. {
  68703. return new NoAudioSoundManager(game);
  68704. }
  68705. if (deviceAudio.webAudio && !(audioConfig && audioConfig.disableWebAudio))
  68706. {
  68707. return new WebAudioSoundManager(game);
  68708. }
  68709. return new HTML5AudioSoundManager(game);
  68710. }
  68711. };
  68712. module.exports = SoundManagerCreator;
  68713. /***/ }),
  68714. /* 329 */
  68715. /***/ (function(module, exports, __webpack_require__) {
  68716. /**
  68717. * @author Richard Davey <rich@photonstorm.com>
  68718. * @copyright 2019 Photon Storm Ltd.
  68719. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68720. */
  68721. var CONST = __webpack_require__(124);
  68722. var GetValue = __webpack_require__(4);
  68723. var Merge = __webpack_require__(103);
  68724. var InjectionMap = __webpack_require__(933);
  68725. /**
  68726. * @namespace Phaser.Scenes.Settings
  68727. */
  68728. /**
  68729. * @typedef {object} Phaser.Scenes.Settings.Config
  68730. *
  68731. * @property {string} [key] - The unique key of this Scene. Must be unique within the entire Game instance.
  68732. * @property {boolean} [active=false] - Does the Scene start as active or not? An active Scene updates each step.
  68733. * @property {boolean} [visible=true] - Does the Scene start as visible or not? A visible Scene renders each step.
  68734. * @property {(false|Phaser.Loader.FileTypes.PackFileConfig)} [pack=false] - An optional Loader Packfile to be loaded before the Scene begins.
  68735. * @property {?(InputJSONCameraObject|InputJSONCameraObject[])} [cameras=null] - An optional Camera configuration object.
  68736. * @property {Object.<string, string>} [map] - Overwrites the default injection map for a scene.
  68737. * @property {Object.<string, string>} [mapAdd] - Extends the injection map for a scene.
  68738. * @property {object} [physics={}] - The physics configuration object for the Scene.
  68739. * @property {object} [loader={}] - The loader configuration object for the Scene.
  68740. * @property {(false|*)} [plugins=false] - The plugin configuration object for the Scene.
  68741. */
  68742. /**
  68743. * @typedef {object} Phaser.Scenes.Settings.Object
  68744. *
  68745. * @property {number} status - The current status of the Scene. Maps to the Scene constants.
  68746. * @property {string} key - The unique key of this Scene. Unique within the entire Game instance.
  68747. * @property {boolean} active - The active state of this Scene. An active Scene updates each step.
  68748. * @property {boolean} visible - The visible state of this Scene. A visible Scene renders each step.
  68749. * @property {boolean} isBooted - Has the Scene finished booting?
  68750. * @property {boolean} isTransition - Is the Scene in a state of transition?
  68751. * @property {?Phaser.Scene} transitionFrom - The Scene this Scene is transitioning from, if set.
  68752. * @property {integer} transitionDuration - The duration of the transition, if set.
  68753. * @property {boolean} transitionAllowInput - Is this Scene allowed to receive input during transitions?
  68754. * @property {object} data - a data bundle passed to this Scene from the Scene Manager.
  68755. * @property {(false|Phaser.Loader.FileTypes.PackFileConfig)} pack - The Loader Packfile to be loaded before the Scene begins.
  68756. * @property {?(InputJSONCameraObject|InputJSONCameraObject[])} cameras - The Camera configuration object.
  68757. * @property {Object.<string, string>} map - The Scene's Injection Map.
  68758. * @property {object} physics - The physics configuration object for the Scene.
  68759. * @property {object} loader - The loader configuration object for the Scene.
  68760. * @property {(false|*)} plugins - The plugin configuration object for the Scene.
  68761. */
  68762. var Settings = {
  68763. /**
  68764. * Takes a Scene configuration object and returns a fully formed System Settings object.
  68765. *
  68766. * @function Phaser.Scenes.Settings.create
  68767. * @since 3.0.0
  68768. *
  68769. * @param {(string|Phaser.Scenes.Settings.Config)} config - The Scene configuration object used to create this Scene Settings.
  68770. *
  68771. * @return {Phaser.Scenes.Settings.Object} The Scene Settings object created as a result of the config and default settings.
  68772. */
  68773. create: function (config)
  68774. {
  68775. if (typeof config === 'string')
  68776. {
  68777. config = { key: config };
  68778. }
  68779. else if (config === undefined)
  68780. {
  68781. // Pass the 'hasOwnProperty' checks
  68782. config = {};
  68783. }
  68784. return {
  68785. status: CONST.PENDING,
  68786. key: GetValue(config, 'key', ''),
  68787. active: GetValue(config, 'active', false),
  68788. visible: GetValue(config, 'visible', true),
  68789. isBooted: false,
  68790. isTransition: false,
  68791. transitionFrom: null,
  68792. transitionDuration: 0,
  68793. transitionAllowInput: true,
  68794. // Loader payload array
  68795. data: {},
  68796. pack: GetValue(config, 'pack', false),
  68797. // Cameras
  68798. cameras: GetValue(config, 'cameras', null),
  68799. // Scene Property Injection Map
  68800. map: GetValue(config, 'map', Merge(InjectionMap, GetValue(config, 'mapAdd', {}))),
  68801. // Physics
  68802. physics: GetValue(config, 'physics', {}),
  68803. // Loader
  68804. loader: GetValue(config, 'loader', {}),
  68805. // Plugins
  68806. plugins: GetValue(config, 'plugins', false),
  68807. // Input
  68808. input: GetValue(config, 'input', {})
  68809. };
  68810. }
  68811. };
  68812. module.exports = Settings;
  68813. /***/ }),
  68814. /* 330 */
  68815. /***/ (function(module, exports) {
  68816. /**
  68817. * @author Richard Davey <rich@photonstorm.com>
  68818. * @copyright 2019 Photon Storm Ltd.
  68819. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68820. */
  68821. /**
  68822. * Capitalizes the first letter of a string if there is one.
  68823. * @example
  68824. * UppercaseFirst('abc');
  68825. * // returns 'Abc'
  68826. * @example
  68827. * UppercaseFirst('the happy family');
  68828. * // returns 'The happy family'
  68829. * @example
  68830. * UppercaseFirst('');
  68831. * // returns ''
  68832. *
  68833. * @function Phaser.Utils.String.UppercaseFirst
  68834. * @since 3.0.0
  68835. *
  68836. * @param {string} str - The string to capitalize.
  68837. *
  68838. * @return {string} A new string, same as the first, but with the first letter capitalized.
  68839. */
  68840. var UppercaseFirst = function (str)
  68841. {
  68842. return str && str[0].toUpperCase() + str.slice(1);
  68843. };
  68844. module.exports = UppercaseFirst;
  68845. /***/ }),
  68846. /* 331 */
  68847. /***/ (function(module, exports, __webpack_require__) {
  68848. /**
  68849. * @author Richard Davey <rich@photonstorm.com>
  68850. * @copyright 2019 Photon Storm Ltd.
  68851. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68852. */
  68853. var Class = __webpack_require__(0);
  68854. var Systems = __webpack_require__(176);
  68855. /**
  68856. * @classdesc
  68857. * A base Phaser.Scene class which you could extend for your own use.
  68858. *
  68859. * @class Scene
  68860. * @memberof Phaser
  68861. * @constructor
  68862. * @since 3.0.0
  68863. *
  68864. * @param {(string|Phaser.Scenes.Settings.Config)} config - Scene specific configuration settings.
  68865. */
  68866. var Scene = new Class({
  68867. initialize:
  68868. function Scene (config)
  68869. {
  68870. /**
  68871. * The Scene Systems. You must never overwrite this property, or all hell will break lose.
  68872. *
  68873. * @name Phaser.Scene#sys
  68874. * @type {Phaser.Scenes.Systems}
  68875. * @since 3.0.0
  68876. */
  68877. this.sys = new Systems(this, config);
  68878. /**
  68879. * A reference to the Phaser.Game instance.
  68880. * This property will only be available if defined in the Scene Injection Map.
  68881. *
  68882. * @name Phaser.Scene#game
  68883. * @type {Phaser.Game}
  68884. * @since 3.0.0
  68885. */
  68886. this.game;
  68887. /**
  68888. * A reference to the global Animation Manager.
  68889. * This property will only be available if defined in the Scene Injection Map.
  68890. *
  68891. * @name Phaser.Scene#anims
  68892. * @type {Phaser.Animations.AnimationManager}
  68893. * @since 3.0.0
  68894. */
  68895. this.anims;
  68896. /**
  68897. * A reference to the global Cache.
  68898. * This property will only be available if defined in the Scene Injection Map.
  68899. *
  68900. * @name Phaser.Scene#cache
  68901. * @type {Phaser.Cache.CacheManager}
  68902. * @since 3.0.0
  68903. */
  68904. this.cache;
  68905. /**
  68906. * A reference to the game level Data Manager.
  68907. * This property will only be available if defined in the Scene Injection Map.
  68908. *
  68909. * @name Phaser.Scene#registry
  68910. * @type {Phaser.Data.DataManager}
  68911. * @since 3.0.0
  68912. */
  68913. this.registry;
  68914. /**
  68915. * A reference to the Sound Manager.
  68916. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  68917. *
  68918. * @name Phaser.Scene#sound
  68919. * @type {Phaser.Sound.BaseSoundManager}
  68920. * @since 3.0.0
  68921. */
  68922. this.sound;
  68923. /**
  68924. * A reference to the Texture Manager.
  68925. * This property will only be available if defined in the Scene Injection Map.
  68926. *
  68927. * @name Phaser.Scene#textures
  68928. * @type {Phaser.Textures.TextureManager}
  68929. * @since 3.0.0
  68930. */
  68931. this.textures;
  68932. /**
  68933. * A scene level Event Emitter.
  68934. * This property will only be available if defined in the Scene Injection Map.
  68935. *
  68936. * @name Phaser.Scene#events
  68937. * @type {Phaser.Events.EventEmitter}
  68938. * @since 3.0.0
  68939. */
  68940. this.events;
  68941. /**
  68942. * A scene level Camera System.
  68943. * This property will only be available if defined in the Scene Injection Map.
  68944. *
  68945. * @name Phaser.Scene#cameras
  68946. * @type {Phaser.Cameras.Scene2D.CameraManager}
  68947. * @since 3.0.0
  68948. */
  68949. this.cameras;
  68950. /**
  68951. * A scene level Game Object Factory.
  68952. * This property will only be available if defined in the Scene Injection Map.
  68953. *
  68954. * @name Phaser.Scene#add
  68955. * @type {Phaser.GameObjects.GameObjectFactory}
  68956. * @since 3.0.0
  68957. */
  68958. this.add;
  68959. /**
  68960. * A scene level Game Object Creator.
  68961. * This property will only be available if defined in the Scene Injection Map.
  68962. *
  68963. * @name Phaser.Scene#make
  68964. * @type {Phaser.GameObjects.GameObjectCreator}
  68965. * @since 3.0.0
  68966. */
  68967. this.make;
  68968. /**
  68969. * A reference to the Scene Manager Plugin.
  68970. * This property will only be available if defined in the Scene Injection Map.
  68971. *
  68972. * @name Phaser.Scene#scene
  68973. * @type {Phaser.Scenes.ScenePlugin}
  68974. * @since 3.0.0
  68975. */
  68976. this.scene;
  68977. /**
  68978. * A scene level Game Object Display List.
  68979. * This property will only be available if defined in the Scene Injection Map.
  68980. *
  68981. * @name Phaser.Scene#children
  68982. * @type {Phaser.GameObjects.DisplayList}
  68983. * @since 3.0.0
  68984. */
  68985. this.children;
  68986. /**
  68987. * A scene level Lights Manager Plugin.
  68988. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  68989. *
  68990. * @name Phaser.Scene#lights
  68991. * @type {Phaser.GameObjects.LightsManager}
  68992. * @since 3.0.0
  68993. */
  68994. this.lights;
  68995. /**
  68996. * A scene level Data Manager Plugin.
  68997. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  68998. *
  68999. * @name Phaser.Scene#data
  69000. * @type {Phaser.Data.DataManager}
  69001. * @since 3.0.0
  69002. */
  69003. this.data;
  69004. /**
  69005. * A scene level Input Manager Plugin.
  69006. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  69007. *
  69008. * @name Phaser.Scene#input
  69009. * @type {Phaser.Input.InputPlugin}
  69010. * @since 3.0.0
  69011. */
  69012. this.input;
  69013. /**
  69014. * A scene level Loader Plugin.
  69015. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  69016. *
  69017. * @name Phaser.Scene#load
  69018. * @type {Phaser.Loader.LoaderPlugin}
  69019. * @since 3.0.0
  69020. */
  69021. this.load;
  69022. /**
  69023. * A scene level Time and Clock Plugin.
  69024. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  69025. *
  69026. * @name Phaser.Scene#time
  69027. * @type {Phaser.Time.Clock}
  69028. * @since 3.0.0
  69029. */
  69030. this.time;
  69031. /**
  69032. * A scene level Tween Manager Plugin.
  69033. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  69034. *
  69035. * @name Phaser.Scene#tweens
  69036. * @type {Phaser.Tweens.TweenManager}
  69037. * @since 3.0.0
  69038. */
  69039. this.tweens;
  69040. /**
  69041. * A scene level Arcade Physics Plugin.
  69042. * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured.
  69043. *
  69044. * @name Phaser.Scene#physics
  69045. * @type {Phaser.Physics.Arcade.ArcadePhysics}
  69046. * @since 3.0.0
  69047. */
  69048. this.physics;
  69049. /**
  69050. * A scene level Impact Physics Plugin.
  69051. * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured.
  69052. *
  69053. * @name Phaser.Scene#impact
  69054. * @type {Phaser.Physics.Impact.ImpactPhysics}
  69055. * @since 3.0.0
  69056. */
  69057. this.impact;
  69058. /**
  69059. * A scene level Matter Physics Plugin.
  69060. * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured.
  69061. *
  69062. * @name Phaser.Scene#matter
  69063. * @type {Phaser.Physics.Matter.MatterPhysics}
  69064. * @since 3.0.0
  69065. */
  69066. this.matter;
  69067. if (false)
  69068. {}
  69069. /**
  69070. * A reference to the global Scale Manager.
  69071. * This property will only be available if defined in the Scene Injection Map.
  69072. *
  69073. * @name Phaser.Scene#scale
  69074. * @type {Phaser.Scale.ScaleManager}
  69075. * @since 3.16.2
  69076. */
  69077. this.scale;
  69078. },
  69079. /**
  69080. * Should be overridden by your own Scenes.
  69081. *
  69082. * @method Phaser.Scene#update
  69083. * @override
  69084. * @since 3.0.0
  69085. *
  69086. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  69087. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  69088. */
  69089. update: function ()
  69090. {
  69091. }
  69092. });
  69093. module.exports = Scene;
  69094. /***/ }),
  69095. /* 332 */
  69096. /***/ (function(module, exports, __webpack_require__) {
  69097. /**
  69098. * @author Richard Davey <rich@photonstorm.com>
  69099. * @copyright 2019 Photon Storm Ltd.
  69100. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  69101. */
  69102. var Class = __webpack_require__(0);
  69103. var CONST = __webpack_require__(124);
  69104. var Events = __webpack_require__(16);
  69105. var GameEvents = __webpack_require__(26);
  69106. var GetValue = __webpack_require__(4);
  69107. var LoaderEvents = __webpack_require__(75);
  69108. var NOOP = __webpack_require__(1);
  69109. var Scene = __webpack_require__(331);
  69110. var Systems = __webpack_require__(176);
  69111. /**
  69112. * @classdesc
  69113. * The Scene Manager.
  69114. *
  69115. * The Scene Manager is a Game level system, responsible for creating, processing and updating all of the
  69116. * Scenes in a Game instance.
  69117. *
  69118. *
  69119. * @class SceneManager
  69120. * @memberof Phaser.Scenes
  69121. * @constructor
  69122. * @since 3.0.0
  69123. *
  69124. * @param {Phaser.Game} game - The Phaser.Game instance this Scene Manager belongs to.
  69125. * @param {object} sceneConfig - Scene specific configuration settings.
  69126. */
  69127. var SceneManager = new Class({
  69128. initialize:
  69129. function SceneManager (game, sceneConfig)
  69130. {
  69131. /**
  69132. * The Game that this SceneManager belongs to.
  69133. *
  69134. * @name Phaser.Scenes.SceneManager#game
  69135. * @type {Phaser.Game}
  69136. * @since 3.0.0
  69137. */
  69138. this.game = game;
  69139. /**
  69140. * An object that maps the keys to the scene so we can quickly get a scene from a key without iteration.
  69141. *
  69142. * @name Phaser.Scenes.SceneManager#keys
  69143. * @type {object}
  69144. * @since 3.0.0
  69145. */
  69146. this.keys = {};
  69147. /**
  69148. * The array in which all of the scenes are kept.
  69149. *
  69150. * @name Phaser.Scenes.SceneManager#scenes
  69151. * @type {array}
  69152. * @since 3.0.0
  69153. */
  69154. this.scenes = [];
  69155. /**
  69156. * Scenes pending to be added are stored in here until the manager has time to add it.
  69157. *
  69158. * @name Phaser.Scenes.SceneManager#_pending
  69159. * @type {array}
  69160. * @private
  69161. * @since 3.0.0
  69162. */
  69163. this._pending = [];
  69164. /**
  69165. * An array of scenes waiting to be started once the game has booted.
  69166. *
  69167. * @name Phaser.Scenes.SceneManager#_start
  69168. * @type {array}
  69169. * @private
  69170. * @since 3.0.0
  69171. */
  69172. this._start = [];
  69173. /**
  69174. * An operations queue, because we don't manipulate the scenes array during processing.
  69175. *
  69176. * @name Phaser.Scenes.SceneManager#_queue
  69177. * @type {array}
  69178. * @private
  69179. * @since 3.0.0
  69180. */
  69181. this._queue = [];
  69182. /**
  69183. * Boot time data to merge.
  69184. *
  69185. * @name Phaser.Scenes.SceneManager#_data
  69186. * @type {object}
  69187. * @private
  69188. * @since 3.4.0
  69189. */
  69190. this._data = {};
  69191. /**
  69192. * Is the Scene Manager actively processing the Scenes list?
  69193. *
  69194. * @name Phaser.Scenes.SceneManager#isProcessing
  69195. * @type {boolean}
  69196. * @default false
  69197. * @readonly
  69198. * @since 3.0.0
  69199. */
  69200. this.isProcessing = false;
  69201. /**
  69202. * Has the Scene Manager properly started?
  69203. *
  69204. * @name Phaser.Scenes.SceneManager#isBooted
  69205. * @type {boolean}
  69206. * @default false
  69207. * @readonly
  69208. * @since 3.4.0
  69209. */
  69210. this.isBooted = false;
  69211. /**
  69212. * Do any of the Cameras in any of the Scenes require a custom viewport?
  69213. * If not we can skip scissor tests.
  69214. *
  69215. * @name Phaser.Scenes.SceneManager#customViewports
  69216. * @type {number}
  69217. * @default 0
  69218. * @since 3.12.0
  69219. */
  69220. this.customViewports = 0;
  69221. if (sceneConfig)
  69222. {
  69223. if (!Array.isArray(sceneConfig))
  69224. {
  69225. sceneConfig = [ sceneConfig ];
  69226. }
  69227. for (var i = 0; i < sceneConfig.length; i++)
  69228. {
  69229. // The i === 0 part just autostarts the first Scene given (unless it says otherwise in its config)
  69230. this._pending.push({
  69231. key: 'default',
  69232. scene: sceneConfig[i],
  69233. autoStart: (i === 0),
  69234. data: {}
  69235. });
  69236. }
  69237. }
  69238. game.events.once(GameEvents.READY, this.bootQueue, this);
  69239. },
  69240. /**
  69241. * Internal first-time Scene boot handler.
  69242. *
  69243. * @method Phaser.Scenes.SceneManager#bootQueue
  69244. * @private
  69245. * @since 3.2.0
  69246. */
  69247. bootQueue: function ()
  69248. {
  69249. if (this.isBooted)
  69250. {
  69251. return;
  69252. }
  69253. var i;
  69254. var entry;
  69255. var key;
  69256. var sceneConfig;
  69257. for (i = 0; i < this._pending.length; i++)
  69258. {
  69259. entry = this._pending[i];
  69260. key = entry.key;
  69261. sceneConfig = entry.scene;
  69262. var newScene;
  69263. if (sceneConfig instanceof Scene)
  69264. {
  69265. newScene = this.createSceneFromInstance(key, sceneConfig);
  69266. }
  69267. else if (typeof sceneConfig === 'object')
  69268. {
  69269. newScene = this.createSceneFromObject(key, sceneConfig);
  69270. }
  69271. else if (typeof sceneConfig === 'function')
  69272. {
  69273. newScene = this.createSceneFromFunction(key, sceneConfig);
  69274. }
  69275. // Replace key in case the scene changed it
  69276. key = newScene.sys.settings.key;
  69277. this.keys[key] = newScene;
  69278. this.scenes.push(newScene);
  69279. // Any data to inject?
  69280. if (this._data[key])
  69281. {
  69282. newScene.sys.settings.data = this._data[key].data;
  69283. if (this._data[key].autoStart)
  69284. {
  69285. entry.autoStart = true;
  69286. }
  69287. }
  69288. if (entry.autoStart || newScene.sys.settings.active)
  69289. {
  69290. this._start.push(key);
  69291. }
  69292. }
  69293. // Clear the pending lists
  69294. this._pending.length = 0;
  69295. this._data = {};
  69296. this.isBooted = true;
  69297. // _start might have been populated by the above
  69298. for (i = 0; i < this._start.length; i++)
  69299. {
  69300. entry = this._start[i];
  69301. this.start(entry);
  69302. }
  69303. this._start.length = 0;
  69304. },
  69305. /**
  69306. * Process the Scene operations queue.
  69307. *
  69308. * @method Phaser.Scenes.SceneManager#processQueue
  69309. * @since 3.0.0
  69310. */
  69311. processQueue: function ()
  69312. {
  69313. var pendingLength = this._pending.length;
  69314. var queueLength = this._queue.length;
  69315. if (pendingLength === 0 && queueLength === 0)
  69316. {
  69317. return;
  69318. }
  69319. var i;
  69320. var entry;
  69321. if (pendingLength)
  69322. {
  69323. for (i = 0; i < pendingLength; i++)
  69324. {
  69325. entry = this._pending[i];
  69326. this.add(entry.key, entry.scene, entry.autoStart, entry.data);
  69327. }
  69328. // _start might have been populated by this.add
  69329. for (i = 0; i < this._start.length; i++)
  69330. {
  69331. entry = this._start[i];
  69332. this.start(entry);
  69333. }
  69334. // Clear the pending lists
  69335. this._start.length = 0;
  69336. this._pending.length = 0;
  69337. return;
  69338. }
  69339. for (i = 0; i < this._queue.length; i++)
  69340. {
  69341. entry = this._queue[i];
  69342. this[entry.op](entry.keyA, entry.keyB);
  69343. }
  69344. this._queue.length = 0;
  69345. },
  69346. /**
  69347. * Adds a new Scene into the SceneManager.
  69348. * You must give each Scene a unique key by which you'll identify it.
  69349. *
  69350. * The `sceneConfig` can be:
  69351. *
  69352. * * A `Phaser.Scene` object, or an object that extends it.
  69353. * * A plain JavaScript object
  69354. * * A JavaScript ES6 Class that extends `Phaser.Scene`
  69355. * * A JavaScript ES5 prototype based Class
  69356. * * A JavaScript function
  69357. *
  69358. * If a function is given then a new Scene will be created by calling it.
  69359. *
  69360. * @method Phaser.Scenes.SceneManager#add
  69361. * @since 3.0.0
  69362. *
  69363. * @param {string} key - A unique key used to reference the Scene, i.e. `MainMenu` or `Level1`.
  69364. * @param {(Phaser.Scene|Phaser.Scenes.Settings.Config|function)} sceneConfig - The config for the Scene
  69365. * @param {boolean} [autoStart=false] - If `true` the Scene will be started immediately after being added.
  69366. * @param {object} [data] - Optional data object. This will be set as Scene.settings.data and passed to `Scene.init`.
  69367. *
  69368. * @return {?Phaser.Scene} The added Scene, if it was added immediately, otherwise `null`.
  69369. */
  69370. add: function (key, sceneConfig, autoStart, data)
  69371. {
  69372. if (autoStart === undefined) { autoStart = false; }
  69373. if (data === undefined) { data = {}; }
  69374. // If processing or not booted then put scene into a holding pattern
  69375. if (this.isProcessing || !this.isBooted)
  69376. {
  69377. this._pending.push({
  69378. key: key,
  69379. scene: sceneConfig,
  69380. autoStart: autoStart,
  69381. data: data
  69382. });
  69383. if (!this.isBooted)
  69384. {
  69385. this._data[key] = { data: data };
  69386. }
  69387. return null;
  69388. }
  69389. key = this.getKey(key, sceneConfig);
  69390. var newScene;
  69391. if (sceneConfig instanceof Scene)
  69392. {
  69393. newScene = this.createSceneFromInstance(key, sceneConfig);
  69394. }
  69395. else if (typeof sceneConfig === 'object')
  69396. {
  69397. sceneConfig.key = key;
  69398. newScene = this.createSceneFromObject(key, sceneConfig);
  69399. }
  69400. else if (typeof sceneConfig === 'function')
  69401. {
  69402. newScene = this.createSceneFromFunction(key, sceneConfig);
  69403. }
  69404. // Any data to inject?
  69405. newScene.sys.settings.data = data;
  69406. // Replace key in case the scene changed it
  69407. key = newScene.sys.settings.key;
  69408. this.keys[key] = newScene;
  69409. this.scenes.push(newScene);
  69410. if (autoStart || newScene.sys.settings.active)
  69411. {
  69412. if (this._pending.length)
  69413. {
  69414. this._start.push(key);
  69415. }
  69416. else
  69417. {
  69418. this.start(key);
  69419. }
  69420. }
  69421. return newScene;
  69422. },
  69423. /**
  69424. * Removes a Scene from the SceneManager.
  69425. *
  69426. * The Scene is removed from the local scenes array, it's key is cleared from the keys
  69427. * cache and Scene.Systems.destroy is then called on it.
  69428. *
  69429. * If the SceneManager is processing the Scenes when this method is called it will
  69430. * queue the operation for the next update sequence.
  69431. *
  69432. * @method Phaser.Scenes.SceneManager#remove
  69433. * @since 3.2.0
  69434. *
  69435. * @param {(string|Phaser.Scene)} scene - The Scene to be removed.
  69436. *
  69437. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  69438. */
  69439. remove: function (key)
  69440. {
  69441. if (this.isProcessing)
  69442. {
  69443. this._queue.push({ op: 'remove', keyA: key, keyB: null });
  69444. }
  69445. else
  69446. {
  69447. var sceneToRemove = this.getScene(key);
  69448. if (!sceneToRemove || sceneToRemove.sys.isTransitioning())
  69449. {
  69450. return this;
  69451. }
  69452. var index = this.scenes.indexOf(sceneToRemove);
  69453. var sceneKey = sceneToRemove.sys.settings.key;
  69454. if (index > -1)
  69455. {
  69456. delete this.keys[sceneKey];
  69457. this.scenes.splice(index, 1);
  69458. if (this._start.indexOf(sceneKey) > -1)
  69459. {
  69460. index = this._start.indexOf(sceneKey);
  69461. this._start.splice(index, 1);
  69462. }
  69463. sceneToRemove.sys.destroy();
  69464. }
  69465. }
  69466. return this;
  69467. },
  69468. /**
  69469. * Boot the given Scene.
  69470. *
  69471. * @method Phaser.Scenes.SceneManager#bootScene
  69472. * @private
  69473. * @fires Phaser.Scenes.Events#TRANSITION_INIT
  69474. * @since 3.0.0
  69475. *
  69476. * @param {Phaser.Scene} scene - The Scene to boot.
  69477. */
  69478. bootScene: function (scene)
  69479. {
  69480. var sys = scene.sys;
  69481. var settings = sys.settings;
  69482. if (scene.init)
  69483. {
  69484. scene.init.call(scene, settings.data);
  69485. settings.status = CONST.INIT;
  69486. if (settings.isTransition)
  69487. {
  69488. sys.events.emit(Events.TRANSITION_INIT, settings.transitionFrom, settings.transitionDuration);
  69489. }
  69490. }
  69491. var loader;
  69492. if (sys.load)
  69493. {
  69494. loader = sys.load;
  69495. loader.reset();
  69496. }
  69497. if (loader && scene.preload)
  69498. {
  69499. scene.preload.call(scene);
  69500. // Is the loader empty?
  69501. if (loader.list.size === 0)
  69502. {
  69503. this.create(scene);
  69504. }
  69505. else
  69506. {
  69507. settings.status = CONST.LOADING;
  69508. // Start the loader going as we have something in the queue
  69509. loader.once(LoaderEvents.COMPLETE, this.loadComplete, this);
  69510. loader.start();
  69511. }
  69512. }
  69513. else
  69514. {
  69515. // No preload? Then there was nothing to load either
  69516. this.create(scene);
  69517. }
  69518. },
  69519. /**
  69520. * Handles load completion for a Scene's Loader.
  69521. *
  69522. * Starts the Scene that the Loader belongs to.
  69523. *
  69524. * @method Phaser.Scenes.SceneManager#loadComplete
  69525. * @private
  69526. * @since 3.0.0
  69527. *
  69528. * @param {Phaser.Loader.LoaderPlugin} loader - The loader that has completed loading.
  69529. */
  69530. loadComplete: function (loader)
  69531. {
  69532. var scene = loader.scene;
  69533. // Try to unlock HTML5 sounds every time any loader completes
  69534. if (this.game.sound.onBlurPausedSounds)
  69535. {
  69536. this.game.sound.unlock();
  69537. }
  69538. this.create(scene);
  69539. },
  69540. /**
  69541. * Handle payload completion for a Scene.
  69542. *
  69543. * @method Phaser.Scenes.SceneManager#payloadComplete
  69544. * @private
  69545. * @since 3.0.0
  69546. *
  69547. * @param {Phaser.Loader.LoaderPlugin} loader - The loader that has completed loading its Scene's payload.
  69548. */
  69549. payloadComplete: function (loader)
  69550. {
  69551. this.bootScene(loader.scene);
  69552. },
  69553. /**
  69554. * Updates the Scenes.
  69555. *
  69556. * @method Phaser.Scenes.SceneManager#update
  69557. * @since 3.0.0
  69558. *
  69559. * @param {number} time - Time elapsed.
  69560. * @param {number} delta - Delta time from the last update.
  69561. */
  69562. update: function (time, delta)
  69563. {
  69564. this.processQueue();
  69565. this.isProcessing = true;
  69566. // Loop through the active scenes in reverse order
  69567. for (var i = this.scenes.length - 1; i >= 0; i--)
  69568. {
  69569. var sys = this.scenes[i].sys;
  69570. if (sys.settings.status > CONST.START && sys.settings.status <= CONST.RUNNING)
  69571. {
  69572. sys.step(time, delta);
  69573. }
  69574. }
  69575. },
  69576. /**
  69577. * Renders the Scenes.
  69578. *
  69579. * @method Phaser.Scenes.SceneManager#render
  69580. * @since 3.0.0
  69581. *
  69582. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The renderer to use.
  69583. */
  69584. render: function (renderer)
  69585. {
  69586. // Loop through the scenes in forward order
  69587. for (var i = 0; i < this.scenes.length; i++)
  69588. {
  69589. var sys = this.scenes[i].sys;
  69590. if (sys.settings.visible && sys.settings.status >= CONST.LOADING && sys.settings.status < CONST.SLEEPING)
  69591. {
  69592. sys.render(renderer);
  69593. }
  69594. }
  69595. this.isProcessing = false;
  69596. },
  69597. /**
  69598. * Calls the given Scene's {@link Phaser.Scene#create} method and updates its status.
  69599. *
  69600. * @method Phaser.Scenes.SceneManager#create
  69601. * @private
  69602. * @fires Phaser.Scenes.Events#TRANSITION_INIT
  69603. * @since 3.0.0
  69604. *
  69605. * @param {Phaser.Scene} scene - The Scene to create.
  69606. */
  69607. create: function (scene)
  69608. {
  69609. var sys = scene.sys;
  69610. var settings = sys.settings;
  69611. if (scene.create)
  69612. {
  69613. settings.status = CONST.CREATING;
  69614. scene.create.call(scene, settings.data);
  69615. }
  69616. if (settings.isTransition)
  69617. {
  69618. sys.events.emit(Events.TRANSITION_START, settings.transitionFrom, settings.transitionDuration);
  69619. }
  69620. // If the Scene has an update function we'll set it now, otherwise it'll remain as NOOP
  69621. if (scene.update)
  69622. {
  69623. sys.sceneUpdate = scene.update;
  69624. }
  69625. settings.status = CONST.RUNNING;
  69626. },
  69627. /**
  69628. * Creates and initializes a Scene from a function.
  69629. *
  69630. * @method Phaser.Scenes.SceneManager#createSceneFromFunction
  69631. * @private
  69632. * @since 3.0.0
  69633. *
  69634. * @param {string} key - The key of the Scene.
  69635. * @param {function} scene - The function to create the Scene from.
  69636. *
  69637. * @return {Phaser.Scene} The created Scene.
  69638. */
  69639. createSceneFromFunction: function (key, scene)
  69640. {
  69641. var newScene = new scene();
  69642. if (newScene instanceof Scene)
  69643. {
  69644. var configKey = newScene.sys.settings.key;
  69645. if (configKey !== '')
  69646. {
  69647. key = configKey;
  69648. }
  69649. if (this.keys.hasOwnProperty(key))
  69650. {
  69651. throw new Error('Cannot add a Scene with duplicate key: ' + key);
  69652. }
  69653. return this.createSceneFromInstance(key, newScene);
  69654. }
  69655. else
  69656. {
  69657. newScene.sys = new Systems(newScene);
  69658. newScene.sys.settings.key = key;
  69659. newScene.sys.init(this.game);
  69660. return newScene;
  69661. }
  69662. },
  69663. /**
  69664. * Creates and initializes a Scene instance.
  69665. *
  69666. * @method Phaser.Scenes.SceneManager#createSceneFromInstance
  69667. * @private
  69668. * @since 3.0.0
  69669. *
  69670. * @param {string} key - The key of the Scene.
  69671. * @param {Phaser.Scene} newScene - The Scene instance.
  69672. *
  69673. * @return {Phaser.Scene} The created Scene.
  69674. */
  69675. createSceneFromInstance: function (key, newScene)
  69676. {
  69677. var configKey = newScene.sys.settings.key;
  69678. if (configKey !== '')
  69679. {
  69680. key = configKey;
  69681. }
  69682. else
  69683. {
  69684. newScene.sys.settings.key = key;
  69685. }
  69686. newScene.sys.init(this.game);
  69687. return newScene;
  69688. },
  69689. /**
  69690. * Creates and initializes a Scene from an Object definition.
  69691. *
  69692. * @method Phaser.Scenes.SceneManager#createSceneFromObject
  69693. * @private
  69694. * @since 3.0.0
  69695. *
  69696. * @param {string} key - The key of the Scene.
  69697. * @param {(string|Phaser.Scenes.Settings.Config)} sceneConfig - The Scene config.
  69698. *
  69699. * @return {Phaser.Scene} The created Scene.
  69700. */
  69701. createSceneFromObject: function (key, sceneConfig)
  69702. {
  69703. var newScene = new Scene(sceneConfig);
  69704. var configKey = newScene.sys.settings.key;
  69705. if (configKey !== '')
  69706. {
  69707. key = configKey;
  69708. }
  69709. else
  69710. {
  69711. newScene.sys.settings.key = key;
  69712. }
  69713. newScene.sys.init(this.game);
  69714. // Extract callbacks
  69715. var defaults = [ 'init', 'preload', 'create', 'update', 'render' ];
  69716. for (var i = 0; i < defaults.length; i++)
  69717. {
  69718. var sceneCallback = GetValue(sceneConfig, defaults[i], null);
  69719. if (sceneCallback)
  69720. {
  69721. newScene[defaults[i]] = sceneCallback;
  69722. }
  69723. }
  69724. // Now let's move across any other functions or properties that may exist in the extend object:
  69725. /*
  69726. scene: {
  69727. preload: preload,
  69728. create: create,
  69729. extend: {
  69730. hello: 1,
  69731. test: 'atari',
  69732. addImage: addImage
  69733. }
  69734. }
  69735. */
  69736. if (sceneConfig.hasOwnProperty('extend'))
  69737. {
  69738. for (var propertyKey in sceneConfig.extend)
  69739. {
  69740. var value = sceneConfig.extend[propertyKey];
  69741. if (propertyKey === 'data' && newScene.hasOwnProperty('data') && typeof value === 'object')
  69742. {
  69743. // Populate the DataManager
  69744. newScene.data.merge(value);
  69745. }
  69746. else if (propertyKey !== 'sys')
  69747. {
  69748. newScene[propertyKey] = value;
  69749. }
  69750. }
  69751. }
  69752. return newScene;
  69753. },
  69754. /**
  69755. * Retrieves the key of a Scene from a Scene config.
  69756. *
  69757. * @method Phaser.Scenes.SceneManager#getKey
  69758. * @private
  69759. * @since 3.0.0
  69760. *
  69761. * @param {string} key - The key to check in the Scene config.
  69762. * @param {(Phaser.Scene|Phaser.Scenes.Settings.Config|function)} sceneConfig - The Scene config.
  69763. *
  69764. * @return {string} The Scene key.
  69765. */
  69766. getKey: function (key, sceneConfig)
  69767. {
  69768. if (!key) { key = 'default'; }
  69769. if (typeof sceneConfig === 'function')
  69770. {
  69771. return key;
  69772. }
  69773. else if (sceneConfig instanceof Scene)
  69774. {
  69775. key = sceneConfig.sys.settings.key;
  69776. }
  69777. else if (typeof sceneConfig === 'object' && sceneConfig.hasOwnProperty('key'))
  69778. {
  69779. key = sceneConfig.key;
  69780. }
  69781. // By this point it's either 'default' or extracted from the Scene
  69782. if (this.keys.hasOwnProperty(key))
  69783. {
  69784. throw new Error('Cannot add a Scene with duplicate key: ' + key);
  69785. }
  69786. else
  69787. {
  69788. return key;
  69789. }
  69790. },
  69791. /**
  69792. * Returns an array of all the current Scenes being managed by this Scene Manager.
  69793. *
  69794. * You can filter the output by the active state of the Scene and choose to have
  69795. * the array returned in normal or reversed order.
  69796. *
  69797. * @method Phaser.Scenes.SceneManager#getScenes
  69798. * @since 3.16.0
  69799. *
  69800. * @param {boolean} [isActive=true] - Only include Scene's that are currently active?
  69801. * @param {boolean} [inReverse=false] - Return the array of Scenes in reverse?
  69802. *
  69803. * @return {Phaser.Scene[]} An array containing all of the Scenes in the Scene Manager.
  69804. */
  69805. getScenes: function (isActive, inReverse)
  69806. {
  69807. if (isActive === undefined) { isActive = true; }
  69808. if (inReverse === undefined) { inReverse = false; }
  69809. var out = [];
  69810. var scenes = this.scenes;
  69811. for (var i = 0; i < scenes.length; i++)
  69812. {
  69813. var scene = scenes[i];
  69814. if (scene && (!isActive || (isActive && scene.sys.isActive())))
  69815. {
  69816. out.push(scene);
  69817. }
  69818. }
  69819. return (inReverse) ? out.reverse() : out;
  69820. },
  69821. /**
  69822. * Retrieves a Scene.
  69823. *
  69824. * @method Phaser.Scenes.SceneManager#getScene
  69825. * @since 3.0.0
  69826. *
  69827. * @param {string|Phaser.Scene} key - The Scene to retrieve.
  69828. *
  69829. * @return {?Phaser.Scene} The Scene.
  69830. */
  69831. getScene: function (key)
  69832. {
  69833. if (typeof key === 'string')
  69834. {
  69835. if (this.keys[key])
  69836. {
  69837. return this.keys[key];
  69838. }
  69839. }
  69840. else
  69841. {
  69842. for (var i = 0; i < this.scenes.length; i++)
  69843. {
  69844. if (key === this.scenes[i])
  69845. {
  69846. return key;
  69847. }
  69848. }
  69849. }
  69850. return null;
  69851. },
  69852. /**
  69853. * Determines whether a Scene is active.
  69854. *
  69855. * @method Phaser.Scenes.SceneManager#isActive
  69856. * @since 3.0.0
  69857. *
  69858. * @param {string} key - The Scene to check.
  69859. *
  69860. * @return {boolean} Whether the Scene is active.
  69861. */
  69862. isActive: function (key)
  69863. {
  69864. var scene = this.getScene(key);
  69865. if (scene)
  69866. {
  69867. return scene.sys.isActive();
  69868. }
  69869. return null;
  69870. },
  69871. /**
  69872. * Determines whether a Scene is visible.
  69873. *
  69874. * @method Phaser.Scenes.SceneManager#isVisible
  69875. * @since 3.0.0
  69876. *
  69877. * @param {string} key - The Scene to check.
  69878. *
  69879. * @return {boolean} Whether the Scene is visible.
  69880. */
  69881. isVisible: function (key)
  69882. {
  69883. var scene = this.getScene(key);
  69884. if (scene)
  69885. {
  69886. return scene.sys.isVisible();
  69887. }
  69888. return null;
  69889. },
  69890. /**
  69891. * Determines whether a Scene is sleeping.
  69892. *
  69893. * @method Phaser.Scenes.SceneManager#isSleeping
  69894. * @since 3.0.0
  69895. *
  69896. * @param {string} key - The Scene to check.
  69897. *
  69898. * @return {boolean} Whether the Scene is sleeping.
  69899. */
  69900. isSleeping: function (key)
  69901. {
  69902. var scene = this.getScene(key);
  69903. if (scene)
  69904. {
  69905. return scene.sys.isSleeping();
  69906. }
  69907. return null;
  69908. },
  69909. /**
  69910. * Pauses the given Scene.
  69911. *
  69912. * @method Phaser.Scenes.SceneManager#pause
  69913. * @since 3.0.0
  69914. *
  69915. * @param {string} key - The Scene to pause.
  69916. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted by its pause event.
  69917. *
  69918. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  69919. */
  69920. pause: function (key, data)
  69921. {
  69922. var scene = this.getScene(key);
  69923. if (scene)
  69924. {
  69925. scene.sys.pause(data);
  69926. }
  69927. return this;
  69928. },
  69929. /**
  69930. * Resumes the given Scene.
  69931. *
  69932. * @method Phaser.Scenes.SceneManager#resume
  69933. * @since 3.0.0
  69934. *
  69935. * @param {string} key - The Scene to resume.
  69936. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted by its resume event.
  69937. *
  69938. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  69939. */
  69940. resume: function (key, data)
  69941. {
  69942. var scene = this.getScene(key);
  69943. if (scene)
  69944. {
  69945. scene.sys.resume(data);
  69946. }
  69947. return this;
  69948. },
  69949. /**
  69950. * Puts the given Scene to sleep.
  69951. *
  69952. * @method Phaser.Scenes.SceneManager#sleep
  69953. * @since 3.0.0
  69954. *
  69955. * @param {string} key - The Scene to put to sleep.
  69956. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted by its sleep event.
  69957. *
  69958. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  69959. */
  69960. sleep: function (key, data)
  69961. {
  69962. var scene = this.getScene(key);
  69963. if (scene && !scene.sys.isTransitioning())
  69964. {
  69965. scene.sys.sleep(data);
  69966. }
  69967. return this;
  69968. },
  69969. /**
  69970. * Awakens the given Scene.
  69971. *
  69972. * @method Phaser.Scenes.SceneManager#wake
  69973. * @since 3.0.0
  69974. *
  69975. * @param {string} key - The Scene to wake up.
  69976. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted by its wake event.
  69977. *
  69978. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  69979. */
  69980. wake: function (key, data)
  69981. {
  69982. var scene = this.getScene(key);
  69983. if (scene)
  69984. {
  69985. scene.sys.wake(data);
  69986. }
  69987. return this;
  69988. },
  69989. /**
  69990. * Runs the given Scene, but does not change the state of this Scene.
  69991. *
  69992. * If the given Scene is paused, it will resume it. If sleeping, it will wake it.
  69993. * If not running at all, it will be started.
  69994. *
  69995. * Use this if you wish to open a modal Scene by calling `pause` on the current
  69996. * Scene, then `run` on the modal Scene.
  69997. *
  69998. * @method Phaser.Scenes.SceneManager#run
  69999. * @since 3.10.0
  70000. *
  70001. * @param {string} key - The Scene to run.
  70002. * @param {object} [data] - A data object that will be passed to the Scene on start, wake, or resume.
  70003. *
  70004. * @return {Phaser.Scenes.SceneManager} This Scene Manager.
  70005. */
  70006. run: function (key, data)
  70007. {
  70008. var scene = this.getScene(key);
  70009. if (!scene)
  70010. {
  70011. for (var i = 0; i < this._pending.length; i++)
  70012. {
  70013. if (this._pending[i].key === key)
  70014. {
  70015. this.queueOp('start', key, data);
  70016. break;
  70017. }
  70018. }
  70019. return this;
  70020. }
  70021. if (scene.sys.isSleeping())
  70022. {
  70023. // Sleeping?
  70024. scene.sys.wake(data);
  70025. }
  70026. else if (scene.sys.isBooted && !scene.sys.isActive())
  70027. {
  70028. // Paused?
  70029. scene.sys.resume(data);
  70030. }
  70031. else
  70032. {
  70033. // Not actually running?
  70034. this.start(key, data);
  70035. }
  70036. },
  70037. /**
  70038. * Starts the given Scene.
  70039. *
  70040. * @method Phaser.Scenes.SceneManager#start
  70041. * @since 3.0.0
  70042. *
  70043. * @param {string} key - The Scene to start.
  70044. * @param {object} [data] - Optional data object to pass to Scene.Settings and Scene.init.
  70045. *
  70046. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70047. */
  70048. start: function (key, data)
  70049. {
  70050. // If the Scene Manager is not running, then put the Scene into a holding pattern
  70051. if (!this.isBooted)
  70052. {
  70053. this._data[key] = {
  70054. autoStart: true,
  70055. data: data
  70056. };
  70057. return this;
  70058. }
  70059. var scene = this.getScene(key);
  70060. if (scene)
  70061. {
  70062. // If the Scene is already running (perhaps they called start from a launched sub-Scene?)
  70063. // then we close it down before starting it again.
  70064. if (scene.sys.isActive() || scene.sys.isPaused())
  70065. {
  70066. scene.sys.shutdown();
  70067. scene.sys.start(data);
  70068. }
  70069. else
  70070. {
  70071. scene.sys.start(data);
  70072. var loader;
  70073. if (scene.sys.load)
  70074. {
  70075. loader = scene.sys.load;
  70076. }
  70077. // Files payload?
  70078. if (loader && scene.sys.settings.hasOwnProperty('pack'))
  70079. {
  70080. loader.reset();
  70081. if (loader.addPack({ payload: scene.sys.settings.pack }))
  70082. {
  70083. scene.sys.settings.status = CONST.LOADING;
  70084. loader.once(LoaderEvents.COMPLETE, this.payloadComplete, this);
  70085. loader.start();
  70086. return this;
  70087. }
  70088. }
  70089. }
  70090. this.bootScene(scene);
  70091. }
  70092. return this;
  70093. },
  70094. /**
  70095. * Stops the given Scene.
  70096. *
  70097. * @method Phaser.Scenes.SceneManager#stop
  70098. * @since 3.0.0
  70099. *
  70100. * @param {string} key - The Scene to stop.
  70101. *
  70102. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70103. */
  70104. stop: function (key)
  70105. {
  70106. var scene = this.getScene(key);
  70107. if (scene && !scene.sys.isTransitioning())
  70108. {
  70109. scene.sys.shutdown();
  70110. }
  70111. return this;
  70112. },
  70113. /**
  70114. * Sleeps one one Scene and starts the other.
  70115. *
  70116. * @method Phaser.Scenes.SceneManager#switch
  70117. * @since 3.0.0
  70118. *
  70119. * @param {string} from - The Scene to sleep.
  70120. * @param {string} to - The Scene to start.
  70121. *
  70122. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70123. */
  70124. switch: function (from, to)
  70125. {
  70126. var sceneA = this.getScene(from);
  70127. var sceneB = this.getScene(to);
  70128. if (sceneA && sceneB && sceneA !== sceneB)
  70129. {
  70130. this.sleep(from);
  70131. if (this.isSleeping(to))
  70132. {
  70133. this.wake(to);
  70134. }
  70135. else
  70136. {
  70137. this.start(to);
  70138. }
  70139. }
  70140. return this;
  70141. },
  70142. /**
  70143. * Retrieves a Scene by numeric index.
  70144. *
  70145. * @method Phaser.Scenes.SceneManager#getAt
  70146. * @since 3.0.0
  70147. *
  70148. * @param {integer} index - The index of the Scene to retrieve.
  70149. *
  70150. * @return {(Phaser.Scene|undefined)} The Scene.
  70151. */
  70152. getAt: function (index)
  70153. {
  70154. return this.scenes[index];
  70155. },
  70156. /**
  70157. * Retrieves the numeric index of a Scene.
  70158. *
  70159. * @method Phaser.Scenes.SceneManager#getIndex
  70160. * @since 3.0.0
  70161. *
  70162. * @param {(string|Phaser.Scene)} key - The key of the Scene.
  70163. *
  70164. * @return {integer} The index of the Scene.
  70165. */
  70166. getIndex: function (key)
  70167. {
  70168. var scene = this.getScene(key);
  70169. return this.scenes.indexOf(scene);
  70170. },
  70171. /**
  70172. * Brings a Scene to the top of the Scenes list.
  70173. *
  70174. * This means it will render above all other Scenes.
  70175. *
  70176. * @method Phaser.Scenes.SceneManager#bringToTop
  70177. * @since 3.0.0
  70178. *
  70179. * @param {(string|Phaser.Scene)} key - The Scene to move.
  70180. *
  70181. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70182. */
  70183. bringToTop: function (key)
  70184. {
  70185. if (this.isProcessing)
  70186. {
  70187. this._queue.push({ op: 'bringToTop', keyA: key, keyB: null });
  70188. }
  70189. else
  70190. {
  70191. var index = this.getIndex(key);
  70192. if (index !== -1 && index < this.scenes.length)
  70193. {
  70194. var scene = this.getScene(key);
  70195. this.scenes.splice(index, 1);
  70196. this.scenes.push(scene);
  70197. }
  70198. }
  70199. return this;
  70200. },
  70201. /**
  70202. * Sends a Scene to the back of the Scenes list.
  70203. *
  70204. * This means it will render below all other Scenes.
  70205. *
  70206. * @method Phaser.Scenes.SceneManager#sendToBack
  70207. * @since 3.0.0
  70208. *
  70209. * @param {(string|Phaser.Scene)} key - The Scene to move.
  70210. *
  70211. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70212. */
  70213. sendToBack: function (key)
  70214. {
  70215. if (this.isProcessing)
  70216. {
  70217. this._queue.push({ op: 'sendToBack', keyA: key, keyB: null });
  70218. }
  70219. else
  70220. {
  70221. var index = this.getIndex(key);
  70222. if (index !== -1 && index > 0)
  70223. {
  70224. var scene = this.getScene(key);
  70225. this.scenes.splice(index, 1);
  70226. this.scenes.unshift(scene);
  70227. }
  70228. }
  70229. return this;
  70230. },
  70231. /**
  70232. * Moves a Scene down one position in the Scenes list.
  70233. *
  70234. * @method Phaser.Scenes.SceneManager#moveDown
  70235. * @since 3.0.0
  70236. *
  70237. * @param {(string|Phaser.Scene)} key - The Scene to move.
  70238. *
  70239. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70240. */
  70241. moveDown: function (key)
  70242. {
  70243. if (this.isProcessing)
  70244. {
  70245. this._queue.push({ op: 'moveDown', keyA: key, keyB: null });
  70246. }
  70247. else
  70248. {
  70249. var indexA = this.getIndex(key);
  70250. if (indexA > 0)
  70251. {
  70252. var indexB = indexA - 1;
  70253. var sceneA = this.getScene(key);
  70254. var sceneB = this.getAt(indexB);
  70255. this.scenes[indexA] = sceneB;
  70256. this.scenes[indexB] = sceneA;
  70257. }
  70258. }
  70259. return this;
  70260. },
  70261. /**
  70262. * Moves a Scene up one position in the Scenes list.
  70263. *
  70264. * @method Phaser.Scenes.SceneManager#moveUp
  70265. * @since 3.0.0
  70266. *
  70267. * @param {(string|Phaser.Scene)} key - The Scene to move.
  70268. *
  70269. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70270. */
  70271. moveUp: function (key)
  70272. {
  70273. if (this.isProcessing)
  70274. {
  70275. this._queue.push({ op: 'moveUp', keyA: key, keyB: null });
  70276. }
  70277. else
  70278. {
  70279. var indexA = this.getIndex(key);
  70280. if (indexA < this.scenes.length - 1)
  70281. {
  70282. var indexB = indexA + 1;
  70283. var sceneA = this.getScene(key);
  70284. var sceneB = this.getAt(indexB);
  70285. this.scenes[indexA] = sceneB;
  70286. this.scenes[indexB] = sceneA;
  70287. }
  70288. }
  70289. return this;
  70290. },
  70291. /**
  70292. * Moves a Scene so it is immediately above another Scene in the Scenes list.
  70293. *
  70294. * This means it will render over the top of the other Scene.
  70295. *
  70296. * @method Phaser.Scenes.SceneManager#moveAbove
  70297. * @since 3.2.0
  70298. *
  70299. * @param {(string|Phaser.Scene)} keyA - The Scene that Scene B will be moved above.
  70300. * @param {(string|Phaser.Scene)} keyB - The Scene to be moved.
  70301. *
  70302. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70303. */
  70304. moveAbove: function (keyA, keyB)
  70305. {
  70306. if (keyA === keyB)
  70307. {
  70308. return this;
  70309. }
  70310. if (this.isProcessing)
  70311. {
  70312. this._queue.push({ op: 'moveAbove', keyA: keyA, keyB: keyB });
  70313. }
  70314. else
  70315. {
  70316. var indexA = this.getIndex(keyA);
  70317. var indexB = this.getIndex(keyB);
  70318. if (indexA !== -1 && indexB !== -1)
  70319. {
  70320. var tempScene = this.getAt(indexB);
  70321. // Remove
  70322. this.scenes.splice(indexB, 1);
  70323. // Add in new location
  70324. this.scenes.splice(indexA + 1, 0, tempScene);
  70325. }
  70326. }
  70327. return this;
  70328. },
  70329. /**
  70330. * Moves a Scene so it is immediately below another Scene in the Scenes list.
  70331. *
  70332. * This means it will render behind the other Scene.
  70333. *
  70334. * @method Phaser.Scenes.SceneManager#moveBelow
  70335. * @since 3.2.0
  70336. *
  70337. * @param {(string|Phaser.Scene)} keyA - The Scene that Scene B will be moved above.
  70338. * @param {(string|Phaser.Scene)} keyB - The Scene to be moved.
  70339. *
  70340. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70341. */
  70342. moveBelow: function (keyA, keyB)
  70343. {
  70344. if (keyA === keyB)
  70345. {
  70346. return this;
  70347. }
  70348. if (this.isProcessing)
  70349. {
  70350. this._queue.push({ op: 'moveBelow', keyA: keyA, keyB: keyB });
  70351. }
  70352. else
  70353. {
  70354. var indexA = this.getIndex(keyA);
  70355. var indexB = this.getIndex(keyB);
  70356. if (indexA !== -1 && indexB !== -1)
  70357. {
  70358. var tempScene = this.getAt(indexB);
  70359. // Remove
  70360. this.scenes.splice(indexB, 1);
  70361. if (indexA === 0)
  70362. {
  70363. this.scenes.unshift(tempScene);
  70364. }
  70365. else
  70366. {
  70367. // Add in new location
  70368. this.scenes.splice(indexA, 0, tempScene);
  70369. }
  70370. }
  70371. }
  70372. return this;
  70373. },
  70374. /**
  70375. * Queue a Scene operation for the next update.
  70376. *
  70377. * @method Phaser.Scenes.SceneManager#queueOp
  70378. * @private
  70379. * @since 3.0.0
  70380. *
  70381. * @param {string} op - The operation to perform.
  70382. * @param {(string|Phaser.Scene)} keyA - Scene A.
  70383. * @param {(string|Phaser.Scene)} [keyB] - Scene B.
  70384. *
  70385. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70386. */
  70387. queueOp: function (op, keyA, keyB)
  70388. {
  70389. this._queue.push({ op: op, keyA: keyA, keyB: keyB });
  70390. return this;
  70391. },
  70392. /**
  70393. * Swaps the positions of two Scenes in the Scenes list.
  70394. *
  70395. * @method Phaser.Scenes.SceneManager#swapPosition
  70396. * @since 3.0.0
  70397. *
  70398. * @param {(string|Phaser.Scene)} keyA - The first Scene to swap.
  70399. * @param {(string|Phaser.Scene)} keyB - The second Scene to swap.
  70400. *
  70401. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  70402. */
  70403. swapPosition: function (keyA, keyB)
  70404. {
  70405. if (keyA === keyB)
  70406. {
  70407. return this;
  70408. }
  70409. if (this.isProcessing)
  70410. {
  70411. this._queue.push({ op: 'swapPosition', keyA: keyA, keyB: keyB });
  70412. }
  70413. else
  70414. {
  70415. var indexA = this.getIndex(keyA);
  70416. var indexB = this.getIndex(keyB);
  70417. if (indexA !== indexB && indexA !== -1 && indexB !== -1)
  70418. {
  70419. var tempScene = this.getAt(indexA);
  70420. this.scenes[indexA] = this.scenes[indexB];
  70421. this.scenes[indexB] = tempScene;
  70422. }
  70423. }
  70424. return this;
  70425. },
  70426. /**
  70427. * Dumps debug information about each Scene to the developer console.
  70428. *
  70429. * @method Phaser.Scenes.SceneManager#dump
  70430. * @since 3.2.0
  70431. */
  70432. dump: function ()
  70433. {
  70434. var out = [];
  70435. var map = [ 'pending', 'init', 'start', 'loading', 'creating', 'running', 'paused', 'sleeping', 'shutdown', 'destroyed' ];
  70436. for (var i = 0; i < this.scenes.length; i++)
  70437. {
  70438. var sys = this.scenes[i].sys;
  70439. var key = (sys.settings.visible && (sys.settings.status === CONST.RUNNING || sys.settings.status === CONST.PAUSED)) ? '[*] ' : '[-] ';
  70440. key += sys.settings.key + ' (' + map[sys.settings.status] + ')';
  70441. out.push(key);
  70442. }
  70443. console.log(out.join('\n'));
  70444. },
  70445. /**
  70446. * Destroy the SceneManager and all of its Scene's systems.
  70447. *
  70448. * @method Phaser.Scenes.SceneManager#destroy
  70449. * @since 3.0.0
  70450. */
  70451. destroy: function ()
  70452. {
  70453. for (var i = 0; i < this.scenes.length; i++)
  70454. {
  70455. var sys = this.scenes[i].sys;
  70456. sys.destroy();
  70457. }
  70458. this.update = NOOP;
  70459. this.scenes = [];
  70460. this._pending = [];
  70461. this._start = [];
  70462. this._queue = [];
  70463. this.game = null;
  70464. }
  70465. });
  70466. module.exports = SceneManager;
  70467. /***/ }),
  70468. /* 333 */
  70469. /***/ (function(module, exports, __webpack_require__) {
  70470. /**
  70471. * @author Richard Davey <rich@photonstorm.com>
  70472. * @copyright 2019 Photon Storm Ltd.
  70473. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  70474. */
  70475. var Clamp = __webpack_require__(23);
  70476. var Class = __webpack_require__(0);
  70477. var SnapFloor = __webpack_require__(98);
  70478. var Vector2 = __webpack_require__(3);
  70479. /**
  70480. * @classdesc
  70481. * The Size component allows you to set `width` and `height` properties and define the relationship between them.
  70482. *
  70483. * The component can automatically maintain the aspect ratios between the two values, and clamp them
  70484. * to a defined min-max range. You can also control the dominant axis. When dimensions are given to the Size component
  70485. * that would cause it to exceed its min-max range, the dimensions are adjusted based on the dominant axis.
  70486. *
  70487. * @class Size
  70488. * @memberof Phaser.Structs
  70489. * @constructor
  70490. * @since 3.16.0
  70491. *
  70492. * @param {number} [width=0] - The width of the Size component.
  70493. * @param {number} [height=width] - The height of the Size component. If not given, it will use the `width`.
  70494. * @param {integer} [aspectMode=0] - The aspect mode of the Size component. Defaults to 0, no mode.
  70495. * @param {any} [parent=null] - The parent of this Size component. Can be any object with public `width` and `height` properties. Dimensions are clamped to keep them within the parent bounds where possible.
  70496. */
  70497. var Size = new Class({
  70498. initialize:
  70499. function Size (width, height, aspectMode, parent)
  70500. {
  70501. if (width === undefined) { width = 0; }
  70502. if (height === undefined) { height = width; }
  70503. if (aspectMode === undefined) { aspectMode = 0; }
  70504. if (parent === undefined) { parent = null; }
  70505. /**
  70506. * Internal width value.
  70507. *
  70508. * @name Phaser.Structs.Size#_width
  70509. * @type {number}
  70510. * @private
  70511. * @since 3.16.0
  70512. */
  70513. this._width = width;
  70514. /**
  70515. * Internal height value.
  70516. *
  70517. * @name Phaser.Structs.Size#_height
  70518. * @type {number}
  70519. * @private
  70520. * @since 3.16.0
  70521. */
  70522. this._height = height;
  70523. /**
  70524. * Internal parent reference.
  70525. *
  70526. * @name Phaser.Structs.Size#_parent
  70527. * @type {any}
  70528. * @private
  70529. * @since 3.16.0
  70530. */
  70531. this._parent = parent;
  70532. /**
  70533. * The aspect mode this Size component will use when calculating its dimensions.
  70534. * This property is read-only. To change it use the `setAspectMode` method.
  70535. *
  70536. * @name Phaser.Structs.Size#aspectMode
  70537. * @type {integer}
  70538. * @readonly
  70539. * @since 3.16.0
  70540. */
  70541. this.aspectMode = aspectMode;
  70542. /**
  70543. * The proportional relationship between the width and height.
  70544. *
  70545. * This property is read-only and is updated automatically when either the `width` or `height` properties are changed,
  70546. * depending on the aspect mode.
  70547. *
  70548. * @name Phaser.Structs.Size#aspectRatio
  70549. * @type {number}
  70550. * @readonly
  70551. * @since 3.16.0
  70552. */
  70553. this.aspectRatio = (height === 0) ? 1 : width / height;
  70554. /**
  70555. * The minimum allowed width.
  70556. * Cannot be less than zero.
  70557. * This value is read-only. To change it see the `setMin` method.
  70558. *
  70559. * @name Phaser.Structs.Size#minWidth
  70560. * @type {number}
  70561. * @readonly
  70562. * @since 3.16.0
  70563. */
  70564. this.minWidth = 0;
  70565. /**
  70566. * The minimum allowed height.
  70567. * Cannot be less than zero.
  70568. * This value is read-only. To change it see the `setMin` method.
  70569. *
  70570. * @name Phaser.Structs.Size#minHeight
  70571. * @type {number}
  70572. * @readonly
  70573. * @since 3.16.0
  70574. */
  70575. this.minHeight = 0;
  70576. /**
  70577. * The maximum allowed width.
  70578. * This value is read-only. To change it see the `setMax` method.
  70579. *
  70580. * @name Phaser.Structs.Size#maxWidth
  70581. * @type {number}
  70582. * @readonly
  70583. * @since 3.16.0
  70584. */
  70585. this.maxWidth = Number.MAX_VALUE;
  70586. /**
  70587. * The maximum allowed height.
  70588. * This value is read-only. To change it see the `setMax` method.
  70589. *
  70590. * @name Phaser.Structs.Size#maxHeight
  70591. * @type {number}
  70592. * @readonly
  70593. * @since 3.16.0
  70594. */
  70595. this.maxHeight = Number.MAX_VALUE;
  70596. /**
  70597. * A Vector2 containing the horizontal and vertical snap values, which the width and height are snapped to during resizing.
  70598. *
  70599. * By default this is disabled.
  70600. *
  70601. * This property is read-only. To change it see the `setSnap` method.
  70602. *
  70603. * @name Phaser.Structs.Size#snapTo
  70604. * @type {Phaser.Math.Vector2}
  70605. * @readonly
  70606. * @since 3.16.0
  70607. */
  70608. this.snapTo = new Vector2();
  70609. },
  70610. /**
  70611. * Sets the aspect mode of this Size component.
  70612. *
  70613. * The aspect mode controls what happens when you modify the `width` or `height` properties, or call `setSize`.
  70614. *
  70615. * It can be a number from 0 to 4, or a Size constant:
  70616. *
  70617. * 0. NONE = Do not make the size fit the aspect ratio. Change the ratio when the size changes.
  70618. * 1. WIDTH_CONTROLS_HEIGHT = The height is automatically adjusted based on the width.
  70619. * 2. HEIGHT_CONTROLS_WIDTH = The width is automatically adjusted based on the height.
  70620. * 3. FIT = The width and height are automatically adjusted to fit inside the given target area, while keeping the aspect ratio. Depending on the aspect ratio there may be some space inside the area which is not covered.
  70621. * 4. ENVELOP = The width and height are automatically adjusted to make the size cover the entire target area while keeping the aspect ratio. This may extend further out than the target size.
  70622. *
  70623. * Calling this method automatically recalculates the `width` and the `height`, if required.
  70624. *
  70625. * @method Phaser.Structs.Size#setAspectMode
  70626. * @since 3.16.0
  70627. *
  70628. * @param {integer} [value=0] - The aspect mode value.
  70629. *
  70630. * @return {this} This Size component instance.
  70631. */
  70632. setAspectMode: function (value)
  70633. {
  70634. if (value === undefined) { value = 0; }
  70635. this.aspectMode = value;
  70636. return this.setSize(this._width, this._height);
  70637. },
  70638. /**
  70639. * By setting a Snap To value when this Size component is modified its dimensions will automatically
  70640. * by snapped to the nearest grid slice, using floor. For example, if you have snap value of 16,
  70641. * and the width changes to 68, then it will snap down to 64 (the closest multiple of 16 when floored)
  70642. *
  70643. * Note that snapping takes place before adjustments by the parent, or the min / max settings. If these
  70644. * values are not multiples of the given snap values, then this can result in un-snapped dimensions.
  70645. *
  70646. * Call this method with no arguments to reset the snap values.
  70647. *
  70648. * Calling this method automatically recalculates the `width` and the `height`, if required.
  70649. *
  70650. * @method Phaser.Structs.Size#setSnap
  70651. * @since 3.16.0
  70652. *
  70653. * @param {number} [snapWidth=0] - The amount to snap the width to. If you don't want to snap the width, pass a value of zero.
  70654. * @param {number} [snapHeight=snapWidth] - The amount to snap the height to. If not provided it will use the `snapWidth` value. If you don't want to snap the height, pass a value of zero.
  70655. *
  70656. * @return {this} This Size component instance.
  70657. */
  70658. setSnap: function (snapWidth, snapHeight)
  70659. {
  70660. if (snapWidth === undefined) { snapWidth = 0; }
  70661. if (snapHeight === undefined) { snapHeight = snapWidth; }
  70662. this.snapTo.set(snapWidth, snapHeight);
  70663. return this.setSize(this._width, this._height);
  70664. },
  70665. /**
  70666. * Sets, or clears, the parent of this Size component.
  70667. *
  70668. * To clear the parent call this method with no arguments.
  70669. *
  70670. * The parent influences the maximum extents to which this Size compoent can expand,
  70671. * based on the aspect mode:
  70672. *
  70673. * NONE - The parent clamps both the width and height.
  70674. * WIDTH_CONTROLS_HEIGHT - The parent clamps just the width.
  70675. * HEIGHT_CONTROLS_WIDTH - The parent clamps just the height.
  70676. * FIT - The parent clamps whichever axis is required to ensure the size fits within it.
  70677. * ENVELOP - The parent is used to ensure the size fully envelops the parent.
  70678. *
  70679. * Calling this method automatically calls `setSize`.
  70680. *
  70681. * @method Phaser.Structs.Size#setParent
  70682. * @since 3.16.0
  70683. *
  70684. * @param {any} [parent] - Sets the parent of this Size component. Don't provide a value to clear an existing parent.
  70685. *
  70686. * @return {this} This Size component instance.
  70687. */
  70688. setParent: function (parent)
  70689. {
  70690. this._parent = parent;
  70691. return this.setSize(this._width, this._height);
  70692. },
  70693. /**
  70694. * Set the minimum width and height values this Size component will allow.
  70695. *
  70696. * The minimum values can never be below zero, or greater than the maximum values.
  70697. *
  70698. * Setting this will automatically adjust both the `width` and `height` properties to ensure they are within range.
  70699. *
  70700. * Note that based on the aspect mode, and if this Size component has a parent set or not, the minimums set here
  70701. * _can_ be exceed in some situations.
  70702. *
  70703. * @method Phaser.Structs.Size#setMin
  70704. * @since 3.16.0
  70705. *
  70706. * @param {number} [width=0] - The minimum allowed width of the Size component.
  70707. * @param {number} [height=width] - The minimum allowed height of the Size component. If not given, it will use the `width`.
  70708. *
  70709. * @return {this} This Size component instance.
  70710. */
  70711. setMin: function (width, height)
  70712. {
  70713. if (width === undefined) { width = 0; }
  70714. if (height === undefined) { height = width; }
  70715. this.minWidth = Clamp(width, 0, this.maxWidth);
  70716. this.minHeight = Clamp(height, 0, this.maxHeight);
  70717. return this.setSize(this._width, this._height);
  70718. },
  70719. /**
  70720. * Set the maximum width and height values this Size component will allow.
  70721. *
  70722. * Setting this will automatically adjust both the `width` and `height` properties to ensure they are within range.
  70723. *
  70724. * Note that based on the aspect mode, and if this Size component has a parent set or not, the maximums set here
  70725. * _can_ be exceed in some situations.
  70726. *
  70727. * @method Phaser.Structs.Size#setMax
  70728. * @since 3.16.0
  70729. *
  70730. * @param {number} [width=Number.MAX_VALUE] - The maximum allowed width of the Size component.
  70731. * @param {number} [height=width] - The maximum allowed height of the Size component. If not given, it will use the `width`.
  70732. *
  70733. * @return {this} This Size component instance.
  70734. */
  70735. setMax: function (width, height)
  70736. {
  70737. if (width === undefined) { width = Number.MAX_VALUE; }
  70738. if (height === undefined) { height = width; }
  70739. this.maxWidth = Clamp(width, this.minWidth, Number.MAX_VALUE);
  70740. this.maxHeight = Clamp(height, this.minHeight, Number.MAX_VALUE);
  70741. return this.setSize(this._width, this._height);
  70742. },
  70743. /**
  70744. * Sets the width and height of this Size component based on the aspect mode.
  70745. *
  70746. * If the aspect mode is 'none' then calling this method will change the aspect ratio, otherwise the current
  70747. * aspect ratio is honored across all other modes.
  70748. *
  70749. * If snapTo values have been set then the given width and height are snapped first, prior to any further
  70750. * adjustment via min/max values, or a parent.
  70751. *
  70752. * If minimum and/or maximum dimensions have been specified, the values given to this method will be clamped into
  70753. * that range prior to adjustment, but may still exceed them depending on the aspect mode.
  70754. *
  70755. * If this Size component has a parent set, and the aspect mode is `fit` or `envelop`, then the given sizes will
  70756. * be clamped to the range specified by the parent.
  70757. *
  70758. * @method Phaser.Structs.Size#setSize
  70759. * @since 3.16.0
  70760. *
  70761. * @param {number} [width=0] - The new width of the Size component.
  70762. * @param {number} [height=width] - The new height of the Size component. If not given, it will use the `width`.
  70763. *
  70764. * @return {this} This Size component instance.
  70765. */
  70766. setSize: function (width, height)
  70767. {
  70768. if (width === undefined) { width = 0; }
  70769. if (height === undefined) { height = width; }
  70770. switch (this.aspectMode)
  70771. {
  70772. case Size.NONE:
  70773. this._width = this.getNewWidth(SnapFloor(width, this.snapTo.x));
  70774. this._height = this.getNewHeight(SnapFloor(height, this.snapTo.y));
  70775. this.aspectRatio = (this._height === 0) ? 1 : this._width / this._height;
  70776. break;
  70777. case Size.WIDTH_CONTROLS_HEIGHT:
  70778. this._width = this.getNewWidth(SnapFloor(width, this.snapTo.x));
  70779. this._height = this.getNewHeight(this._width * (1 / this.aspectRatio), false);
  70780. break;
  70781. case Size.HEIGHT_CONTROLS_WIDTH:
  70782. this._height = this.getNewHeight(SnapFloor(height, this.snapTo.y));
  70783. this._width = this.getNewWidth(this._height * this.aspectRatio, false);
  70784. break;
  70785. case Size.FIT:
  70786. this.constrain(width, height, true);
  70787. break;
  70788. case Size.ENVELOP:
  70789. this.constrain(width, height, false);
  70790. break;
  70791. }
  70792. return this;
  70793. },
  70794. /**
  70795. * Sets a new aspect ratio, overriding what was there previously.
  70796. *
  70797. * It then calls `setSize` immediately using the current dimensions.
  70798. *
  70799. * @method Phaser.Structs.Size#setAspectRatio
  70800. * @since 3.16.0
  70801. *
  70802. * @param {number} ratio - The new aspect ratio.
  70803. *
  70804. * @return {this} This Size component instance.
  70805. */
  70806. setAspectRatio: function (ratio)
  70807. {
  70808. this.aspectRatio = ratio;
  70809. return this.setSize(this._width, this._height);
  70810. },
  70811. /**
  70812. * Sets a new width and height for this Size component and updates the aspect ratio based on them.
  70813. *
  70814. * It _doesn't_ change the `aspectMode` and still factors in size limits such as the min max and parent bounds.
  70815. *
  70816. * @method Phaser.Structs.Size#resize
  70817. * @since 3.16.0
  70818. *
  70819. * @param {number} width - The new width of the Size component.
  70820. * @param {number} [height=width] - The new height of the Size component. If not given, it will use the `width`.
  70821. *
  70822. * @return {this} This Size component instance.
  70823. */
  70824. resize: function (width, height)
  70825. {
  70826. this._width = this.getNewWidth(SnapFloor(width, this.snapTo.x));
  70827. this._height = this.getNewHeight(SnapFloor(height, this.snapTo.y));
  70828. this.aspectRatio = (this._height === 0) ? 1 : this._width / this._height;
  70829. return this;
  70830. },
  70831. /**
  70832. * Takes a new width and passes it through the min/max clamp and then checks it doesn't exceed the parent width.
  70833. *
  70834. * @method Phaser.Structs.Size#getNewWidth
  70835. * @since 3.16.0
  70836. *
  70837. * @param {number} value - The value to clamp and check.
  70838. * @param {boolean} [checkParent=true] - Check the given value against the parent, if set.
  70839. *
  70840. * @return {number} The modified width value.
  70841. */
  70842. getNewWidth: function (value, checkParent)
  70843. {
  70844. if (checkParent === undefined) { checkParent = true; }
  70845. value = Clamp(value, this.minWidth, this.maxWidth);
  70846. if (checkParent && this._parent && value > this._parent.width)
  70847. {
  70848. value = Math.max(this.minWidth, this._parent.width);
  70849. }
  70850. return value;
  70851. },
  70852. /**
  70853. * Takes a new height and passes it through the min/max clamp and then checks it doesn't exceed the parent height.
  70854. *
  70855. * @method Phaser.Structs.Size#getNewHeight
  70856. * @since 3.16.0
  70857. *
  70858. * @param {number} value - The value to clamp and check.
  70859. * @param {boolean} [checkParent=true] - Check the given value against the parent, if set.
  70860. *
  70861. * @return {number} The modified height value.
  70862. */
  70863. getNewHeight: function (value, checkParent)
  70864. {
  70865. if (checkParent === undefined) { checkParent = true; }
  70866. value = Clamp(value, this.minHeight, this.maxHeight);
  70867. if (checkParent && this._parent && value > this._parent.height)
  70868. {
  70869. value = Math.max(this.minHeight, this._parent.height);
  70870. }
  70871. return value;
  70872. },
  70873. /**
  70874. * The current `width` and `height` are adjusted to fit inside the given dimensions, while keeping the aspect ratio.
  70875. *
  70876. * If `fit` is true there may be some space inside the target area which is not covered if its aspect ratio differs.
  70877. * If `fit` is false the size may extend further out than the target area if the aspect ratios differ.
  70878. *
  70879. * If this Size component has a parent set, then the width and height passed to this method will be clamped so
  70880. * it cannot exceed that of the parent.
  70881. *
  70882. * @method Phaser.Structs.Size#constrain
  70883. * @since 3.16.0
  70884. *
  70885. * @param {number} [width=0] - The new width of the Size component.
  70886. * @param {number} [height] - The new height of the Size component. If not given, it will use the width value.
  70887. * @param {boolean} [fit=true] - Perform a `fit` (true) constraint, or an `envelop` (false) constraint.
  70888. *
  70889. * @return {this} This Size component instance.
  70890. */
  70891. constrain: function (width, height, fit)
  70892. {
  70893. if (width === undefined) { width = 0; }
  70894. if (height === undefined) { height = width; }
  70895. if (fit === undefined) { fit = true; }
  70896. width = this.getNewWidth(width);
  70897. height = this.getNewHeight(height);
  70898. var snap = this.snapTo;
  70899. var newRatio = (height === 0) ? 1 : width / height;
  70900. if ((fit && this.aspectRatio > newRatio) || (!fit && this.aspectRatio < newRatio))
  70901. {
  70902. // We need to change the height to fit the width
  70903. // height = width / this.aspectRatio;
  70904. width = SnapFloor(width, snap.x);
  70905. height = width / this.aspectRatio;
  70906. if (snap.y > 0)
  70907. {
  70908. height = SnapFloor(height, snap.y);
  70909. // Reduce the width accordingly
  70910. width = height * this.aspectRatio;
  70911. }
  70912. }
  70913. else if ((fit && this.aspectRatio < newRatio) || (!fit && this.aspectRatio > newRatio))
  70914. {
  70915. // We need to change the width to fit the height
  70916. // width = height * this.aspectRatio;
  70917. height = SnapFloor(height, snap.y);
  70918. width = height * this.aspectRatio;
  70919. if (snap.x > 0)
  70920. {
  70921. width = SnapFloor(width, snap.x);
  70922. // Reduce the height accordingly
  70923. height = width * (1 / this.aspectRatio);
  70924. }
  70925. }
  70926. this._width = width;
  70927. this._height = height;
  70928. return this;
  70929. },
  70930. /**
  70931. * The current `width` and `height` are adjusted to fit inside the given dimensions, while keeping the aspect ratio.
  70932. *
  70933. * There may be some space inside the target area which is not covered if its aspect ratio differs.
  70934. *
  70935. * If this Size component has a parent set, then the width and height passed to this method will be clamped so
  70936. * it cannot exceed that of the parent.
  70937. *
  70938. * @method Phaser.Structs.Size#fitTo
  70939. * @since 3.16.0
  70940. *
  70941. * @param {number} [width=0] - The new width of the Size component.
  70942. * @param {number} [height] - The new height of the Size component. If not given, it will use the width value.
  70943. *
  70944. * @return {this} This Size component instance.
  70945. */
  70946. fitTo: function (width, height)
  70947. {
  70948. return this.constrain(width, height, true);
  70949. },
  70950. /**
  70951. * The current `width` and `height` are adjusted so that they fully envlop the given dimensions, while keeping the aspect ratio.
  70952. *
  70953. * The size may extend further out than the target area if the aspect ratios differ.
  70954. *
  70955. * If this Size component has a parent set, then the values are clamped so that it never exceeds the parent
  70956. * on the longest axis.
  70957. *
  70958. * @method Phaser.Structs.Size#envelop
  70959. * @since 3.16.0
  70960. *
  70961. * @param {number} [width=0] - The new width of the Size component.
  70962. * @param {number} [height] - The new height of the Size component. If not given, it will use the width value.
  70963. *
  70964. * @return {this} This Size component instance.
  70965. */
  70966. envelop: function (width, height)
  70967. {
  70968. return this.constrain(width, height, false);
  70969. },
  70970. /**
  70971. * Sets the width of this Size component.
  70972. *
  70973. * Depending on the aspect mode, changing the width may also update the height and aspect ratio.
  70974. *
  70975. * @method Phaser.Structs.Size#setWidth
  70976. * @since 3.16.0
  70977. *
  70978. * @param {number} width - The new width of the Size component.
  70979. *
  70980. * @return {this} This Size component instance.
  70981. */
  70982. setWidth: function (value)
  70983. {
  70984. return this.setSize(value, this._height);
  70985. },
  70986. /**
  70987. * Sets the height of this Size component.
  70988. *
  70989. * Depending on the aspect mode, changing the height may also update the width and aspect ratio.
  70990. *
  70991. * @method Phaser.Structs.Size#setHeight
  70992. * @since 3.16.0
  70993. *
  70994. * @param {number} height - The new height of the Size component.
  70995. *
  70996. * @return {this} This Size component instance.
  70997. */
  70998. setHeight: function (value)
  70999. {
  71000. return this.setSize(this._width, value);
  71001. },
  71002. /**
  71003. * Returns a string representation of this Size component.
  71004. *
  71005. * @method Phaser.Structs.Size#toString
  71006. * @since 3.16.0
  71007. *
  71008. * @return {string} A string representation of this Size component.
  71009. */
  71010. toString: function ()
  71011. {
  71012. return '[{ Size (width=' + this._width + ' height=' + this._height + ' aspectRatio=' + this.aspectRatio + ' aspectMode=' + this.aspectMode + ') }]';
  71013. },
  71014. /**
  71015. * Copies the aspect mode, aspect ratio, width and height from this Size component
  71016. * to the given Size component. Note that the parent, if set, is not copied across.
  71017. *
  71018. * @method Phaser.Structs.Size#copy
  71019. * @since 3.16.0
  71020. *
  71021. * @param {Phaser.Structs.Size} destination - The Size component to copy the values to.
  71022. *
  71023. * @return {Phaser.Structs.Size} The updated destination Size component.
  71024. */
  71025. copy: function (destination)
  71026. {
  71027. destination.setAspectMode(this.aspectMode);
  71028. destination.aspectRatio = this.aspectRatio;
  71029. return destination.setSize(this.width, this.height);
  71030. },
  71031. /**
  71032. * Destroys this Size component.
  71033. *
  71034. * This clears the local properties and any parent object, if set.
  71035. *
  71036. * A destroyed Size component cannot be re-used.
  71037. *
  71038. * @method Phaser.Structs.Size#destroy
  71039. * @since 3.16.0
  71040. */
  71041. destroy: function ()
  71042. {
  71043. this._parent = null;
  71044. this.snapTo = null;
  71045. },
  71046. /**
  71047. * The width of this Size component.
  71048. *
  71049. * This value is clamped to the range specified by `minWidth` and `maxWidth`, if enabled.
  71050. *
  71051. * A width can never be less than zero.
  71052. *
  71053. * Changing this value will automatically update the `height` if the aspect ratio lock is enabled.
  71054. * You can also use the `setWidth` and `getWidth` methods.
  71055. *
  71056. * @name Phaser.Structs.Size#width
  71057. * @type {number}
  71058. * @since 3.16.0
  71059. */
  71060. width: {
  71061. get: function ()
  71062. {
  71063. return this._width;
  71064. },
  71065. set: function (value)
  71066. {
  71067. this.setSize(value, this._height);
  71068. }
  71069. },
  71070. /**
  71071. * The height of this Size component.
  71072. *
  71073. * This value is clamped to the range specified by `minHeight` and `maxHeight`, if enabled.
  71074. *
  71075. * A height can never be less than zero.
  71076. *
  71077. * Changing this value will automatically update the `width` if the aspect ratio lock is enabled.
  71078. * You can also use the `setHeight` and `getHeight` methods.
  71079. *
  71080. * @name Phaser.Structs.Size#height
  71081. * @type {number}
  71082. * @since 3.16.0
  71083. */
  71084. height: {
  71085. get: function ()
  71086. {
  71087. return this._height;
  71088. },
  71089. set: function (value)
  71090. {
  71091. this.setSize(this._width, value);
  71092. }
  71093. }
  71094. });
  71095. /**
  71096. * Do not make the size fit the aspect ratio. Change the ratio when the size changes.
  71097. *
  71098. * @name Phaser.Structs.Size.NONE
  71099. * @constant
  71100. * @type {integer}
  71101. * @since 3.16.0
  71102. */
  71103. Size.NONE = 0;
  71104. /**
  71105. * The height is automatically adjusted based on the width.
  71106. *
  71107. * @name Phaser.Structs.Size.WIDTH_CONTROLS_HEIGHT
  71108. * @constant
  71109. * @type {integer}
  71110. * @since 3.16.0
  71111. */
  71112. Size.WIDTH_CONTROLS_HEIGHT = 1;
  71113. /**
  71114. * The width is automatically adjusted based on the height.
  71115. *
  71116. * @name Phaser.Structs.Size.HEIGHT_CONTROLS_WIDTH
  71117. * @constant
  71118. * @type {integer}
  71119. * @since 3.16.0
  71120. */
  71121. Size.HEIGHT_CONTROLS_WIDTH = 2;
  71122. /**
  71123. * The width and height are automatically adjusted to fit inside the given target area, while keeping the aspect ratio. Depending on the aspect ratio there may be some space inside the area which is not covered.
  71124. *
  71125. * @name Phaser.Structs.Size.FIT
  71126. * @constant
  71127. * @type {integer}
  71128. * @since 3.16.0
  71129. */
  71130. Size.FIT = 3;
  71131. /**
  71132. * The width and height are automatically adjusted to make the size cover the entire target area while keeping the aspect ratio. This may extend further out than the target size.
  71133. *
  71134. * @name Phaser.Structs.Size.ENVELOP
  71135. * @constant
  71136. * @type {integer}
  71137. * @since 3.16.0
  71138. */
  71139. Size.ENVELOP = 4;
  71140. module.exports = Size;
  71141. /***/ }),
  71142. /* 334 */
  71143. /***/ (function(module, exports, __webpack_require__) {
  71144. /**
  71145. * @author Richard Davey <rich@photonstorm.com>
  71146. * @copyright 2019 Photon Storm Ltd.
  71147. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  71148. */
  71149. /**
  71150. * @namespace Phaser.Scale.Events
  71151. */
  71152. module.exports = {
  71153. ENTER_FULLSCREEN: __webpack_require__(951),
  71154. FULLSCREEN_UNSUPPORTED: __webpack_require__(950),
  71155. LEAVE_FULLSCREEN: __webpack_require__(949),
  71156. ORIENTATION_CHANGE: __webpack_require__(948),
  71157. RESIZE: __webpack_require__(947)
  71158. };
  71159. /***/ }),
  71160. /* 335 */
  71161. /***/ (function(module, exports, __webpack_require__) {
  71162. /**
  71163. * @author Richard Davey <rich@photonstorm.com>
  71164. * @copyright 2019 Photon Storm Ltd.
  71165. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  71166. */
  71167. var CONST = __webpack_require__(178);
  71168. var Class = __webpack_require__(0);
  71169. var EventEmitter = __webpack_require__(11);
  71170. var Events = __webpack_require__(334);
  71171. var GameEvents = __webpack_require__(26);
  71172. var GetInnerHeight = __webpack_require__(946);
  71173. var GetTarget = __webpack_require__(345);
  71174. var GetScreenOrientation = __webpack_require__(350);
  71175. var NOOP = __webpack_require__(1);
  71176. var Rectangle = __webpack_require__(10);
  71177. var Size = __webpack_require__(333);
  71178. var SnapFloor = __webpack_require__(98);
  71179. var Vector2 = __webpack_require__(3);
  71180. /**
  71181. * @classdesc
  71182. * The Scale Manager handles the scaling, resizing and alignment of the game canvas.
  71183. *
  71184. * The way scaling is handled is by setting the game canvas to a fixed size, which is defined in the
  71185. * game configuration. You also define the parent container in the game config. If no parent is given,
  71186. * it will default to using the document body. The Scale Manager will then look at the available space
  71187. * within the _parent_ and scale the canvas accordingly. Scaling is handled by setting the canvas CSS
  71188. * width and height properties, leaving the width and height of the canvas element itself untouched.
  71189. * Scaling is therefore achieved by keeping the core canvas the same size and 'stretching'
  71190. * it via its CSS properties. This gives the same result and speed as using the `transform-scale` CSS
  71191. * property, without the need for browser prefix handling.
  71192. *
  71193. * The calculations for the scale are heavily influenced by the bounding parent size, which is the computed
  71194. * dimensions of the canvas's parent. The CSS rules of the parent element play an important role in the
  71195. * operation of the Scale Manager. For example, if the parent has no defined width or height, then actions
  71196. * like auto-centering will fail to achieve the required result. The Scale Manager works in tandem with the
  71197. * CSS you set-up on the page hosting your game, rather than taking control of it.
  71198. *
  71199. * #### Parent and Display canvas containment guidelines:
  71200. *
  71201. * - Style the Parent element (of the game canvas) to control the Parent size and thus the games size and layout.
  71202. *
  71203. * - The Parent element's CSS styles should _effectively_ apply maximum (and minimum) bounding behavior.
  71204. *
  71205. * - The Parent element should _not_ apply a padding as this is not accounted for.
  71206. * If a padding is required apply it to the Parent's parent or apply a margin to the Parent.
  71207. * If you need to add a border, margin or any other CSS around your game container, then use a parent element and
  71208. * apply the CSS to this instead, otherwise you'll be constantly resizing the shape of the game container.
  71209. *
  71210. * - The Display canvas layout CSS styles (i.e. margins, size) should not be altered / specified as
  71211. * they may be updated by the Scale Manager.
  71212. *
  71213. * #### Scale Modes
  71214. *
  71215. * The way the scaling is handled is determined by the `scaleMode` property. The default is `NO_SCALE`,
  71216. * which prevents Phaser from scaling or touching the canvas, or its parent, at all. In this mode, you are
  71217. * responsible for all scaling. The other scaling modes afford you automatic scaling.
  71218. *
  71219. * If you wish to scale your game so that it always fits into the available space within the parent, you
  71220. * should use the scale mode `FIT`. Look at the documentation for other scale modes to see what options are
  71221. * available. Here is a basic config showing how to set this scale mode:
  71222. *
  71223. * ```javascript
  71224. * scale: {
  71225. * parent: 'yourgamediv',
  71226. * mode: Phaser.Scale.FIT,
  71227. * width: 800,
  71228. * height: 600
  71229. * }
  71230. * ```
  71231. *
  71232. * Place the `scale` config object within your game config.
  71233. *
  71234. * If you wish for the canvas to be resized directly, so that the canvas itself fills the available space
  71235. * (i.e. it isn't scaled, it's resized) then use the `RESIZE` scale mode. This will give you a 1:1 mapping
  71236. * of canvas pixels to game size. In this mode CSS isn't used to scale the canvas, it's literally adjusted
  71237. * to fill all available space within the parent. You should be extremely careful about the size of the
  71238. * canvas you're creating when doing this, as the larger the area, the more work the GPU has to do and it's
  71239. * very easy to hit fill-rate limits quickly.
  71240. *
  71241. * For complex, custom-scaling requirements, you should probably consider using the `RESIZE` scale mode,
  71242. * with your own limitations in place re: canvas dimensions and managing the scaling with the game scenes
  71243. * yourself. For the vast majority of games, however, the `FIT` mode is likely to be the most used.
  71244. *
  71245. * Please appreciate that the Scale Manager cannot perform miracles. All it does is scale your game canvas
  71246. * as best it can, based on what it can infer from its surrounding area. There are all kinds of environments
  71247. * where it's up to you to guide and help the canvas position itself, especially when built into rendering
  71248. * frameworks like React and Vue. If your page requires meta tags to prevent user scaling gestures, or such
  71249. * like, then it's up to you to ensure they are present in the html.
  71250. *
  71251. * #### Centering
  71252. *
  71253. * You can also have the game canvas automatically centered. Again, this relies heavily on the parent being
  71254. * properly configured and styled, as the centering offsets are based entirely on the available space
  71255. * within the parent element. Centering is disabled by default, or can be applied horizontally, vertically,
  71256. * or both. Here's an example:
  71257. *
  71258. * ```javascript
  71259. * scale: {
  71260. * parent: 'yourgamediv',
  71261. * autoCenter: Phaser.Scale.CENTER_BOTH,
  71262. * width: 800,
  71263. * height: 600
  71264. * }
  71265. * ```
  71266. *
  71267. * #### Fullscreen API
  71268. *
  71269. * If the browser supports it, you can send your game into fullscreen mode. In this mode, the game will fill
  71270. * the entire display, removing all browser UI and anything else present on the screen. It will remain in this
  71271. * mode until your game either disables it, or until the user tabs out or presses ESCape if on desktop. It's a
  71272. * great way to achieve a desktop-game like experience from the browser, but it does require a modern browser
  71273. * to handle it. Some mobile browsers also support this.
  71274. *
  71275. * @class ScaleManager
  71276. * @memberof Phaser.Scale
  71277. * @extends Phaser.Events.EventEmitter
  71278. * @constructor
  71279. * @since 3.16.0
  71280. *
  71281. * @param {Phaser.Game} game - A reference to the Phaser.Game instance.
  71282. */
  71283. var ScaleManager = new Class({
  71284. Extends: EventEmitter,
  71285. initialize:
  71286. function ScaleManager (game)
  71287. {
  71288. EventEmitter.call(this);
  71289. /**
  71290. * A reference to the Phaser.Game instance.
  71291. *
  71292. * @name Phaser.Scale.ScaleManager#game
  71293. * @type {Phaser.Game}
  71294. * @readonly
  71295. * @since 3.15.0
  71296. */
  71297. this.game = game;
  71298. /**
  71299. * A reference to the HTML Canvas Element that Phaser uses to render the game.
  71300. *
  71301. * @name Phaser.Scale.ScaleManager#canvas
  71302. * @type {HTMLCanvasElement}
  71303. * @since 3.16.0
  71304. */
  71305. this.canvas;
  71306. /**
  71307. * The DOM bounds of the canvas element.
  71308. *
  71309. * @name Phaser.Scale.ScaleManager#canvasBounds
  71310. * @type {Phaser.Geom.Rectangle}
  71311. * @since 3.16.0
  71312. */
  71313. this.canvasBounds = new Rectangle();
  71314. /**
  71315. * The parent object of the Canvas. Often a div, or the browser window, or nothing in non-browser environments.
  71316. *
  71317. * This is set in the Game Config as the `parent` property. If undefined (or just not present), it will default
  71318. * to use the document body. If specifically set to `null` Phaser will ignore all parent operations.
  71319. *
  71320. * @name Phaser.Scale.ScaleManager#parent
  71321. * @type {?any}
  71322. * @since 3.16.0
  71323. */
  71324. this.parent = null;
  71325. /**
  71326. * Is the parent element the browser window?
  71327. *
  71328. * @name Phaser.Scale.ScaleManager#parentIsWindow
  71329. * @type {boolean}
  71330. * @since 3.16.0
  71331. */
  71332. this.parentIsWindow = false;
  71333. /**
  71334. * The Parent Size component.
  71335. *
  71336. * @name Phaser.Scale.ScaleManager#parentSize
  71337. * @type {Phaser.Structs.Size}
  71338. * @since 3.16.0
  71339. */
  71340. this.parentSize = new Size();
  71341. /**
  71342. * The Game Size component.
  71343. *
  71344. * The un-modified game size, as requested in the game config (the raw width / height),
  71345. * as used for world bounds, cameras, etc
  71346. *
  71347. * @name Phaser.Scale.ScaleManager#gameSize
  71348. * @type {Phaser.Structs.Size}
  71349. * @since 3.16.0
  71350. */
  71351. this.gameSize = new Size();
  71352. /**
  71353. * The Base Size component.
  71354. *
  71355. * The modified game size, which is the gameSize * resolution, used to set the canvas width and height
  71356. * (but not the CSS style)
  71357. *
  71358. * @name Phaser.Scale.ScaleManager#baseSize
  71359. * @type {Phaser.Structs.Size}
  71360. * @since 3.16.0
  71361. */
  71362. this.baseSize = new Size();
  71363. /**
  71364. * The Display Size component.
  71365. *
  71366. * The size used for the canvas style, factoring in the scale mode, parent and other values.
  71367. *
  71368. * @name Phaser.Scale.ScaleManager#displaySize
  71369. * @type {Phaser.Structs.Size}
  71370. * @since 3.16.0
  71371. */
  71372. this.displaySize = new Size();
  71373. /**
  71374. * The game scale mode.
  71375. *
  71376. * @name Phaser.Scale.ScaleManager#scaleMode
  71377. * @type {Phaser.Scale.ScaleModeType}
  71378. * @since 3.16.0
  71379. */
  71380. this.scaleMode = CONST.SCALE_MODE.NONE;
  71381. /**
  71382. * The canvas resolution.
  71383. *
  71384. * This is hard-coded to a value of 1 in the 3.16 release of Phaser and will be enabled at a later date.
  71385. *
  71386. * @name Phaser.Scale.ScaleManager#resolution
  71387. * @type {number}
  71388. * @since 3.16.0
  71389. */
  71390. this.resolution = 1;
  71391. /**
  71392. * The game zoom factor.
  71393. *
  71394. * This value allows you to multiply your games base size by the given zoom factor.
  71395. * This is then used when calculating the display size, even in `NO_SCALE` situations.
  71396. * If you don't want Phaser to touch the canvas style at all, this value should be 1.
  71397. *
  71398. * Can also be set to `MAX_ZOOM` in which case the zoom value will be derived based
  71399. * on the game size and available space within the parent.
  71400. *
  71401. * @name Phaser.Scale.ScaleManager#zoom
  71402. * @type {number}
  71403. * @since 3.16.0
  71404. */
  71405. this.zoom = 1;
  71406. /**
  71407. * The scale factor between the baseSize and the canvasBounds.
  71408. *
  71409. * @name Phaser.Scale.ScaleManager#displayScale
  71410. * @type {Phaser.Math.Vector2}
  71411. * @since 3.16.0
  71412. */
  71413. this.displayScale = new Vector2(1, 1);
  71414. /**
  71415. * If set, the canvas sizes will be automatically passed through Math.floor.
  71416. * This results in rounded pixel display values, which is important for performance on legacy
  71417. * and low powered devices, but at the cost of not achieving a 'perfect' fit in some browser windows.
  71418. *
  71419. * @name Phaser.Scale.ScaleManager#autoRound
  71420. * @type {boolean}
  71421. * @since 3.16.0
  71422. */
  71423. this.autoRound = false;
  71424. /**
  71425. * Automatically center the canvas within the parent? The different centering modes are:
  71426. *
  71427. * 1. No centering.
  71428. * 2. Center both horizontally and vertically.
  71429. * 3. Center horizontally.
  71430. * 4. Center vertically.
  71431. *
  71432. * Please be aware that in order to center the game canvas, you must have specified a parent
  71433. * that has a size set, or the canvas parent is the document.body.
  71434. *
  71435. * @name Phaser.Scale.ScaleManager#autoCenter
  71436. * @type {Phaser.Scale.CenterType}
  71437. * @since 3.16.0
  71438. */
  71439. this.autoCenter = CONST.CENTER.NO_CENTER;
  71440. /**
  71441. * The current device orientation.
  71442. *
  71443. * Orientation events are dispatched via the Device Orientation API, typically only on mobile browsers.
  71444. *
  71445. * @name Phaser.Scale.ScaleManager#orientation
  71446. * @type {Phaser.Scale.OrientationType}
  71447. * @since 3.16.0
  71448. */
  71449. this.orientation = CONST.ORIENTATION.LANDSCAPE;
  71450. /**
  71451. * A reference to the Device.Fullscreen object.
  71452. *
  71453. * @name Phaser.Scale.ScaleManager#fullscreen
  71454. * @type {Phaser.Device.Fullscreen}
  71455. * @since 3.16.0
  71456. */
  71457. this.fullscreen;
  71458. /**
  71459. * The DOM Element which is sent into fullscreen mode.
  71460. *
  71461. * @name Phaser.Scale.ScaleManager#fullscreenTarget
  71462. * @type {?any}
  71463. * @since 3.16.0
  71464. */
  71465. this.fullscreenTarget = null;
  71466. /**
  71467. * Did Phaser create the fullscreen target div, or was it provided in the game config?
  71468. *
  71469. * @name Phaser.Scale.ScaleManager#_createdFullscreenTarget
  71470. * @type {boolean}
  71471. * @private
  71472. * @since 3.16.0
  71473. */
  71474. this._createdFullscreenTarget = false;
  71475. /**
  71476. * Internal var that keeps track of the user, or the browser, requesting fullscreen changes.
  71477. *
  71478. * @name Phaser.Scale.ScaleManager#_requestedFullscreenChange
  71479. * @type {boolean}
  71480. * @private
  71481. * @since 3.16.2
  71482. */
  71483. this._requestedFullscreenChange = false;
  71484. /**
  71485. * The dirty state of the Scale Manager.
  71486. * Set if there is a change between the parent size and the current size.
  71487. *
  71488. * @name Phaser.Scale.ScaleManager#dirty
  71489. * @type {boolean}
  71490. * @since 3.16.0
  71491. */
  71492. this.dirty = false;
  71493. /**
  71494. * How many milliseconds should elapse before checking if the browser size has changed?
  71495. *
  71496. * Most modern browsers dispatch a 'resize' event, which the Scale Manager will listen for.
  71497. * However, older browsers fail to do this, or do it consistently, so we fall back to a
  71498. * more traditional 'size check' based on a time interval. You can control how often it is
  71499. * checked here.
  71500. *
  71501. * @name Phaser.Scale.ScaleManager#resizeInterval
  71502. * @type {integer}
  71503. * @since 3.16.0
  71504. */
  71505. this.resizeInterval = 500;
  71506. /**
  71507. * Internal size interval tracker.
  71508. *
  71509. * @name Phaser.Scale.ScaleManager#_lastCheck
  71510. * @type {integer}
  71511. * @private
  71512. * @since 3.16.0
  71513. */
  71514. this._lastCheck = 0;
  71515. /**
  71516. * Internal flag to check orientation state.
  71517. *
  71518. * @name Phaser.Scale.ScaleManager#_checkOrientation
  71519. * @type {boolean}
  71520. * @private
  71521. * @since 3.16.0
  71522. */
  71523. this._checkOrientation = false;
  71524. /**
  71525. * Internal object containing our defined event listeners.
  71526. *
  71527. * @name Phaser.Scale.ScaleManager#listeners
  71528. * @type {object}
  71529. * @private
  71530. * @since 3.16.0
  71531. */
  71532. this.listeners = {
  71533. orientationChange: NOOP,
  71534. windowResize: NOOP,
  71535. fullScreenChange: NOOP,
  71536. fullScreenError: NOOP
  71537. };
  71538. },
  71539. /**
  71540. * Called _before_ the canvas object is created and added to the DOM.
  71541. *
  71542. * @method Phaser.Scale.ScaleManager#preBoot
  71543. * @protected
  71544. * @listens Phaser.Core.Events#BOOT
  71545. * @since 3.16.0
  71546. */
  71547. preBoot: function ()
  71548. {
  71549. // Parse the config to get the scaling values we need
  71550. this.parseConfig(this.game.config);
  71551. this.game.events.once('boot', this.boot, this);
  71552. },
  71553. /**
  71554. * The Boot handler is called by Phaser.Game when it first starts up.
  71555. * The renderer is available by now and the canvas has been added to the DOM.
  71556. *
  71557. * @method Phaser.Scale.ScaleManager#boot
  71558. * @protected
  71559. * @fires Phaser.Scale.Events#RESIZE
  71560. * @since 3.16.0
  71561. */
  71562. boot: function ()
  71563. {
  71564. var game = this.game;
  71565. this.canvas = game.canvas;
  71566. this.fullscreen = game.device.fullscreen;
  71567. if (this.scaleMode !== CONST.SCALE_MODE.RESIZE)
  71568. {
  71569. this.displaySize.setAspectMode(this.scaleMode);
  71570. }
  71571. if (this.scaleMode === CONST.SCALE_MODE.NONE)
  71572. {
  71573. this.resize(this.width, this.height);
  71574. }
  71575. else
  71576. {
  71577. this.getParentBounds();
  71578. // Only set the parent bounds if the parent has an actual size
  71579. if (this.parentSize.width > 0 && this.parentSize.height > 0)
  71580. {
  71581. this.displaySize.setParent(this.parentSize);
  71582. }
  71583. this.refresh();
  71584. }
  71585. game.events.on(GameEvents.PRE_STEP, this.step, this);
  71586. this.startListeners();
  71587. },
  71588. /**
  71589. * Parses the game configuration to set-up the scale defaults.
  71590. *
  71591. * @method Phaser.Scale.ScaleManager#parseConfig
  71592. * @protected
  71593. * @since 3.16.0
  71594. *
  71595. * @param {GameConfig} config - The Game configuration object.
  71596. */
  71597. parseConfig: function (config)
  71598. {
  71599. // Get the parent element, if any
  71600. this.getParent(config);
  71601. // Get the size of the parent element
  71602. // This can often set a height of zero (especially for un-styled divs)
  71603. this.getParentBounds();
  71604. var width = config.width;
  71605. var height = config.height;
  71606. var scaleMode = config.scaleMode;
  71607. var resolution = config.resolution;
  71608. var zoom = config.zoom;
  71609. var autoRound = config.autoRound;
  71610. // If width = '100%', or similar value
  71611. if (typeof width === 'string')
  71612. {
  71613. // If we have a parent with a height, we'll work it out from that
  71614. var parentWidth = this.parentSize.width;
  71615. if (parentWidth === 0)
  71616. {
  71617. parentWidth = window.innerWidth;
  71618. }
  71619. var parentScaleX = parseInt(width, 10) / 100;
  71620. width = Math.floor(parentWidth * parentScaleX);
  71621. }
  71622. // If height = '100%', or similar value
  71623. if (typeof height === 'string')
  71624. {
  71625. // If we have a parent with a height, we'll work it out from that
  71626. var parentHeight = this.parentSize.height;
  71627. if (parentHeight === 0)
  71628. {
  71629. parentHeight = window.innerHeight;
  71630. }
  71631. var parentScaleY = parseInt(height, 10) / 100;
  71632. height = Math.floor(parentHeight * parentScaleY);
  71633. }
  71634. // This is fixed at 1 on purpose.
  71635. // Changing it will break all user input.
  71636. // Wait for another release to solve this issue.
  71637. this.resolution = 1;
  71638. this.scaleMode = scaleMode;
  71639. this.autoRound = autoRound;
  71640. this.autoCenter = config.autoCenter;
  71641. this.resizeInterval = config.resizeInterval;
  71642. if (autoRound)
  71643. {
  71644. width = Math.floor(width);
  71645. height = Math.floor(height);
  71646. }
  71647. // The un-modified game size, as requested in the game config (the raw width / height) as used for world bounds, etc
  71648. this.gameSize.setSize(width, height);
  71649. if (zoom === CONST.ZOOM.MAX_ZOOM)
  71650. {
  71651. zoom = this.getMaxZoom();
  71652. }
  71653. this.zoom = zoom;
  71654. // The modified game size, which is the w/h * resolution
  71655. this.baseSize.setSize(width * resolution, height * resolution);
  71656. if (autoRound)
  71657. {
  71658. this.baseSize.width = Math.floor(this.baseSize.width);
  71659. this.baseSize.height = Math.floor(this.baseSize.height);
  71660. }
  71661. if (config.minWidth > 0)
  71662. {
  71663. this.displaySize.setMin(config.minWidth * zoom, config.minHeight * zoom);
  71664. }
  71665. if (config.maxWidth > 0)
  71666. {
  71667. this.displaySize.setMax(config.maxWidth * zoom, config.maxHeight * zoom);
  71668. }
  71669. // The size used for the canvas style, factoring in the scale mode and parent and zoom value
  71670. // We just use the w/h here as this is what sets the aspect ratio (which doesn't then change)
  71671. this.displaySize.setSize(width, height);
  71672. this.orientation = GetScreenOrientation(width, height);
  71673. },
  71674. /**
  71675. * Determines the parent element of the game canvas, if any, based on the game configuration.
  71676. *
  71677. * @method Phaser.Scale.ScaleManager#getParent
  71678. * @since 3.16.0
  71679. *
  71680. * @param {GameConfig} config - The Game configuration object.
  71681. */
  71682. getParent: function (config)
  71683. {
  71684. var parent = config.parent;
  71685. if (parent === null)
  71686. {
  71687. // User is responsible for managing the parent
  71688. return;
  71689. }
  71690. this.parent = GetTarget(parent);
  71691. this.parentIsWindow = (this.parent === document.body);
  71692. if (config.expandParent && config.scaleMode !== CONST.SCALE_MODE.NONE)
  71693. {
  71694. var DOMRect = this.parent.getBoundingClientRect();
  71695. if (this.parentIsWindow || DOMRect.height === 0)
  71696. {
  71697. document.documentElement.style.height = '100%';
  71698. document.body.style.height = '100%';
  71699. DOMRect = this.parent.getBoundingClientRect();
  71700. // The parent STILL has no height, clearly no CSS
  71701. // has been set on it even though we fixed the body :(
  71702. if (!this.parentIsWindow && DOMRect.height === 0)
  71703. {
  71704. this.parent.style.overflow = 'hidden';
  71705. this.parent.style.width = '100%';
  71706. this.parent.style.height = '100%';
  71707. }
  71708. }
  71709. }
  71710. // And now get the fullscreenTarget
  71711. if (config.fullscreenTarget && !this.fullscreenTarget)
  71712. {
  71713. this.fullscreenTarget = GetTarget(config.fullscreenTarget);
  71714. }
  71715. },
  71716. /**
  71717. * Calculates the size of the parent bounds and updates the `parentSize` component, if the canvas has a dom parent.
  71718. *
  71719. * @method Phaser.Scale.ScaleManager#getParentBounds
  71720. * @since 3.16.0
  71721. *
  71722. * @return {boolean} `true` if the parent bounds have changed size, otherwise `false`.
  71723. */
  71724. getParentBounds: function ()
  71725. {
  71726. if (!this.parent)
  71727. {
  71728. return false;
  71729. }
  71730. var parentSize = this.parentSize;
  71731. // Ref. http://msdn.microsoft.com/en-us/library/hh781509(v=vs.85).aspx for getBoundingClientRect
  71732. var DOMRect = this.parent.getBoundingClientRect();
  71733. if (this.parentIsWindow && this.game.device.os.iOS)
  71734. {
  71735. DOMRect.height = GetInnerHeight(true);
  71736. }
  71737. var resolution = this.resolution;
  71738. var newWidth = DOMRect.width * resolution;
  71739. var newHeight = DOMRect.height * resolution;
  71740. if (parentSize.width !== newWidth || parentSize.height !== newHeight)
  71741. {
  71742. parentSize.setSize(newWidth, newHeight);
  71743. return true;
  71744. }
  71745. else
  71746. {
  71747. return false;
  71748. }
  71749. },
  71750. /**
  71751. * Attempts to lock the orientation of the web browser using the Screen Orientation API.
  71752. *
  71753. * This API is only available on modern mobile browsers.
  71754. * See https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation for details.
  71755. *
  71756. * @method Phaser.Scale.ScaleManager#lockOrientation
  71757. * @since 3.16.0
  71758. *
  71759. * @param {string} orientation - The orientation you'd like to lock the browser in. Should be an API string such as 'landscape', 'landscape-primary', 'portrait', etc.
  71760. *
  71761. * @return {boolean} `true` if the orientation was successfully locked, otherwise `false`.
  71762. */
  71763. lockOrientation: function (orientation)
  71764. {
  71765. var lock = screen.lockOrientation || screen.mozLockOrientation || screen.msLockOrientation;
  71766. if (lock)
  71767. {
  71768. return lock(orientation);
  71769. }
  71770. return false;
  71771. },
  71772. /**
  71773. * This method will set the size of the Parent Size component, which is used in scaling
  71774. * and centering calculations. You only need to call this method if you have explicitly
  71775. * disabled the use of a parent in your game config, but still wish to take advantage of
  71776. * other Scale Manager features.
  71777. *
  71778. * @method Phaser.Scale.ScaleManager#setParentSize
  71779. * @fires Phaser.Scale.Events#RESIZE
  71780. * @since 3.16.0
  71781. *
  71782. * @param {number} width - The new width of the parent.
  71783. * @param {number} height - The new height of the parent.
  71784. *
  71785. * @return {this} The Scale Manager instance.
  71786. */
  71787. setParentSize: function (width, height)
  71788. {
  71789. this.parentSize.setSize(width, height);
  71790. return this.refresh();
  71791. },
  71792. /**
  71793. * This method will set a new size for your game.
  71794. *
  71795. * @method Phaser.Scale.ScaleManager#setGameSize
  71796. * @fires Phaser.Scale.Events#RESIZE
  71797. * @since 3.16.0
  71798. *
  71799. * @param {number} width - The new width of the game.
  71800. * @param {number} height - The new height of the game.
  71801. *
  71802. * @return {this} The Scale Manager instance.
  71803. */
  71804. setGameSize: function (width, height)
  71805. {
  71806. var autoRound = this.autoRound;
  71807. var resolution = this.resolution;
  71808. if (autoRound)
  71809. {
  71810. width = Math.floor(width);
  71811. height = Math.floor(height);
  71812. }
  71813. this.gameSize.resize(width, height);
  71814. this.baseSize.resize(width * resolution, height * resolution);
  71815. this.updateBounds();
  71816. this.displayScale.set(width / this.canvasBounds.width, height / this.canvasBounds.height);
  71817. this.emit(Events.RESIZE, this.gameSize, this.baseSize, this.displaySize, this.resolution);
  71818. this.updateOrientation();
  71819. return this.refresh();
  71820. },
  71821. /**
  71822. * Call this to modify the size of the Phaser canvas element directly.
  71823. * You should only use this if you are using the `NO_SCALE` scale mode,
  71824. * it will update all internal components completely.
  71825. *
  71826. * If all you want to do is change the size of the parent, see the `setParentSize` method.
  71827. *
  71828. * If all you want is to change the base size of the game, but still have the Scale Manager
  71829. * manage all the scaling, then see the `setGameSize` method.
  71830. *
  71831. * This method will set the `gameSize`, `baseSize` and `displaySize` components to the given
  71832. * dimensions. It will then resize the canvas width and height to the values given, by
  71833. * directly setting the properties. Finally, if you have set the Scale Manager zoom value
  71834. * to anything other than 1 (the default), it will set the canvas CSS width and height to
  71835. * be the given size multiplied by the zoom factor (the canvas pixel size remains untouched).
  71836. *
  71837. * If you have enabled `autoCenter`, it is then passed to the `updateCenter` method and
  71838. * the margins are set, allowing the canvas to be centered based on its parent element
  71839. * alone. Finally, the `displayScale` is adjusted and the RESIZE event dispatched.
  71840. *
  71841. * @method Phaser.Scale.ScaleManager#resize
  71842. * @fires Phaser.Scale.Events#RESIZE
  71843. * @since 3.16.0
  71844. *
  71845. * @param {number} width - The new width of the game.
  71846. * @param {number} height - The new height of the game.
  71847. *
  71848. * @return {this} The Scale Manager instance.
  71849. */
  71850. resize: function (width, height)
  71851. {
  71852. var zoom = this.zoom;
  71853. var resolution = this.resolution;
  71854. var autoRound = this.autoRound;
  71855. if (autoRound)
  71856. {
  71857. width = Math.floor(width);
  71858. height = Math.floor(height);
  71859. }
  71860. this.gameSize.resize(width, height);
  71861. this.baseSize.resize(width * resolution, height * resolution);
  71862. this.displaySize.setSize((width * zoom) * resolution, (height * zoom) * resolution);
  71863. this.canvas.width = this.baseSize.width;
  71864. this.canvas.height = this.baseSize.height;
  71865. var style = this.canvas.style;
  71866. var styleWidth = width * zoom;
  71867. var styleHeight = height * zoom;
  71868. if (autoRound)
  71869. {
  71870. styleWidth = Math.floor(styleWidth);
  71871. styleHeight = Math.floor(styleHeight);
  71872. }
  71873. if (styleWidth !== width || styleHeight !== height)
  71874. {
  71875. style.width = styleWidth + 'px';
  71876. style.height = styleHeight + 'px';
  71877. }
  71878. this.getParentBounds();
  71879. this.updateCenter();
  71880. this.updateBounds();
  71881. this.displayScale.set(width / this.canvasBounds.width, height / this.canvasBounds.height);
  71882. this.emit(Events.RESIZE, this.gameSize, this.baseSize, this.displaySize, this.resolution);
  71883. this.updateOrientation();
  71884. return this;
  71885. },
  71886. /**
  71887. * Sets the zoom value of the Scale Manager.
  71888. *
  71889. * @method Phaser.Scale.ScaleManager#setZoom
  71890. * @fires Phaser.Scale.Events#RESIZE
  71891. * @since 3.16.0
  71892. *
  71893. * @param {integer} value - The new zoom value of the game.
  71894. *
  71895. * @return {this} The Scale Manager instance.
  71896. */
  71897. setZoom: function (value)
  71898. {
  71899. this.zoom = value;
  71900. return this.refresh();
  71901. },
  71902. /**
  71903. * Sets the zoom to be the maximum possible based on the _current_ parent size.
  71904. *
  71905. * @method Phaser.Scale.ScaleManager#setMaxZoom
  71906. * @fires Phaser.Scale.Events#RESIZE
  71907. * @since 3.16.0
  71908. *
  71909. * @return {this} The Scale Manager instance.
  71910. */
  71911. setMaxZoom: function ()
  71912. {
  71913. this.zoom = this.getMaxZoom();
  71914. return this.refresh();
  71915. },
  71916. /**
  71917. * Refreshes the internal scale values, bounds sizes and orientation checks.
  71918. *
  71919. * Once finished, dispatches the resize event.
  71920. *
  71921. * This is called automatically by the Scale Manager when the browser window size changes,
  71922. * as long as it is using a Scale Mode other than 'NONE'.
  71923. *
  71924. * @method Phaser.Scale.ScaleManager#refresh
  71925. * @fires Phaser.Scale.Events#RESIZE
  71926. * @since 3.16.0
  71927. *
  71928. * @return {this} The Scale Manager instance.
  71929. */
  71930. refresh: function ()
  71931. {
  71932. this.updateScale();
  71933. this.updateBounds();
  71934. this.updateOrientation();
  71935. this.displayScale.set(this.baseSize.width / this.canvasBounds.width, this.baseSize.height / this.canvasBounds.height);
  71936. this.emit(Events.RESIZE, this.gameSize, this.baseSize, this.displaySize, this.resolution);
  71937. return this;
  71938. },
  71939. /**
  71940. * Internal method that checks the current screen orientation, only if the internal check flag is set.
  71941. *
  71942. * If the orientation has changed it updates the orientation property and then dispatches the orientation change event.
  71943. *
  71944. * @method Phaser.Scale.ScaleManager#updateOrientation
  71945. * @fires Phaser.Scale.Events#ORIENTATION_CHANGE
  71946. * @since 3.16.0
  71947. */
  71948. updateOrientation: function ()
  71949. {
  71950. if (this._checkOrientation)
  71951. {
  71952. this._checkOrientation = false;
  71953. var newOrientation = GetScreenOrientation(this.width, this.height);
  71954. if (newOrientation !== this.orientation)
  71955. {
  71956. this.orientation = newOrientation;
  71957. this.emit(Events.ORIENTATION_CHANGE, newOrientation);
  71958. }
  71959. }
  71960. },
  71961. /**
  71962. * Internal method that manages updating the size components based on the scale mode.
  71963. *
  71964. * @method Phaser.Scale.ScaleManager#updateScale
  71965. * @since 3.16.0
  71966. */
  71967. updateScale: function ()
  71968. {
  71969. var style = this.canvas.style;
  71970. var width = this.gameSize.width;
  71971. var height = this.gameSize.height;
  71972. var styleWidth;
  71973. var styleHeight;
  71974. var zoom = this.zoom;
  71975. var autoRound = this.autoRound;
  71976. var resolution = 1;
  71977. if (this.scaleMode === CONST.SCALE_MODE.NONE)
  71978. {
  71979. // No scale
  71980. this.displaySize.setSize((width * zoom) * resolution, (height * zoom) * resolution);
  71981. styleWidth = this.displaySize.width / resolution;
  71982. styleHeight = this.displaySize.height / resolution;
  71983. if (autoRound)
  71984. {
  71985. styleWidth = Math.floor(styleWidth);
  71986. styleHeight = Math.floor(styleHeight);
  71987. }
  71988. if (zoom > 1)
  71989. {
  71990. style.width = styleWidth + 'px';
  71991. style.height = styleHeight + 'px';
  71992. }
  71993. }
  71994. else if (this.scaleMode === CONST.SCALE_MODE.RESIZE)
  71995. {
  71996. // Resize to match parent
  71997. // This will constrain using min/max
  71998. this.displaySize.setSize(this.parentSize.width, this.parentSize.height);
  71999. this.gameSize.setSize(this.displaySize.width, this.displaySize.height);
  72000. this.baseSize.setSize(this.displaySize.width * resolution, this.displaySize.height * resolution);
  72001. styleWidth = this.displaySize.width / resolution;
  72002. styleHeight = this.displaySize.height / resolution;
  72003. if (autoRound)
  72004. {
  72005. styleWidth = Math.floor(styleWidth);
  72006. styleHeight = Math.floor(styleHeight);
  72007. }
  72008. this.canvas.width = styleWidth;
  72009. this.canvas.height = styleHeight;
  72010. }
  72011. else
  72012. {
  72013. // All other scale modes
  72014. this.displaySize.setSize(this.parentSize.width, this.parentSize.height);
  72015. styleWidth = this.displaySize.width / resolution;
  72016. styleHeight = this.displaySize.height / resolution;
  72017. if (autoRound)
  72018. {
  72019. styleWidth = Math.floor(styleWidth);
  72020. styleHeight = Math.floor(styleHeight);
  72021. }
  72022. style.width = styleWidth + 'px';
  72023. style.height = styleHeight + 'px';
  72024. }
  72025. // Update the parentSize incase the canvas / style change modified it
  72026. this.getParentBounds();
  72027. // Finally, update the centering
  72028. this.updateCenter();
  72029. },
  72030. /**
  72031. * Calculates and returns the largest possible zoom factor, based on the current
  72032. * parent and game sizes. If the parent has no dimensions (i.e. an unstyled div),
  72033. * or is smaller than the un-zoomed game, then this will return a value of 1 (no zoom)
  72034. *
  72035. * @method Phaser.Scale.ScaleManager#getMaxZoom
  72036. * @since 3.16.0
  72037. *
  72038. * @return {integer} The maximum possible zoom factor. At a minimum this value is always at least 1.
  72039. */
  72040. getMaxZoom: function ()
  72041. {
  72042. var zoomH = SnapFloor(this.parentSize.width, this.gameSize.width, 0, true);
  72043. var zoomV = SnapFloor(this.parentSize.height, this.gameSize.height, 0, true);
  72044. return Math.max(Math.min(zoomH, zoomV), 1);
  72045. },
  72046. /**
  72047. * Calculates and updates the canvas CSS style in order to center it within the
  72048. * bounds of its parent. If you have explicitly set parent to be `null` in your
  72049. * game config then this method will likely give incorrect results unless you have called the
  72050. * `setParentSize` method first.
  72051. *
  72052. * It works by modifying the canvas CSS `marginLeft` and `marginTop` properties.
  72053. *
  72054. * If they have already been set by your own style sheet, or code, this will overwrite them.
  72055. *
  72056. * To prevent the Scale Manager from centering the canvas, either do not set the
  72057. * `autoCenter` property in your game config, or make sure it is set to `NO_CENTER`.
  72058. *
  72059. * @method Phaser.Scale.ScaleManager#updateCenter
  72060. * @since 3.16.0
  72061. */
  72062. updateCenter: function ()
  72063. {
  72064. var autoCenter = this.autoCenter;
  72065. if (autoCenter === CONST.CENTER.NO_CENTER)
  72066. {
  72067. return;
  72068. }
  72069. var canvas = this.canvas;
  72070. var style = canvas.style;
  72071. var bounds = canvas.getBoundingClientRect();
  72072. // var width = parseInt(canvas.style.width, 10) || canvas.width;
  72073. // var height = parseInt(canvas.style.height, 10) || canvas.height;
  72074. var width = bounds.width;
  72075. var height = bounds.height;
  72076. var offsetX = Math.floor((this.parentSize.width - width) / 2);
  72077. var offsetY = Math.floor((this.parentSize.height - height) / 2);
  72078. if (autoCenter === CONST.CENTER.CENTER_HORIZONTALLY)
  72079. {
  72080. offsetY = 0;
  72081. }
  72082. else if (autoCenter === CONST.CENTER.CENTER_VERTICALLY)
  72083. {
  72084. offsetX = 0;
  72085. }
  72086. style.marginLeft = offsetX + 'px';
  72087. style.marginTop = offsetY + 'px';
  72088. },
  72089. /**
  72090. * Updates the `canvasBounds` rectangle to match the bounding client rectangle of the
  72091. * canvas element being used to track input events.
  72092. *
  72093. * @method Phaser.Scale.ScaleManager#updateBounds
  72094. * @since 3.16.0
  72095. */
  72096. updateBounds: function ()
  72097. {
  72098. var bounds = this.canvasBounds;
  72099. var clientRect = this.canvas.getBoundingClientRect();
  72100. bounds.x = clientRect.left + (window.pageXOffset || 0) - (document.documentElement.clientLeft || 0);
  72101. bounds.y = clientRect.top + (window.pageYOffset || 0) - (document.documentElement.clientTop || 0);
  72102. bounds.width = clientRect.width;
  72103. bounds.height = clientRect.height;
  72104. },
  72105. /**
  72106. * Transforms the pageX value into the scaled coordinate space of the Scale Manager.
  72107. *
  72108. * @method Phaser.Scale.ScaleManager#transformX
  72109. * @since 3.16.0
  72110. *
  72111. * @param {number} pageX - The DOM pageX value.
  72112. *
  72113. * @return {number} The translated value.
  72114. */
  72115. transformX: function (pageX)
  72116. {
  72117. return (pageX - this.canvasBounds.left) * this.displayScale.x;
  72118. },
  72119. /**
  72120. * Transforms the pageY value into the scaled coordinate space of the Scale Manager.
  72121. *
  72122. * @method Phaser.Scale.ScaleManager#transformY
  72123. * @since 3.16.0
  72124. *
  72125. * @param {number} pageY - The DOM pageY value.
  72126. *
  72127. * @return {number} The translated value.
  72128. */
  72129. transformY: function (pageY)
  72130. {
  72131. return (pageY - this.canvasBounds.top) * this.displayScale.y;
  72132. },
  72133. /**
  72134. * Sends a request to the browser to ask it to go in to full screen mode, using the {@link https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API Fullscreen API}.
  72135. *
  72136. * If the browser does not support this, a `FULLSCREEN_UNSUPPORTED` event will be emitted.
  72137. *
  72138. * This method _must_ be called from a user-input gesture, such as `pointerdown`. You cannot launch
  72139. * games fullscreen without this, as most browsers block it. Games within an iframe will also be blocked
  72140. * from fullscreen unless the iframe has the `allowfullscreen` attribute.
  72141. *
  72142. * Performing an action that navigates to another page, or opens another tab, will automatically cancel
  72143. * fullscreen mode, as will the user pressing the ESC key. To cancel fullscreen mode from your game, i.e.
  72144. * from clicking an icon, call the `stopFullscreen` method.
  72145. *
  72146. * A browser can only send one DOM element into fullscreen. You can control which element this is by
  72147. * setting the `fullscreenTarget` property in your game config, or changing the property in the Scale Manager.
  72148. * Note that the game canvas _must_ be a child of the target. If you do not give a target, Phaser will
  72149. * automatically create a blank `<div>` element and move the canvas into it, before going fullscreen.
  72150. * When it leaves fullscreen, the div will be removed.
  72151. *
  72152. * @method Phaser.Scale.ScaleManager#startFullscreen
  72153. * @fires Phaser.Scale.Events#ENTER_FULLSCREEN
  72154. * @fires Phaser.Scale.Events#FULLSCREEN_UNSUPPORTED
  72155. * @fires Phaser.Scale.Events#RESIZE
  72156. * @since 3.16.0
  72157. *
  72158. * @param {object} [fullscreenOptions] - The FullscreenOptions dictionary is used to provide configuration options when entering full screen.
  72159. */
  72160. startFullscreen: function (fullscreenOptions)
  72161. {
  72162. if (fullscreenOptions === undefined) { fullscreenOptions = { navigationUI: 'hide' }; }
  72163. var fullscreen = this.fullscreen;
  72164. if (!fullscreen.available)
  72165. {
  72166. this.emit(Events.FULLSCREEN_UNSUPPORTED);
  72167. return;
  72168. }
  72169. if (!fullscreen.active)
  72170. {
  72171. var fsTarget = this.getFullscreenTarget();
  72172. this._requestedFullscreenChange = true;
  72173. if (fullscreen.keyboard)
  72174. {
  72175. fsTarget[fullscreen.request](Element.ALLOW_KEYBOARD_INPUT);
  72176. }
  72177. else
  72178. {
  72179. fsTarget[fullscreen.request](fullscreenOptions);
  72180. }
  72181. this.getParentBounds();
  72182. this.refresh();
  72183. this.emit(Events.ENTER_FULLSCREEN);
  72184. }
  72185. },
  72186. /**
  72187. * An internal method that gets the target element that is used when entering fullscreen mode.
  72188. *
  72189. * @method Phaser.Scale.ScaleManager#getFullscreenTarget
  72190. * @since 3.16.0
  72191. *
  72192. * @return {object} The fullscreen target element.
  72193. */
  72194. getFullscreenTarget: function ()
  72195. {
  72196. if (!this.fullscreenTarget)
  72197. {
  72198. var fsTarget = document.createElement('div');
  72199. fsTarget.style.margin = '0';
  72200. fsTarget.style.padding = '0';
  72201. fsTarget.style.width = '100%';
  72202. fsTarget.style.height = '100%';
  72203. this.fullscreenTarget = fsTarget;
  72204. this._createdFullscreenTarget = true;
  72205. }
  72206. if (this._createdFullscreenTarget)
  72207. {
  72208. var canvasParent = this.canvas.parentNode;
  72209. canvasParent.insertBefore(this.fullscreenTarget, this.canvas);
  72210. this.fullscreenTarget.appendChild(this.canvas);
  72211. }
  72212. return this.fullscreenTarget;
  72213. },
  72214. /**
  72215. * Calling this method will cancel fullscreen mode, if the browser has entered it.
  72216. *
  72217. * @method Phaser.Scale.ScaleManager#stopFullscreen
  72218. * @fires Phaser.Scale.Events#LEAVE_FULLSCREEN
  72219. * @fires Phaser.Scale.Events#FULLSCREEN_UNSUPPORTED
  72220. * @since 3.16.0
  72221. */
  72222. stopFullscreen: function ()
  72223. {
  72224. var fullscreen = this.fullscreen;
  72225. if (!fullscreen.available)
  72226. {
  72227. this.emit(Events.FULLSCREEN_UNSUPPORTED);
  72228. return false;
  72229. }
  72230. if (fullscreen.active)
  72231. {
  72232. this._requestedFullscreenChange = true;
  72233. document[fullscreen.cancel]();
  72234. }
  72235. if (this._createdFullscreenTarget)
  72236. {
  72237. var fsTarget = this.fullscreenTarget;
  72238. if (fsTarget && fsTarget.parentNode)
  72239. {
  72240. var parent = fsTarget.parentNode;
  72241. parent.insertBefore(this.canvas, fsTarget);
  72242. parent.removeChild(fsTarget);
  72243. }
  72244. }
  72245. this.emit(Events.LEAVE_FULLSCREEN);
  72246. this.refresh();
  72247. },
  72248. /**
  72249. * Toggles the fullscreen mode. If already in fullscreen, calling this will cancel it.
  72250. * If not in fullscreen, this will request the browser to enter fullscreen mode.
  72251. *
  72252. * If the browser does not support this, a `FULLSCREEN_UNSUPPORTED` event will be emitted.
  72253. *
  72254. * This method _must_ be called from a user-input gesture, such as `pointerdown`. You cannot launch
  72255. * games fullscreen without this, as most browsers block it. Games within an iframe will also be blocked
  72256. * from fullscreen unless the iframe has the `allowfullscreen` attribute.
  72257. *
  72258. * @method Phaser.Scale.ScaleManager#toggleFullscreen
  72259. * @fires Phaser.Scale.Events#ENTER_FULLSCREEN
  72260. * @fires Phaser.Scale.Events#LEAVE_FULLSCREEN
  72261. * @fires Phaser.Scale.Events#FULLSCREEN_UNSUPPORTED
  72262. * @fires Phaser.Scale.Events#RESIZE
  72263. * @since 3.16.0
  72264. *
  72265. * @param {object} [fullscreenOptions] - The FullscreenOptions dictionary is used to provide configuration options when entering full screen.
  72266. */
  72267. toggleFullscreen: function (fullscreenOptions)
  72268. {
  72269. if (this.fullscreen.active)
  72270. {
  72271. this.stopFullscreen();
  72272. }
  72273. else
  72274. {
  72275. this.startFullscreen(fullscreenOptions);
  72276. }
  72277. },
  72278. /**
  72279. * An internal method that starts the different DOM event listeners running.
  72280. *
  72281. * @method Phaser.Scale.ScaleManager#startListeners
  72282. * @since 3.16.0
  72283. */
  72284. startListeners: function ()
  72285. {
  72286. var _this = this;
  72287. var listeners = this.listeners;
  72288. listeners.orientationChange = function ()
  72289. {
  72290. _this._checkOrientation = true;
  72291. _this.dirty = true;
  72292. };
  72293. listeners.windowResize = function ()
  72294. {
  72295. _this.dirty = true;
  72296. };
  72297. // Only dispatched on mobile devices
  72298. window.addEventListener('orientationchange', listeners.orientationChange, false);
  72299. window.addEventListener('resize', listeners.windowResize, false);
  72300. if (this.fullscreen.available)
  72301. {
  72302. listeners.fullScreenChange = function (event)
  72303. {
  72304. return _this.onFullScreenChange(event);
  72305. };
  72306. listeners.fullScreenError = function (event)
  72307. {
  72308. return _this.onFullScreenError(event);
  72309. };
  72310. var vendors = [ 'webkit', 'moz', '' ];
  72311. vendors.forEach(function (prefix)
  72312. {
  72313. document.addEventListener(prefix + 'fullscreenchange', listeners.fullScreenChange, false);
  72314. document.addEventListener(prefix + 'fullscreenerror', listeners.fullScreenError, false);
  72315. });
  72316. // MS Specific
  72317. document.addEventListener('MSFullscreenChange', listeners.fullScreenChange, false);
  72318. document.addEventListener('MSFullscreenError', listeners.fullScreenError, false);
  72319. }
  72320. },
  72321. /**
  72322. * Triggered when a fullscreenchange event is dispatched by the DOM.
  72323. *
  72324. * @method Phaser.Scale.ScaleManager#onFullScreenChange
  72325. * @since 3.16.0
  72326. */
  72327. onFullScreenChange: function ()
  72328. {
  72329. // They pressed ESC while in fullscreen mode
  72330. if (!this._requestedFullscreenChange)
  72331. {
  72332. this.stopFullscreen();
  72333. }
  72334. this._requestedFullscreenChange = false;
  72335. },
  72336. /**
  72337. * Triggered when a fullscreenerror event is dispatched by the DOM.
  72338. *
  72339. * @method Phaser.Scale.ScaleManager#onFullScreenError
  72340. * @since 3.16.0
  72341. */
  72342. onFullScreenError: function ()
  72343. {
  72344. },
  72345. /**
  72346. * Internal method, called automatically by the game step.
  72347. * Monitors the elapsed time and resize interval to see if a parent bounds check needs to take place.
  72348. *
  72349. * @method Phaser.Scale.ScaleManager#step
  72350. * @since 3.16.0
  72351. *
  72352. * @param {number} time - The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now().
  72353. * @param {number} delta - The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class.
  72354. */
  72355. step: function (time, delta)
  72356. {
  72357. if (!this.parent)
  72358. {
  72359. return;
  72360. }
  72361. this._lastCheck += delta;
  72362. if (this.dirty || this._lastCheck > this.resizeInterval)
  72363. {
  72364. // Returns true if the parent bounds have changed size
  72365. if (this.getParentBounds())
  72366. {
  72367. this.refresh();
  72368. }
  72369. this.dirty = false;
  72370. this._lastCheck = 0;
  72371. }
  72372. },
  72373. /**
  72374. * Stops all DOM event listeners.
  72375. *
  72376. * @method Phaser.Scale.ScaleManager#stopListeners
  72377. * @since 3.16.0
  72378. */
  72379. stopListeners: function ()
  72380. {
  72381. var listeners = this.listeners;
  72382. window.removeEventListener('orientationchange', listeners.orientationChange, false);
  72383. window.removeEventListener('resize', listeners.windowResize, false);
  72384. var vendors = [ 'webkit', 'moz', '' ];
  72385. vendors.forEach(function (prefix)
  72386. {
  72387. document.removeEventListener(prefix + 'fullscreenchange', listeners.fullScreenChange, false);
  72388. document.removeEventListener(prefix + 'fullscreenerror', listeners.fullScreenError, false);
  72389. });
  72390. // MS Specific
  72391. document.removeEventListener('MSFullscreenChange', listeners.fullScreenChange, false);
  72392. document.removeEventListener('MSFullscreenError', listeners.fullScreenError, false);
  72393. },
  72394. /**
  72395. * Destroys this Scale Manager, releasing all references to external resources.
  72396. * Once destroyed, the Scale Manager cannot be used again.
  72397. *
  72398. * @method Phaser.Scale.ScaleManager#destroy
  72399. * @since 3.16.0
  72400. */
  72401. destroy: function ()
  72402. {
  72403. this.removeAllListeners();
  72404. this.stopListeners();
  72405. this.game = null;
  72406. this.canvas = null;
  72407. this.canvasBounds = null;
  72408. this.parent = null;
  72409. this.parentSize.destroy();
  72410. this.gameSize.destroy();
  72411. this.baseSize.destroy();
  72412. this.displaySize.destroy();
  72413. this.fullscreenTarget = null;
  72414. },
  72415. /**
  72416. * Is the browser currently in fullscreen mode or not?
  72417. *
  72418. * @name Phaser.Scale.ScaleManager#isFullscreen
  72419. * @type {boolean}
  72420. * @readonly
  72421. * @since 3.16.0
  72422. */
  72423. isFullscreen: {
  72424. get: function ()
  72425. {
  72426. return this.fullscreen.active;
  72427. }
  72428. },
  72429. /**
  72430. * The game width.
  72431. *
  72432. * This is typically the size given in the game configuration.
  72433. *
  72434. * @name Phaser.Scale.ScaleManager#width
  72435. * @type {number}
  72436. * @readonly
  72437. * @since 3.16.0
  72438. */
  72439. width: {
  72440. get: function ()
  72441. {
  72442. return this.gameSize.width;
  72443. }
  72444. },
  72445. /**
  72446. * The game height.
  72447. *
  72448. * This is typically the size given in the game configuration.
  72449. *
  72450. * @name Phaser.Scale.ScaleManager#height
  72451. * @type {number}
  72452. * @readonly
  72453. * @since 3.16.0
  72454. */
  72455. height: {
  72456. get: function ()
  72457. {
  72458. return this.gameSize.height;
  72459. }
  72460. },
  72461. /**
  72462. * Is the device in a portrait orientation as reported by the Orientation API?
  72463. * This value is usually only available on mobile devices.
  72464. *
  72465. * @name Phaser.Scale.ScaleManager#isPortrait
  72466. * @type {boolean}
  72467. * @readonly
  72468. * @since 3.16.0
  72469. */
  72470. isPortrait: {
  72471. get: function ()
  72472. {
  72473. return (this.orientation === CONST.ORIENTATION.PORTRAIT);
  72474. }
  72475. },
  72476. /**
  72477. * Is the device in a landscape orientation as reported by the Orientation API?
  72478. * This value is usually only available on mobile devices.
  72479. *
  72480. * @name Phaser.Scale.ScaleManager#isLandscape
  72481. * @type {boolean}
  72482. * @readonly
  72483. * @since 3.16.0
  72484. */
  72485. isLandscape: {
  72486. get: function ()
  72487. {
  72488. return (this.orientation === CONST.ORIENTATION.LANDSCAPE);
  72489. }
  72490. },
  72491. /**
  72492. * Are the game dimensions portrait? (i.e. taller than they are wide)
  72493. *
  72494. * This is different to the device itself being in a portrait orientation.
  72495. *
  72496. * @name Phaser.Scale.ScaleManager#isGamePortrait
  72497. * @type {boolean}
  72498. * @readonly
  72499. * @since 3.16.0
  72500. */
  72501. isGamePortrait: {
  72502. get: function ()
  72503. {
  72504. return (this.height > this.width);
  72505. }
  72506. },
  72507. /**
  72508. * Are the game dimensions landscape? (i.e. wider than they are tall)
  72509. *
  72510. * This is different to the device itself being in a landscape orientation.
  72511. *
  72512. * @name Phaser.Scale.ScaleManager#isGameLandscape
  72513. * @type {boolean}
  72514. * @readonly
  72515. * @since 3.16.0
  72516. */
  72517. isGameLandscape: {
  72518. get: function ()
  72519. {
  72520. return (this.width > this.height);
  72521. }
  72522. }
  72523. });
  72524. module.exports = ScaleManager;
  72525. /***/ }),
  72526. /* 336 */
  72527. /***/ (function(module, exports, __webpack_require__) {
  72528. /**
  72529. * @author Richard Davey <rich@photonstorm.com>
  72530. * @copyright 2019 Photon Storm Ltd.
  72531. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  72532. */
  72533. var Class = __webpack_require__(0);
  72534. var GameEvents = __webpack_require__(26);
  72535. var EventEmitter = __webpack_require__(11);
  72536. var FileTypesManager = __webpack_require__(7);
  72537. var GameObjectCreator = __webpack_require__(14);
  72538. var GameObjectFactory = __webpack_require__(5);
  72539. var GetFastValue = __webpack_require__(2);
  72540. var PluginCache = __webpack_require__(17);
  72541. var Remove = __webpack_require__(177);
  72542. /**
  72543. * @typedef {object} GlobalPlugin
  72544. *
  72545. * @property {string} key - The unique name of this plugin within the plugin cache.
  72546. * @property {function} plugin - An instance of the plugin.
  72547. * @property {boolean} [active] - Is the plugin active or not?
  72548. * @property {string} [mapping] - If this plugin is to be injected into the Scene Systems, this is the property key map used.
  72549. */
  72550. /**
  72551. * @classdesc
  72552. * The PluginManager is responsible for installing and adding plugins to Phaser.
  72553. *
  72554. * It is a global system and therefore belongs to the Game instance, not a specific Scene.
  72555. *
  72556. * It works in conjunction with the PluginCache. Core internal plugins automatically register themselves
  72557. * with the Cache, but it's the Plugin Manager that is responsible for injecting them into the Scenes.
  72558. *
  72559. * There are two types of plugin:
  72560. *
  72561. * 1. A Global Plugin
  72562. * 2. A Scene Plugin
  72563. *
  72564. * A Global Plugin is a plugin that lives within the Plugin Manager rather than a Scene. You can get
  72565. * access to it by calling `PluginManager.get` and providing a key. Any Scene that requests a plugin in
  72566. * this way will all get access to the same plugin instance, allowing you to use a single plugin across
  72567. * multiple Scenes.
  72568. *
  72569. * A Scene Plugin is a plugin dedicated to running within a Scene. These are different to Global Plugins
  72570. * in that their instances do not live within the Plugin Manager, but within the Scene Systems class instead.
  72571. * And that every Scene created is given its own unique instance of a Scene Plugin. Examples of core Scene
  72572. * Plugins include the Input Plugin, the Tween Plugin and the physics Plugins.
  72573. *
  72574. * You can add a plugin to Phaser in three different ways:
  72575. *
  72576. * 1. Preload it
  72577. * 2. Include it in your source code and install it via the Game Config
  72578. * 3. Include it in your source code and install it within a Scene
  72579. *
  72580. * For examples of all of these approaches please see the Phaser 3 Examples Repo `plugins` folder.
  72581. *
  72582. * For information on creating your own plugin please see the Phaser 3 Plugin Template.
  72583. *
  72584. * @class PluginManager
  72585. * @memberof Phaser.Plugins
  72586. * @constructor
  72587. * @since 3.0.0
  72588. *
  72589. * @param {Phaser.Game} game - The game instance that owns this Plugin Manager.
  72590. */
  72591. var PluginManager = new Class({
  72592. Extends: EventEmitter,
  72593. initialize:
  72594. function PluginManager (game)
  72595. {
  72596. EventEmitter.call(this);
  72597. /**
  72598. * The game instance that owns this Plugin Manager.
  72599. *
  72600. * @name Phaser.Plugins.PluginManager#game
  72601. * @type {Phaser.Game}
  72602. * @since 3.0.0
  72603. */
  72604. this.game = game;
  72605. /**
  72606. * The global plugins currently running and managed by this Plugin Manager.
  72607. * A plugin must have been started at least once in order to appear in this list.
  72608. *
  72609. * @name Phaser.Plugins.PluginManager#plugins
  72610. * @type {GlobalPlugin[]}
  72611. * @since 3.8.0
  72612. */
  72613. this.plugins = [];
  72614. /**
  72615. * A list of plugin keys that should be installed into Scenes as well as the Core Plugins.
  72616. *
  72617. * @name Phaser.Plugins.PluginManager#scenePlugins
  72618. * @type {string[]}
  72619. * @since 3.8.0
  72620. */
  72621. this.scenePlugins = [];
  72622. /**
  72623. * A temporary list of plugins to install when the game has booted.
  72624. *
  72625. * @name Phaser.Plugins.PluginManager#_pendingGlobal
  72626. * @private
  72627. * @type {array}
  72628. * @since 3.8.0
  72629. */
  72630. this._pendingGlobal = [];
  72631. /**
  72632. * A temporary list of scene plugins to install when the game has booted.
  72633. *
  72634. * @name Phaser.Plugins.PluginManager#_pendingScene
  72635. * @private
  72636. * @type {array}
  72637. * @since 3.8.0
  72638. */
  72639. this._pendingScene = [];
  72640. if (game.isBooted)
  72641. {
  72642. this.boot();
  72643. }
  72644. else
  72645. {
  72646. game.events.once(GameEvents.BOOT, this.boot, this);
  72647. }
  72648. },
  72649. /**
  72650. * Run once the game has booted and installs all of the plugins configured in the Game Config.
  72651. *
  72652. * @method Phaser.Plugins.PluginManager#boot
  72653. * @protected
  72654. * @since 3.0.0
  72655. */
  72656. boot: function ()
  72657. {
  72658. var i;
  72659. var entry;
  72660. var key;
  72661. var plugin;
  72662. var start;
  72663. var mapping;
  72664. var data;
  72665. var config = this.game.config;
  72666. // Any plugins to install?
  72667. var list = config.installGlobalPlugins;
  72668. // Any plugins added outside of the game config, but before the game booted?
  72669. list = list.concat(this._pendingGlobal);
  72670. for (i = 0; i < list.length; i++)
  72671. {
  72672. entry = list[i];
  72673. // { key: 'TestPlugin', plugin: TestPlugin, start: true, mapping: 'test', data: { msg: 'The plugin is alive' } }
  72674. key = GetFastValue(entry, 'key', null);
  72675. plugin = GetFastValue(entry, 'plugin', null);
  72676. start = GetFastValue(entry, 'start', false);
  72677. mapping = GetFastValue(entry, 'mapping', null);
  72678. data = GetFastValue(entry, 'data', null);
  72679. if (key && plugin)
  72680. {
  72681. this.install(key, plugin, start, mapping, data);
  72682. }
  72683. }
  72684. // Any scene plugins to install?
  72685. list = config.installScenePlugins;
  72686. // Any plugins added outside of the game config, but before the game booted?
  72687. list = list.concat(this._pendingScene);
  72688. for (i = 0; i < list.length; i++)
  72689. {
  72690. entry = list[i];
  72691. // { key: 'moveSpritePlugin', plugin: MoveSpritePlugin, , mapping: 'move' }
  72692. key = GetFastValue(entry, 'key', null);
  72693. plugin = GetFastValue(entry, 'plugin', null);
  72694. mapping = GetFastValue(entry, 'mapping', null);
  72695. if (key && plugin)
  72696. {
  72697. this.installScenePlugin(key, plugin, mapping);
  72698. }
  72699. }
  72700. this._pendingGlobal = [];
  72701. this._pendingScene = [];
  72702. this.game.events.once(GameEvents.DESTROY, this.destroy, this);
  72703. },
  72704. /**
  72705. * Called by the Scene Systems class. Tells the plugin manager to install all Scene plugins into it.
  72706. *
  72707. * First it will install global references, i.e. references from the Game systems into the Scene Systems (and Scene if mapped.)
  72708. * Then it will install Core Scene Plugins followed by Scene Plugins registered with the PluginManager.
  72709. * Finally it will install any references to Global Plugins that have a Scene mapping property into the Scene itself.
  72710. *
  72711. * @method Phaser.Plugins.PluginManager#addToScene
  72712. * @protected
  72713. * @since 3.8.0
  72714. *
  72715. * @param {Phaser.Scenes.Systems} sys - The Scene Systems class to install all the plugins in to.
  72716. * @param {array} globalPlugins - An array of global plugins to install.
  72717. * @param {array} scenePlugins - An array of scene plugins to install.
  72718. */
  72719. addToScene: function (sys, globalPlugins, scenePlugins)
  72720. {
  72721. var i;
  72722. var pluginKey;
  72723. var pluginList;
  72724. var game = this.game;
  72725. var scene = sys.scene;
  72726. var map = sys.settings.map;
  72727. var isBooted = sys.settings.isBooted;
  72728. // Reference the GlobalPlugins from Game into Scene.Systems
  72729. for (i = 0; i < globalPlugins.length; i++)
  72730. {
  72731. pluginKey = globalPlugins[i];
  72732. if (game[pluginKey])
  72733. {
  72734. sys[pluginKey] = game[pluginKey];
  72735. // Scene level injection
  72736. if (map.hasOwnProperty(pluginKey))
  72737. {
  72738. scene[map[pluginKey]] = sys[pluginKey];
  72739. }
  72740. }
  72741. else if (pluginKey === 'game' && map.hasOwnProperty(pluginKey))
  72742. {
  72743. scene[map[pluginKey]] = game;
  72744. }
  72745. }
  72746. for (var s = 0; s < scenePlugins.length; s++)
  72747. {
  72748. pluginList = scenePlugins[s];
  72749. for (i = 0; i < pluginList.length; i++)
  72750. {
  72751. pluginKey = pluginList[i];
  72752. if (!PluginCache.hasCore(pluginKey))
  72753. {
  72754. continue;
  72755. }
  72756. var source = PluginCache.getCore(pluginKey);
  72757. var plugin = new source.plugin(scene, this);
  72758. sys[source.mapping] = plugin;
  72759. // Scene level injection
  72760. if (source.custom)
  72761. {
  72762. scene[source.mapping] = plugin;
  72763. }
  72764. else if (map.hasOwnProperty(source.mapping))
  72765. {
  72766. scene[map[source.mapping]] = plugin;
  72767. }
  72768. // Scene is already booted, usually because this method is being called at run-time, so boot the plugin
  72769. if (isBooted)
  72770. {
  72771. plugin.boot();
  72772. }
  72773. }
  72774. }
  72775. // And finally, inject any 'global scene plugins'
  72776. pluginList = this.plugins;
  72777. for (i = 0; i < pluginList.length; i++)
  72778. {
  72779. var entry = pluginList[i];
  72780. if (entry.mapping)
  72781. {
  72782. scene[entry.mapping] = entry.plugin;
  72783. }
  72784. }
  72785. },
  72786. /**
  72787. * Called by the Scene Systems class. Returns a list of plugins to be installed.
  72788. *
  72789. * @method Phaser.Plugins.PluginManager#getDefaultScenePlugins
  72790. * @protected
  72791. * @since 3.8.0
  72792. *
  72793. * @return {string[]} A list keys of all the Scene Plugins to install.
  72794. */
  72795. getDefaultScenePlugins: function ()
  72796. {
  72797. var list = this.game.config.defaultPlugins;
  72798. // Merge in custom Scene plugins
  72799. list = list.concat(this.scenePlugins);
  72800. return list;
  72801. },
  72802. /**
  72803. * Installs a new Scene Plugin into the Plugin Manager and optionally adds it
  72804. * to the given Scene as well. A Scene Plugin added to the manager in this way
  72805. * will be automatically installed into all new Scenes using the key and mapping given.
  72806. *
  72807. * The `key` property is what the plugin is injected into Scene.Systems as.
  72808. * The `mapping` property is optional, and if specified is what the plugin is installed into
  72809. * the Scene as. For example:
  72810. *
  72811. * ```javascript
  72812. * this.plugins.installScenePlugin('powerupsPlugin', pluginCode, 'powerups');
  72813. *
  72814. * // and from within the scene:
  72815. * this.sys.powerupsPlugin; // key value
  72816. * this.powerups; // mapping value
  72817. * ```
  72818. *
  72819. * This method is called automatically by Phaser if you install your plugins using either the
  72820. * Game Configuration object, or by preloading them via the Loader.
  72821. *
  72822. * @method Phaser.Plugins.PluginManager#installScenePlugin
  72823. * @since 3.8.0
  72824. *
  72825. * @param {string} key - The property key that will be used to add this plugin to Scene.Systems.
  72826. * @param {function} plugin - The plugin code. This should be the non-instantiated version.
  72827. * @param {string} [mapping] - If this plugin is injected into the Phaser.Scene class, this is the property key to use.
  72828. * @param {Phaser.Scene} [addToScene] - Optionally automatically add this plugin to the given Scene.
  72829. */
  72830. installScenePlugin: function (key, plugin, mapping, addToScene)
  72831. {
  72832. if (typeof plugin !== 'function')
  72833. {
  72834. console.warn('Invalid Scene Plugin: ' + key);
  72835. return;
  72836. }
  72837. if (PluginCache.hasCore(key))
  72838. {
  72839. console.warn('Scene Plugin key in use: ' + key);
  72840. return;
  72841. }
  72842. PluginCache.register(key, plugin, mapping, true);
  72843. this.scenePlugins.push(key);
  72844. if (addToScene)
  72845. {
  72846. var instance = new plugin(addToScene, this);
  72847. addToScene.sys[key] = instance;
  72848. if (mapping && mapping !== '')
  72849. {
  72850. addToScene[mapping] = instance;
  72851. }
  72852. instance.boot();
  72853. }
  72854. },
  72855. /**
  72856. * Installs a new Global Plugin into the Plugin Manager and optionally starts it running.
  72857. * A global plugin belongs to the Plugin Manager, rather than a specific Scene, and can be accessed
  72858. * and used by all Scenes in your game.
  72859. *
  72860. * The `key` property is what you use to access this plugin from the Plugin Manager.
  72861. *
  72862. * ```javascript
  72863. * this.plugins.install('powerupsPlugin', pluginCode);
  72864. *
  72865. * // and from within the scene:
  72866. * this.plugins.get('powerupsPlugin');
  72867. * ```
  72868. *
  72869. * This method is called automatically by Phaser if you install your plugins using either the
  72870. * Game Configuration object, or by preloading them via the Loader.
  72871. *
  72872. * The same plugin can be installed multiple times into the Plugin Manager by simply giving each
  72873. * instance its own unique key.
  72874. *
  72875. * @method Phaser.Plugins.PluginManager#install
  72876. * @since 3.8.0
  72877. *
  72878. * @param {string} key - The unique handle given to this plugin within the Plugin Manager.
  72879. * @param {function} plugin - The plugin code. This should be the non-instantiated version.
  72880. * @param {boolean} [start=false] - Automatically start the plugin running? This is always `true` if you provide a mapping value.
  72881. * @param {string} [mapping] - If this plugin is injected into the Phaser.Scene class, this is the property key to use.
  72882. * @param {any} [data] - A value passed to the plugin's `init` method.
  72883. *
  72884. * @return {?Phaser.Plugins.BasePlugin} The plugin that was started, or `null` if `start` was false, or game isn't yet booted.
  72885. */
  72886. install: function (key, plugin, start, mapping, data)
  72887. {
  72888. if (start === undefined) { start = false; }
  72889. if (mapping === undefined) { mapping = null; }
  72890. if (data === undefined) { data = null; }
  72891. if (typeof plugin !== 'function')
  72892. {
  72893. console.warn('Invalid Plugin: ' + key);
  72894. return null;
  72895. }
  72896. if (PluginCache.hasCustom(key))
  72897. {
  72898. console.warn('Plugin key in use: ' + key);
  72899. return null;
  72900. }
  72901. if (mapping !== null)
  72902. {
  72903. start = true;
  72904. }
  72905. if (!this.game.isBooted)
  72906. {
  72907. this._pendingGlobal.push({ key: key, plugin: plugin, start: start, mapping: mapping, data: data });
  72908. }
  72909. else
  72910. {
  72911. // Add it to the plugin store
  72912. PluginCache.registerCustom(key, plugin, mapping, data);
  72913. if (start)
  72914. {
  72915. return this.start(key);
  72916. }
  72917. }
  72918. return null;
  72919. },
  72920. /**
  72921. * Gets an index of a global plugin based on the given key.
  72922. *
  72923. * @method Phaser.Plugins.PluginManager#getIndex
  72924. * @protected
  72925. * @since 3.8.0
  72926. *
  72927. * @param {string} key - The unique plugin key.
  72928. *
  72929. * @return {integer} The index of the plugin within the plugins array.
  72930. */
  72931. getIndex: function (key)
  72932. {
  72933. var list = this.plugins;
  72934. for (var i = 0; i < list.length; i++)
  72935. {
  72936. var entry = list[i];
  72937. if (entry.key === key)
  72938. {
  72939. return i;
  72940. }
  72941. }
  72942. return -1;
  72943. },
  72944. /**
  72945. * Gets a global plugin based on the given key.
  72946. *
  72947. * @method Phaser.Plugins.PluginManager#getEntry
  72948. * @protected
  72949. * @since 3.8.0
  72950. *
  72951. * @param {string} key - The unique plugin key.
  72952. *
  72953. * @return {GlobalPlugin} The plugin entry.
  72954. */
  72955. getEntry: function (key)
  72956. {
  72957. var idx = this.getIndex(key);
  72958. if (idx !== -1)
  72959. {
  72960. return this.plugins[idx];
  72961. }
  72962. },
  72963. /**
  72964. * Checks if the given global plugin, based on its key, is active or not.
  72965. *
  72966. * @method Phaser.Plugins.PluginManager#isActive
  72967. * @since 3.8.0
  72968. *
  72969. * @param {string} key - The unique plugin key.
  72970. *
  72971. * @return {boolean} `true` if the plugin is active, otherwise `false`.
  72972. */
  72973. isActive: function (key)
  72974. {
  72975. var entry = this.getEntry(key);
  72976. return (entry && entry.active);
  72977. },
  72978. /**
  72979. * Starts a global plugin running.
  72980. *
  72981. * If the plugin was previously active then calling `start` will reset it to an active state and then
  72982. * call its `start` method.
  72983. *
  72984. * If the plugin has never been run before a new instance of it will be created within the Plugin Manager,
  72985. * its active state set and then both of its `init` and `start` methods called, in that order.
  72986. *
  72987. * If the plugin is already running under the given key then nothing happens.
  72988. *
  72989. * @method Phaser.Plugins.PluginManager#start
  72990. * @since 3.8.0
  72991. *
  72992. * @param {string} key - The key of the plugin to start.
  72993. * @param {string} [runAs] - Run the plugin under a new key. This allows you to run one plugin multiple times.
  72994. *
  72995. * @return {?Phaser.Plugins.BasePlugin} The plugin that was started, or `null` if invalid key given or plugin is already stopped.
  72996. */
  72997. start: function (key, runAs)
  72998. {
  72999. if (runAs === undefined) { runAs = key; }
  73000. var entry = this.getEntry(runAs);
  73001. // Plugin already running under this key?
  73002. if (entry && !entry.active)
  73003. {
  73004. // It exists, we just need to start it up again
  73005. entry.active = true;
  73006. entry.plugin.start();
  73007. }
  73008. else if (!entry)
  73009. {
  73010. entry = this.createEntry(key, runAs);
  73011. }
  73012. return (entry) ? entry.plugin : null;
  73013. },
  73014. /**
  73015. * Creates a new instance of a global plugin, adds an entry into the plugins array and returns it.
  73016. *
  73017. * @method Phaser.Plugins.PluginManager#createEntry
  73018. * @private
  73019. * @since 3.9.0
  73020. *
  73021. * @param {string} key - The key of the plugin to create an instance of.
  73022. * @param {string} [runAs] - Run the plugin under a new key. This allows you to run one plugin multiple times.
  73023. *
  73024. * @return {?Phaser.Plugins.BasePlugin} The plugin that was started, or `null` if invalid key given.
  73025. */
  73026. createEntry: function (key, runAs)
  73027. {
  73028. var entry = PluginCache.getCustom(key);
  73029. if (entry)
  73030. {
  73031. var instance = new entry.plugin(this);
  73032. entry = {
  73033. key: runAs,
  73034. plugin: instance,
  73035. active: true,
  73036. mapping: entry.mapping,
  73037. data: entry.data
  73038. };
  73039. this.plugins.push(entry);
  73040. instance.init(entry.data);
  73041. instance.start();
  73042. }
  73043. return entry;
  73044. },
  73045. /**
  73046. * Stops a global plugin from running.
  73047. *
  73048. * If the plugin is active then its active state will be set to false and the plugins `stop` method
  73049. * will be called.
  73050. *
  73051. * If the plugin is not already running, nothing will happen.
  73052. *
  73053. * @method Phaser.Plugins.PluginManager#stop
  73054. * @since 3.8.0
  73055. *
  73056. * @param {string} key - The key of the plugin to stop.
  73057. *
  73058. * @return {Phaser.Plugins.PluginManager} The Plugin Manager.
  73059. */
  73060. stop: function (key)
  73061. {
  73062. var entry = this.getEntry(key);
  73063. if (entry && entry.active)
  73064. {
  73065. entry.active = false;
  73066. entry.plugin.stop();
  73067. }
  73068. return this;
  73069. },
  73070. /**
  73071. * Gets a global plugin from the Plugin Manager based on the given key and returns it.
  73072. *
  73073. * If it cannot find an active plugin based on the key, but there is one in the Plugin Cache with the same key,
  73074. * then it will create a new instance of the cached plugin and return that.
  73075. *
  73076. * @method Phaser.Plugins.PluginManager#get
  73077. * @since 3.8.0
  73078. *
  73079. * @param {string} key - The key of the plugin to get.
  73080. * @param {boolean} [autoStart=true] - Automatically start a new instance of the plugin if found in the cache, but not actively running.
  73081. *
  73082. * @return {?(Phaser.Plugins.BasePlugin|function)} The plugin, or `null` if no plugin was found matching the key.
  73083. */
  73084. get: function (key, autoStart)
  73085. {
  73086. if (autoStart === undefined) { autoStart = true; }
  73087. var entry = this.getEntry(key);
  73088. if (entry)
  73089. {
  73090. return entry.plugin;
  73091. }
  73092. else
  73093. {
  73094. var plugin = this.getClass(key);
  73095. if (plugin && autoStart)
  73096. {
  73097. entry = this.createEntry(key, key);
  73098. return (entry) ? entry.plugin : null;
  73099. }
  73100. else if (plugin)
  73101. {
  73102. return plugin;
  73103. }
  73104. }
  73105. return null;
  73106. },
  73107. /**
  73108. * Returns the plugin class from the cache.
  73109. * Used internally by the Plugin Manager.
  73110. *
  73111. * @method Phaser.Plugins.PluginManager#getClass
  73112. * @since 3.8.0
  73113. *
  73114. * @param {string} key - The key of the plugin to get.
  73115. *
  73116. * @return {Phaser.Plugins.BasePlugin} A Plugin object
  73117. */
  73118. getClass: function (key)
  73119. {
  73120. return PluginCache.getCustomClass(key);
  73121. },
  73122. /**
  73123. * Removes a global plugin from the Plugin Manager and Plugin Cache.
  73124. *
  73125. * It is up to you to remove all references to this plugin that you may hold within your game code.
  73126. *
  73127. * @method Phaser.Plugins.PluginManager#removeGlobalPlugin
  73128. * @since 3.8.0
  73129. *
  73130. * @param {string} key - The key of the plugin to remove.
  73131. */
  73132. removeGlobalPlugin: function (key)
  73133. {
  73134. var entry = this.getEntry(key);
  73135. if (entry)
  73136. {
  73137. Remove(this.plugins, entry);
  73138. }
  73139. PluginCache.removeCustom(key);
  73140. },
  73141. /**
  73142. * Removes a scene plugin from the Plugin Manager and Plugin Cache.
  73143. *
  73144. * This will not remove the plugin from any active Scenes that are already using it.
  73145. *
  73146. * It is up to you to remove all references to this plugin that you may hold within your game code.
  73147. *
  73148. * @method Phaser.Plugins.PluginManager#removeScenePlugin
  73149. * @since 3.8.0
  73150. *
  73151. * @param {string} key - The key of the plugin to remove.
  73152. */
  73153. removeScenePlugin: function (key)
  73154. {
  73155. Remove(this.scenePlugins, key);
  73156. PluginCache.remove(key);
  73157. },
  73158. /**
  73159. * Registers a new type of Game Object with the global Game Object Factory and / or Creator.
  73160. * This is usually called from within your Plugin code and is a helpful short-cut for creating
  73161. * new Game Objects.
  73162. *
  73163. * The key is the property that will be injected into the factories and used to create the
  73164. * Game Object. For example:
  73165. *
  73166. * ```javascript
  73167. * this.plugins.registerGameObject('clown', clownFactoryCallback, clownCreatorCallback);
  73168. * // later in your game code:
  73169. * this.add.clown();
  73170. * this.make.clown();
  73171. * ```
  73172. *
  73173. * The callbacks are what are called when the factories try to create a Game Object
  73174. * matching the given key. It's important to understand that the callbacks are invoked within
  73175. * the context of the GameObjectFactory. In this context there are several properties available
  73176. * to use:
  73177. *
  73178. * this.scene - A reference to the Scene that owns the GameObjectFactory.
  73179. * this.displayList - A reference to the Display List the Scene owns.
  73180. * this.updateList - A reference to the Update List the Scene owns.
  73181. *
  73182. * See the GameObjectFactory and GameObjectCreator classes for more details.
  73183. * Any public property or method listed is available from your callbacks under `this`.
  73184. *
  73185. * @method Phaser.Plugins.PluginManager#registerGameObject
  73186. * @since 3.8.0
  73187. *
  73188. * @param {string} key - The key of the Game Object that the given callbacks will create, i.e. `image`, `sprite`.
  73189. * @param {function} [factoryCallback] - The callback to invoke when the Game Object Factory is called.
  73190. * @param {function} [creatorCallback] - The callback to invoke when the Game Object Creator is called.
  73191. */
  73192. registerGameObject: function (key, factoryCallback, creatorCallback)
  73193. {
  73194. if (factoryCallback)
  73195. {
  73196. GameObjectFactory.register(key, factoryCallback);
  73197. }
  73198. if (creatorCallback)
  73199. {
  73200. GameObjectCreator.register(key, creatorCallback);
  73201. }
  73202. return this;
  73203. },
  73204. /**
  73205. * Registers a new file type with the global File Types Manager, making it available to all Loader
  73206. * Plugins created after this.
  73207. *
  73208. * This is usually called from within your Plugin code and is a helpful short-cut for creating
  73209. * new loader file types.
  73210. *
  73211. * The key is the property that will be injected into the Loader Plugin and used to load the
  73212. * files. For example:
  73213. *
  73214. * ```javascript
  73215. * this.plugins.registerFileType('wad', doomWadLoaderCallback);
  73216. * // later in your preload code:
  73217. * this.load.wad();
  73218. * ```
  73219. *
  73220. * The callback is what is called when the loader tries to load a file matching the given key.
  73221. * It's important to understand that the callback is invoked within
  73222. * the context of the LoaderPlugin. In this context there are several properties / methods available
  73223. * to use:
  73224. *
  73225. * this.addFile - A method to add the new file to the load queue.
  73226. * this.scene - The Scene that owns the Loader Plugin instance.
  73227. *
  73228. * See the LoaderPlugin class for more details. Any public property or method listed is available from
  73229. * your callback under `this`.
  73230. *
  73231. * @method Phaser.Plugins.PluginManager#registerFileType
  73232. * @since 3.8.0
  73233. *
  73234. * @param {string} key - The key of the Game Object that the given callbacks will create, i.e. `image`, `sprite`.
  73235. * @param {function} callback - The callback to invoke when the Game Object Factory is called.
  73236. * @param {Phaser.Scene} [addToScene] - Optionally add this file type into the Loader Plugin owned by the given Scene.
  73237. */
  73238. registerFileType: function (key, callback, addToScene)
  73239. {
  73240. FileTypesManager.register(key, callback);
  73241. if (addToScene && addToScene.sys.load)
  73242. {
  73243. addToScene.sys.load[key] = callback;
  73244. }
  73245. },
  73246. /**
  73247. * Destroys this Plugin Manager and all associated plugins.
  73248. * It will iterate all plugins found and call their `destroy` methods.
  73249. *
  73250. * The PluginCache will remove all custom plugins.
  73251. *
  73252. * @method Phaser.Plugins.PluginManager#destroy
  73253. * @since 3.8.0
  73254. */
  73255. destroy: function ()
  73256. {
  73257. for (var i = 0; i < this.plugins.length; i++)
  73258. {
  73259. this.plugins[i].plugin.destroy();
  73260. }
  73261. PluginCache.destroyCustomPlugins();
  73262. if (this.game.noReturn)
  73263. {
  73264. PluginCache.destroyCorePlugins();
  73265. }
  73266. this.game = null;
  73267. this.plugins = [];
  73268. this.scenePlugins = [];
  73269. }
  73270. });
  73271. /*
  73272. * "Sometimes, the elegant implementation is just a function.
  73273. * Not a method. Not a class. Not a framework. Just a function."
  73274. * -- John Carmack
  73275. */
  73276. module.exports = PluginManager;
  73277. /***/ }),
  73278. /* 337 */
  73279. /***/ (function(module, exports, __webpack_require__) {
  73280. /**
  73281. * @author Richard Davey <rich@photonstorm.com>
  73282. * @copyright 2019 Photon Storm Ltd.
  73283. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  73284. */
  73285. var Class = __webpack_require__(0);
  73286. var InputEvents = __webpack_require__(52);
  73287. var NOOP = __webpack_require__(1);
  73288. // https://developer.mozilla.org/en-US/docs/Web/API/Touch_events
  73289. // https://patrickhlauke.github.io/touch/tests/results/
  73290. // https://www.html5rocks.com/en/mobile/touch/
  73291. /**
  73292. * @classdesc
  73293. * The Touch Manager is a helper class that belongs to the Input Manager.
  73294. *
  73295. * Its role is to listen for native DOM Touch Events and then pass them onto the Input Manager for further processing.
  73296. *
  73297. * You do not need to create this class directly, the Input Manager will create an instance of it automatically.
  73298. *
  73299. * @class TouchManager
  73300. * @memberof Phaser.Input.Touch
  73301. * @constructor
  73302. * @since 3.0.0
  73303. *
  73304. * @param {Phaser.Input.InputManager} inputManager - A reference to the Input Manager.
  73305. */
  73306. var TouchManager = new Class({
  73307. initialize:
  73308. function TouchManager (inputManager)
  73309. {
  73310. /**
  73311. * A reference to the Input Manager.
  73312. *
  73313. * @name Phaser.Input.Touch.TouchManager#manager
  73314. * @type {Phaser.Input.InputManager}
  73315. * @since 3.0.0
  73316. */
  73317. this.manager = inputManager;
  73318. /**
  73319. * If true the DOM events will have event.preventDefault applied to them, if false they will propagate fully.
  73320. *
  73321. * @name Phaser.Input.Touch.TouchManager#capture
  73322. * @type {boolean}
  73323. * @default true
  73324. * @since 3.0.0
  73325. */
  73326. this.capture = true;
  73327. /**
  73328. * A boolean that controls if the Touch Manager is enabled or not.
  73329. * Can be toggled on the fly.
  73330. *
  73331. * @name Phaser.Input.Touch.TouchManager#enabled
  73332. * @type {boolean}
  73333. * @default false
  73334. * @since 3.0.0
  73335. */
  73336. this.enabled = false;
  73337. /**
  73338. * The Touch Event target, as defined in the Game Config.
  73339. * Typically the canvas to which the game is rendering, but can be any interactive DOM element.
  73340. *
  73341. * @name Phaser.Input.Touch.TouchManager#target
  73342. * @type {any}
  73343. * @since 3.0.0
  73344. */
  73345. this.target;
  73346. /**
  73347. * The Touch Start event handler function.
  73348. * Initially empty and bound in the `startListeners` method.
  73349. *
  73350. * @name Phaser.Input.Touch.TouchManager#onTouchStart
  73351. * @type {function}
  73352. * @since 3.0.0
  73353. */
  73354. this.onTouchStart = NOOP;
  73355. /**
  73356. * The Touch Move event handler function.
  73357. * Initially empty and bound in the `startListeners` method.
  73358. *
  73359. * @name Phaser.Input.Touch.TouchManager#onTouchMove
  73360. * @type {function}
  73361. * @since 3.0.0
  73362. */
  73363. this.onTouchMove = NOOP;
  73364. /**
  73365. * The Touch End event handler function.
  73366. * Initially empty and bound in the `startListeners` method.
  73367. *
  73368. * @name Phaser.Input.Touch.TouchManager#onTouchEnd
  73369. * @type {function}
  73370. * @since 3.0.0
  73371. */
  73372. this.onTouchEnd = NOOP;
  73373. /**
  73374. * The Touch Cancel event handler function.
  73375. * Initially empty and bound in the `startListeners` method.
  73376. *
  73377. * @name Phaser.Input.Touch.TouchManager#onTouchCancel
  73378. * @type {function}
  73379. * @since 3.15.0
  73380. */
  73381. this.onTouchCancel = NOOP;
  73382. /**
  73383. * The Touch Over event handler function.
  73384. * Initially empty and bound in the `startListeners` method.
  73385. *
  73386. * @name Phaser.Input.Touch.TouchManager#onTouchOver
  73387. * @type {function}
  73388. * @since 3.16.0
  73389. */
  73390. this.onTouchOver = NOOP;
  73391. /**
  73392. * The Touch Out event handler function.
  73393. * Initially empty and bound in the `startListeners` method.
  73394. *
  73395. * @name Phaser.Input.Touch.TouchManager#onTouchOut
  73396. * @type {function}
  73397. * @since 3.16.0
  73398. */
  73399. this.onTouchOut = NOOP;
  73400. inputManager.events.once(InputEvents.MANAGER_BOOT, this.boot, this);
  73401. },
  73402. /**
  73403. * The Touch Manager boot process.
  73404. *
  73405. * @method Phaser.Input.Touch.TouchManager#boot
  73406. * @private
  73407. * @since 3.0.0
  73408. */
  73409. boot: function ()
  73410. {
  73411. var config = this.manager.config;
  73412. this.enabled = config.inputTouch;
  73413. this.target = config.inputTouchEventTarget;
  73414. this.capture = config.inputTouchCapture;
  73415. if (!this.target)
  73416. {
  73417. this.target = this.manager.game.canvas;
  73418. }
  73419. if (this.enabled && this.target)
  73420. {
  73421. this.startListeners();
  73422. }
  73423. },
  73424. /**
  73425. * Starts the Touch Event listeners running as long as an input target is set.
  73426. *
  73427. * This method is called automatically if Touch Input is enabled in the game config,
  73428. * which it is by default. However, you can call it manually should you need to
  73429. * delay input capturing until later in the game.
  73430. *
  73431. * @method Phaser.Input.Touch.TouchManager#startListeners
  73432. * @since 3.0.0
  73433. */
  73434. startListeners: function ()
  73435. {
  73436. var _this = this;
  73437. var canvas = this.manager.canvas;
  73438. var autoFocus = (window && window.focus && this.manager.game.config.autoFocus);
  73439. this.onTouchStart = function (event)
  73440. {
  73441. if (autoFocus)
  73442. {
  73443. window.focus();
  73444. }
  73445. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  73446. {
  73447. // Do nothing if event already handled
  73448. return;
  73449. }
  73450. _this.manager.queueTouchStart(event);
  73451. if (_this.capture && event.target === canvas)
  73452. {
  73453. event.preventDefault();
  73454. }
  73455. };
  73456. this.onTouchMove = function (event)
  73457. {
  73458. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  73459. {
  73460. // Do nothing if event already handled
  73461. return;
  73462. }
  73463. _this.manager.queueTouchMove(event);
  73464. if (_this.capture)
  73465. {
  73466. event.preventDefault();
  73467. }
  73468. };
  73469. this.onTouchEnd = function (event)
  73470. {
  73471. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  73472. {
  73473. // Do nothing if event already handled
  73474. return;
  73475. }
  73476. _this.manager.queueTouchEnd(event);
  73477. if (_this.capture && event.target === canvas)
  73478. {
  73479. event.preventDefault();
  73480. }
  73481. };
  73482. this.onTouchCancel = function (event)
  73483. {
  73484. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  73485. {
  73486. // Do nothing if event already handled
  73487. return;
  73488. }
  73489. _this.manager.queueTouchCancel(event);
  73490. if (_this.capture)
  73491. {
  73492. event.preventDefault();
  73493. }
  73494. };
  73495. this.onTouchOver = function (event)
  73496. {
  73497. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  73498. {
  73499. // Do nothing if event already handled
  73500. return;
  73501. }
  73502. _this.manager.setCanvasOver(event);
  73503. };
  73504. this.onTouchOut = function (event)
  73505. {
  73506. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  73507. {
  73508. // Do nothing if event already handled
  73509. return;
  73510. }
  73511. _this.manager.setCanvasOut(event);
  73512. };
  73513. var target = this.target;
  73514. if (!target)
  73515. {
  73516. return;
  73517. }
  73518. var passive = { passive: true };
  73519. var nonPassive = { passive: false };
  73520. target.addEventListener('touchstart', this.onTouchStart, (this.capture) ? nonPassive : passive);
  73521. target.addEventListener('touchmove', this.onTouchMove, (this.capture) ? nonPassive : passive);
  73522. target.addEventListener('touchend', this.onTouchEnd, (this.capture) ? nonPassive : passive);
  73523. target.addEventListener('touchcancel', this.onTouchCancel, (this.capture) ? nonPassive : passive);
  73524. target.addEventListener('touchover', this.onTouchOver, (this.capture) ? nonPassive : passive);
  73525. target.addEventListener('touchout', this.onTouchOut, (this.capture) ? nonPassive : passive);
  73526. if (window)
  73527. {
  73528. window.addEventListener('touchstart', this.onTouchStart, nonPassive);
  73529. window.addEventListener('touchend', this.onTouchEnd, nonPassive);
  73530. }
  73531. this.enabled = true;
  73532. },
  73533. /**
  73534. * Stops the Touch Event listeners.
  73535. * This is called automatically and does not need to be manually invoked.
  73536. *
  73537. * @method Phaser.Input.Touch.TouchManager#stopListeners
  73538. * @since 3.0.0
  73539. */
  73540. stopListeners: function ()
  73541. {
  73542. var target = this.target;
  73543. target.removeEventListener('touchstart', this.onTouchStart);
  73544. target.removeEventListener('touchmove', this.onTouchMove);
  73545. target.removeEventListener('touchend', this.onTouchEnd);
  73546. target.removeEventListener('touchcancel', this.onTouchCancel);
  73547. target.removeEventListener('touchover', this.onTouchOver);
  73548. target.removeEventListener('touchout', this.onTouchOut);
  73549. if (window)
  73550. {
  73551. window.removeEventListener('touchstart', this.onTouchStart);
  73552. window.removeEventListener('touchend', this.onTouchEnd);
  73553. }
  73554. },
  73555. /**
  73556. * Destroys this Touch Manager instance.
  73557. *
  73558. * @method Phaser.Input.Touch.TouchManager#destroy
  73559. * @since 3.0.0
  73560. */
  73561. destroy: function ()
  73562. {
  73563. this.stopListeners();
  73564. this.target = null;
  73565. this.enabled = false;
  73566. this.manager = null;
  73567. }
  73568. });
  73569. module.exports = TouchManager;
  73570. /***/ }),
  73571. /* 338 */
  73572. /***/ (function(module, exports, __webpack_require__) {
  73573. /**
  73574. * @author Richard Davey <rich@photonstorm.com>
  73575. * @copyright 2019 Photon Storm Ltd.
  73576. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  73577. */
  73578. var Angle = __webpack_require__(386);
  73579. var Class = __webpack_require__(0);
  73580. var Distance = __webpack_require__(56);
  73581. var FuzzyEqual = __webpack_require__(186);
  73582. var SmoothStepInterpolation = __webpack_require__(377);
  73583. var Vector2 = __webpack_require__(3);
  73584. /**
  73585. * @classdesc
  73586. * A Pointer object encapsulates both mouse and touch input within Phaser.
  73587. *
  73588. * By default, Phaser will create 2 pointers for your game to use. If you require more, i.e. for a multi-touch
  73589. * game, then use the `InputPlugin.addPointer` method to do so, rather than instantiating this class directly,
  73590. * otherwise it won't be managed by the input system.
  73591. *
  73592. * You can reference the current active pointer via `InputPlugin.activePointer`. You can also use the properties
  73593. * `InputPlugin.pointer1` through to `pointer10`, for each pointer you have enabled in your game.
  73594. *
  73595. * The properties of this object are set by the Input Plugin during processing. This object is then sent in all
  73596. * input related events that the Input Plugin emits, so you can reference properties from it directly in your
  73597. * callbacks.
  73598. *
  73599. * @class Pointer
  73600. * @memberof Phaser.Input
  73601. * @constructor
  73602. * @since 3.0.0
  73603. *
  73604. * @param {Phaser.Input.InputManager} manager - A reference to the Input Manager.
  73605. * @param {integer} id - The internal ID of this Pointer.
  73606. */
  73607. var Pointer = new Class({
  73608. initialize:
  73609. function Pointer (manager, id)
  73610. {
  73611. /**
  73612. * A reference to the Input Manager.
  73613. *
  73614. * @name Phaser.Input.Pointer#manager
  73615. * @type {Phaser.Input.InputManager}
  73616. * @since 3.0.0
  73617. */
  73618. this.manager = manager;
  73619. /**
  73620. * The internal ID of this Pointer.
  73621. *
  73622. * @name Phaser.Input.Pointer#id
  73623. * @type {integer}
  73624. * @readonly
  73625. * @since 3.0.0
  73626. */
  73627. this.id = id;
  73628. /**
  73629. * The most recent native DOM Event this Pointer has processed.
  73630. *
  73631. * @name Phaser.Input.Pointer#event
  73632. * @type {(TouchEvent|MouseEvent)}
  73633. * @since 3.0.0
  73634. */
  73635. this.event;
  73636. /**
  73637. * The DOM element the Pointer was pressed down on, taken from the DOM event.
  73638. *
  73639. * @name Phaser.Input.Pointer#downElement
  73640. * @type {any}
  73641. * @readonly
  73642. * @since 3.16.0
  73643. */
  73644. this.downElement;
  73645. /**
  73646. * The DOM element the Pointer was released on, taken from the DOM event.
  73647. *
  73648. * @name Phaser.Input.Pointer#upElement
  73649. * @type {any}
  73650. * @readonly
  73651. * @since 3.16.0
  73652. */
  73653. this.upElement;
  73654. /**
  73655. * The camera the Pointer interacted with during its last update.
  73656. *
  73657. * A Pointer can only ever interact with one camera at once, which will be the top-most camera
  73658. * in the list should multiple cameras be positioned on-top of each other.
  73659. *
  73660. * @name Phaser.Input.Pointer#camera
  73661. * @type {Phaser.Cameras.Scene2D.Camera}
  73662. * @default null
  73663. * @since 3.0.0
  73664. */
  73665. this.camera = null;
  73666. /**
  73667. * 0: No button or un-initialized
  73668. * 1: Left button
  73669. * 2: Right button
  73670. * 4: Wheel button or middle button
  73671. * 8: 4th button (typically the "Browser Back" button)
  73672. * 16: 5th button (typically the "Browser Forward" button)
  73673. *
  73674. * For a mouse configured for left-handed use, the button actions are reversed.
  73675. * In this case, the values are read from right to left.
  73676. *
  73677. * @name Phaser.Input.Pointer#buttons
  73678. * @type {integer}
  73679. * @default 0
  73680. * @since 3.0.0
  73681. */
  73682. this.buttons = 0;
  73683. /**
  73684. * The position of the Pointer in screen space.
  73685. *
  73686. * @name Phaser.Input.Pointer#position
  73687. * @type {Phaser.Math.Vector2}
  73688. * @readonly
  73689. * @since 3.0.0
  73690. */
  73691. this.position = new Vector2();
  73692. /**
  73693. * The previous position of the Pointer in screen space.
  73694. *
  73695. * The old x and y values are stored in here during the InputManager.transformPointer call.
  73696. *
  73697. * Use the properties `velocity`, `angle` and `distance` to create your own gesture recognition.
  73698. *
  73699. * @name Phaser.Input.Pointer#prevPosition
  73700. * @type {Phaser.Math.Vector2}
  73701. * @readonly
  73702. * @since 3.11.0
  73703. */
  73704. this.prevPosition = new Vector2();
  73705. /**
  73706. * An internal vector used for calculations of the pointer speed and angle.
  73707. *
  73708. * @name Phaser.Input.Pointer#midPoint
  73709. * @type {Phaser.Math.Vector2}
  73710. * @private
  73711. * @since 3.16.0
  73712. */
  73713. this.midPoint = new Vector2(-1, -1);
  73714. /**
  73715. * The current velocity of the Pointer, based on its current and previous positions.
  73716. *
  73717. * This value is smoothed out each frame, according to the `motionFactor` property.
  73718. *
  73719. * This property is updated whenever the Pointer moves, regardless of any button states. In other words,
  73720. * it changes based on movement alone - a button doesn't have to be pressed first.
  73721. *
  73722. * @name Phaser.Input.Pointer#velocity
  73723. * @type {Phaser.Math.Vector2}
  73724. * @readonly
  73725. * @since 3.16.0
  73726. */
  73727. this.velocity = new Vector2();
  73728. /**
  73729. * The current angle the Pointer is moving, in radians, based on its previous and current position.
  73730. *
  73731. * The angle is based on the old position facing to the current position.
  73732. *
  73733. * This property is updated whenever the Pointer moves, regardless of any button states. In other words,
  73734. * it changes based on movement alone - a button doesn't have to be pressed first.
  73735. *
  73736. * @name Phaser.Input.Pointer#angle
  73737. * @type {number}
  73738. * @readonly
  73739. * @since 3.16.0
  73740. */
  73741. this.angle = 0;
  73742. /**
  73743. * The distance the Pointer has moved, based on its previous and current position.
  73744. *
  73745. * This value is smoothed out each frame, according to the `motionFactor` property.
  73746. *
  73747. * This property is updated whenever the Pointer moves, regardless of any button states. In other words,
  73748. * it changes based on movement alone - a button doesn't have to be pressed first.
  73749. *
  73750. * If you need the total distance travelled since the primary buttons was pressed down,
  73751. * then use the `Pointer.getDistance` method.
  73752. *
  73753. * @name Phaser.Input.Pointer#distance
  73754. * @type {number}
  73755. * @readonly
  73756. * @since 3.16.0
  73757. */
  73758. this.distance = 0;
  73759. /**
  73760. * The smoothing factor to apply to the Pointer position.
  73761. *
  73762. * Due to their nature, pointer positions are inherently noisy. While this is fine for lots of games, if you need cleaner positions
  73763. * then you can set this value to apply an automatic smoothing to the positions as they are recorded.
  73764. *
  73765. * The default value of zero means 'no smoothing'.
  73766. * Set to a small value, such as 0.2, to apply an average level of smoothing between positions. You can do this by changing this
  73767. * value directly, or by setting the `input.smoothFactor` property in the Game Config.
  73768. *
  73769. * Positions are only smoothed when the pointer moves. If the primary button on this Pointer enters an Up or Down state, then the position
  73770. * is always precise, and not smoothed.
  73771. *
  73772. * @name Phaser.Input.Pointer#smoothFactor
  73773. * @type {number}
  73774. * @default 0
  73775. * @since 3.16.0
  73776. */
  73777. this.smoothFactor = 0;
  73778. /**
  73779. * The factor applied to the motion smoothing each frame.
  73780. *
  73781. * This value is passed to the Smooth Step Interpolation that is used to calculate the velocity,
  73782. * angle and distance of the Pointer. It's applied every frame, until the midPoint reaches the current
  73783. * position of the Pointer. 0.2 provides a good average but can be increased if you need a
  73784. * quicker update and are working in a high performance environment. Never set this value to
  73785. * zero.
  73786. *
  73787. * @name Phaser.Input.Pointer#motionFactor
  73788. * @type {number}
  73789. * @default 0.2
  73790. * @since 3.16.0
  73791. */
  73792. this.motionFactor = 0.2;
  73793. /**
  73794. * The x position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with.
  73795. *
  73796. * @name Phaser.Input.Pointer#worldX
  73797. * @type {number}
  73798. * @default 0
  73799. * @since 3.10.0
  73800. */
  73801. this.worldX = 0;
  73802. /**
  73803. * The y position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with.
  73804. *
  73805. * @name Phaser.Input.Pointer#worldY
  73806. * @type {number}
  73807. * @default 0
  73808. * @since 3.10.0
  73809. */
  73810. this.worldY = 0;
  73811. /**
  73812. * Time when this Pointer was most recently moved (regardless of the state of its buttons, if any)
  73813. *
  73814. * @name Phaser.Input.Pointer#moveTime
  73815. * @type {number}
  73816. * @default 0
  73817. * @since 3.0.0
  73818. */
  73819. this.moveTime = 0;
  73820. /**
  73821. * X coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects.
  73822. *
  73823. * @name Phaser.Input.Pointer#downX
  73824. * @type {number}
  73825. * @default 0
  73826. * @since 3.0.0
  73827. */
  73828. this.downX = 0;
  73829. /**
  73830. * Y coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects.
  73831. *
  73832. * @name Phaser.Input.Pointer#downY
  73833. * @type {number}
  73834. * @default 0
  73835. * @since 3.0.0
  73836. */
  73837. this.downY = 0;
  73838. /**
  73839. * Time when Button 1 (left button), or Touch, was pressed, used for dragging objects.
  73840. *
  73841. * @name Phaser.Input.Pointer#downTime
  73842. * @type {number}
  73843. * @default 0
  73844. * @since 3.0.0
  73845. */
  73846. this.downTime = 0;
  73847. /**
  73848. * X coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects.
  73849. *
  73850. * @name Phaser.Input.Pointer#upX
  73851. * @type {number}
  73852. * @default 0
  73853. * @since 3.0.0
  73854. */
  73855. this.upX = 0;
  73856. /**
  73857. * Y coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects.
  73858. *
  73859. * @name Phaser.Input.Pointer#upY
  73860. * @type {number}
  73861. * @default 0
  73862. * @since 3.0.0
  73863. */
  73864. this.upY = 0;
  73865. /**
  73866. * Time when Button 1 (left button), or Touch, was released, used for dragging objects.
  73867. *
  73868. * @name Phaser.Input.Pointer#upTime
  73869. * @type {number}
  73870. * @default 0
  73871. * @since 3.0.0
  73872. */
  73873. this.upTime = 0;
  73874. /**
  73875. * Is the primary button down? (usually button 0, the left mouse button)
  73876. *
  73877. * @name Phaser.Input.Pointer#primaryDown
  73878. * @type {boolean}
  73879. * @default false
  73880. * @since 3.0.0
  73881. */
  73882. this.primaryDown = false;
  73883. /**
  73884. * Is _any_ button on this pointer considered as being down?
  73885. *
  73886. * @name Phaser.Input.Pointer#isDown
  73887. * @type {boolean}
  73888. * @default false
  73889. * @since 3.0.0
  73890. */
  73891. this.isDown = false;
  73892. /**
  73893. * A dirty flag for this Pointer, used internally by the Input Plugin.
  73894. *
  73895. * @name Phaser.Input.Pointer#dirty
  73896. * @type {boolean}
  73897. * @default false
  73898. * @since 3.0.0
  73899. */
  73900. this.dirty = false;
  73901. /**
  73902. * Is this Pointer considered as being "just down" or not?
  73903. *
  73904. * @name Phaser.Input.Pointer#justDown
  73905. * @type {boolean}
  73906. * @default false
  73907. * @since 3.0.0
  73908. */
  73909. this.justDown = false;
  73910. /**
  73911. * Is this Pointer considered as being "just up" or not?
  73912. *
  73913. * @name Phaser.Input.Pointer#justUp
  73914. * @type {boolean}
  73915. * @default false
  73916. * @since 3.0.0
  73917. */
  73918. this.justUp = false;
  73919. /**
  73920. * Is this Pointer considered as being "just moved" or not?
  73921. *
  73922. * @name Phaser.Input.Pointer#justMoved
  73923. * @type {boolean}
  73924. * @default false
  73925. * @since 3.0.0
  73926. */
  73927. this.justMoved = false;
  73928. /**
  73929. * Did the previous input event come from a Touch input (true) or Mouse? (false)
  73930. *
  73931. * @name Phaser.Input.Pointer#wasTouch
  73932. * @type {boolean}
  73933. * @default false
  73934. * @since 3.0.0
  73935. */
  73936. this.wasTouch = false;
  73937. /**
  73938. * Did this Pointer get canceled by a touchcancel event?
  73939. *
  73940. * Note: "canceled" is the American-English spelling of "cancelled". Please don't submit PRs correcting it!
  73941. *
  73942. * @name Phaser.Input.Pointer#wasCanceled
  73943. * @type {boolean}
  73944. * @default false
  73945. * @since 3.15.0
  73946. */
  73947. this.wasCanceled = false;
  73948. /**
  73949. * If the mouse is locked, the horizontal relative movement of the Pointer in pixels since last frame.
  73950. *
  73951. * @name Phaser.Input.Pointer#movementX
  73952. * @type {number}
  73953. * @default 0
  73954. * @since 3.0.0
  73955. */
  73956. this.movementX = 0;
  73957. /**
  73958. * If the mouse is locked, the vertical relative movement of the Pointer in pixels since last frame.
  73959. *
  73960. * @name Phaser.Input.Pointer#movementY
  73961. * @type {number}
  73962. * @default 0
  73963. * @since 3.0.0
  73964. */
  73965. this.movementY = 0;
  73966. /**
  73967. * The identifier property of the Pointer as set by the DOM event when this Pointer is started.
  73968. *
  73969. * @name Phaser.Input.Pointer#identifier
  73970. * @type {number}
  73971. * @since 3.10.0
  73972. */
  73973. this.identifier = 0;
  73974. /**
  73975. * The pointerId property of the Pointer as set by the DOM event when this Pointer is started.
  73976. * The browser can and will recycle this value.
  73977. *
  73978. * @name Phaser.Input.Pointer#pointerId
  73979. * @type {number}
  73980. * @since 3.10.0
  73981. */
  73982. this.pointerId = null;
  73983. /**
  73984. * An active Pointer is one that is currently pressed down on the display.
  73985. * A Mouse is always considered as active.
  73986. *
  73987. * @name Phaser.Input.Pointer#active
  73988. * @type {boolean}
  73989. * @since 3.10.0
  73990. */
  73991. this.active = (id === 0) ? true : false;
  73992. /**
  73993. * Time when this Pointer was most recently updated by the Game step.
  73994. *
  73995. * @name Phaser.Input.Pointer#time
  73996. * @type {number}
  73997. * @since 3.16.0
  73998. */
  73999. this.time = 0;
  74000. },
  74001. /**
  74002. * Takes a Camera and returns a Vector2 containing the translated position of this Pointer
  74003. * within that Camera. This can be used to convert this Pointers position into camera space.
  74004. *
  74005. * @method Phaser.Input.Pointer#positionToCamera
  74006. * @since 3.0.0
  74007. *
  74008. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to use for the translation.
  74009. * @param {(Phaser.Math.Vector2|object)} [output] - A Vector2-like object in which to store the translated position.
  74010. *
  74011. * @return {(Phaser.Math.Vector2|object)} A Vector2 containing the translated coordinates of this Pointer, based on the given camera.
  74012. */
  74013. positionToCamera: function (camera, output)
  74014. {
  74015. return camera.getWorldPoint(this.x, this.y, output);
  74016. },
  74017. /**
  74018. * Resets the temporal properties of this Pointer.
  74019. * This method is called automatically each frame by the Input Manager.
  74020. *
  74021. * @method Phaser.Input.Pointer#reset
  74022. * @private
  74023. * @since 3.0.0
  74024. */
  74025. reset: function (time)
  74026. {
  74027. this.dirty = false;
  74028. this.justDown = false;
  74029. this.justUp = false;
  74030. this.justMoved = false;
  74031. this.time = time;
  74032. this.movementX = 0;
  74033. this.movementY = 0;
  74034. },
  74035. /**
  74036. * Calculates the motion of this Pointer, including its velocity and angle of movement.
  74037. * This method is called automatically each frame by the Input Manager.
  74038. *
  74039. * @method Phaser.Input.Pointer#updateMotion
  74040. * @private
  74041. * @since 3.16.0
  74042. */
  74043. updateMotion: function ()
  74044. {
  74045. var cx = this.position.x;
  74046. var cy = this.position.y;
  74047. var mx = this.midPoint.x;
  74048. var my = this.midPoint.y;
  74049. if (cx === mx && cy === my)
  74050. {
  74051. // Nothing to do here
  74052. return;
  74053. }
  74054. // Moving towards our goal ...
  74055. var vx = SmoothStepInterpolation(this.motionFactor, mx, cx);
  74056. var vy = SmoothStepInterpolation(this.motionFactor, my, cy);
  74057. if (FuzzyEqual(vx, cx, 0.1))
  74058. {
  74059. vx = cx;
  74060. }
  74061. if (FuzzyEqual(vy, cy, 0.1))
  74062. {
  74063. vy = cy;
  74064. }
  74065. this.midPoint.set(vx, vy);
  74066. var dx = cx - vx;
  74067. var dy = cy - vy;
  74068. this.velocity.set(dx, dy);
  74069. this.angle = Angle(vx, vy, cx, cy);
  74070. this.distance = Math.sqrt(dx * dx + dy * dy);
  74071. },
  74072. /**
  74073. * Internal method to handle a Mouse Up Event.
  74074. *
  74075. * @method Phaser.Input.Pointer#up
  74076. * @private
  74077. * @since 3.0.0
  74078. *
  74079. * @param {MouseEvent} event - The Mouse Event to process.
  74080. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  74081. */
  74082. up: function (event, time)
  74083. {
  74084. if ('buttons' in event)
  74085. {
  74086. this.buttons = event.buttons;
  74087. }
  74088. this.event = event;
  74089. this.upElement = event.target;
  74090. // Sets the local x/y properties
  74091. this.manager.transformPointer(this, event.pageX, event.pageY, false);
  74092. // 0: Main button pressed, usually the left button or the un-initialized state
  74093. if (event.button === 0)
  74094. {
  74095. this.primaryDown = false;
  74096. this.upX = this.x;
  74097. this.upY = this.y;
  74098. this.upTime = time;
  74099. }
  74100. this.justUp = true;
  74101. this.isDown = false;
  74102. this.dirty = true;
  74103. this.wasTouch = false;
  74104. },
  74105. /**
  74106. * Internal method to handle a Mouse Down Event.
  74107. *
  74108. * @method Phaser.Input.Pointer#down
  74109. * @private
  74110. * @since 3.0.0
  74111. *
  74112. * @param {MouseEvent} event - The Mouse Event to process.
  74113. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  74114. */
  74115. down: function (event, time)
  74116. {
  74117. if ('buttons' in event)
  74118. {
  74119. this.buttons = event.buttons;
  74120. }
  74121. this.event = event;
  74122. this.downElement = event.target;
  74123. // Sets the local x/y properties
  74124. this.manager.transformPointer(this, event.pageX, event.pageY, false);
  74125. // 0: Main button pressed, usually the left button or the un-initialized state
  74126. if (event.button === 0)
  74127. {
  74128. this.primaryDown = true;
  74129. this.downX = this.x;
  74130. this.downY = this.y;
  74131. this.downTime = time;
  74132. }
  74133. this.justDown = true;
  74134. this.isDown = true;
  74135. this.dirty = true;
  74136. this.wasTouch = false;
  74137. },
  74138. /**
  74139. * Internal method to handle a Mouse Move Event.
  74140. *
  74141. * @method Phaser.Input.Pointer#move
  74142. * @private
  74143. * @since 3.0.0
  74144. *
  74145. * @param {MouseEvent} event - The Mouse Event to process.
  74146. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  74147. */
  74148. move: function (event, time)
  74149. {
  74150. if ('buttons' in event)
  74151. {
  74152. this.buttons = event.buttons;
  74153. }
  74154. this.event = event;
  74155. // Sets the local x/y properties
  74156. this.manager.transformPointer(this, event.pageX, event.pageY, true);
  74157. if (this.manager.mouse.locked)
  74158. {
  74159. // Multiple DOM events may occur within one frame, but only one Phaser event will fire
  74160. this.movementX += event.movementX || event.mozMovementX || event.webkitMovementX || 0;
  74161. this.movementY += event.movementY || event.mozMovementY || event.webkitMovementY || 0;
  74162. }
  74163. this.justMoved = true;
  74164. this.moveTime = time;
  74165. this.dirty = true;
  74166. this.wasTouch = false;
  74167. },
  74168. /**
  74169. * Internal method to handle a Touch Start Event.
  74170. *
  74171. * @method Phaser.Input.Pointer#touchstart
  74172. * @private
  74173. * @since 3.0.0
  74174. *
  74175. * @param {TouchEvent} event - The Touch Event to process.
  74176. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  74177. */
  74178. touchstart: function (event, time)
  74179. {
  74180. if (event['pointerId'])
  74181. {
  74182. this.pointerId = event.pointerId;
  74183. }
  74184. this.identifier = event.identifier;
  74185. this.target = event.target;
  74186. this.active = true;
  74187. this.buttons = 1;
  74188. this.event = event;
  74189. this.downElement = event.target;
  74190. // Sets the local x/y properties
  74191. this.manager.transformPointer(this, event.pageX, event.pageY, false);
  74192. this.primaryDown = true;
  74193. this.downX = this.x;
  74194. this.downY = this.y;
  74195. this.downTime = time;
  74196. this.justDown = true;
  74197. this.isDown = true;
  74198. this.dirty = true;
  74199. this.wasTouch = true;
  74200. this.wasCanceled = false;
  74201. },
  74202. /**
  74203. * Internal method to handle a Touch Move Event.
  74204. *
  74205. * @method Phaser.Input.Pointer#touchmove
  74206. * @private
  74207. * @since 3.0.0
  74208. *
  74209. * @param {TouchEvent} event - The Touch Event to process.
  74210. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  74211. */
  74212. touchmove: function (event, time)
  74213. {
  74214. this.event = event;
  74215. // Sets the local x/y properties
  74216. this.manager.transformPointer(this, event.pageX, event.pageY, true);
  74217. this.justMoved = true;
  74218. this.moveTime = time;
  74219. this.dirty = true;
  74220. this.wasTouch = true;
  74221. },
  74222. /**
  74223. * Internal method to handle a Touch End Event.
  74224. *
  74225. * @method Phaser.Input.Pointer#touchend
  74226. * @private
  74227. * @since 3.0.0
  74228. *
  74229. * @param {TouchEvent} event - The Touch Event to process.
  74230. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  74231. */
  74232. touchend: function (event, time)
  74233. {
  74234. this.buttons = 0;
  74235. this.event = event;
  74236. this.upElement = event.target;
  74237. // Sets the local x/y properties
  74238. this.manager.transformPointer(this, event.pageX, event.pageY, false);
  74239. this.primaryDown = false;
  74240. this.upX = this.x;
  74241. this.upY = this.y;
  74242. this.upTime = time;
  74243. this.justUp = true;
  74244. this.isDown = false;
  74245. this.dirty = true;
  74246. this.wasTouch = true;
  74247. this.wasCanceled = false;
  74248. this.active = false;
  74249. },
  74250. /**
  74251. * Internal method to handle a Touch Cancel Event.
  74252. *
  74253. * @method Phaser.Input.Pointer#touchcancel
  74254. * @private
  74255. * @since 3.15.0
  74256. *
  74257. * @param {TouchEvent} event - The Touch Event to process.
  74258. */
  74259. touchcancel: function (event)
  74260. {
  74261. this.buttons = 0;
  74262. this.event = event;
  74263. this.primaryDown = false;
  74264. this.justUp = false;
  74265. this.isDown = false;
  74266. this.dirty = true;
  74267. this.wasTouch = true;
  74268. this.wasCanceled = true;
  74269. this.active = false;
  74270. },
  74271. /**
  74272. * Checks to see if any buttons are being held down on this Pointer.
  74273. *
  74274. * @method Phaser.Input.Pointer#noButtonDown
  74275. * @since 3.0.0
  74276. *
  74277. * @return {boolean} `true` if no buttons are being held down.
  74278. */
  74279. noButtonDown: function ()
  74280. {
  74281. return (this.buttons === 0);
  74282. },
  74283. /**
  74284. * Checks to see if the left button is being held down on this Pointer.
  74285. *
  74286. * @method Phaser.Input.Pointer#leftButtonDown
  74287. * @since 3.0.0
  74288. *
  74289. * @return {boolean} `true` if the left button is being held down.
  74290. */
  74291. leftButtonDown: function ()
  74292. {
  74293. return (this.buttons & 1) ? true : false;
  74294. },
  74295. /**
  74296. * Checks to see if the right button is being held down on this Pointer.
  74297. *
  74298. * @method Phaser.Input.Pointer#rightButtonDown
  74299. * @since 3.0.0
  74300. *
  74301. * @return {boolean} `true` if the right button is being held down.
  74302. */
  74303. rightButtonDown: function ()
  74304. {
  74305. return (this.buttons & 2) ? true : false;
  74306. },
  74307. /**
  74308. * Checks to see if the middle button is being held down on this Pointer.
  74309. *
  74310. * @method Phaser.Input.Pointer#middleButtonDown
  74311. * @since 3.0.0
  74312. *
  74313. * @return {boolean} `true` if the middle button is being held down.
  74314. */
  74315. middleButtonDown: function ()
  74316. {
  74317. return (this.buttons & 4) ? true : false;
  74318. },
  74319. /**
  74320. * Checks to see if the back button is being held down on this Pointer.
  74321. *
  74322. * @method Phaser.Input.Pointer#backButtonDown
  74323. * @since 3.0.0
  74324. *
  74325. * @return {boolean} `true` if the back button is being held down.
  74326. */
  74327. backButtonDown: function ()
  74328. {
  74329. return (this.buttons & 8) ? true : false;
  74330. },
  74331. /**
  74332. * Checks to see if the forward button is being held down on this Pointer.
  74333. *
  74334. * @method Phaser.Input.Pointer#forwardButtonDown
  74335. * @since 3.0.0
  74336. *
  74337. * @return {boolean} `true` if the forward button is being held down.
  74338. */
  74339. forwardButtonDown: function ()
  74340. {
  74341. return (this.buttons & 16) ? true : false;
  74342. },
  74343. /**
  74344. * If the Pointer has a button pressed down at the time this method is called, it will return the
  74345. * distance between the Pointer's `downX` and `downY` values and the current position.
  74346. *
  74347. * If no button is held down, it will return the last recorded distance, based on where
  74348. * the Pointer was when the button was released.
  74349. *
  74350. * If you wish to get the distance being travelled currently, based on the velocity of the Pointer,
  74351. * then see the `Pointer.distance` property.
  74352. *
  74353. * @method Phaser.Input.Pointer#getDistance
  74354. * @since 3.13.0
  74355. *
  74356. * @return {number} The distance the Pointer moved.
  74357. */
  74358. getDistance: function ()
  74359. {
  74360. if (this.isDown)
  74361. {
  74362. return Distance(this.downX, this.downY, this.x, this.y);
  74363. }
  74364. else
  74365. {
  74366. return Distance(this.downX, this.downY, this.upX, this.upY);
  74367. }
  74368. },
  74369. /**
  74370. * If the Pointer has a button pressed down at the time this method is called, it will return the
  74371. * horizontal distance between the Pointer's `downX` and `downY` values and the current position.
  74372. *
  74373. * If no button is held down, it will return the last recorded horizontal distance, based on where
  74374. * the Pointer was when the button was released.
  74375. *
  74376. * @method Phaser.Input.Pointer#getDistanceX
  74377. * @since 3.16.0
  74378. *
  74379. * @return {number} The horizontal distance the Pointer moved.
  74380. */
  74381. getDistanceX: function ()
  74382. {
  74383. if (this.isDown)
  74384. {
  74385. return Math.abs(this.downX - this.x);
  74386. }
  74387. else
  74388. {
  74389. return Math.abs(this.downX - this.upX);
  74390. }
  74391. },
  74392. /**
  74393. * If the Pointer has a button pressed down at the time this method is called, it will return the
  74394. * vertical distance between the Pointer's `downX` and `downY` values and the current position.
  74395. *
  74396. * If no button is held down, it will return the last recorded vertical distance, based on where
  74397. * the Pointer was when the button was released.
  74398. *
  74399. * @method Phaser.Input.Pointer#getDistanceY
  74400. * @since 3.16.0
  74401. *
  74402. * @return {number} The vertical distance the Pointer moved.
  74403. */
  74404. getDistanceY: function ()
  74405. {
  74406. if (this.isDown)
  74407. {
  74408. return Math.abs(this.downY - this.y);
  74409. }
  74410. else
  74411. {
  74412. return Math.abs(this.downY - this.upY);
  74413. }
  74414. },
  74415. /**
  74416. * If the Pointer has a button pressed down at the time this method is called, it will return the
  74417. * duration since the Pointer's was pressed down.
  74418. *
  74419. * If no button is held down, it will return the last recorded duration, based on the time
  74420. * the Pointer button was released.
  74421. *
  74422. * @method Phaser.Input.Pointer#getDuration
  74423. * @since 3.16.0
  74424. *
  74425. * @return {number} The duration the Pointer was held down for in milliseconds.
  74426. */
  74427. getDuration: function ()
  74428. {
  74429. if (this.isDown)
  74430. {
  74431. return (this.time - this.downTime);
  74432. }
  74433. else
  74434. {
  74435. return (this.upTime - this.downTime);
  74436. }
  74437. },
  74438. /**
  74439. * If the Pointer has a button pressed down at the time this method is called, it will return the
  74440. * angle between the Pointer's `downX` and `downY` values and the current position.
  74441. *
  74442. * If no button is held down, it will return the last recorded angle, based on where
  74443. * the Pointer was when the button was released.
  74444. *
  74445. * The angle is based on the old position facing to the current position.
  74446. *
  74447. * If you wish to get the current angle, based on the velocity of the Pointer, then
  74448. * see the `Pointer.angle` property.
  74449. *
  74450. * @method Phaser.Input.Pointer#getAngle
  74451. * @since 3.16.0
  74452. *
  74453. * @return {number} The angle between the Pointer's coordinates in radians.
  74454. */
  74455. getAngle: function ()
  74456. {
  74457. if (this.isDown)
  74458. {
  74459. return Angle(this.downX, this.downY, this.x, this.y);
  74460. }
  74461. else
  74462. {
  74463. return Angle(this.downX, this.downY, this.upX, this.upY);
  74464. }
  74465. },
  74466. /**
  74467. * Takes the previous and current Pointer positions and then generates an array of interpolated values between
  74468. * the two. The array will be populated up to the size of the `steps` argument.
  74469. *
  74470. * ```javaScript
  74471. * var points = pointer.getInterpolatedPosition(4);
  74472. *
  74473. * // points[0] = { x: 0, y: 0 }
  74474. * // points[1] = { x: 2, y: 1 }
  74475. * // points[2] = { x: 3, y: 2 }
  74476. * // points[3] = { x: 6, y: 3 }
  74477. * ```
  74478. *
  74479. * Use this if you need to get smoothed values between the previous and current pointer positions. DOM pointer
  74480. * events can often fire faster than the main browser loop, and this will help you avoid janky movement
  74481. * especially if you have an object following a Pointer.
  74482. *
  74483. * Note that if you provide an output array it will only be populated up to the number of steps provided.
  74484. * It will not clear any previous data that may have existed beyond the range of the steps count.
  74485. *
  74486. * Internally it uses the Smooth Step interpolation calculation.
  74487. *
  74488. * @method Phaser.Input.Pointer#getInterpolatedPosition
  74489. * @since 3.11.0
  74490. *
  74491. * @param {integer} [steps=10] - The number of interpolation steps to use.
  74492. * @param {array} [out] - An array to store the results in. If not provided a new one will be created.
  74493. *
  74494. * @return {array} An array of interpolated values.
  74495. */
  74496. getInterpolatedPosition: function (steps, out)
  74497. {
  74498. if (steps === undefined) { steps = 10; }
  74499. if (out === undefined) { out = []; }
  74500. var prevX = this.prevPosition.x;
  74501. var prevY = this.prevPosition.y;
  74502. var curX = this.position.x;
  74503. var curY = this.position.y;
  74504. for (var i = 0; i < steps; i++)
  74505. {
  74506. var t = (1 / steps) * i;
  74507. out[i] = { x: SmoothStepInterpolation(t, prevX, curX), y: SmoothStepInterpolation(t, prevY, curY) };
  74508. }
  74509. return out;
  74510. },
  74511. /**
  74512. * Destroys this Pointer instance and resets its external references.
  74513. *
  74514. * @method Phaser.Input.Pointer#destroy
  74515. * @since 3.0.0
  74516. */
  74517. destroy: function ()
  74518. {
  74519. this.camera = null;
  74520. this.manager = null;
  74521. this.position = null;
  74522. },
  74523. /**
  74524. * The x position of this Pointer.
  74525. * The value is in screen space.
  74526. * See `worldX` to get a camera converted position.
  74527. *
  74528. * @name Phaser.Input.Pointer#x
  74529. * @type {number}
  74530. * @since 3.0.0
  74531. */
  74532. x: {
  74533. get: function ()
  74534. {
  74535. return this.position.x;
  74536. },
  74537. set: function (value)
  74538. {
  74539. this.position.x = value;
  74540. }
  74541. },
  74542. /**
  74543. * The y position of this Pointer.
  74544. * The value is in screen space.
  74545. * See `worldY` to get a camera converted position.
  74546. *
  74547. * @name Phaser.Input.Pointer#y
  74548. * @type {number}
  74549. * @since 3.0.0
  74550. */
  74551. y: {
  74552. get: function ()
  74553. {
  74554. return this.position.y;
  74555. },
  74556. set: function (value)
  74557. {
  74558. this.position.y = value;
  74559. }
  74560. }
  74561. });
  74562. module.exports = Pointer;
  74563. /***/ }),
  74564. /* 339 */
  74565. /***/ (function(module, exports, __webpack_require__) {
  74566. /**
  74567. * @author Richard Davey <rich@photonstorm.com>
  74568. * @copyright 2019 Photon Storm Ltd.
  74569. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  74570. */
  74571. var Class = __webpack_require__(0);
  74572. var Features = __webpack_require__(187);
  74573. var InputEvents = __webpack_require__(52);
  74574. var NOOP = __webpack_require__(0);
  74575. // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent
  74576. // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
  74577. /**
  74578. * @classdesc
  74579. * The Mouse Manager is a helper class that belongs to the Input Manager.
  74580. *
  74581. * Its role is to listen for native DOM Mouse Events and then pass them onto the Input Manager for further processing.
  74582. *
  74583. * You do not need to create this class directly, the Input Manager will create an instance of it automatically.
  74584. *
  74585. * @class MouseManager
  74586. * @memberof Phaser.Input.Mouse
  74587. * @constructor
  74588. * @since 3.0.0
  74589. *
  74590. * @param {Phaser.Input.InputManager} inputManager - A reference to the Input Manager.
  74591. */
  74592. var MouseManager = new Class({
  74593. initialize:
  74594. function MouseManager (inputManager)
  74595. {
  74596. /**
  74597. * A reference to the Input Manager.
  74598. *
  74599. * @name Phaser.Input.Mouse.MouseManager#manager
  74600. * @type {Phaser.Input.InputManager}
  74601. * @since 3.0.0
  74602. */
  74603. this.manager = inputManager;
  74604. /**
  74605. * If true the DOM mouse events will have event.preventDefault applied to them, if false they will propagate fully.
  74606. *
  74607. * @name Phaser.Input.Mouse.MouseManager#capture
  74608. * @type {boolean}
  74609. * @default true
  74610. * @since 3.0.0
  74611. */
  74612. this.capture = true;
  74613. /**
  74614. * A boolean that controls if the Mouse Manager is enabled or not.
  74615. * Can be toggled on the fly.
  74616. *
  74617. * @name Phaser.Input.Mouse.MouseManager#enabled
  74618. * @type {boolean}
  74619. * @default false
  74620. * @since 3.0.0
  74621. */
  74622. this.enabled = false;
  74623. /**
  74624. * The Touch Event target, as defined in the Game Config.
  74625. * Typically the canvas to which the game is rendering, but can be any interactive DOM element.
  74626. *
  74627. * @name Phaser.Input.Mouse.MouseManager#target
  74628. * @type {any}
  74629. * @since 3.0.0
  74630. */
  74631. this.target;
  74632. /**
  74633. * If the mouse has been pointer locked successfully this will be set to true.
  74634. *
  74635. * @name Phaser.Input.Mouse.MouseManager#locked
  74636. * @type {boolean}
  74637. * @default false
  74638. * @since 3.0.0
  74639. */
  74640. this.locked = false;
  74641. /**
  74642. * The Mouse Move Event handler.
  74643. * This function is sent the native DOM MouseEvent.
  74644. * Initially empty and bound in the `startListeners` method.
  74645. *
  74646. * @name Phaser.Input.Mouse.MouseManager#onMouseMove
  74647. * @type {function}
  74648. * @since 3.10.0
  74649. */
  74650. this.onMouseMove = NOOP;
  74651. /**
  74652. * The Mouse Down Event handler.
  74653. * This function is sent the native DOM MouseEvent.
  74654. * Initially empty and bound in the `startListeners` method.
  74655. *
  74656. * @name Phaser.Input.Mouse.MouseManager#onMouseDown
  74657. * @type {function}
  74658. * @since 3.10.0
  74659. */
  74660. this.onMouseDown = NOOP;
  74661. /**
  74662. * The Mouse Up Event handler.
  74663. * This function is sent the native DOM MouseEvent.
  74664. * Initially empty and bound in the `startListeners` method.
  74665. *
  74666. * @name Phaser.Input.Mouse.MouseManager#onMouseUp
  74667. * @type {function}
  74668. * @since 3.10.0
  74669. */
  74670. this.onMouseUp = NOOP;
  74671. /**
  74672. * The Mouse Over Event handler.
  74673. * This function is sent the native DOM MouseEvent.
  74674. * Initially empty and bound in the `startListeners` method.
  74675. *
  74676. * @name Phaser.Input.Mouse.MouseManager#onMouseOver
  74677. * @type {function}
  74678. * @since 3.16.0
  74679. */
  74680. this.onMouseOver = NOOP;
  74681. /**
  74682. * The Mouse Out Event handler.
  74683. * This function is sent the native DOM MouseEvent.
  74684. * Initially empty and bound in the `startListeners` method.
  74685. *
  74686. * @name Phaser.Input.Mouse.MouseManager#onMouseOut
  74687. * @type {function}
  74688. * @since 3.16.0
  74689. */
  74690. this.onMouseOut = NOOP;
  74691. /**
  74692. * Internal pointerLockChange handler.
  74693. * This function is sent the native DOM MouseEvent.
  74694. * Initially empty and bound in the `startListeners` method.
  74695. *
  74696. * @name Phaser.Input.Mouse.MouseManager#pointerLockChange
  74697. * @type {function}
  74698. * @since 3.0.0
  74699. */
  74700. this.pointerLockChange = NOOP;
  74701. inputManager.events.once(InputEvents.MANAGER_BOOT, this.boot, this);
  74702. },
  74703. /**
  74704. * The Touch Manager boot process.
  74705. *
  74706. * @method Phaser.Input.Mouse.MouseManager#boot
  74707. * @private
  74708. * @since 3.0.0
  74709. */
  74710. boot: function ()
  74711. {
  74712. var config = this.manager.config;
  74713. this.enabled = config.inputMouse;
  74714. this.target = config.inputMouseEventTarget;
  74715. this.capture = config.inputMouseCapture;
  74716. if (!this.target)
  74717. {
  74718. this.target = this.manager.game.canvas;
  74719. }
  74720. if (config.disableContextMenu)
  74721. {
  74722. this.disableContextMenu();
  74723. }
  74724. if (this.enabled && this.target)
  74725. {
  74726. this.startListeners();
  74727. }
  74728. },
  74729. /**
  74730. * Attempts to disable the context menu from appearing if you right-click on the browser.
  74731. *
  74732. * Works by listening for the `contextmenu` event and prevent defaulting it.
  74733. *
  74734. * Use this if you need to enable right-button mouse support in your game, and the browser
  74735. * menu keeps getting in the way.
  74736. *
  74737. * @method Phaser.Input.Mouse.MouseManager#disableContextMenu
  74738. * @since 3.0.0
  74739. *
  74740. * @return {Phaser.Input.Mouse.MouseManager} This Mouse Manager instance.
  74741. */
  74742. disableContextMenu: function ()
  74743. {
  74744. document.body.addEventListener('contextmenu', function (event)
  74745. {
  74746. event.preventDefault();
  74747. return false;
  74748. });
  74749. return this;
  74750. },
  74751. /**
  74752. * If the browser supports it, you can request that the pointer be locked to the browser window.
  74753. *
  74754. * This is classically known as 'FPS controls', where the pointer can't leave the browser until
  74755. * the user presses an exit key.
  74756. *
  74757. * If the browser successfully enters a locked state, a `POINTER_LOCK_CHANGE_EVENT` will be dispatched,
  74758. * from the games Input Manager, with an `isPointerLocked` property.
  74759. *
  74760. * It is important to note that pointer lock can only be enabled after an 'engagement gesture',
  74761. * see: https://w3c.github.io/pointerlock/#dfn-engagement-gesture.
  74762. *
  74763. * @method Phaser.Input.Mouse.MouseManager#requestPointerLock
  74764. * @since 3.0.0
  74765. */
  74766. requestPointerLock: function ()
  74767. {
  74768. if (Features.pointerLock)
  74769. {
  74770. var element = this.target;
  74771. element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;
  74772. element.requestPointerLock();
  74773. }
  74774. },
  74775. /**
  74776. * If the browser supports pointer lock, this will request that the pointer lock is released. If
  74777. * the browser successfully enters a locked state, a 'POINTER_LOCK_CHANGE_EVENT' will be
  74778. * dispatched - from the game's input manager - with an `isPointerLocked` property.
  74779. *
  74780. * @method Phaser.Input.Mouse.MouseManager#releasePointerLock
  74781. * @since 3.0.0
  74782. */
  74783. releasePointerLock: function ()
  74784. {
  74785. if (Features.pointerLock)
  74786. {
  74787. document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock;
  74788. document.exitPointerLock();
  74789. }
  74790. },
  74791. /**
  74792. * Starts the Mouse Event listeners running.
  74793. * This is called automatically and does not need to be manually invoked.
  74794. *
  74795. * @method Phaser.Input.Mouse.MouseManager#startListeners
  74796. * @since 3.0.0
  74797. */
  74798. startListeners: function ()
  74799. {
  74800. var _this = this;
  74801. var canvas = this.manager.canvas;
  74802. var autoFocus = (window && window.focus && this.manager.game.config.autoFocus);
  74803. this.onMouseMove = function (event)
  74804. {
  74805. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  74806. {
  74807. // Do nothing if event already handled
  74808. return;
  74809. }
  74810. _this.manager.queueMouseMove(event);
  74811. if (_this.capture)
  74812. {
  74813. event.preventDefault();
  74814. }
  74815. };
  74816. this.onMouseDown = function (event)
  74817. {
  74818. if (autoFocus)
  74819. {
  74820. window.focus();
  74821. }
  74822. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  74823. {
  74824. // Do nothing if event already handled
  74825. return;
  74826. }
  74827. _this.manager.queueMouseDown(event);
  74828. if (_this.capture && event.target === canvas)
  74829. {
  74830. event.preventDefault();
  74831. }
  74832. };
  74833. this.onMouseUp = function (event)
  74834. {
  74835. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  74836. {
  74837. // Do nothing if event already handled
  74838. return;
  74839. }
  74840. _this.manager.queueMouseUp(event);
  74841. if (_this.capture && event.target === canvas)
  74842. {
  74843. event.preventDefault();
  74844. }
  74845. };
  74846. this.onMouseOver = function (event)
  74847. {
  74848. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  74849. {
  74850. // Do nothing if event already handled
  74851. return;
  74852. }
  74853. _this.manager.setCanvasOver(event);
  74854. };
  74855. this.onMouseOut = function (event)
  74856. {
  74857. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  74858. {
  74859. // Do nothing if event already handled
  74860. return;
  74861. }
  74862. _this.manager.setCanvasOut(event);
  74863. };
  74864. var target = this.target;
  74865. if (!target)
  74866. {
  74867. return;
  74868. }
  74869. var passive = { passive: true };
  74870. var nonPassive = { passive: false };
  74871. target.addEventListener('mousemove', this.onMouseMove, (this.capture) ? nonPassive : passive);
  74872. target.addEventListener('mousedown', this.onMouseDown, (this.capture) ? nonPassive : passive);
  74873. target.addEventListener('mouseup', this.onMouseUp, (this.capture) ? nonPassive : passive);
  74874. target.addEventListener('mouseover', this.onMouseOver, (this.capture) ? nonPassive : passive);
  74875. target.addEventListener('mouseout', this.onMouseOut, (this.capture) ? nonPassive : passive);
  74876. if (window)
  74877. {
  74878. window.addEventListener('mousedown', this.onMouseDown, nonPassive);
  74879. window.addEventListener('mouseup', this.onMouseUp, nonPassive);
  74880. }
  74881. if (Features.pointerLock)
  74882. {
  74883. this.pointerLockChange = function (event)
  74884. {
  74885. var element = _this.target;
  74886. _this.locked = (document.pointerLockElement === element || document.mozPointerLockElement === element || document.webkitPointerLockElement === element) ? true : false;
  74887. _this.manager.queue.push(event);
  74888. };
  74889. document.addEventListener('pointerlockchange', this.pointerLockChange, true);
  74890. document.addEventListener('mozpointerlockchange', this.pointerLockChange, true);
  74891. document.addEventListener('webkitpointerlockchange', this.pointerLockChange, true);
  74892. }
  74893. this.enabled = true;
  74894. },
  74895. /**
  74896. * Stops the Mouse Event listeners.
  74897. * This is called automatically and does not need to be manually invoked.
  74898. *
  74899. * @method Phaser.Input.Mouse.MouseManager#stopListeners
  74900. * @since 3.0.0
  74901. */
  74902. stopListeners: function ()
  74903. {
  74904. var target = this.target;
  74905. target.removeEventListener('mousemove', this.onMouseMove);
  74906. target.removeEventListener('mousedown', this.onMouseDown);
  74907. target.removeEventListener('mouseup', this.onMouseUp);
  74908. target.removeEventListener('mouseover', this.onMouseOver);
  74909. target.removeEventListener('mouseout', this.onMouseOut);
  74910. if (window)
  74911. {
  74912. window.removeEventListener('mousedown', this.onMouseDown);
  74913. window.removeEventListener('mouseup', this.onMouseUp);
  74914. }
  74915. if (Features.pointerLock)
  74916. {
  74917. document.removeEventListener('pointerlockchange', this.pointerLockChange, true);
  74918. document.removeEventListener('mozpointerlockchange', this.pointerLockChange, true);
  74919. document.removeEventListener('webkitpointerlockchange', this.pointerLockChange, true);
  74920. }
  74921. },
  74922. /**
  74923. * Destroys this Mouse Manager instance.
  74924. *
  74925. * @method Phaser.Input.Mouse.MouseManager#destroy
  74926. * @since 3.0.0
  74927. */
  74928. destroy: function ()
  74929. {
  74930. this.stopListeners();
  74931. this.target = null;
  74932. this.enabled = false;
  74933. this.manager = null;
  74934. }
  74935. });
  74936. module.exports = MouseManager;
  74937. /***/ }),
  74938. /* 340 */
  74939. /***/ (function(module, exports, __webpack_require__) {
  74940. /**
  74941. * @author Richard Davey <rich@photonstorm.com>
  74942. * @copyright 2019 Photon Storm Ltd.
  74943. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  74944. */
  74945. var ArrayRemove = __webpack_require__(177);
  74946. var Class = __webpack_require__(0);
  74947. var GameEvents = __webpack_require__(26);
  74948. var InputEvents = __webpack_require__(52);
  74949. var KeyCodes = __webpack_require__(125);
  74950. var NOOP = __webpack_require__(0);
  74951. /**
  74952. * @classdesc
  74953. * The Keyboard Manager is a helper class that belongs to the global Input Manager.
  74954. *
  74955. * Its role is to listen for native DOM Keyboard Events and then store them for further processing by the Keyboard Plugin.
  74956. *
  74957. * You do not need to create this class directly, the Input Manager will create an instance of it automatically if keyboard
  74958. * input has been enabled in the Game Config.
  74959. *
  74960. * @class KeyboardManager
  74961. * @memberof Phaser.Input.Keyboard
  74962. * @constructor
  74963. * @since 3.16.0
  74964. *
  74965. * @param {Phaser.Input.InputManager} inputManager - A reference to the Input Manager.
  74966. */
  74967. var KeyboardManager = new Class({
  74968. initialize:
  74969. function KeyboardManager (inputManager)
  74970. {
  74971. /**
  74972. * A reference to the Input Manager.
  74973. *
  74974. * @name Phaser.Input.Keyboard.KeyboardManager#manager
  74975. * @type {Phaser.Input.InputManager}
  74976. * @since 3.16.0
  74977. */
  74978. this.manager = inputManager;
  74979. /**
  74980. * An internal event queue.
  74981. *
  74982. * @name Phaser.Input.Keyboard.KeyboardManager#queue
  74983. * @type {KeyboardEvent[]}
  74984. * @private
  74985. * @since 3.16.0
  74986. */
  74987. this.queue = [];
  74988. /**
  74989. * A flag that controls if the non-modified keys, matching those stored in the `captures` array,
  74990. * have `preventDefault` called on them or not.
  74991. *
  74992. * A non-modified key is one that doesn't have a modifier key held down with it. The modifier keys are
  74993. * shift, control, alt and the meta key (Command on a Mac, the Windows Key on Windows).
  74994. * Therefore, if the user presses shift + r, it won't prevent this combination, because of the modifier.
  74995. * However, if the user presses just the r key on its own, it will have its event prevented.
  74996. *
  74997. * If you wish to stop capturing the keys, for example switching out to a DOM based element, then
  74998. * you can toggle this property at run-time.
  74999. *
  75000. * @name Phaser.Input.Keyboard.KeyboardManager#preventDefault
  75001. * @type {boolean}
  75002. * @since 3.16.0
  75003. */
  75004. this.preventDefault = true;
  75005. /**
  75006. * An array of Key Code values that will automatically have `preventDefault` called on them,
  75007. * as long as the `KeyboardManager.preventDefault` boolean is set to `true`.
  75008. *
  75009. * By default the array is empty.
  75010. *
  75011. * The key must be non-modified when pressed in order to be captured.
  75012. *
  75013. * A non-modified key is one that doesn't have a modifier key held down with it. The modifier keys are
  75014. * shift, control, alt and the meta key (Command on a Mac, the Windows Key on Windows).
  75015. * Therefore, if the user presses shift + r, it won't prevent this combination, because of the modifier.
  75016. * However, if the user presses just the r key on its own, it will have its event prevented.
  75017. *
  75018. * If you wish to stop capturing the keys, for example switching out to a DOM based element, then
  75019. * you can toggle the `KeyboardManager.preventDefault` boolean at run-time.
  75020. *
  75021. * If you need more specific control, you can create Key objects and set the flag on each of those instead.
  75022. *
  75023. * This array can be populated via the Game Config by setting the `input.keyboard.capture` array, or you
  75024. * can call the `addCapture` method. See also `removeCapture` and `clearCaptures`.
  75025. *
  75026. * @name Phaser.Input.Keyboard.KeyboardManager#captures
  75027. * @type {integer[]}
  75028. * @since 3.16.0
  75029. */
  75030. this.captures = [];
  75031. /**
  75032. * A boolean that controls if the Keyboard Manager is enabled or not.
  75033. * Can be toggled on the fly.
  75034. *
  75035. * @name Phaser.Input.Keyboard.KeyboardManager#enabled
  75036. * @type {boolean}
  75037. * @default false
  75038. * @since 3.16.0
  75039. */
  75040. this.enabled = false;
  75041. /**
  75042. * The Keyboard Event target, as defined in the Game Config.
  75043. * Typically the window in which the game is rendering, but can be any interactive DOM element.
  75044. *
  75045. * @name Phaser.Input.Keyboard.KeyboardManager#target
  75046. * @type {any}
  75047. * @since 3.16.0
  75048. */
  75049. this.target;
  75050. /**
  75051. * The Key Down Event handler.
  75052. * This function is sent the native DOM KeyEvent.
  75053. * Initially empty and bound in the `startListeners` method.
  75054. *
  75055. * @name Phaser.Input.Keyboard.KeyboardManager#onKeyDown
  75056. * @type {function}
  75057. * @since 3.16.00
  75058. */
  75059. this.onKeyDown = NOOP;
  75060. /**
  75061. * The Key Up Event handler.
  75062. * This function is sent the native DOM KeyEvent.
  75063. * Initially empty and bound in the `startListeners` method.
  75064. *
  75065. * @name Phaser.Input.Keyboard.KeyboardManager#onKeyUp
  75066. * @type {function}
  75067. * @since 3.16.00
  75068. */
  75069. this.onKeyUp = NOOP;
  75070. inputManager.events.once(InputEvents.MANAGER_BOOT, this.boot, this);
  75071. },
  75072. /**
  75073. * The Keyboard Manager boot process.
  75074. *
  75075. * @method Phaser.Input.Keyboard.KeyboardManager#boot
  75076. * @private
  75077. * @since 3.16.0
  75078. */
  75079. boot: function ()
  75080. {
  75081. var config = this.manager.config;
  75082. this.enabled = config.inputKeyboard;
  75083. this.target = config.inputKeyboardEventTarget;
  75084. this.addCapture(config.inputKeyboardCapture);
  75085. if (!this.target && window)
  75086. {
  75087. this.target = window;
  75088. }
  75089. if (this.enabled && this.target)
  75090. {
  75091. this.startListeners();
  75092. }
  75093. this.manager.game.events.on(GameEvents.POST_STEP, this.postUpdate, this);
  75094. },
  75095. /**
  75096. * Starts the Keyboard Event listeners running.
  75097. * This is called automatically and does not need to be manually invoked.
  75098. *
  75099. * @method Phaser.Input.Keyboard.KeyboardManager#startListeners
  75100. * @since 3.16.0
  75101. */
  75102. startListeners: function ()
  75103. {
  75104. var _this = this;
  75105. this.onKeyDown = function (event)
  75106. {
  75107. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  75108. {
  75109. // Do nothing if event already handled
  75110. return;
  75111. }
  75112. _this.queue.push(event);
  75113. if (!_this.manager.useQueue)
  75114. {
  75115. _this.manager.events.emit(InputEvents.MANAGER_PROCESS);
  75116. }
  75117. var modified = (event.altKey || event.ctrlKey || event.shiftKey || event.metaKey);
  75118. if (_this.preventDefault && !modified && _this.captures.indexOf(event.keyCode) > -1)
  75119. {
  75120. event.preventDefault();
  75121. }
  75122. };
  75123. this.onKeyUp = function (event)
  75124. {
  75125. if (event.defaultPrevented || !_this.enabled || !_this.manager)
  75126. {
  75127. // Do nothing if event already handled
  75128. return;
  75129. }
  75130. _this.queue.push(event);
  75131. if (!_this.manager.useQueue)
  75132. {
  75133. _this.manager.events.emit(InputEvents.MANAGER_PROCESS);
  75134. }
  75135. var modified = (event.altKey || event.ctrlKey || event.shiftKey || event.metaKey);
  75136. if (_this.preventDefault && !modified && _this.captures.indexOf(event.keyCode) > -1)
  75137. {
  75138. event.preventDefault();
  75139. }
  75140. };
  75141. var target = this.target;
  75142. if (target)
  75143. {
  75144. target.addEventListener('keydown', this.onKeyDown, false);
  75145. target.addEventListener('keyup', this.onKeyUp, false);
  75146. this.enabled = true;
  75147. }
  75148. },
  75149. /**
  75150. * Stops the Key Event listeners.
  75151. * This is called automatically and does not need to be manually invoked.
  75152. *
  75153. * @method Phaser.Input.Keyboard.KeyboardManager#stopListeners
  75154. * @since 3.16.0
  75155. */
  75156. stopListeners: function ()
  75157. {
  75158. var target = this.target;
  75159. target.removeEventListener('keydown', this.onKeyDown, false);
  75160. target.removeEventListener('keyup', this.onKeyUp, false);
  75161. this.enabled = false;
  75162. },
  75163. /**
  75164. * Clears the event queue.
  75165. * Called automatically by the Input Manager.
  75166. *
  75167. * @method Phaser.Input.Keyboard.KeyboardManager#postUpdate
  75168. * @private
  75169. * @since 3.16.0
  75170. */
  75171. postUpdate: function ()
  75172. {
  75173. this.queue = [];
  75174. },
  75175. /**
  75176. * By default when a key is pressed Phaser will not stop the event from propagating up to the browser.
  75177. * There are some keys this can be annoying for, like the arrow keys or space bar, which make the browser window scroll.
  75178. *
  75179. * This `addCapture` method enables consuming keyboard event for specific keys so it doesn't bubble up to the the browser
  75180. * and cause the default browser behavior.
  75181. *
  75182. * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to say prevent
  75183. * the SPACE BAR from triggering a page scroll, then it will prevent it for any Scene in your game, not just the calling one.
  75184. *
  75185. * You can pass in a single key code value, or an array of key codes, or a string:
  75186. *
  75187. * ```javascript
  75188. * this.input.keyboard.addCapture(62);
  75189. * ```
  75190. *
  75191. * An array of key codes:
  75192. *
  75193. * ```javascript
  75194. * this.input.keyboard.addCapture([ 62, 63, 64 ]);
  75195. * ```
  75196. *
  75197. * Or a string:
  75198. *
  75199. * ```javascript
  75200. * this.input.keyboard.addCapture('W,S,A,D');
  75201. * ```
  75202. *
  75203. * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'.
  75204. *
  75205. * You can also provide an array mixing both strings and key code integers.
  75206. *
  75207. * If there are active captures after calling this method, the `preventDefault` property is set to `true`.
  75208. *
  75209. * @method Phaser.Input.Keyboard.KeyboardManager#addCapture
  75210. * @since 3.16.0
  75211. *
  75212. * @param {(string|integer|integer[]|any[])} keycode - The Key Codes to enable capture for, preventing them reaching the browser.
  75213. */
  75214. addCapture: function (keycode)
  75215. {
  75216. if (typeof keycode === 'string')
  75217. {
  75218. keycode = keycode.split(',');
  75219. }
  75220. if (!Array.isArray(keycode))
  75221. {
  75222. keycode = [ keycode ];
  75223. }
  75224. var captures = this.captures;
  75225. for (var i = 0; i < keycode.length; i++)
  75226. {
  75227. var code = keycode[i];
  75228. if (typeof code === 'string')
  75229. {
  75230. code = KeyCodes[code.trim().toUpperCase()];
  75231. }
  75232. if (captures.indexOf(code) === -1)
  75233. {
  75234. captures.push(code);
  75235. }
  75236. }
  75237. this.preventDefault = captures.length > 0;
  75238. },
  75239. /**
  75240. * Removes an existing key capture.
  75241. *
  75242. * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to remove
  75243. * the capture of a key, then it will remove it for any Scene in your game, not just the calling one.
  75244. *
  75245. * You can pass in a single key code value, or an array of key codes, or a string:
  75246. *
  75247. * ```javascript
  75248. * this.input.keyboard.removeCapture(62);
  75249. * ```
  75250. *
  75251. * An array of key codes:
  75252. *
  75253. * ```javascript
  75254. * this.input.keyboard.removeCapture([ 62, 63, 64 ]);
  75255. * ```
  75256. *
  75257. * Or a string:
  75258. *
  75259. * ```javascript
  75260. * this.input.keyboard.removeCapture('W,S,A,D');
  75261. * ```
  75262. *
  75263. * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'.
  75264. *
  75265. * You can also provide an array mixing both strings and key code integers.
  75266. *
  75267. * If there are no captures left after calling this method, the `preventDefault` property is set to `false`.
  75268. *
  75269. * @method Phaser.Input.Keyboard.KeyboardManager#removeCapture
  75270. * @since 3.16.0
  75271. *
  75272. * @param {(string|integer|integer[]|any[])} keycode - The Key Codes to disable capture for, allowing them reaching the browser again.
  75273. */
  75274. removeCapture: function (keycode)
  75275. {
  75276. if (typeof keycode === 'string')
  75277. {
  75278. keycode = keycode.split(',');
  75279. }
  75280. if (!Array.isArray(keycode))
  75281. {
  75282. keycode = [ keycode ];
  75283. }
  75284. var captures = this.captures;
  75285. for (var i = 0; i < keycode.length; i++)
  75286. {
  75287. var code = keycode[i];
  75288. if (typeof code === 'string')
  75289. {
  75290. code = KeyCodes[code.toUpperCase()];
  75291. }
  75292. ArrayRemove(captures, code);
  75293. }
  75294. this.preventDefault = captures.length > 0;
  75295. },
  75296. /**
  75297. * Removes all keyboard captures and sets the `preventDefault` property to `false`.
  75298. *
  75299. * @method Phaser.Input.Keyboard.KeyboardManager#clearCaptures
  75300. * @since 3.16.0
  75301. */
  75302. clearCaptures: function ()
  75303. {
  75304. this.captures = [];
  75305. this.preventDefault = false;
  75306. },
  75307. /**
  75308. * Destroys this Keyboard Manager instance.
  75309. *
  75310. * @method Phaser.Input.Keyboard.KeyboardManager#destroy
  75311. * @since 3.16.0
  75312. */
  75313. destroy: function ()
  75314. {
  75315. this.stopListeners();
  75316. this.clearCaptures();
  75317. this.queue = [];
  75318. this.manager.game.events.off(GameEvents.POST_RENDER, this.postUpdate, this);
  75319. this.target = null;
  75320. this.enabled = false;
  75321. this.manager = null;
  75322. }
  75323. });
  75324. module.exports = KeyboardManager;
  75325. /***/ }),
  75326. /* 341 */
  75327. /***/ (function(module, exports) {
  75328. /**
  75329. * @author Richard Davey <rich@photonstorm.com>
  75330. * @copyright 2019 Photon Storm Ltd.
  75331. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75332. */
  75333. var INPUT_CONST = {
  75334. /**
  75335. * The mouse pointer is being held down.
  75336. *
  75337. * @name Phaser.Input.MOUSE_DOWN
  75338. * @type {integer}
  75339. * @since 3.10.0
  75340. */
  75341. MOUSE_DOWN: 0,
  75342. /**
  75343. * The mouse pointer is being moved.
  75344. *
  75345. * @name Phaser.Input.MOUSE_MOVE
  75346. * @type {integer}
  75347. * @since 3.10.0
  75348. */
  75349. MOUSE_MOVE: 1,
  75350. /**
  75351. * The mouse pointer is released.
  75352. *
  75353. * @name Phaser.Input.MOUSE_UP
  75354. * @type {integer}
  75355. * @since 3.10.0
  75356. */
  75357. MOUSE_UP: 2,
  75358. /**
  75359. * A touch pointer has been started.
  75360. *
  75361. * @name Phaser.Input.TOUCH_START
  75362. * @type {integer}
  75363. * @since 3.10.0
  75364. */
  75365. TOUCH_START: 3,
  75366. /**
  75367. * A touch pointer has been started.
  75368. *
  75369. * @name Phaser.Input.TOUCH_MOVE
  75370. * @type {integer}
  75371. * @since 3.10.0
  75372. */
  75373. TOUCH_MOVE: 4,
  75374. /**
  75375. * A touch pointer has been started.
  75376. *
  75377. * @name Phaser.Input.TOUCH_END
  75378. * @type {integer}
  75379. * @since 3.10.0
  75380. */
  75381. TOUCH_END: 5,
  75382. /**
  75383. * A touch pointer has been been cancelled by the browser.
  75384. *
  75385. * @name Phaser.Input.TOUCH_CANCEL
  75386. * @type {integer}
  75387. * @since 3.15.0
  75388. */
  75389. TOUCH_CANCEL: 7,
  75390. /**
  75391. * The pointer lock has changed.
  75392. *
  75393. * @name Phaser.Input.POINTER_LOCK_CHANGE
  75394. * @type {integer}
  75395. * @since 3.10.0
  75396. */
  75397. POINTER_LOCK_CHANGE: 6
  75398. };
  75399. module.exports = INPUT_CONST;
  75400. /***/ }),
  75401. /* 342 */
  75402. /***/ (function(module, exports, __webpack_require__) {
  75403. /**
  75404. * @author Richard Davey <rich@photonstorm.com>
  75405. * @copyright 2019 Photon Storm Ltd.
  75406. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75407. */
  75408. var Class = __webpack_require__(0);
  75409. var CONST = __webpack_require__(341);
  75410. var EventEmitter = __webpack_require__(11);
  75411. var Events = __webpack_require__(52);
  75412. var GameEvents = __webpack_require__(26);
  75413. var Keyboard = __webpack_require__(340);
  75414. var Mouse = __webpack_require__(339);
  75415. var Pointer = __webpack_require__(338);
  75416. var Touch = __webpack_require__(337);
  75417. var TransformMatrix = __webpack_require__(41);
  75418. var TransformXY = __webpack_require__(371);
  75419. /**
  75420. * @classdesc
  75421. * The Input Manager is responsible for handling the pointer related systems in a single Phaser Game instance.
  75422. *
  75423. * Based on the Game Config it will create handlers for mouse and touch support.
  75424. *
  75425. * Keyboard and Gamepad are plugins, handled directly by the InputPlugin class.
  75426. *
  75427. * It then manages the event queue, pointer creation and general hit test related operations.
  75428. *
  75429. * You rarely need to interact with the Input Manager directly, and as such, all of its properties and methods
  75430. * should be considered private. Instead, you should use the Input Plugin, which is a Scene level system, responsible
  75431. * for dealing with all input events for a Scene.
  75432. *
  75433. * @class InputManager
  75434. * @memberof Phaser.Input
  75435. * @constructor
  75436. * @since 3.0.0
  75437. *
  75438. * @param {Phaser.Game} game - The Game instance that owns the Input Manager.
  75439. * @param {object} config - The Input Configuration object, as set in the Game Config.
  75440. */
  75441. var InputManager = new Class({
  75442. initialize:
  75443. function InputManager (game, config)
  75444. {
  75445. /**
  75446. * The Game instance that owns the Input Manager.
  75447. * A Game only maintains on instance of the Input Manager at any time.
  75448. *
  75449. * @name Phaser.Input.InputManager#game
  75450. * @type {Phaser.Game}
  75451. * @readonly
  75452. * @since 3.0.0
  75453. */
  75454. this.game = game;
  75455. /**
  75456. * A reference to the global Game Scale Manager.
  75457. * Used for all bounds checks and pointer scaling.
  75458. *
  75459. * @name Phaser.Input.InputManager#scaleManager
  75460. * @type {Phaser.Scale.ScaleManager}
  75461. * @since 3.16.0
  75462. */
  75463. this.scaleManager;
  75464. /**
  75465. * The Canvas that is used for all DOM event input listeners.
  75466. *
  75467. * @name Phaser.Input.InputManager#canvas
  75468. * @type {HTMLCanvasElement}
  75469. * @since 3.0.0
  75470. */
  75471. this.canvas;
  75472. /**
  75473. * The Game Configuration object, as set during the game boot.
  75474. *
  75475. * @name Phaser.Input.InputManager#config
  75476. * @type {Phaser.Core.Config}
  75477. * @since 3.0.0
  75478. */
  75479. this.config = config;
  75480. /**
  75481. * If set, the Input Manager will run its update loop every frame.
  75482. *
  75483. * @name Phaser.Input.InputManager#enabled
  75484. * @type {boolean}
  75485. * @default true
  75486. * @since 3.0.0
  75487. */
  75488. this.enabled = true;
  75489. /**
  75490. * The Event Emitter instance that the Input Manager uses to emit events from.
  75491. *
  75492. * @name Phaser.Input.InputManager#events
  75493. * @type {Phaser.Events.EventEmitter}
  75494. * @since 3.0.0
  75495. */
  75496. this.events = new EventEmitter();
  75497. /**
  75498. * A standard FIFO queue for the native DOM events waiting to be handled by the Input Manager.
  75499. *
  75500. * @name Phaser.Input.InputManager#queue
  75501. * @type {array}
  75502. * @default []
  75503. * @deprecated
  75504. * @since 3.0.0
  75505. */
  75506. this.queue = [];
  75507. /**
  75508. * DOM Callbacks container.
  75509. *
  75510. * @name Phaser.Input.InputManager#domCallbacks
  75511. * @private
  75512. * @type {object}
  75513. * @deprecated
  75514. * @since 3.10.0
  75515. */
  75516. this.domCallbacks = { up: [], down: [], move: [], upOnce: [], downOnce: [], moveOnce: [] };
  75517. /**
  75518. * Are any mouse or touch pointers currently over the game canvas?
  75519. * This is updated automatically by the canvas over and out handlers.
  75520. *
  75521. * @name Phaser.Input.InputManager#isOver
  75522. * @type {boolean}
  75523. * @readonly
  75524. * @since 3.16.0
  75525. */
  75526. this.isOver = true;
  75527. /**
  75528. * Are there any up callbacks defined?
  75529. *
  75530. * @name Phaser.Input.InputManager#_hasUpCallback
  75531. * @private
  75532. * @type {boolean}
  75533. * @deprecated
  75534. * @since 3.10.0
  75535. */
  75536. this._hasUpCallback = false;
  75537. /**
  75538. * Are there any down callbacks defined?
  75539. *
  75540. * @name Phaser.Input.InputManager#_hasDownCallback
  75541. * @private
  75542. * @type {boolean}
  75543. * @deprecated
  75544. * @since 3.10.0
  75545. */
  75546. this._hasDownCallback = false;
  75547. /**
  75548. * Are there any move callbacks defined?
  75549. *
  75550. * @name Phaser.Input.InputManager#_hasMoveCallback
  75551. * @private
  75552. * @type {boolean}
  75553. * @deprecated
  75554. * @since 3.10.0
  75555. */
  75556. this._hasMoveCallback = false;
  75557. /**
  75558. * Is a custom cursor currently set? (desktop only)
  75559. *
  75560. * @name Phaser.Input.InputManager#_customCursor
  75561. * @private
  75562. * @type {string}
  75563. * @since 3.10.0
  75564. */
  75565. this._customCursor = '';
  75566. /**
  75567. * Custom cursor tracking value.
  75568. *
  75569. * 0 - No change.
  75570. * 1 - Set new cursor.
  75571. * 2 - Reset cursor.
  75572. *
  75573. * @name Phaser.Input.InputManager#_setCursor
  75574. * @private
  75575. * @type {integer}
  75576. * @since 3.10.0
  75577. */
  75578. this._setCursor = 0;
  75579. /**
  75580. * The default CSS cursor to be used when interacting with your game.
  75581. *
  75582. * See the `setDefaultCursor` method for more details.
  75583. *
  75584. * @name Phaser.Input.InputManager#defaultCursor
  75585. * @type {string}
  75586. * @since 3.10.0
  75587. */
  75588. this.defaultCursor = '';
  75589. /**
  75590. * A reference to the Keyboard Manager class, if enabled via the `input.keyboard` Game Config property.
  75591. *
  75592. * @name Phaser.Input.InputManager#keyboard
  75593. * @type {?Phaser.Input.Keyboard.KeyboardManager}
  75594. * @since 3.16.0
  75595. */
  75596. this.keyboard = (config.inputKeyboard) ? new Keyboard(this) : null;
  75597. /**
  75598. * A reference to the Mouse Manager class, if enabled via the `input.mouse` Game Config property.
  75599. *
  75600. * @name Phaser.Input.InputManager#mouse
  75601. * @type {?Phaser.Input.Mouse.MouseManager}
  75602. * @since 3.0.0
  75603. */
  75604. this.mouse = (config.inputMouse) ? new Mouse(this) : null;
  75605. /**
  75606. * A reference to the Touch Manager class, if enabled via the `input.touch` Game Config property.
  75607. *
  75608. * @name Phaser.Input.InputManager#touch
  75609. * @type {Phaser.Input.Touch.TouchManager}
  75610. * @since 3.0.0
  75611. */
  75612. this.touch = (config.inputTouch) ? new Touch(this) : null;
  75613. /**
  75614. * An array of Pointers that have been added to the game.
  75615. * The first entry is reserved for the Mouse Pointer, the rest are Touch Pointers.
  75616. *
  75617. * By default there is 1 touch pointer enabled. If you need more use the `addPointer` method to start them,
  75618. * or set the `input.activePointers` property in the Game Config.
  75619. *
  75620. * @name Phaser.Input.InputManager#pointers
  75621. * @type {Phaser.Input.Pointer[]}
  75622. * @since 3.10.0
  75623. */
  75624. this.pointers = [];
  75625. /**
  75626. * The number of touch objects activated and being processed each update.
  75627. *
  75628. * You can change this by either calling `addPointer` at run-time, or by
  75629. * setting the `input.activePointers` property in the Game Config.
  75630. *
  75631. * @name Phaser.Input.InputManager#pointersTotal
  75632. * @type {integer}
  75633. * @readonly
  75634. * @since 3.10.0
  75635. */
  75636. this.pointersTotal = config.inputActivePointers;
  75637. if (config.inputTouch && this.pointersTotal === 1)
  75638. {
  75639. this.pointersTotal = 2;
  75640. }
  75641. for (var i = 0; i <= this.pointersTotal; i++)
  75642. {
  75643. var pointer = new Pointer(this, i);
  75644. pointer.smoothFactor = config.inputSmoothFactor;
  75645. this.pointers.push(pointer);
  75646. }
  75647. /**
  75648. * The mouse has its own unique Pointer object, which you can reference directly if making a _desktop specific game_.
  75649. * If you are supporting both desktop and touch devices then do not use this property, instead use `activePointer`
  75650. * which will always map to the most recently interacted pointer.
  75651. *
  75652. * @name Phaser.Input.InputManager#mousePointer
  75653. * @type {?Phaser.Input.Pointer}
  75654. * @since 3.10.0
  75655. */
  75656. this.mousePointer = (config.inputMouse) ? this.pointers[0] : null;
  75657. /**
  75658. * The most recently active Pointer object.
  75659. *
  75660. * If you've only 1 Pointer in your game then this will accurately be either the first finger touched, or the mouse.
  75661. *
  75662. * If your game doesn't need to support multi-touch then you can safely use this property in all of your game
  75663. * code and it will adapt to be either the mouse or the touch, based on device.
  75664. *
  75665. * @name Phaser.Input.InputManager#activePointer
  75666. * @type {Phaser.Input.Pointer}
  75667. * @since 3.0.0
  75668. */
  75669. this.activePointer = this.pointers[0];
  75670. /**
  75671. * Reset every frame. Set to `true` if any of the Pointers are dirty this frame.
  75672. *
  75673. * @name Phaser.Input.InputManager#dirty
  75674. * @type {boolean}
  75675. * @since 3.10.0
  75676. */
  75677. this.dirty = false;
  75678. /**
  75679. * If the top-most Scene in the Scene List receives an input it will stop input from
  75680. * propagating any lower down the scene list, i.e. if you have a UI Scene at the top
  75681. * and click something on it, that click will not then be passed down to any other
  75682. * Scene below. Disable this to have input events passed through all Scenes, all the time.
  75683. *
  75684. * @name Phaser.Input.InputManager#globalTopOnly
  75685. * @type {boolean}
  75686. * @default true
  75687. * @since 3.0.0
  75688. */
  75689. this.globalTopOnly = true;
  75690. /**
  75691. * An internal flag that controls if the Input Manager will ignore or process native DOM events this frame.
  75692. * Set via the InputPlugin.stopPropagation method.
  75693. *
  75694. * @name Phaser.Input.InputManager#ignoreEvents
  75695. * @type {boolean}
  75696. * @default false
  75697. * @since 3.0.0
  75698. */
  75699. this.ignoreEvents = false;
  75700. /**
  75701. * Use the internal event queue or not?
  75702. *
  75703. * Set this via the Game Config with the `inputQueue` property.
  75704. *
  75705. * Phaser 3.15.1 and earlier used a event queue by default.
  75706. *
  75707. * This was changed in version 3.16 to use an immediate-mode system.
  75708. * The previous queue based version remains and is left under this flag for backwards
  75709. * compatibility. This flag, along with the legacy system, will be removed in a future version.
  75710. *
  75711. * @name Phaser.Input.InputManager#useQueue
  75712. * @type {boolean}
  75713. * @default false
  75714. * @since 3.16.0
  75715. */
  75716. this.useQueue = config.inputQueue;
  75717. /**
  75718. * The time this Input Manager was last updated.
  75719. * This value is populated by the Game Step each frame.
  75720. *
  75721. * @name Phaser.Input.InputManager#time
  75722. * @type {number}
  75723. * @readonly
  75724. * @since 3.16.2
  75725. */
  75726. this.time = 0;
  75727. /**
  75728. * Internal property that tracks frame event state.
  75729. *
  75730. * @name Phaser.Input.InputManager#_updatedThisFrame
  75731. * @type {boolean}
  75732. * @private
  75733. * @since 3.16.0
  75734. */
  75735. this._updatedThisFrame = false;
  75736. /**
  75737. * A re-cycled point-like object to store hit test values in.
  75738. *
  75739. * @name Phaser.Input.InputManager#_tempPoint
  75740. * @type {{x:number, y:number}}
  75741. * @private
  75742. * @since 3.0.0
  75743. */
  75744. this._tempPoint = { x: 0, y: 0 };
  75745. /**
  75746. * A re-cycled array to store hit results in.
  75747. *
  75748. * @name Phaser.Input.InputManager#_tempHitTest
  75749. * @type {array}
  75750. * @private
  75751. * @default []
  75752. * @since 3.0.0
  75753. */
  75754. this._tempHitTest = [];
  75755. /**
  75756. * A re-cycled matrix used in hit test calculations.
  75757. *
  75758. * @name Phaser.Input.InputManager#_tempMatrix
  75759. * @type {Phaser.GameObjects.Components.TransformMatrix}
  75760. * @private
  75761. * @since 3.4.0
  75762. */
  75763. this._tempMatrix = new TransformMatrix();
  75764. /**
  75765. * A re-cycled matrix used in hit test calculations.
  75766. *
  75767. * @name Phaser.Input.InputManager#_tempMatrix2
  75768. * @type {Phaser.GameObjects.Components.TransformMatrix}
  75769. * @private
  75770. * @since 3.12.0
  75771. */
  75772. this._tempMatrix2 = new TransformMatrix();
  75773. game.events.once(GameEvents.BOOT, this.boot, this);
  75774. },
  75775. /**
  75776. * The Boot handler is called by Phaser.Game when it first starts up.
  75777. * The renderer is available by now.
  75778. *
  75779. * @method Phaser.Input.InputManager#boot
  75780. * @protected
  75781. * @fires Phaser.Input.Events#MANAGER_BOOT
  75782. * @since 3.0.0
  75783. */
  75784. boot: function ()
  75785. {
  75786. this.canvas = this.game.canvas;
  75787. this.scaleManager = this.game.scale;
  75788. this.events.emit(Events.MANAGER_BOOT);
  75789. if (this.useQueue)
  75790. {
  75791. this.game.events.on(GameEvents.PRE_STEP, this.legacyUpdate, this);
  75792. }
  75793. else
  75794. {
  75795. this.game.events.on(GameEvents.PRE_STEP, this.preStep, this);
  75796. }
  75797. this.game.events.on(GameEvents.POST_STEP, this.postUpdate, this);
  75798. this.game.events.once(GameEvents.DESTROY, this.destroy, this);
  75799. },
  75800. /**
  75801. * Internal canvas state change, called automatically by the Mouse Manager.
  75802. *
  75803. * @method Phaser.Input.InputManager#setCanvasOver
  75804. * @fires Phaser.Input.Events#GAME_OVER
  75805. * @private
  75806. * @since 3.16.0
  75807. *
  75808. * @param {(MouseEvent|TouchEvent)} event - The DOM Event.
  75809. */
  75810. setCanvasOver: function (event)
  75811. {
  75812. this.isOver = true;
  75813. this.events.emit(Events.GAME_OVER, event);
  75814. },
  75815. /**
  75816. * Internal canvas state change, called automatically by the Mouse Manager.
  75817. *
  75818. * @method Phaser.Input.InputManager#setCanvasOut
  75819. * @fires Phaser.Input.Events#GAME_OUT
  75820. * @private
  75821. * @since 3.16.0
  75822. *
  75823. * @param {(MouseEvent|TouchEvent)} event - The DOM Event.
  75824. */
  75825. setCanvasOut: function (event)
  75826. {
  75827. this.isOver = false;
  75828. this.events.emit(Events.GAME_OUT, event);
  75829. },
  75830. /**
  75831. * Internal update method, called automatically when a DOM input event is received.
  75832. *
  75833. * @method Phaser.Input.InputManager#update
  75834. * @private
  75835. * @fires Phaser.Input.Events#MANAGER_UPDATE
  75836. * @since 3.0.0
  75837. *
  75838. * @param {number} time - The time stamp value of this game step.
  75839. */
  75840. update: function (time)
  75841. {
  75842. if (!this._updatedThisFrame)
  75843. {
  75844. this._setCursor = 0;
  75845. this._updatedThisFrame = true;
  75846. }
  75847. this.events.emit(Events.MANAGER_UPDATE);
  75848. this.ignoreEvents = false;
  75849. this.dirty = true;
  75850. var pointers = this.pointers;
  75851. for (var i = 0; i < this.pointersTotal; i++)
  75852. {
  75853. pointers[i].reset(time);
  75854. }
  75855. },
  75856. /**
  75857. * Internal update, called automatically by the Game Step.
  75858. *
  75859. * @method Phaser.Input.InputManager#preStep
  75860. * @private
  75861. * @since 3.16.2
  75862. *
  75863. * @param {number} time - The time stamp value of this game step.
  75864. */
  75865. preStep: function (time)
  75866. {
  75867. this.time = time;
  75868. },
  75869. /**
  75870. * Internal update loop, called automatically by the Game Step when using the legacy event queue.
  75871. *
  75872. * @method Phaser.Input.InputManager#legacyUpdate
  75873. * @private
  75874. * @fires Phaser.Input.Events#MANAGER_UPDATE
  75875. * @since 3.16.0
  75876. *
  75877. * @param {number} time - The time stamp value of this game step.
  75878. */
  75879. legacyUpdate: function (time)
  75880. {
  75881. this.time = time;
  75882. var i;
  75883. this._setCursor = 0;
  75884. this.events.emit(Events.MANAGER_UPDATE);
  75885. this.ignoreEvents = false;
  75886. this.dirty = false;
  75887. var len = this.queue.length;
  75888. var pointers = this.pointers;
  75889. for (i = 0; i < this.pointersTotal; i++)
  75890. {
  75891. pointers[i].reset(time);
  75892. }
  75893. if (!this.enabled || len === 0)
  75894. {
  75895. for (i = 0; i < this.pointersTotal; i++)
  75896. {
  75897. pointers[i].updateMotion();
  75898. }
  75899. return;
  75900. }
  75901. this.dirty = true;
  75902. // Clears the queue array, and also means we don't work on array data that could potentially
  75903. // be modified during the processing phase
  75904. var queue = this.queue.splice(0, len);
  75905. var mouse = this.mousePointer;
  75906. // Process the event queue, dispatching all of the events that have stored up
  75907. for (i = 0; i < len; i += 2)
  75908. {
  75909. var type = queue[i];
  75910. var event = queue[i + 1];
  75911. switch (type)
  75912. {
  75913. case CONST.MOUSE_DOWN:
  75914. mouse.down(event, time);
  75915. break;
  75916. case CONST.MOUSE_MOVE:
  75917. mouse.move(event, time);
  75918. break;
  75919. case CONST.MOUSE_UP:
  75920. mouse.up(event, time);
  75921. break;
  75922. case CONST.TOUCH_START:
  75923. this.startPointer(event, time);
  75924. break;
  75925. case CONST.TOUCH_MOVE:
  75926. this.updatePointer(event, time);
  75927. break;
  75928. case CONST.TOUCH_END:
  75929. this.stopPointer(event, time);
  75930. break;
  75931. case CONST.TOUCH_CANCEL:
  75932. this.cancelPointer(event, time);
  75933. break;
  75934. case CONST.POINTER_LOCK_CHANGE:
  75935. this.events.emit(Events.POINTERLOCK_CHANGE, event, this.mouse.locked);
  75936. break;
  75937. }
  75938. }
  75939. for (i = 0; i < this.pointersTotal; i++)
  75940. {
  75941. pointers[i].updateMotion();
  75942. }
  75943. },
  75944. /**
  75945. * Internal post-update, called automatically by the Game step.
  75946. *
  75947. * @method Phaser.Input.InputManager#postUpdate
  75948. * @private
  75949. * @since 3.10.0
  75950. */
  75951. postUpdate: function ()
  75952. {
  75953. if (this._setCursor === 1)
  75954. {
  75955. this.canvas.style.cursor = this._customCursor;
  75956. }
  75957. else if (this._setCursor === 2)
  75958. {
  75959. this.canvas.style.cursor = this.defaultCursor;
  75960. }
  75961. this.dirty = false;
  75962. this._updatedThisFrame = false;
  75963. },
  75964. /**
  75965. * Tells the Input system to set a custom cursor.
  75966. *
  75967. * This cursor will be the default cursor used when interacting with the game canvas.
  75968. *
  75969. * If an Interactive Object also sets a custom cursor, this is the cursor that is reset after its use.
  75970. *
  75971. * Any valid CSS cursor value is allowed, including paths to image files, i.e.:
  75972. *
  75973. * ```javascript
  75974. * this.input.setDefaultCursor('url(assets/cursors/sword.cur), pointer');
  75975. * ```
  75976. *
  75977. * Please read about the differences between browsers when it comes to the file formats and sizes they support:
  75978. *
  75979. * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor
  75980. * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_User_Interface/Using_URL_values_for_the_cursor_property
  75981. *
  75982. * It's up to you to pick a suitable cursor format that works across the range of browsers you need to support.
  75983. *
  75984. * @method Phaser.Input.InputManager#setDefaultCursor
  75985. * @since 3.10.0
  75986. *
  75987. * @param {string} cursor - The CSS to be used when setting the default cursor.
  75988. */
  75989. setDefaultCursor: function (cursor)
  75990. {
  75991. this.defaultCursor = cursor;
  75992. if (this.canvas.style.cursor !== cursor)
  75993. {
  75994. this.canvas.style.cursor = cursor;
  75995. }
  75996. },
  75997. /**
  75998. * Called by the InputPlugin when processing over and out events.
  75999. *
  76000. * Tells the Input Manager to set a custom cursor during its postUpdate step.
  76001. *
  76002. * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor
  76003. *
  76004. * @method Phaser.Input.InputManager#setCursor
  76005. * @private
  76006. * @since 3.10.0
  76007. *
  76008. * @param {Phaser.Input.InteractiveObject} interactiveObject - The Interactive Object that called this method.
  76009. */
  76010. setCursor: function (interactiveObject)
  76011. {
  76012. if (interactiveObject.cursor)
  76013. {
  76014. this._setCursor = 1;
  76015. this._customCursor = interactiveObject.cursor;
  76016. }
  76017. },
  76018. /**
  76019. * Called by the InputPlugin when processing over and out events.
  76020. *
  76021. * Tells the Input Manager to clear the hand cursor, if set, during its postUpdate step.
  76022. *
  76023. * @method Phaser.Input.InputManager#resetCursor
  76024. * @private
  76025. * @since 3.10.0
  76026. *
  76027. * @param {Phaser.Input.InteractiveObject} interactiveObject - The Interactive Object that called this method.
  76028. */
  76029. resetCursor: function (interactiveObject)
  76030. {
  76031. if (interactiveObject.cursor)
  76032. {
  76033. this._setCursor = 2;
  76034. }
  76035. },
  76036. // event.targetTouches = list of all touches on the TARGET ELEMENT (i.e. game dom element)
  76037. // event.touches = list of all touches on the ENTIRE DOCUMENT, not just the target element
  76038. // event.changedTouches = the touches that CHANGED in this event, not the total number of them
  76039. /**
  76040. * Called by the main update loop when a Touch Start Event is received.
  76041. *
  76042. * @method Phaser.Input.InputManager#startPointer
  76043. * @private
  76044. * @since 3.10.0
  76045. *
  76046. * @param {TouchEvent} event - The native DOM event to be processed.
  76047. * @param {number} time - The time stamp value of this game step.
  76048. *
  76049. * @return {Phaser.Input.Pointer[]} An array containing all the Pointer instances that were modified by this event.
  76050. */
  76051. startPointer: function (event, time)
  76052. {
  76053. var pointers = this.pointers;
  76054. var changed = [];
  76055. for (var c = 0; c < event.changedTouches.length; c++)
  76056. {
  76057. var changedTouch = event.changedTouches[c];
  76058. for (var i = 1; i < this.pointersTotal; i++)
  76059. {
  76060. var pointer = pointers[i];
  76061. if (!pointer.active)
  76062. {
  76063. pointer.touchstart(changedTouch, time);
  76064. this.activePointer = pointer;
  76065. changed.push(pointer);
  76066. break;
  76067. }
  76068. }
  76069. }
  76070. return changed;
  76071. },
  76072. /**
  76073. * Called by the main update loop when a Touch Move Event is received.
  76074. *
  76075. * @method Phaser.Input.InputManager#updatePointer
  76076. * @private
  76077. * @since 3.10.0
  76078. *
  76079. * @param {TouchEvent} event - The native DOM event to be processed.
  76080. * @param {number} time - The time stamp value of this game step.
  76081. *
  76082. * @return {Phaser.Input.Pointer[]} An array containing all the Pointer instances that were modified by this event.
  76083. */
  76084. updatePointer: function (event, time)
  76085. {
  76086. var pointers = this.pointers;
  76087. var changed = [];
  76088. for (var c = 0; c < event.changedTouches.length; c++)
  76089. {
  76090. var changedTouch = event.changedTouches[c];
  76091. for (var i = 1; i < this.pointersTotal; i++)
  76092. {
  76093. var pointer = pointers[i];
  76094. if (pointer.active && pointer.identifier === changedTouch.identifier)
  76095. {
  76096. pointer.touchmove(changedTouch, time);
  76097. this.activePointer = pointer;
  76098. changed.push(pointer);
  76099. break;
  76100. }
  76101. }
  76102. }
  76103. return changed;
  76104. },
  76105. // For touch end its a list of the touch points that have been removed from the surface
  76106. // https://developer.mozilla.org/en-US/docs/DOM/TouchList
  76107. // event.changedTouches = the touches that CHANGED in this event, not the total number of them
  76108. /**
  76109. * Called by the main update loop when a Touch End Event is received.
  76110. *
  76111. * @method Phaser.Input.InputManager#stopPointer
  76112. * @private
  76113. * @since 3.10.0
  76114. *
  76115. * @param {TouchEvent} event - The native DOM event to be processed.
  76116. * @param {number} time - The time stamp value of this game step.
  76117. *
  76118. * @return {Phaser.Input.Pointer[]} An array containing all the Pointer instances that were modified by this event.
  76119. */
  76120. stopPointer: function (event, time)
  76121. {
  76122. var pointers = this.pointers;
  76123. var changed = [];
  76124. for (var c = 0; c < event.changedTouches.length; c++)
  76125. {
  76126. var changedTouch = event.changedTouches[c];
  76127. for (var i = 1; i < this.pointersTotal; i++)
  76128. {
  76129. var pointer = pointers[i];
  76130. if (pointer.active && pointer.identifier === changedTouch.identifier)
  76131. {
  76132. pointer.touchend(changedTouch, time);
  76133. changed.push(pointer);
  76134. break;
  76135. }
  76136. }
  76137. }
  76138. return changed;
  76139. },
  76140. /**
  76141. * Called by the main update loop when a Touch Cancel Event is received.
  76142. *
  76143. * @method Phaser.Input.InputManager#cancelPointer
  76144. * @private
  76145. * @since 3.15.0
  76146. *
  76147. * @param {TouchEvent} event - The native DOM event to be processed.
  76148. * @param {number} time - The time stamp value of this game step.
  76149. *
  76150. * @return {Phaser.Input.Pointer[]} An array containing all the Pointer instances that were modified by this event.
  76151. */
  76152. cancelPointer: function (event, time)
  76153. {
  76154. var pointers = this.pointers;
  76155. var changed = [];
  76156. for (var c = 0; c < event.changedTouches.length; c++)
  76157. {
  76158. var changedTouch = event.changedTouches[c];
  76159. for (var i = 1; i < this.pointersTotal; i++)
  76160. {
  76161. var pointer = pointers[i];
  76162. if (pointer.active && pointer.identifier === changedTouch.identifier)
  76163. {
  76164. pointer.touchend(changedTouch, time);
  76165. changed.push(pointer);
  76166. break;
  76167. }
  76168. }
  76169. }
  76170. return changed;
  76171. },
  76172. /**
  76173. * Adds new Pointer objects to the Input Manager.
  76174. *
  76175. * By default Phaser creates 2 pointer objects: `mousePointer` and `pointer1`.
  76176. *
  76177. * You can create more either by calling this method, or by setting the `input.activePointers` property
  76178. * in the Game Config, up to a maximum of 10 pointers.
  76179. *
  76180. * The first 10 pointers are available via the `InputPlugin.pointerX` properties, once they have been added
  76181. * via this method.
  76182. *
  76183. * @method Phaser.Input.InputManager#addPointer
  76184. * @since 3.10.0
  76185. *
  76186. * @param {integer} [quantity=1] The number of new Pointers to create. A maximum of 10 is allowed in total.
  76187. *
  76188. * @return {Phaser.Input.Pointer[]} An array containing all of the new Pointer objects that were created.
  76189. */
  76190. addPointer: function (quantity)
  76191. {
  76192. if (quantity === undefined) { quantity = 1; }
  76193. var output = [];
  76194. if (this.pointersTotal + quantity > 10)
  76195. {
  76196. quantity = 10 - this.pointersTotal;
  76197. }
  76198. for (var i = 0; i < quantity; i++)
  76199. {
  76200. var id = this.pointers.length;
  76201. var pointer = new Pointer(this, id);
  76202. pointer.smoothFactor = this.config.inputSmoothFactor;
  76203. this.pointers.push(pointer);
  76204. this.pointersTotal++;
  76205. output.push(pointer);
  76206. }
  76207. return output;
  76208. },
  76209. /**
  76210. * Process any pending DOM callbacks.
  76211. *
  76212. * @method Phaser.Input.InputManager#processDomCallbacks
  76213. * @private
  76214. * @deprecated
  76215. * @since 3.10.0
  76216. *
  76217. * @param {array} once - The isOnce callbacks to invoke.
  76218. * @param {array} every - The every frame callbacks to invoke.
  76219. * @param {any} event - The native DOM event that is passed to the callbacks.
  76220. *
  76221. * @return {boolean} `true` if there are callbacks still in the list, otherwise `false`.
  76222. */
  76223. processDomCallbacks: function (once, every, event)
  76224. {
  76225. var i = 0;
  76226. for (i = 0; i < once.length; i++)
  76227. {
  76228. once[i](event);
  76229. }
  76230. for (i = 0; i < every.length; i++)
  76231. {
  76232. every[i](event);
  76233. }
  76234. return (every.length > 0);
  76235. },
  76236. /**
  76237. * Internal method that gets a list of all the active Input Plugins in the game
  76238. * and updates each of them in turn, in reverse order (top to bottom), to allow
  76239. * for DOM top-level event handling simulation.
  76240. *
  76241. * @method Phaser.Input.InputManager#updateInputPlugins
  76242. * @since 3.16.0
  76243. *
  76244. * @param {number} time - The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now().
  76245. * @param {number} delta - The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class.
  76246. */
  76247. updateInputPlugins: function (time, delta)
  76248. {
  76249. var scenes = this.game.scene.getScenes(true, true);
  76250. for (var i = 0; i < scenes.length; i++)
  76251. {
  76252. var scene = scenes[i];
  76253. if (scene.sys.input)
  76254. {
  76255. scene.sys.input.update(time, delta);
  76256. }
  76257. }
  76258. },
  76259. /**
  76260. * Queues a touch start event, as passed in by the TouchManager.
  76261. * Also dispatches any DOM callbacks for this event.
  76262. *
  76263. * @method Phaser.Input.InputManager#queueTouchStart
  76264. * @private
  76265. * @since 3.10.0
  76266. *
  76267. * @param {TouchEvent} event - The native DOM Touch event.
  76268. */
  76269. queueTouchStart: function (event)
  76270. {
  76271. if (this.useQueue)
  76272. {
  76273. this.queue.push(CONST.TOUCH_START, event);
  76274. if (this._hasDownCallback)
  76275. {
  76276. var callbacks = this.domCallbacks;
  76277. this._hasDownCallback = this.processDomCallbacks(callbacks.downOnce, callbacks.down, event);
  76278. callbacks.downOnce = [];
  76279. }
  76280. }
  76281. else if (this.enabled)
  76282. {
  76283. this.update(event.timeStamp);
  76284. var changed = this.startPointer(event, event.timeStamp);
  76285. changed.forEach(function (pointer)
  76286. {
  76287. pointer.updateMotion();
  76288. });
  76289. this.updateInputPlugins(event.timeStamp, this.game.loop.delta);
  76290. }
  76291. },
  76292. /**
  76293. * Queues a touch move event, as passed in by the TouchManager.
  76294. * Also dispatches any DOM callbacks for this event.
  76295. *
  76296. * @method Phaser.Input.InputManager#queueTouchMove
  76297. * @private
  76298. * @since 3.10.0
  76299. *
  76300. * @param {TouchEvent} event - The native DOM Touch event.
  76301. */
  76302. queueTouchMove: function (event)
  76303. {
  76304. if (this.useQueue)
  76305. {
  76306. this.queue.push(CONST.TOUCH_MOVE, event);
  76307. if (this._hasMoveCallback)
  76308. {
  76309. var callbacks = this.domCallbacks;
  76310. this._hasMoveCallback = this.processDomCallbacks(callbacks.moveOnce, callbacks.move, event);
  76311. callbacks.moveOnce = [];
  76312. }
  76313. }
  76314. else if (this.enabled)
  76315. {
  76316. this.update(event.timeStamp);
  76317. var changed = this.updatePointer(event, event.timeStamp);
  76318. changed.forEach(function (pointer)
  76319. {
  76320. pointer.updateMotion();
  76321. });
  76322. this.updateInputPlugins(event.timeStamp, this.game.loop.delta);
  76323. }
  76324. },
  76325. /**
  76326. * Queues a touch end event, as passed in by the TouchManager.
  76327. * Also dispatches any DOM callbacks for this event.
  76328. *
  76329. * @method Phaser.Input.InputManager#queueTouchEnd
  76330. * @private
  76331. * @since 3.10.0
  76332. *
  76333. * @param {TouchEvent} event - The native DOM Touch event.
  76334. */
  76335. queueTouchEnd: function (event)
  76336. {
  76337. if (this.useQueue)
  76338. {
  76339. this.queue.push(CONST.TOUCH_END, event);
  76340. if (this._hasUpCallback)
  76341. {
  76342. var callbacks = this.domCallbacks;
  76343. this._hasUpCallback = this.processDomCallbacks(callbacks.upOnce, callbacks.up, event);
  76344. callbacks.upOnce = [];
  76345. }
  76346. }
  76347. else if (this.enabled)
  76348. {
  76349. this.update(event.timeStamp);
  76350. var changed = this.stopPointer(event, event.timeStamp);
  76351. changed.forEach(function (pointer)
  76352. {
  76353. pointer.updateMotion();
  76354. });
  76355. this.updateInputPlugins(event.timeStamp, this.game.loop.delta);
  76356. }
  76357. },
  76358. /**
  76359. * Queues a touch cancel event, as passed in by the TouchManager.
  76360. * Also dispatches any DOM callbacks for this event.
  76361. *
  76362. * @method Phaser.Input.InputManager#queueTouchCancel
  76363. * @private
  76364. * @since 3.15.0
  76365. *
  76366. * @param {TouchEvent} event - The native DOM Touch event.
  76367. */
  76368. queueTouchCancel: function (event)
  76369. {
  76370. if (this.useQueue)
  76371. {
  76372. this.queue.push(CONST.TOUCH_CANCEL, event);
  76373. }
  76374. else if (this.enabled)
  76375. {
  76376. this.update(event.timeStamp);
  76377. var changed = this.cancelPointer(event, event.timeStamp);
  76378. changed.forEach(function (pointer)
  76379. {
  76380. pointer.updateMotion();
  76381. });
  76382. this.updateInputPlugins(event.timeStamp, this.game.loop.delta);
  76383. }
  76384. },
  76385. /**
  76386. * Queues a mouse down event, as passed in by the MouseManager.
  76387. * Also dispatches any DOM callbacks for this event.
  76388. *
  76389. * @method Phaser.Input.InputManager#queueMouseDown
  76390. * @private
  76391. * @since 3.10.0
  76392. *
  76393. * @param {MouseEvent} event - The native DOM Mouse event.
  76394. */
  76395. queueMouseDown: function (event)
  76396. {
  76397. if (this.useQueue)
  76398. {
  76399. this.queue.push(CONST.MOUSE_DOWN, event);
  76400. if (this._hasDownCallback)
  76401. {
  76402. var callbacks = this.domCallbacks;
  76403. this._hasDownCallback = this.processDomCallbacks(callbacks.downOnce, callbacks.down, event);
  76404. callbacks.downOnce = [];
  76405. }
  76406. }
  76407. else if (this.enabled)
  76408. {
  76409. this.update(event.timeStamp);
  76410. this.mousePointer.down(event, event.timeStamp);
  76411. this.mousePointer.updateMotion();
  76412. this.updateInputPlugins(event.timeStamp, this.game.loop.delta);
  76413. }
  76414. },
  76415. /**
  76416. * Queues a mouse move event, as passed in by the MouseManager.
  76417. * Also dispatches any DOM callbacks for this event.
  76418. *
  76419. * @method Phaser.Input.InputManager#queueMouseMove
  76420. * @private
  76421. * @since 3.10.0
  76422. *
  76423. * @param {MouseEvent} event - The native DOM Mouse event.
  76424. */
  76425. queueMouseMove: function (event)
  76426. {
  76427. if (this.useQueue)
  76428. {
  76429. this.queue.push(CONST.MOUSE_MOVE, event);
  76430. if (this._hasMoveCallback)
  76431. {
  76432. var callbacks = this.domCallbacks;
  76433. this._hasMoveCallback = this.processDomCallbacks(callbacks.moveOnce, callbacks.move, event);
  76434. callbacks.moveOnce = [];
  76435. }
  76436. }
  76437. else if (this.enabled)
  76438. {
  76439. this.update(event.timeStamp);
  76440. this.mousePointer.move(event, event.timeStamp);
  76441. this.mousePointer.updateMotion();
  76442. this.updateInputPlugins(event.timeStamp, this.game.loop.delta);
  76443. }
  76444. },
  76445. /**
  76446. * Queues a mouse up event, as passed in by the MouseManager.
  76447. * Also dispatches any DOM callbacks for this event.
  76448. *
  76449. * @method Phaser.Input.InputManager#queueMouseUp
  76450. * @private
  76451. * @since 3.10.0
  76452. *
  76453. * @param {MouseEvent} event - The native DOM Mouse event.
  76454. */
  76455. queueMouseUp: function (event)
  76456. {
  76457. if (this.useQueue)
  76458. {
  76459. this.queue.push(CONST.MOUSE_UP, event);
  76460. if (this._hasUpCallback)
  76461. {
  76462. var callbacks = this.domCallbacks;
  76463. this._hasUpCallback = this.processDomCallbacks(callbacks.upOnce, callbacks.up, event);
  76464. callbacks.upOnce = [];
  76465. }
  76466. }
  76467. else if (this.enabled)
  76468. {
  76469. this.update(event.timeStamp);
  76470. this.mousePointer.up(event, event.timeStamp);
  76471. this.mousePointer.updateMotion();
  76472. this.updateInputPlugins(event.timeStamp, this.game.loop.delta);
  76473. }
  76474. },
  76475. /**
  76476. * **Note:** As of Phaser 3.16 this method is no longer required _unless_ you have set `input.queue = true`
  76477. * in your game config, to force it to use the legacy event queue system. This method is deprecated and
  76478. * will be removed in a future version.
  76479. *
  76480. * Adds a callback to be invoked whenever the native DOM `mouseup` or `touchend` events are received.
  76481. * By setting the `isOnce` argument you can control if the callback is called once,
  76482. * or every time the DOM event occurs.
  76483. *
  76484. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  76485. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  76486. * from the perspective of the browser. This means they can be used for tasks such as
  76487. * opening new browser windows, or anything which explicitly requires user input to activate.
  76488. * However, as a result of this, they come with their own risks, and as such should not be used
  76489. * for general game input, but instead be reserved for special circumstances.
  76490. *
  76491. * If all you're trying to do is execute a callback when a pointer is released, then
  76492. * please use the internal Input event system instead.
  76493. *
  76494. * Please understand that these callbacks are invoked when the browser feels like doing so,
  76495. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  76496. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  76497. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  76498. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  76499. * solve.
  76500. *
  76501. * @method Phaser.Input.InputManager#addUpCallback
  76502. * @deprecated
  76503. * @since 3.10.0
  76504. *
  76505. * @param {function} callback - The callback to be invoked on this dom event.
  76506. * @param {boolean} [isOnce=true] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  76507. *
  76508. * @return {this} The Input Manager.
  76509. */
  76510. addUpCallback: function (callback, isOnce)
  76511. {
  76512. if (isOnce === undefined) { isOnce = true; }
  76513. if (isOnce)
  76514. {
  76515. this.domCallbacks.upOnce.push(callback);
  76516. }
  76517. else
  76518. {
  76519. this.domCallbacks.up.push(callback);
  76520. }
  76521. this._hasUpCallback = true;
  76522. return this;
  76523. },
  76524. /**
  76525. * **Note:** As of Phaser 3.16 this method is no longer required _unless_ you have set `input.queue = true`
  76526. * in your game config, to force it to use the legacy event queue system. This method is deprecated and
  76527. * will be removed in a future version.
  76528. *
  76529. * Adds a callback to be invoked whenever the native DOM `mousedown` or `touchstart` events are received.
  76530. * By setting the `isOnce` argument you can control if the callback is called once,
  76531. * or every time the DOM event occurs.
  76532. *
  76533. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  76534. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  76535. * from the perspective of the browser. This means they can be used for tasks such as
  76536. * opening new browser windows, or anything which explicitly requires user input to activate.
  76537. * However, as a result of this, they come with their own risks, and as such should not be used
  76538. * for general game input, but instead be reserved for special circumstances.
  76539. *
  76540. * If all you're trying to do is execute a callback when a pointer is down, then
  76541. * please use the internal Input event system instead.
  76542. *
  76543. * Please understand that these callbacks are invoked when the browser feels like doing so,
  76544. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  76545. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  76546. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  76547. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  76548. * solve.
  76549. *
  76550. * @method Phaser.Input.InputManager#addDownCallback
  76551. * @deprecated
  76552. * @since 3.10.0
  76553. *
  76554. * @param {function} callback - The callback to be invoked on this dom event.
  76555. * @param {boolean} [isOnce=true] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  76556. *
  76557. * @return {this} The Input Manager.
  76558. */
  76559. addDownCallback: function (callback, isOnce)
  76560. {
  76561. if (isOnce === undefined) { isOnce = true; }
  76562. if (isOnce)
  76563. {
  76564. this.domCallbacks.downOnce.push(callback);
  76565. }
  76566. else
  76567. {
  76568. this.domCallbacks.down.push(callback);
  76569. }
  76570. this._hasDownCallback = true;
  76571. return this;
  76572. },
  76573. /**
  76574. * **Note:** As of Phaser 3.16 this method is no longer required _unless_ you have set `input.queue = true`
  76575. * in your game config, to force it to use the legacy event queue system. This method is deprecated and
  76576. * will be removed in a future version.
  76577. *
  76578. * Adds a callback to be invoked whenever the native DOM `mousemove` or `touchmove` events are received.
  76579. * By setting the `isOnce` argument you can control if the callback is called once,
  76580. * or every time the DOM event occurs.
  76581. *
  76582. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  76583. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  76584. * from the perspective of the browser. This means they can be used for tasks such as
  76585. * opening new browser windows, or anything which explicitly requires user input to activate.
  76586. * However, as a result of this, they come with their own risks, and as such should not be used
  76587. * for general game input, but instead be reserved for special circumstances.
  76588. *
  76589. * If all you're trying to do is execute a callback when a pointer is moved, then
  76590. * please use the internal Input event system instead.
  76591. *
  76592. * Please understand that these callbacks are invoked when the browser feels like doing so,
  76593. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  76594. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  76595. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  76596. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  76597. * solve.
  76598. *
  76599. * @method Phaser.Input.InputManager#addMoveCallback
  76600. * @deprecated
  76601. * @since 3.10.0
  76602. *
  76603. * @param {function} callback - The callback to be invoked on this dom event.
  76604. * @param {boolean} [isOnce=false] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  76605. *
  76606. * @return {this} The Input Manager.
  76607. */
  76608. addMoveCallback: function (callback, isOnce)
  76609. {
  76610. if (isOnce === undefined) { isOnce = false; }
  76611. if (isOnce)
  76612. {
  76613. this.domCallbacks.moveOnce.push(callback);
  76614. }
  76615. else
  76616. {
  76617. this.domCallbacks.move.push(callback);
  76618. }
  76619. this._hasMoveCallback = true;
  76620. return this;
  76621. },
  76622. /**
  76623. * Checks if the given Game Object should be considered as a candidate for input or not.
  76624. *
  76625. * Checks if the Game Object has an input component that is enabled, that it will render,
  76626. * and finally, if it has a parent, that the parent parent, or any ancestor, is visible or not.
  76627. *
  76628. * @method Phaser.Input.InputManager#inputCandidate
  76629. * @private
  76630. * @since 3.10.0
  76631. *
  76632. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to test.
  76633. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera which is being tested against.
  76634. *
  76635. * @return {boolean} `true` if the Game Object should be considered for input, otherwise `false`.
  76636. */
  76637. inputCandidate: function (gameObject, camera)
  76638. {
  76639. var input = gameObject.input;
  76640. if (!input || !input.enabled || !gameObject.willRender(camera))
  76641. {
  76642. return false;
  76643. }
  76644. var visible = true;
  76645. var parent = gameObject.parentContainer;
  76646. if (parent)
  76647. {
  76648. do
  76649. {
  76650. if (!parent.willRender(camera))
  76651. {
  76652. visible = false;
  76653. break;
  76654. }
  76655. parent = parent.parentContainer;
  76656. } while (parent);
  76657. }
  76658. return visible;
  76659. },
  76660. /**
  76661. * Performs a hit test using the given Pointer and camera, against an array of interactive Game Objects.
  76662. *
  76663. * The Game Objects are culled against the camera, and then the coordinates are translated into the local camera space
  76664. * and used to determine if they fall within the remaining Game Objects hit areas or not.
  76665. *
  76666. * If nothing is matched an empty array is returned.
  76667. *
  76668. * This method is called automatically by InputPlugin.hitTestPointer and doesn't usually need to be invoked directly.
  76669. *
  76670. * @method Phaser.Input.InputManager#hitTest
  76671. * @since 3.0.0
  76672. *
  76673. * @param {Phaser.Input.Pointer} pointer - The Pointer to test against.
  76674. * @param {array} gameObjects - An array of interactive Game Objects to check.
  76675. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera which is being tested against.
  76676. * @param {array} [output] - An array to store the results in. If not given, a new empty array is created.
  76677. *
  76678. * @return {array} An array of the Game Objects that were hit during this hit test.
  76679. */
  76680. hitTest: function (pointer, gameObjects, camera, output)
  76681. {
  76682. if (output === undefined) { output = this._tempHitTest; }
  76683. var tempPoint = this._tempPoint;
  76684. var csx = camera.scrollX;
  76685. var csy = camera.scrollY;
  76686. output.length = 0;
  76687. var x = pointer.x;
  76688. var y = pointer.y;
  76689. if (camera.resolution !== 1)
  76690. {
  76691. x += camera._x;
  76692. y += camera._y;
  76693. }
  76694. // Stores the world point inside of tempPoint
  76695. camera.getWorldPoint(x, y, tempPoint);
  76696. pointer.worldX = tempPoint.x;
  76697. pointer.worldY = tempPoint.y;
  76698. var point = { x: 0, y: 0 };
  76699. var matrix = this._tempMatrix;
  76700. var parentMatrix = this._tempMatrix2;
  76701. for (var i = 0; i < gameObjects.length; i++)
  76702. {
  76703. var gameObject = gameObjects[i];
  76704. // Checks if the Game Object can receive input (isn't being ignored by the camera, invisible, etc)
  76705. // and also checks all of its parents, if any
  76706. if (!this.inputCandidate(gameObject, camera))
  76707. {
  76708. continue;
  76709. }
  76710. var px = tempPoint.x + (csx * gameObject.scrollFactorX) - csx;
  76711. var py = tempPoint.y + (csy * gameObject.scrollFactorY) - csy;
  76712. if (gameObject.parentContainer)
  76713. {
  76714. gameObject.getWorldTransformMatrix(matrix, parentMatrix);
  76715. matrix.applyInverse(px, py, point);
  76716. }
  76717. else
  76718. {
  76719. TransformXY(px, py, gameObject.x, gameObject.y, gameObject.rotation, gameObject.scaleX, gameObject.scaleY, point);
  76720. }
  76721. if (this.pointWithinHitArea(gameObject, point.x, point.y))
  76722. {
  76723. output.push(gameObject);
  76724. }
  76725. }
  76726. return output;
  76727. },
  76728. /**
  76729. * Checks if the given x and y coordinate are within the hit area of the Game Object.
  76730. *
  76731. * This method assumes that the coordinate values have already been translated into the space of the Game Object.
  76732. *
  76733. * If the coordinates are within the hit area they are set into the Game Objects Input `localX` and `localY` properties.
  76734. *
  76735. * @method Phaser.Input.InputManager#pointWithinHitArea
  76736. * @since 3.0.0
  76737. *
  76738. * @param {Phaser.GameObjects.GameObject} gameObject - The interactive Game Object to check against.
  76739. * @param {number} x - The translated x coordinate for the hit test.
  76740. * @param {number} y - The translated y coordinate for the hit test.
  76741. *
  76742. * @return {boolean} `true` if the coordinates were inside the Game Objects hit area, otherwise `false`.
  76743. */
  76744. pointWithinHitArea: function (gameObject, x, y)
  76745. {
  76746. // Normalize the origin
  76747. x += gameObject.displayOriginX;
  76748. y += gameObject.displayOriginY;
  76749. var input = gameObject.input;
  76750. if (input && input.hitAreaCallback(input.hitArea, x, y, gameObject))
  76751. {
  76752. input.localX = x;
  76753. input.localY = y;
  76754. return true;
  76755. }
  76756. else
  76757. {
  76758. return false;
  76759. }
  76760. },
  76761. /**
  76762. * Checks if the given x and y coordinate are within the hit area of the Interactive Object.
  76763. *
  76764. * This method assumes that the coordinate values have already been translated into the space of the Interactive Object.
  76765. *
  76766. * If the coordinates are within the hit area they are set into the Interactive Objects Input `localX` and `localY` properties.
  76767. *
  76768. * @method Phaser.Input.InputManager#pointWithinInteractiveObject
  76769. * @since 3.0.0
  76770. *
  76771. * @param {Phaser.Input.InteractiveObject} object - The Interactive Object to check against.
  76772. * @param {number} x - The translated x coordinate for the hit test.
  76773. * @param {number} y - The translated y coordinate for the hit test.
  76774. *
  76775. * @return {boolean} `true` if the coordinates were inside the Game Objects hit area, otherwise `false`.
  76776. */
  76777. pointWithinInteractiveObject: function (object, x, y)
  76778. {
  76779. if (!object.hitArea)
  76780. {
  76781. return false;
  76782. }
  76783. // Normalize the origin
  76784. x += object.gameObject.displayOriginX;
  76785. y += object.gameObject.displayOriginY;
  76786. object.localX = x;
  76787. object.localY = y;
  76788. return object.hitAreaCallback(object.hitArea, x, y, object);
  76789. },
  76790. /**
  76791. * Transforms the pageX and pageY values of a Pointer into the scaled coordinate space of the Input Manager.
  76792. *
  76793. * @method Phaser.Input.InputManager#transformPointer
  76794. * @since 3.10.0
  76795. *
  76796. * @param {Phaser.Input.Pointer} pointer - The Pointer to transform the values for.
  76797. * @param {number} pageX - The Page X value.
  76798. * @param {number} pageY - The Page Y value.
  76799. * @param {boolean} wasMove - Are we transforming the Pointer from a move event, or an up / down event?
  76800. */
  76801. transformPointer: function (pointer, pageX, pageY, wasMove)
  76802. {
  76803. var p0 = pointer.position;
  76804. var p1 = pointer.prevPosition;
  76805. // Store previous position
  76806. p1.x = p0.x;
  76807. p1.y = p0.y;
  76808. // Translate coordinates
  76809. var x = this.scaleManager.transformX(pageX);
  76810. var y = this.scaleManager.transformY(pageY);
  76811. var a = pointer.smoothFactor;
  76812. if (!wasMove || a === 0)
  76813. {
  76814. // Set immediately
  76815. p0.x = x;
  76816. p0.y = y;
  76817. }
  76818. else
  76819. {
  76820. // Apply smoothing
  76821. p0.x = x * a + p1.x * (1 - a);
  76822. p0.y = y * a + p1.y * (1 - a);
  76823. }
  76824. },
  76825. /**
  76826. * Destroys the Input Manager and all of its systems.
  76827. *
  76828. * There is no way to recover from doing this.
  76829. *
  76830. * @method Phaser.Input.InputManager#destroy
  76831. * @since 3.0.0
  76832. */
  76833. destroy: function ()
  76834. {
  76835. this.events.removeAllListeners();
  76836. if (this.keyboard)
  76837. {
  76838. this.keyboard.destroy();
  76839. }
  76840. if (this.mouse)
  76841. {
  76842. this.mouse.destroy();
  76843. }
  76844. if (this.touch)
  76845. {
  76846. this.touch.destroy();
  76847. }
  76848. for (var i = 0; i < this.pointers.length; i++)
  76849. {
  76850. this.pointers[i].destroy();
  76851. }
  76852. this.domCallbacks = {};
  76853. this.pointers = [];
  76854. this.queue = [];
  76855. this._tempHitTest = [];
  76856. this._tempMatrix.destroy();
  76857. this.canvas = null;
  76858. this.game = null;
  76859. }
  76860. });
  76861. module.exports = InputManager;
  76862. /***/ }),
  76863. /* 343 */
  76864. /***/ (function(module, exports) {
  76865. /**
  76866. * @author Richard Davey <rich@photonstorm.com>
  76867. * @copyright 2019 Photon Storm Ltd.
  76868. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  76869. */
  76870. /**
  76871. * Attempts to remove the element from its parentNode in the DOM.
  76872. *
  76873. * @function Phaser.DOM.RemoveFromDOM
  76874. * @since 3.0.0
  76875. *
  76876. * @param {HTMLElement} element - The DOM element to remove from its parent node.
  76877. */
  76878. var RemoveFromDOM = function (element)
  76879. {
  76880. if (element.parentNode)
  76881. {
  76882. element.parentNode.removeChild(element);
  76883. }
  76884. };
  76885. module.exports = RemoveFromDOM;
  76886. /***/ }),
  76887. /* 344 */
  76888. /***/ (function(module, exports) {
  76889. /**
  76890. * @author Richard Davey <rich@photonstorm.com>
  76891. * @copyright 2019 Photon Storm Ltd.
  76892. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  76893. */
  76894. /**
  76895. * Takes the given data string and parses it as XML.
  76896. * First tries to use the window.DOMParser and reverts to the Microsoft.XMLDOM if that fails.
  76897. * The parsed XML object is returned, or `null` if there was an error while parsing the data.
  76898. *
  76899. * @function Phaser.DOM.ParseXML
  76900. * @since 3.0.0
  76901. *
  76902. * @param {string} data - The XML source stored in a string.
  76903. *
  76904. * @return {?(DOMParser|ActiveXObject)} The parsed XML data, or `null` if the data could not be parsed.
  76905. */
  76906. var ParseXML = function (data)
  76907. {
  76908. var xml = '';
  76909. try
  76910. {
  76911. if (window['DOMParser'])
  76912. {
  76913. var domparser = new DOMParser();
  76914. xml = domparser.parseFromString(data, 'text/xml');
  76915. }
  76916. else
  76917. {
  76918. xml = new ActiveXObject('Microsoft.XMLDOM');
  76919. xml.loadXML(data);
  76920. }
  76921. }
  76922. catch (e)
  76923. {
  76924. xml = null;
  76925. }
  76926. if (!xml || !xml.documentElement || xml.getElementsByTagName('parsererror').length)
  76927. {
  76928. return null;
  76929. }
  76930. else
  76931. {
  76932. return xml;
  76933. }
  76934. };
  76935. module.exports = ParseXML;
  76936. /***/ }),
  76937. /* 345 */
  76938. /***/ (function(module, exports) {
  76939. /**
  76940. * @author Richard Davey <rich@photonstorm.com>
  76941. * @copyright 2019 Photon Storm Ltd.
  76942. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  76943. */
  76944. /**
  76945. * Attempts to get the target DOM element based on the given value, which can be either
  76946. * a string, in which case it will be looked-up by ID, or an element node. If nothing
  76947. * can be found it will return a reference to the document.body.
  76948. *
  76949. * @function Phaser.DOM.GetTarget
  76950. * @since 3.16.0
  76951. *
  76952. * @param {HTMLElement} element - The DOM element to look-up.
  76953. */
  76954. var GetTarget = function (element)
  76955. {
  76956. var target;
  76957. if (element !== '')
  76958. {
  76959. if (typeof element === 'string')
  76960. {
  76961. // Hopefully an element ID
  76962. target = document.getElementById(element);
  76963. }
  76964. else if (element && element.nodeType === 1)
  76965. {
  76966. // Quick test for a HTMLElement
  76967. target = element;
  76968. }
  76969. }
  76970. // Fallback to the document body. Covers an invalid ID and a non HTMLElement object.
  76971. if (!target)
  76972. {
  76973. // Use the full window
  76974. target = document.body;
  76975. }
  76976. return target;
  76977. };
  76978. module.exports = GetTarget;
  76979. /***/ }),
  76980. /* 346 */
  76981. /***/ (function(module, exports) {
  76982. /**
  76983. * @author Richard Davey <rich@photonstorm.com>
  76984. * @copyright 2019 Photon Storm Ltd.
  76985. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  76986. */
  76987. /**
  76988. * Phaser Scale Manager constants for zoom modes.
  76989. *
  76990. * @namespace Phaser.Scale.Zoom
  76991. * @memberof Phaser.Scale
  76992. * @since 3.16.0
  76993. */
  76994. /**
  76995. * Phaser Scale Manager constants for zoom modes.
  76996. *
  76997. * To find out what each mode does please see [Phaser.Scale.Zoom]{@link Phaser.Scale.Zoom}.
  76998. *
  76999. * @typedef {(Phaser.Scale.Zoom.NO_ZOOM|Phaser.Scale.Zoom.ZOOM_2X|Phaser.Scale.Zoom.ZOOM_4X|Phaser.Scale.Zoom.MAX_ZOOM)} Phaser.Scale.ZoomType
  77000. * @memberof Phaser.Scale
  77001. * @since 3.16.0
  77002. */
  77003. module.exports = {
  77004. /**
  77005. * The game canvas will not be zoomed by Phaser.
  77006. *
  77007. * @name Phaser.Scale.Zoom.NO_ZOOM
  77008. * @since 3.16.0
  77009. */
  77010. NO_ZOOM: 1,
  77011. /**
  77012. * The game canvas will be 2x zoomed by Phaser.
  77013. *
  77014. * @name Phaser.Scale.Zoom.ZOOM_2X
  77015. * @since 3.16.0
  77016. */
  77017. ZOOM_2X: 2,
  77018. /**
  77019. * The game canvas will be 4x zoomed by Phaser.
  77020. *
  77021. * @name Phaser.Scale.Zoom.ZOOM_4X
  77022. * @since 3.16.0
  77023. */
  77024. ZOOM_4X: 4,
  77025. /**
  77026. * Calculate the zoom value based on the maximum multiplied game size that will
  77027. * fit into the parent, or browser window if no parent is set.
  77028. *
  77029. * @name Phaser.Scale.Zoom.MAX_ZOOM
  77030. * @since 3.16.0
  77031. */
  77032. MAX_ZOOM: -1
  77033. };
  77034. /***/ }),
  77035. /* 347 */
  77036. /***/ (function(module, exports) {
  77037. /**
  77038. * @author Richard Davey <rich@photonstorm.com>
  77039. * @copyright 2019 Photon Storm Ltd.
  77040. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77041. */
  77042. /**
  77043. * Phaser Scale Manager constants for the different scale modes available.
  77044. *
  77045. * @namespace Phaser.Scale.ScaleModes
  77046. * @memberof Phaser.Scale
  77047. * @since 3.16.0
  77048. */
  77049. /**
  77050. * Phaser Scale Manager constants for the different scale modes available.
  77051. *
  77052. * To find out what each mode does please see [Phaser.Scale.ScaleModes]{@link Phaser.Scale.ScaleModes}.
  77053. *
  77054. * @typedef {(Phaser.Scale.ScaleModes.NONE|Phaser.Scale.ScaleModes.WIDTH_CONTROLS_HEIGHT|Phaser.Scale.ScaleModes.HEIGHT_CONTROLS_WIDTH|Phaser.Scale.ScaleModes.FIT|Phaser.Scale.ScaleModes.ENVELOP|Phaser.Scale.ScaleModes.RESIZE)} Phaser.Scale.ScaleModeType
  77055. * @memberof Phaser.Scale
  77056. * @since 3.16.0
  77057. */
  77058. module.exports = {
  77059. /**
  77060. * No scaling happens at all. The canvas is set to the size given in the game config and Phaser doesn't change it
  77061. * again from that point on. If you change the canvas size, either via CSS, or directly via code, then you need
  77062. * to call the Scale Managers `resize` method to give the new dimensions, or input events will stop working.
  77063. *
  77064. * @name Phaser.Scale.ScaleModes.NONE
  77065. * @since 3.16.0
  77066. */
  77067. NONE: 0,
  77068. /**
  77069. * The height is automatically adjusted based on the width.
  77070. *
  77071. * @name Phaser.Scale.ScaleModes.WIDTH_CONTROLS_HEIGHT
  77072. * @since 3.16.0
  77073. */
  77074. WIDTH_CONTROLS_HEIGHT: 1,
  77075. /**
  77076. * The width is automatically adjusted based on the height.
  77077. *
  77078. * @name Phaser.Scale.ScaleModes.HEIGHT_CONTROLS_WIDTH
  77079. * @since 3.16.0
  77080. */
  77081. HEIGHT_CONTROLS_WIDTH: 2,
  77082. /**
  77083. * The width and height are automatically adjusted to fit inside the given target area,
  77084. * while keeping the aspect ratio. Depending on the aspect ratio there may be some space
  77085. * inside the area which is not covered.
  77086. *
  77087. * @name Phaser.Scale.ScaleModes.FIT
  77088. * @since 3.16.0
  77089. */
  77090. FIT: 3,
  77091. /**
  77092. * The width and height are automatically adjusted to make the size cover the entire target
  77093. * area while keeping the aspect ratio. This may extend further out than the target size.
  77094. *
  77095. * @name Phaser.Scale.ScaleModes.ENVELOP
  77096. * @since 3.16.0
  77097. */
  77098. ENVELOP: 4,
  77099. /**
  77100. * The Canvas is resized to fit all available _parent_ space, regardless of aspect ratio.
  77101. *
  77102. * @name Phaser.Scale.ScaleModes.RESIZE
  77103. * @since 3.16.0
  77104. */
  77105. RESIZE: 5
  77106. };
  77107. /***/ }),
  77108. /* 348 */
  77109. /***/ (function(module, exports) {
  77110. /**
  77111. * @author Richard Davey <rich@photonstorm.com>
  77112. * @copyright 2019 Photon Storm Ltd.
  77113. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77114. */
  77115. /**
  77116. * Phaser Scale Manager constants for orientation.
  77117. *
  77118. * @namespace Phaser.Scale.Orientation
  77119. * @memberof Phaser.Scale
  77120. * @since 3.16.0
  77121. */
  77122. /**
  77123. * Phaser Scale Manager constants for orientation.
  77124. *
  77125. * To find out what each mode does please see [Phaser.Scale.Orientation]{@link Phaser.Scale.Orientation}.
  77126. *
  77127. * @typedef {(Phaser.Scale.Orientation.LANDSCAPE|Phaser.Scale.Orientation.PORTRAIT)} Phaser.Scale.OrientationType
  77128. * @memberof Phaser.Scale
  77129. * @since 3.16.0
  77130. */
  77131. module.exports = {
  77132. /**
  77133. * A landscape orientation.
  77134. *
  77135. * @name Phaser.Scale.Orientation.LANDSCAPE
  77136. * @since 3.16.0
  77137. */
  77138. LANDSCAPE: 'landscape-primary',
  77139. /**
  77140. * A portrait orientation.
  77141. *
  77142. * @name Phaser.Scale.Orientation.PORTRAIT
  77143. * @since 3.16.0
  77144. */
  77145. PORTRAIT: 'portrait-primary'
  77146. };
  77147. /***/ }),
  77148. /* 349 */
  77149. /***/ (function(module, exports) {
  77150. /**
  77151. * @author Richard Davey <rich@photonstorm.com>
  77152. * @copyright 2019 Photon Storm Ltd.
  77153. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77154. */
  77155. /**
  77156. * Phaser Scale Manager constants for centering the game canvas.
  77157. *
  77158. * @namespace Phaser.Scale.Center
  77159. * @memberof Phaser.Scale
  77160. * @since 3.16.0
  77161. */
  77162. /**
  77163. * Phaser Scale Manager constants for centering the game canvas.
  77164. *
  77165. * To find out what each mode does please see [Phaser.Scale.Center]{@link Phaser.Scale.Center}.
  77166. *
  77167. * @typedef {(Phaser.Scale.Center.NO_CENTER|Phaser.Scale.Center.CENTER_BOTH|Phaser.Scale.Center.CENTER_HORIZONTALLY|Phaser.Scale.Center.CENTER_VERTICALLY)} Phaser.Scale.CenterType
  77168. * @memberof Phaser.Scale
  77169. * @since 3.16.0
  77170. */
  77171. module.exports = {
  77172. /**
  77173. * The game canvas is not centered within the parent by Phaser.
  77174. * You can still center it yourself via CSS.
  77175. *
  77176. * @name Phaser.Scale.Center.NO_CENTER
  77177. * @since 3.16.0
  77178. */
  77179. NO_CENTER: 0,
  77180. /**
  77181. * The game canvas is centered both horizontally and vertically within the parent.
  77182. * To do this, the parent has to have a bounds that can be calculated and not be empty.
  77183. *
  77184. * Centering is achieved by setting the margin left and top properties of the
  77185. * game canvas, and does not factor in any other CSS styles you may have applied.
  77186. *
  77187. * @name Phaser.Scale.Center.CENTER_BOTH
  77188. * @since 3.16.0
  77189. */
  77190. CENTER_BOTH: 1,
  77191. /**
  77192. * The game canvas is centered horizontally within the parent.
  77193. * To do this, the parent has to have a bounds that can be calculated and not be empty.
  77194. *
  77195. * Centering is achieved by setting the margin left and top properties of the
  77196. * game canvas, and does not factor in any other CSS styles you may have applied.
  77197. *
  77198. * @name Phaser.Scale.Center.CENTER_HORIZONTALLY
  77199. * @since 3.16.0
  77200. */
  77201. CENTER_HORIZONTALLY: 2,
  77202. /**
  77203. * The game canvas is centered both vertically within the parent.
  77204. * To do this, the parent has to have a bounds that can be calculated and not be empty.
  77205. *
  77206. * Centering is achieved by setting the margin left and top properties of the
  77207. * game canvas, and does not factor in any other CSS styles you may have applied.
  77208. *
  77209. * @name Phaser.Scale.Center.CENTER_VERTICALLY
  77210. * @since 3.16.0
  77211. */
  77212. CENTER_VERTICALLY: 3
  77213. };
  77214. /***/ }),
  77215. /* 350 */
  77216. /***/ (function(module, exports, __webpack_require__) {
  77217. /**
  77218. * @author Richard Davey <rich@photonstorm.com>
  77219. * @copyright 2019 Photon Storm Ltd.
  77220. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77221. */
  77222. var CONST = __webpack_require__(178);
  77223. var GetScreenOrientation = function (width, height)
  77224. {
  77225. var screen = window.screen;
  77226. var orientation = (screen) ? screen.orientation || screen.mozOrientation || screen.msOrientation : false;
  77227. if (orientation && typeof orientation.type === 'string')
  77228. {
  77229. // Screen Orientation API specification
  77230. return orientation.type;
  77231. }
  77232. else if (typeof orientation === 'string')
  77233. {
  77234. // moz / ms-orientation are strings
  77235. return orientation;
  77236. }
  77237. if (screen)
  77238. {
  77239. return (screen.height > screen.width) ? CONST.PORTRAIT : CONST.LANDSCAPE;
  77240. }
  77241. else if (typeof window.orientation === 'number')
  77242. {
  77243. // This may change by device based on "natural" orientation.
  77244. return (window.orientation === 0 || window.orientation === 180) ? CONST.PORTRAIT : CONST.LANDSCAPE;
  77245. }
  77246. else if (window.matchMedia)
  77247. {
  77248. if (window.matchMedia('(orientation: portrait)').matches)
  77249. {
  77250. return CONST.PORTRAIT;
  77251. }
  77252. else if (window.matchMedia('(orientation: landscape)').matches)
  77253. {
  77254. return CONST.LANDSCAPE;
  77255. }
  77256. }
  77257. return (height > width) ? CONST.PORTRAIT : CONST.LANDSCAPE;
  77258. };
  77259. module.exports = GetScreenOrientation;
  77260. /***/ }),
  77261. /* 351 */
  77262. /***/ (function(module, exports, __webpack_require__) {
  77263. /**
  77264. * @author Richard Davey <rich@photonstorm.com>
  77265. * @copyright 2019 Photon Storm Ltd.
  77266. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77267. */
  77268. var OS = __webpack_require__(99);
  77269. /**
  77270. * @callback ContentLoadedCallback
  77271. */
  77272. /**
  77273. * Inspects the readyState of the document. If the document is already complete then it invokes the given callback.
  77274. * If not complete it sets up several event listeners such as `deviceready`, and once those fire, it invokes the callback.
  77275. * Called automatically by the Phaser.Game instance. Should not usually be accessed directly.
  77276. *
  77277. * @function Phaser.DOM.DOMContentLoaded
  77278. * @since 3.0.0
  77279. *
  77280. * @param {ContentLoadedCallback} callback - The callback to be invoked when the device is ready and the DOM content is loaded.
  77281. */
  77282. var DOMContentLoaded = function (callback)
  77283. {
  77284. if (document.readyState === 'complete' || document.readyState === 'interactive')
  77285. {
  77286. callback();
  77287. return;
  77288. }
  77289. var check = function ()
  77290. {
  77291. document.removeEventListener('deviceready', check, true);
  77292. document.removeEventListener('DOMContentLoaded', check, true);
  77293. window.removeEventListener('load', check, true);
  77294. callback();
  77295. };
  77296. if (!document.body)
  77297. {
  77298. window.setTimeout(check, 20);
  77299. }
  77300. else if (OS.cordova && !OS.cocoonJS)
  77301. {
  77302. // Ref. http://docs.phonegap.com/en/3.5.0/cordova_events_events.md.html#deviceready
  77303. document.addEventListener('deviceready', check, false);
  77304. }
  77305. else
  77306. {
  77307. document.addEventListener('DOMContentLoaded', check, true);
  77308. window.addEventListener('load', check, true);
  77309. }
  77310. };
  77311. module.exports = DOMContentLoaded;
  77312. /***/ }),
  77313. /* 352 */
  77314. /***/ (function(module, exports) {
  77315. /**
  77316. * @author Richard Davey <rich@photonstorm.com>
  77317. * @copyright 2019 Photon Storm Ltd.
  77318. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77319. */
  77320. /**
  77321. * Converts a hue to an RGB color.
  77322. * Based on code by Michael Jackson (https://github.com/mjijackson)
  77323. *
  77324. * @function Phaser.Display.Color.HueToComponent
  77325. * @since 3.0.0
  77326. *
  77327. * @param {number} p
  77328. * @param {number} q
  77329. * @param {number} t
  77330. *
  77331. * @return {number} The combined color value.
  77332. */
  77333. var HueToComponent = function (p, q, t)
  77334. {
  77335. if (t < 0)
  77336. {
  77337. t += 1;
  77338. }
  77339. if (t > 1)
  77340. {
  77341. t -= 1;
  77342. }
  77343. if (t < 1 / 6)
  77344. {
  77345. return p + (q - p) * 6 * t;
  77346. }
  77347. if (t < 1 / 2)
  77348. {
  77349. return q;
  77350. }
  77351. if (t < 2 / 3)
  77352. {
  77353. return p + (q - p) * (2 / 3 - t) * 6;
  77354. }
  77355. return p;
  77356. };
  77357. module.exports = HueToComponent;
  77358. /***/ }),
  77359. /* 353 */
  77360. /***/ (function(module, exports) {
  77361. /**
  77362. * @author Richard Davey <rich@photonstorm.com>
  77363. * @copyright 2019 Photon Storm Ltd.
  77364. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77365. */
  77366. /**
  77367. * Returns a string containing a hex representation of the given color component.
  77368. *
  77369. * @function Phaser.Display.Color.ComponentToHex
  77370. * @since 3.0.0
  77371. *
  77372. * @param {integer} color - The color channel to get the hex value for, must be a value between 0 and 255.
  77373. *
  77374. * @return {string} A string of length 2 characters, i.e. 255 = ff, 100 = 64.
  77375. */
  77376. var ComponentToHex = function (color)
  77377. {
  77378. var hex = color.toString(16);
  77379. return (hex.length === 1) ? '0' + hex : hex;
  77380. };
  77381. module.exports = ComponentToHex;
  77382. /***/ }),
  77383. /* 354 */
  77384. /***/ (function(module, exports, __webpack_require__) {
  77385. /**
  77386. * @author Richard Davey <rich@photonstorm.com>
  77387. * @copyright 2019 Photon Storm Ltd.
  77388. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77389. */
  77390. /**
  77391. * @typedef {object} InputColorObject
  77392. *
  77393. * @property {number} [r] - The red color value in the range 0 to 255.
  77394. * @property {number} [g] - The green color value in the range 0 to 255.
  77395. * @property {number} [b] - The blue color value in the range 0 to 255.
  77396. * @property {number} [a] - The alpha color value in the range 0 to 255.
  77397. */
  77398. /**
  77399. * @typedef {object} ColorObject
  77400. *
  77401. * @property {number} r - The red color value in the range 0 to 255.
  77402. * @property {number} g - The green color value in the range 0 to 255.
  77403. * @property {number} b - The blue color value in the range 0 to 255.
  77404. * @property {number} a - The alpha color value in the range 0 to 255.
  77405. */
  77406. var Color = __webpack_require__(32);
  77407. Color.ColorToRGBA = __webpack_require__(1005);
  77408. Color.ComponentToHex = __webpack_require__(353);
  77409. Color.GetColor = __webpack_require__(191);
  77410. Color.GetColor32 = __webpack_require__(409);
  77411. Color.HexStringToColor = __webpack_require__(410);
  77412. Color.HSLToColor = __webpack_require__(1004);
  77413. Color.HSVColorWheel = __webpack_require__(1003);
  77414. Color.HSVToRGB = __webpack_require__(190);
  77415. Color.HueToComponent = __webpack_require__(352);
  77416. Color.IntegerToColor = __webpack_require__(407);
  77417. Color.IntegerToRGB = __webpack_require__(406);
  77418. Color.Interpolate = __webpack_require__(1002);
  77419. Color.ObjectToColor = __webpack_require__(405);
  77420. Color.RandomRGB = __webpack_require__(1001);
  77421. Color.RGBStringToColor = __webpack_require__(404);
  77422. Color.RGBToHSV = __webpack_require__(408);
  77423. Color.RGBToString = __webpack_require__(1000);
  77424. Color.ValueToColor = __webpack_require__(192);
  77425. module.exports = Color;
  77426. /***/ }),
  77427. /* 355 */
  77428. /***/ (function(module, exports, __webpack_require__) {
  77429. /**
  77430. * @author Richard Davey <rich@photonstorm.com>
  77431. * @copyright 2019 Photon Storm Ltd.
  77432. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77433. */
  77434. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  77435. var CatmullRom = __webpack_require__(185);
  77436. var Class = __webpack_require__(0);
  77437. var Curve = __webpack_require__(76);
  77438. var Vector2 = __webpack_require__(3);
  77439. /**
  77440. * @classdesc
  77441. * [description]
  77442. *
  77443. * @class Spline
  77444. * @extends Phaser.Curves.Curve
  77445. * @memberof Phaser.Curves
  77446. * @constructor
  77447. * @since 3.0.0
  77448. *
  77449. * @param {Phaser.Math.Vector2[]} [points] - [description]
  77450. */
  77451. var SplineCurve = new Class({
  77452. Extends: Curve,
  77453. initialize:
  77454. function SplineCurve (points)
  77455. {
  77456. if (points === undefined) { points = []; }
  77457. Curve.call(this, 'SplineCurve');
  77458. /**
  77459. * [description]
  77460. *
  77461. * @name Phaser.Curves.Spline#points
  77462. * @type {Phaser.Math.Vector2[]}
  77463. * @default []
  77464. * @since 3.0.0
  77465. */
  77466. this.points = [];
  77467. this.addPoints(points);
  77468. },
  77469. /**
  77470. * [description]
  77471. *
  77472. * @method Phaser.Curves.Spline#addPoints
  77473. * @since 3.0.0
  77474. *
  77475. * @param {(Phaser.Math.Vector2[]|number[]|number[][])} points - [description]
  77476. *
  77477. * @return {Phaser.Curves.Spline} This curve object.
  77478. */
  77479. addPoints: function (points)
  77480. {
  77481. for (var i = 0; i < points.length; i++)
  77482. {
  77483. var p = new Vector2();
  77484. if (typeof points[i] === 'number')
  77485. {
  77486. p.x = points[i];
  77487. p.y = points[i + 1];
  77488. i++;
  77489. }
  77490. else if (Array.isArray(points[i]))
  77491. {
  77492. // An array of arrays?
  77493. p.x = points[i][0];
  77494. p.y = points[i][1];
  77495. }
  77496. else
  77497. {
  77498. p.x = points[i].x;
  77499. p.y = points[i].y;
  77500. }
  77501. this.points.push(p);
  77502. }
  77503. return this;
  77504. },
  77505. /**
  77506. * [description]
  77507. *
  77508. * @method Phaser.Curves.Spline#addPoint
  77509. * @since 3.0.0
  77510. *
  77511. * @param {number} x - [description]
  77512. * @param {number} y - [description]
  77513. *
  77514. * @return {Phaser.Math.Vector2} [description]
  77515. */
  77516. addPoint: function (x, y)
  77517. {
  77518. var vec = new Vector2(x, y);
  77519. this.points.push(vec);
  77520. return vec;
  77521. },
  77522. /**
  77523. * Gets the starting point on the curve.
  77524. *
  77525. * @method Phaser.Curves.Spline#getStartPoint
  77526. * @since 3.0.0
  77527. *
  77528. * @generic {Phaser.Math.Vector2} O - [out,$return]
  77529. *
  77530. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  77531. *
  77532. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  77533. */
  77534. getStartPoint: function (out)
  77535. {
  77536. if (out === undefined) { out = new Vector2(); }
  77537. return out.copy(this.points[0]);
  77538. },
  77539. /**
  77540. * [description]
  77541. *
  77542. * @method Phaser.Curves.Spline#getResolution
  77543. * @since 3.0.0
  77544. *
  77545. * @param {number} divisions - [description]
  77546. *
  77547. * @return {number} [description]
  77548. */
  77549. getResolution: function (divisions)
  77550. {
  77551. return divisions * this.points.length;
  77552. },
  77553. /**
  77554. * Get point at relative position in curve according to length.
  77555. *
  77556. * @method Phaser.Curves.Spline#getPoint
  77557. * @since 3.0.0
  77558. *
  77559. * @generic {Phaser.Math.Vector2} O - [out,$return]
  77560. *
  77561. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  77562. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  77563. *
  77564. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  77565. */
  77566. getPoint: function (t, out)
  77567. {
  77568. if (out === undefined) { out = new Vector2(); }
  77569. var points = this.points;
  77570. var point = (points.length - 1) * t;
  77571. var intPoint = Math.floor(point);
  77572. var weight = point - intPoint;
  77573. var p0 = points[(intPoint === 0) ? intPoint : intPoint - 1];
  77574. var p1 = points[intPoint];
  77575. var p2 = points[(intPoint > points.length - 2) ? points.length - 1 : intPoint + 1];
  77576. var p3 = points[(intPoint > points.length - 3) ? points.length - 1 : intPoint + 2];
  77577. return out.set(CatmullRom(weight, p0.x, p1.x, p2.x, p3.x), CatmullRom(weight, p0.y, p1.y, p2.y, p3.y));
  77578. },
  77579. /**
  77580. * [description]
  77581. *
  77582. * @method Phaser.Curves.Spline#toJSON
  77583. * @since 3.0.0
  77584. *
  77585. * @return {JSONCurve} The JSON object containing this curve data.
  77586. */
  77587. toJSON: function ()
  77588. {
  77589. var points = [];
  77590. for (var i = 0; i < this.points.length; i++)
  77591. {
  77592. points.push(this.points[i].x);
  77593. points.push(this.points[i].y);
  77594. }
  77595. return {
  77596. type: this.type,
  77597. points: points
  77598. };
  77599. }
  77600. });
  77601. /**
  77602. * [description]
  77603. *
  77604. * @function Phaser.Curves.Spline.fromJSON
  77605. * @since 3.0.0
  77606. *
  77607. * @param {JSONCurve} data - The JSON object containing this curve data.
  77608. *
  77609. * @return {Phaser.Curves.Spline} [description]
  77610. */
  77611. SplineCurve.fromJSON = function (data)
  77612. {
  77613. return new SplineCurve(data.points);
  77614. };
  77615. module.exports = SplineCurve;
  77616. /***/ }),
  77617. /* 356 */
  77618. /***/ (function(module, exports, __webpack_require__) {
  77619. /**
  77620. * @author Richard Davey <rich@photonstorm.com>
  77621. * @copyright 2019 Photon Storm Ltd.
  77622. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77623. */
  77624. var Class = __webpack_require__(0);
  77625. var Curve = __webpack_require__(76);
  77626. var QuadraticBezierInterpolation = __webpack_require__(378);
  77627. var Vector2 = __webpack_require__(3);
  77628. /**
  77629. * @classdesc
  77630. * [description]
  77631. *
  77632. * @class QuadraticBezier
  77633. * @extends Phaser.Curves.Curve
  77634. * @memberof Phaser.Curves
  77635. * @constructor
  77636. * @since 3.2.0
  77637. *
  77638. * @param {(Phaser.Math.Vector2|number[])} p0 - Start point, or an array of point pairs.
  77639. * @param {Phaser.Math.Vector2} p1 - Control Point 1.
  77640. * @param {Phaser.Math.Vector2} p2 - Control Point 2.
  77641. */
  77642. var QuadraticBezier = new Class({
  77643. Extends: Curve,
  77644. initialize:
  77645. function QuadraticBezier (p0, p1, p2)
  77646. {
  77647. Curve.call(this, 'QuadraticBezier');
  77648. if (Array.isArray(p0))
  77649. {
  77650. p2 = new Vector2(p0[4], p0[5]);
  77651. p1 = new Vector2(p0[2], p0[3]);
  77652. p0 = new Vector2(p0[0], p0[1]);
  77653. }
  77654. /**
  77655. * [description]
  77656. *
  77657. * @name Phaser.Curves.QuadraticBezier#p0
  77658. * @type {Phaser.Math.Vector2}
  77659. * @since 3.2.0
  77660. */
  77661. this.p0 = p0;
  77662. /**
  77663. * [description]
  77664. *
  77665. * @name Phaser.Curves.QuadraticBezier#p1
  77666. * @type {Phaser.Math.Vector2}
  77667. * @since 3.2.0
  77668. */
  77669. this.p1 = p1;
  77670. /**
  77671. * [description]
  77672. *
  77673. * @name Phaser.Curves.QuadraticBezier#p2
  77674. * @type {Phaser.Math.Vector2}
  77675. * @since 3.2.0
  77676. */
  77677. this.p2 = p2;
  77678. },
  77679. /**
  77680. * Gets the starting point on the curve.
  77681. *
  77682. * @method Phaser.Curves.QuadraticBezier#getStartPoint
  77683. * @since 3.2.0
  77684. *
  77685. * @generic {Phaser.Math.Vector2} O - [out,$return]
  77686. *
  77687. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  77688. *
  77689. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  77690. */
  77691. getStartPoint: function (out)
  77692. {
  77693. if (out === undefined) { out = new Vector2(); }
  77694. return out.copy(this.p0);
  77695. },
  77696. /**
  77697. * [description]
  77698. *
  77699. * @method Phaser.Curves.QuadraticBezier#getResolution
  77700. * @since 3.2.0
  77701. *
  77702. * @param {number} divisions - [description]
  77703. *
  77704. * @return {number} [description]
  77705. */
  77706. getResolution: function (divisions)
  77707. {
  77708. return divisions;
  77709. },
  77710. /**
  77711. * Get point at relative position in curve according to length.
  77712. *
  77713. * @method Phaser.Curves.QuadraticBezier#getPoint
  77714. * @since 3.2.0
  77715. *
  77716. * @generic {Phaser.Math.Vector2} O - [out,$return]
  77717. *
  77718. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  77719. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  77720. *
  77721. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  77722. */
  77723. getPoint: function (t, out)
  77724. {
  77725. if (out === undefined) { out = new Vector2(); }
  77726. var p0 = this.p0;
  77727. var p1 = this.p1;
  77728. var p2 = this.p2;
  77729. return out.set(
  77730. QuadraticBezierInterpolation(t, p0.x, p1.x, p2.x),
  77731. QuadraticBezierInterpolation(t, p0.y, p1.y, p2.y)
  77732. );
  77733. },
  77734. /**
  77735. * [description]
  77736. *
  77737. * @method Phaser.Curves.QuadraticBezier#draw
  77738. * @since 3.2.0
  77739. *
  77740. * @generic {Phaser.GameObjects.Graphics} G - [graphics,$return]
  77741. *
  77742. * @param {Phaser.GameObjects.Graphics} graphics - `Graphics` object to draw onto.
  77743. * @param {integer} [pointsTotal=32] - Number of points to be used for drawing the curve. Higher numbers result in smoother curve but require more processing.
  77744. *
  77745. * @return {Phaser.GameObjects.Graphics} `Graphics` object that was drawn to.
  77746. */
  77747. draw: function (graphics, pointsTotal)
  77748. {
  77749. if (pointsTotal === undefined) { pointsTotal = 32; }
  77750. var points = this.getPoints(pointsTotal);
  77751. graphics.beginPath();
  77752. graphics.moveTo(this.p0.x, this.p0.y);
  77753. for (var i = 1; i < points.length; i++)
  77754. {
  77755. graphics.lineTo(points[i].x, points[i].y);
  77756. }
  77757. graphics.strokePath();
  77758. // So you can chain graphics calls
  77759. return graphics;
  77760. },
  77761. /**
  77762. * Converts the curve into a JSON compatible object.
  77763. *
  77764. * @method Phaser.Curves.QuadraticBezier#toJSON
  77765. * @since 3.2.0
  77766. *
  77767. * @return {JSONCurve} The JSON object containing this curve data.
  77768. */
  77769. toJSON: function ()
  77770. {
  77771. return {
  77772. type: this.type,
  77773. points: [
  77774. this.p0.x, this.p0.y,
  77775. this.p1.x, this.p1.y,
  77776. this.p2.x, this.p2.y
  77777. ]
  77778. };
  77779. }
  77780. });
  77781. /**
  77782. * Creates a curve from a JSON object, e. g. created by `toJSON`.
  77783. *
  77784. * @function Phaser.Curves.QuadraticBezier.fromJSON
  77785. * @since 3.2.0
  77786. *
  77787. * @param {JSONCurve} data - The JSON object containing this curve data.
  77788. *
  77789. * @return {Phaser.Curves.QuadraticBezier} The created curve instance.
  77790. */
  77791. QuadraticBezier.fromJSON = function (data)
  77792. {
  77793. var points = data.points;
  77794. var p0 = new Vector2(points[0], points[1]);
  77795. var p1 = new Vector2(points[2], points[3]);
  77796. var p2 = new Vector2(points[4], points[5]);
  77797. return new QuadraticBezier(p0, p1, p2);
  77798. };
  77799. module.exports = QuadraticBezier;
  77800. /***/ }),
  77801. /* 357 */
  77802. /***/ (function(module, exports, __webpack_require__) {
  77803. /**
  77804. * @author Richard Davey <rich@photonstorm.com>
  77805. * @copyright 2019 Photon Storm Ltd.
  77806. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77807. */
  77808. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  77809. var Class = __webpack_require__(0);
  77810. var Curve = __webpack_require__(76);
  77811. var FromPoints = __webpack_require__(180);
  77812. var Rectangle = __webpack_require__(10);
  77813. var Vector2 = __webpack_require__(3);
  77814. var tmpVec2 = new Vector2();
  77815. /**
  77816. * @classdesc
  77817. * A LineCurve is a "curve" comprising exactly two points (a line segment).
  77818. *
  77819. * @class Line
  77820. * @extends Phaser.Curves.Curve
  77821. * @memberof Phaser.Curves
  77822. * @constructor
  77823. * @since 3.0.0
  77824. *
  77825. * @param {(Phaser.Math.Vector2|number[])} p0 - The first endpoint.
  77826. * @param {Phaser.Math.Vector2} [p1] - The second endpoint.
  77827. */
  77828. var LineCurve = new Class({
  77829. Extends: Curve,
  77830. initialize:
  77831. // vec2s or array
  77832. function LineCurve (p0, p1)
  77833. {
  77834. Curve.call(this, 'LineCurve');
  77835. if (Array.isArray(p0))
  77836. {
  77837. p1 = new Vector2(p0[2], p0[3]);
  77838. p0 = new Vector2(p0[0], p0[1]);
  77839. }
  77840. /**
  77841. * The first endpoint.
  77842. *
  77843. * @name Phaser.Curves.Line#p0
  77844. * @type {Phaser.Math.Vector2}
  77845. * @since 3.0.0
  77846. */
  77847. this.p0 = p0;
  77848. /**
  77849. * The second endpoint.
  77850. *
  77851. * @name Phaser.Curves.Line#p1
  77852. * @type {Phaser.Math.Vector2}
  77853. * @since 3.0.0
  77854. */
  77855. this.p1 = p1;
  77856. },
  77857. /**
  77858. * Returns a Rectangle where the position and dimensions match the bounds of this Curve.
  77859. *
  77860. * @method Phaser.Curves.Line#getBounds
  77861. * @since 3.0.0
  77862. *
  77863. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  77864. *
  77865. * @param {Phaser.Geom.Rectangle} [out] - A Rectangle object to store the bounds in. If not given a new Rectangle will be created.
  77866. *
  77867. * @return {Phaser.Geom.Rectangle} A Rectangle object holding the bounds of this curve. If `out` was given it will be this object.
  77868. */
  77869. getBounds: function (out)
  77870. {
  77871. if (out === undefined) { out = new Rectangle(); }
  77872. return FromPoints([ this.p0, this.p1 ], out);
  77873. },
  77874. /**
  77875. * Gets the starting point on the curve.
  77876. *
  77877. * @method Phaser.Curves.Line#getStartPoint
  77878. * @since 3.0.0
  77879. *
  77880. * @generic {Phaser.Math.Vector2} O - [out,$return]
  77881. *
  77882. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  77883. *
  77884. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  77885. */
  77886. getStartPoint: function (out)
  77887. {
  77888. if (out === undefined) { out = new Vector2(); }
  77889. return out.copy(this.p0);
  77890. },
  77891. /**
  77892. * Gets the resolution of the line.
  77893. *
  77894. * @method Phaser.Curves.Line#getResolution
  77895. * @since 3.0.0
  77896. *
  77897. * @param {number} [divisions=1] - The number of divisions to consider.
  77898. *
  77899. * @return {number} The resolution. Equal to the number of divisions.
  77900. */
  77901. getResolution: function (divisions)
  77902. {
  77903. if (divisions === undefined) { divisions = 1; }
  77904. return divisions;
  77905. },
  77906. /**
  77907. * Get point at relative position in curve according to length.
  77908. *
  77909. * @method Phaser.Curves.Line#getPoint
  77910. * @since 3.0.0
  77911. *
  77912. * @generic {Phaser.Math.Vector2} O - [out,$return]
  77913. *
  77914. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  77915. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  77916. *
  77917. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  77918. */
  77919. getPoint: function (t, out)
  77920. {
  77921. if (out === undefined) { out = new Vector2(); }
  77922. if (t === 1)
  77923. {
  77924. return out.copy(this.p1);
  77925. }
  77926. out.copy(this.p1).subtract(this.p0).scale(t).add(this.p0);
  77927. return out;
  77928. },
  77929. // Line curve is linear, so we can overwrite default getPointAt
  77930. /**
  77931. * Gets a point at a given position on the line.
  77932. *
  77933. * @method Phaser.Curves.Line#getPointAt
  77934. * @since 3.0.0
  77935. *
  77936. * @generic {Phaser.Math.Vector2} O - [out,$return]
  77937. *
  77938. * @param {number} u - The position along the curve to return. Where 0 is the start and 1 is the end.
  77939. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  77940. *
  77941. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  77942. */
  77943. getPointAt: function (u, out)
  77944. {
  77945. return this.getPoint(u, out);
  77946. },
  77947. /**
  77948. * Gets the slope of the line as a unit vector.
  77949. *
  77950. * @method Phaser.Curves.Line#getTangent
  77951. * @since 3.0.0
  77952. *
  77953. * @generic {Phaser.Math.Vector2} O - [out,$return]
  77954. *
  77955. * @return {Phaser.Math.Vector2} The tangent vector.
  77956. */
  77957. getTangent: function ()
  77958. {
  77959. var tangent = tmpVec2.copy(this.p1).subtract(this.p0);
  77960. return tangent.normalize();
  77961. },
  77962. // Override default Curve.draw because this is better than calling getPoints on a line!
  77963. /**
  77964. * Draws this curve on the given Graphics object.
  77965. *
  77966. * The curve is drawn using `Graphics.lineBetween` so will be drawn at whatever the present Graphics line color is.
  77967. * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it.
  77968. *
  77969. * @method Phaser.Curves.Line#draw
  77970. * @since 3.0.0
  77971. *
  77972. * @generic {Phaser.GameObjects.Graphics} G - [graphics,$return]
  77973. *
  77974. * @param {Phaser.GameObjects.Graphics} graphics - The Graphics instance onto which this curve will be drawn.
  77975. *
  77976. * @return {Phaser.GameObjects.Graphics} The Graphics object to which the curve was drawn.
  77977. */
  77978. draw: function (graphics)
  77979. {
  77980. graphics.lineBetween(this.p0.x, this.p0.y, this.p1.x, this.p1.y);
  77981. // So you can chain graphics calls
  77982. return graphics;
  77983. },
  77984. /**
  77985. * Gets a JSON representation of the line.
  77986. *
  77987. * @method Phaser.Curves.Line#toJSON
  77988. * @since 3.0.0
  77989. *
  77990. * @return {JSONCurve} The JSON object containing this curve data.
  77991. */
  77992. toJSON: function ()
  77993. {
  77994. return {
  77995. type: this.type,
  77996. points: [
  77997. this.p0.x, this.p0.y,
  77998. this.p1.x, this.p1.y
  77999. ]
  78000. };
  78001. }
  78002. });
  78003. /**
  78004. * Configures this line from a JSON representation.
  78005. *
  78006. * @function Phaser.Curves.Line.fromJSON
  78007. * @since 3.0.0
  78008. *
  78009. * @param {JSONCurve} data - The JSON object containing this curve data.
  78010. *
  78011. * @return {Phaser.Curves.Line} A new LineCurve object.
  78012. */
  78013. LineCurve.fromJSON = function (data)
  78014. {
  78015. var points = data.points;
  78016. var p0 = new Vector2(points[0], points[1]);
  78017. var p1 = new Vector2(points[2], points[3]);
  78018. return new LineCurve(p0, p1);
  78019. };
  78020. module.exports = LineCurve;
  78021. /***/ }),
  78022. /* 358 */
  78023. /***/ (function(module, exports, __webpack_require__) {
  78024. /**
  78025. * @author Richard Davey <rich@photonstorm.com>
  78026. * @copyright 2019 Photon Storm Ltd.
  78027. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78028. */
  78029. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  78030. var Class = __webpack_require__(0);
  78031. var Curve = __webpack_require__(76);
  78032. var DegToRad = __webpack_require__(34);
  78033. var GetValue = __webpack_require__(4);
  78034. var RadToDeg = __webpack_require__(183);
  78035. var Vector2 = __webpack_require__(3);
  78036. /**
  78037. * @typedef {object} JSONEllipseCurve
  78038. *
  78039. * @property {string} type - The of the curve.
  78040. * @property {number} x - The x coordinate of the ellipse.
  78041. * @property {number} y - The y coordinate of the ellipse.
  78042. * @property {number} xRadius - The horizontal radius of ellipse.
  78043. * @property {number} yRadius - The vertical radius of ellipse.
  78044. * @property {integer} startAngle - The start angle of the ellipse, in degrees.
  78045. * @property {integer} endAngle - The end angle of the ellipse, in degrees.
  78046. * @property {boolean} clockwise - Sets if the the ellipse rotation is clockwise (true) or anti-clockwise (false)
  78047. * @property {integer} rotation - The rotation of ellipse, in degrees.
  78048. */
  78049. /**
  78050. * @typedef {object} EllipseCurveConfig
  78051. *
  78052. * @property {number} [x=0] - The x coordinate of the ellipse.
  78053. * @property {number} [y=0] - The y coordinate of the ellipse.
  78054. * @property {number} [xRadius=0] - The horizontal radius of the ellipse.
  78055. * @property {number} [yRadius=0] - The vertical radius of the ellipse.
  78056. * @property {integer} [startAngle=0] - The start angle of the ellipse, in degrees.
  78057. * @property {integer} [endAngle=360] - The end angle of the ellipse, in degrees.
  78058. * @property {boolean} [clockwise=false] - Sets if the the ellipse rotation is clockwise (true) or anti-clockwise (false)
  78059. * @property {integer} [rotation=0] - The rotation of the ellipse, in degrees.
  78060. */
  78061. /**
  78062. * @classdesc
  78063. * An Elliptical Curve derived from the Base Curve class.
  78064. *
  78065. * See https://en.wikipedia.org/wiki/Elliptic_curve for more details.
  78066. *
  78067. * @class Ellipse
  78068. * @extends Phaser.Curves.Curve
  78069. * @memberof Phaser.Curves
  78070. * @constructor
  78071. * @since 3.0.0
  78072. *
  78073. * @param {(number|EllipseCurveConfig)} [x=0] - The x coordinate of the ellipse, or an Ellipse Curve configuration object.
  78074. * @param {number} [y=0] - The y coordinate of the ellipse.
  78075. * @param {number} [xRadius=0] - The horizontal radius of ellipse.
  78076. * @param {number} [yRadius=0] - The vertical radius of ellipse.
  78077. * @param {integer} [startAngle=0] - The start angle of the ellipse, in degrees.
  78078. * @param {integer} [endAngle=360] - The end angle of the ellipse, in degrees.
  78079. * @param {boolean} [clockwise=false] - Sets if the the ellipse rotation is clockwise (true) or anti-clockwise (false)
  78080. * @param {integer} [rotation=0] - The rotation of the ellipse, in degrees.
  78081. */
  78082. var EllipseCurve = new Class({
  78083. Extends: Curve,
  78084. initialize:
  78085. function EllipseCurve (x, y, xRadius, yRadius, startAngle, endAngle, clockwise, rotation)
  78086. {
  78087. if (typeof x === 'object')
  78088. {
  78089. var config = x;
  78090. x = GetValue(config, 'x', 0);
  78091. y = GetValue(config, 'y', 0);
  78092. xRadius = GetValue(config, 'xRadius', 0);
  78093. yRadius = GetValue(config, 'yRadius', xRadius);
  78094. startAngle = GetValue(config, 'startAngle', 0);
  78095. endAngle = GetValue(config, 'endAngle', 360);
  78096. clockwise = GetValue(config, 'clockwise', false);
  78097. rotation = GetValue(config, 'rotation', 0);
  78098. }
  78099. else
  78100. {
  78101. if (yRadius === undefined) { yRadius = xRadius; }
  78102. if (startAngle === undefined) { startAngle = 0; }
  78103. if (endAngle === undefined) { endAngle = 360; }
  78104. if (clockwise === undefined) { clockwise = false; }
  78105. if (rotation === undefined) { rotation = 0; }
  78106. }
  78107. Curve.call(this, 'EllipseCurve');
  78108. // Center point
  78109. /**
  78110. * The center point of the ellipse. Used for calculating rotation.
  78111. *
  78112. * @name Phaser.Curves.Ellipse#p0
  78113. * @type {Phaser.Math.Vector2}
  78114. * @since 3.0.0
  78115. */
  78116. this.p0 = new Vector2(x, y);
  78117. /**
  78118. * The horizontal radius of the ellipse.
  78119. *
  78120. * @name Phaser.Curves.Ellipse#_xRadius
  78121. * @type {number}
  78122. * @private
  78123. * @since 3.0.0
  78124. */
  78125. this._xRadius = xRadius;
  78126. /**
  78127. * The vertical radius of the ellipse.
  78128. *
  78129. * @name Phaser.Curves.Ellipse#_yRadius
  78130. * @type {number}
  78131. * @private
  78132. * @since 3.0.0
  78133. */
  78134. this._yRadius = yRadius;
  78135. // Radians
  78136. /**
  78137. * The starting angle of the ellipse in radians.
  78138. *
  78139. * @name Phaser.Curves.Ellipse#_startAngle
  78140. * @type {number}
  78141. * @private
  78142. * @since 3.0.0
  78143. */
  78144. this._startAngle = DegToRad(startAngle);
  78145. /**
  78146. * The end angle of the ellipse in radians.
  78147. *
  78148. * @name Phaser.Curves.Ellipse#_endAngle
  78149. * @type {number}
  78150. * @private
  78151. * @since 3.0.0
  78152. */
  78153. this._endAngle = DegToRad(endAngle);
  78154. /**
  78155. * Anti-clockwise direction.
  78156. *
  78157. * @name Phaser.Curves.Ellipse#_clockwise
  78158. * @type {boolean}
  78159. * @private
  78160. * @since 3.0.0
  78161. */
  78162. this._clockwise = clockwise;
  78163. /**
  78164. * The rotation of the arc.
  78165. *
  78166. * @name Phaser.Curves.Ellipse#_rotation
  78167. * @type {number}
  78168. * @private
  78169. * @since 3.0.0
  78170. */
  78171. this._rotation = DegToRad(rotation);
  78172. },
  78173. /**
  78174. * Gets the starting point on the curve.
  78175. *
  78176. * @method Phaser.Curves.Ellipse#getStartPoint
  78177. * @since 3.0.0
  78178. *
  78179. * @generic {Phaser.Math.Vector2} O - [out,$return]
  78180. *
  78181. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  78182. *
  78183. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  78184. */
  78185. getStartPoint: function (out)
  78186. {
  78187. if (out === undefined) { out = new Vector2(); }
  78188. return this.getPoint(0, out);
  78189. },
  78190. /**
  78191. * [description]
  78192. *
  78193. * @method Phaser.Curves.Ellipse#getResolution
  78194. * @since 3.0.0
  78195. *
  78196. * @param {number} divisions - [description]
  78197. *
  78198. * @return {number} [description]
  78199. */
  78200. getResolution: function (divisions)
  78201. {
  78202. return divisions * 2;
  78203. },
  78204. /**
  78205. * Get point at relative position in curve according to length.
  78206. *
  78207. * @method Phaser.Curves.Ellipse#getPoint
  78208. * @since 3.0.0
  78209. *
  78210. * @generic {Phaser.Math.Vector2} O - [out,$return]
  78211. *
  78212. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  78213. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  78214. *
  78215. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  78216. */
  78217. getPoint: function (t, out)
  78218. {
  78219. if (out === undefined) { out = new Vector2(); }
  78220. var twoPi = Math.PI * 2;
  78221. var deltaAngle = this._endAngle - this._startAngle;
  78222. var samePoints = Math.abs(deltaAngle) < Number.EPSILON;
  78223. // ensures that deltaAngle is 0 .. 2 PI
  78224. while (deltaAngle < 0)
  78225. {
  78226. deltaAngle += twoPi;
  78227. }
  78228. while (deltaAngle > twoPi)
  78229. {
  78230. deltaAngle -= twoPi;
  78231. }
  78232. if (deltaAngle < Number.EPSILON)
  78233. {
  78234. if (samePoints)
  78235. {
  78236. deltaAngle = 0;
  78237. }
  78238. else
  78239. {
  78240. deltaAngle = twoPi;
  78241. }
  78242. }
  78243. if (this._clockwise && !samePoints)
  78244. {
  78245. if (deltaAngle === twoPi)
  78246. {
  78247. deltaAngle = - twoPi;
  78248. }
  78249. else
  78250. {
  78251. deltaAngle = deltaAngle - twoPi;
  78252. }
  78253. }
  78254. var angle = this._startAngle + t * deltaAngle;
  78255. var x = this.p0.x + this._xRadius * Math.cos(angle);
  78256. var y = this.p0.y + this._yRadius * Math.sin(angle);
  78257. if (this._rotation !== 0)
  78258. {
  78259. var cos = Math.cos(this._rotation);
  78260. var sin = Math.sin(this._rotation);
  78261. var tx = x - this.p0.x;
  78262. var ty = y - this.p0.y;
  78263. // Rotate the point about the center of the ellipse.
  78264. x = tx * cos - ty * sin + this.p0.x;
  78265. y = tx * sin + ty * cos + this.p0.y;
  78266. }
  78267. return out.set(x, y);
  78268. },
  78269. /**
  78270. * Sets the horizontal radius of this curve.
  78271. *
  78272. * @method Phaser.Curves.Ellipse#setXRadius
  78273. * @since 3.0.0
  78274. *
  78275. * @param {number} value - The horizontal radius of this curve.
  78276. *
  78277. * @return {Phaser.Curves.Ellipse} This curve object.
  78278. */
  78279. setXRadius: function (value)
  78280. {
  78281. this.xRadius = value;
  78282. return this;
  78283. },
  78284. /**
  78285. * Sets the vertical radius of this curve.
  78286. *
  78287. * @method Phaser.Curves.Ellipse#setYRadius
  78288. * @since 3.0.0
  78289. *
  78290. * @param {number} value - The vertical radius of this curve.
  78291. *
  78292. * @return {Phaser.Curves.Ellipse} This curve object.
  78293. */
  78294. setYRadius: function (value)
  78295. {
  78296. this.yRadius = value;
  78297. return this;
  78298. },
  78299. /**
  78300. * Sets the width of this curve.
  78301. *
  78302. * @method Phaser.Curves.Ellipse#setWidth
  78303. * @since 3.0.0
  78304. *
  78305. * @param {number} value - The width of this curve.
  78306. *
  78307. * @return {Phaser.Curves.Ellipse} This curve object.
  78308. */
  78309. setWidth: function (value)
  78310. {
  78311. this.xRadius = value * 2;
  78312. return this;
  78313. },
  78314. /**
  78315. * Sets the height of this curve.
  78316. *
  78317. * @method Phaser.Curves.Ellipse#setHeight
  78318. * @since 3.0.0
  78319. *
  78320. * @param {number} value - The height of this curve.
  78321. *
  78322. * @return {Phaser.Curves.Ellipse} This curve object.
  78323. */
  78324. setHeight: function (value)
  78325. {
  78326. this.yRadius = value * 2;
  78327. return this;
  78328. },
  78329. /**
  78330. * Sets the start angle of this curve.
  78331. *
  78332. * @method Phaser.Curves.Ellipse#setStartAngle
  78333. * @since 3.0.0
  78334. *
  78335. * @param {number} value - The start angle of this curve, in radians.
  78336. *
  78337. * @return {Phaser.Curves.Ellipse} This curve object.
  78338. */
  78339. setStartAngle: function (value)
  78340. {
  78341. this.startAngle = value;
  78342. return this;
  78343. },
  78344. /**
  78345. * Sets the end angle of this curve.
  78346. *
  78347. * @method Phaser.Curves.Ellipse#setEndAngle
  78348. * @since 3.0.0
  78349. *
  78350. * @param {number} value - The end angle of this curve, in radians.
  78351. *
  78352. * @return {Phaser.Curves.Ellipse} This curve object.
  78353. */
  78354. setEndAngle: function (value)
  78355. {
  78356. this.endAngle = value;
  78357. return this;
  78358. },
  78359. /**
  78360. * Sets if this curve extends clockwise or anti-clockwise.
  78361. *
  78362. * @method Phaser.Curves.Ellipse#setClockwise
  78363. * @since 3.0.0
  78364. *
  78365. * @param {boolean} value - The clockwise state of this curve.
  78366. *
  78367. * @return {Phaser.Curves.Ellipse} This curve object.
  78368. */
  78369. setClockwise: function (value)
  78370. {
  78371. this.clockwise = value;
  78372. return this;
  78373. },
  78374. /**
  78375. * Sets the rotation of this curve.
  78376. *
  78377. * @method Phaser.Curves.Ellipse#setRotation
  78378. * @since 3.0.0
  78379. *
  78380. * @param {number} value - The rotation of this curve, in radians.
  78381. *
  78382. * @return {Phaser.Curves.Ellipse} This curve object.
  78383. */
  78384. setRotation: function (value)
  78385. {
  78386. this.rotation = value;
  78387. return this;
  78388. },
  78389. /**
  78390. * The x coordinate of the center of the ellipse.
  78391. *
  78392. * @name Phaser.Curves.Ellipse#x
  78393. * @type {number}
  78394. * @since 3.0.0
  78395. */
  78396. x: {
  78397. get: function ()
  78398. {
  78399. return this.p0.x;
  78400. },
  78401. set: function (value)
  78402. {
  78403. this.p0.x = value;
  78404. }
  78405. },
  78406. /**
  78407. * The y coordinate of the center of the ellipse.
  78408. *
  78409. * @name Phaser.Curves.Ellipse#y
  78410. * @type {number}
  78411. * @since 3.0.0
  78412. */
  78413. y: {
  78414. get: function ()
  78415. {
  78416. return this.p0.y;
  78417. },
  78418. set: function (value)
  78419. {
  78420. this.p0.y = value;
  78421. }
  78422. },
  78423. /**
  78424. * The horizontal radius of the ellipse.
  78425. *
  78426. * @name Phaser.Curves.Ellipse#xRadius
  78427. * @type {number}
  78428. * @since 3.0.0
  78429. */
  78430. xRadius: {
  78431. get: function ()
  78432. {
  78433. return this._xRadius;
  78434. },
  78435. set: function (value)
  78436. {
  78437. this._xRadius = value;
  78438. }
  78439. },
  78440. /**
  78441. * The vertical radius of the ellipse.
  78442. *
  78443. * @name Phaser.Curves.Ellipse#yRadius
  78444. * @type {number}
  78445. * @since 3.0.0
  78446. */
  78447. yRadius: {
  78448. get: function ()
  78449. {
  78450. return this._yRadius;
  78451. },
  78452. set: function (value)
  78453. {
  78454. this._yRadius = value;
  78455. }
  78456. },
  78457. /**
  78458. * The start angle of the ellipse in degrees.
  78459. *
  78460. * @name Phaser.Curves.Ellipse#startAngle
  78461. * @type {number}
  78462. * @since 3.0.0
  78463. */
  78464. startAngle: {
  78465. get: function ()
  78466. {
  78467. return RadToDeg(this._startAngle);
  78468. },
  78469. set: function (value)
  78470. {
  78471. this._startAngle = DegToRad(value);
  78472. }
  78473. },
  78474. /**
  78475. * The end angle of the ellipse in degrees.
  78476. *
  78477. * @name Phaser.Curves.Ellipse#endAngle
  78478. * @type {number}
  78479. * @since 3.0.0
  78480. */
  78481. endAngle: {
  78482. get: function ()
  78483. {
  78484. return RadToDeg(this._endAngle);
  78485. },
  78486. set: function (value)
  78487. {
  78488. this._endAngle = DegToRad(value);
  78489. }
  78490. },
  78491. /**
  78492. * `true` if the ellipse rotation is clockwise or `false` if anti-clockwise.
  78493. *
  78494. * @name Phaser.Curves.Ellipse#clockwise
  78495. * @type {boolean}
  78496. * @since 3.0.0
  78497. */
  78498. clockwise: {
  78499. get: function ()
  78500. {
  78501. return this._clockwise;
  78502. },
  78503. set: function (value)
  78504. {
  78505. this._clockwise = value;
  78506. }
  78507. },
  78508. /**
  78509. * The rotation of the ellipse, relative to the center, in degrees.
  78510. *
  78511. * @name Phaser.Curves.Ellipse#angle
  78512. * @type {number}
  78513. * @since 3.14.0
  78514. */
  78515. angle: {
  78516. get: function ()
  78517. {
  78518. return RadToDeg(this._rotation);
  78519. },
  78520. set: function (value)
  78521. {
  78522. this._rotation = DegToRad(value);
  78523. }
  78524. },
  78525. /**
  78526. * The rotation of the ellipse, relative to the center, in radians.
  78527. *
  78528. * @name Phaser.Curves.Ellipse#rotation
  78529. * @type {number}
  78530. * @since 3.0.0
  78531. */
  78532. rotation: {
  78533. get: function ()
  78534. {
  78535. return this._rotation;
  78536. },
  78537. set: function (value)
  78538. {
  78539. this._rotation = value;
  78540. }
  78541. },
  78542. /**
  78543. * JSON serialization of the curve.
  78544. *
  78545. * @method Phaser.Curves.Ellipse#toJSON
  78546. * @since 3.0.0
  78547. *
  78548. * @return {JSONEllipseCurve} The JSON object containing this curve data.
  78549. */
  78550. toJSON: function ()
  78551. {
  78552. return {
  78553. type: this.type,
  78554. x: this.p0.x,
  78555. y: this.p0.y,
  78556. xRadius: this._xRadius,
  78557. yRadius: this._yRadius,
  78558. startAngle: RadToDeg(this._startAngle),
  78559. endAngle: RadToDeg(this._endAngle),
  78560. clockwise: this._clockwise,
  78561. rotation: RadToDeg(this._rotation)
  78562. };
  78563. }
  78564. });
  78565. /**
  78566. * Creates a curve from the provided Ellipse Curve Configuration object.
  78567. *
  78568. * @function Phaser.Curves.Ellipse.fromJSON
  78569. * @since 3.0.0
  78570. *
  78571. * @param {JSONEllipseCurve} data - The JSON object containing this curve data.
  78572. *
  78573. * @return {Phaser.Curves.Ellipse} The ellipse curve constructed from the configuration object.
  78574. */
  78575. EllipseCurve.fromJSON = function (data)
  78576. {
  78577. return new EllipseCurve(data);
  78578. };
  78579. module.exports = EllipseCurve;
  78580. /***/ }),
  78581. /* 359 */
  78582. /***/ (function(module, exports, __webpack_require__) {
  78583. /**
  78584. * @author Richard Davey <rich@photonstorm.com>
  78585. * @copyright 2019 Photon Storm Ltd.
  78586. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78587. */
  78588. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  78589. var Class = __webpack_require__(0);
  78590. var CubicBezier = __webpack_require__(379);
  78591. var Curve = __webpack_require__(76);
  78592. var Vector2 = __webpack_require__(3);
  78593. /**
  78594. * @classdesc
  78595. * A higher-order Bézier curve constructed of four points.
  78596. *
  78597. * @class CubicBezier
  78598. * @extends Phaser.Curves.Curve
  78599. * @memberof Phaser.Curves
  78600. * @constructor
  78601. * @since 3.0.0
  78602. *
  78603. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector2[])} p0 - Start point, or an array of point pairs.
  78604. * @param {Phaser.Math.Vector2} p1 - Control Point 1.
  78605. * @param {Phaser.Math.Vector2} p2 - Control Point 2.
  78606. * @param {Phaser.Math.Vector2} p3 - End Point.
  78607. */
  78608. var CubicBezierCurve = new Class({
  78609. Extends: Curve,
  78610. initialize:
  78611. function CubicBezierCurve (p0, p1, p2, p3)
  78612. {
  78613. Curve.call(this, 'CubicBezierCurve');
  78614. if (Array.isArray(p0))
  78615. {
  78616. p3 = new Vector2(p0[6], p0[7]);
  78617. p2 = new Vector2(p0[4], p0[5]);
  78618. p1 = new Vector2(p0[2], p0[3]);
  78619. p0 = new Vector2(p0[0], p0[1]);
  78620. }
  78621. /**
  78622. * The start point of this curve.
  78623. *
  78624. * @name Phaser.Curves.CubicBezier#p0
  78625. * @type {Phaser.Math.Vector2}
  78626. * @since 3.0.0
  78627. */
  78628. this.p0 = p0;
  78629. /**
  78630. * The first control point of this curve.
  78631. *
  78632. * @name Phaser.Curves.CubicBezier#p1
  78633. * @type {Phaser.Math.Vector2}
  78634. * @since 3.0.0
  78635. */
  78636. this.p1 = p1;
  78637. /**
  78638. * The second control point of this curve.
  78639. *
  78640. * @name Phaser.Curves.CubicBezier#p2
  78641. * @type {Phaser.Math.Vector2}
  78642. * @since 3.0.0
  78643. */
  78644. this.p2 = p2;
  78645. /**
  78646. * The end point of this curve.
  78647. *
  78648. * @name Phaser.Curves.CubicBezier#p3
  78649. * @type {Phaser.Math.Vector2}
  78650. * @since 3.0.0
  78651. */
  78652. this.p3 = p3;
  78653. },
  78654. /**
  78655. * Gets the starting point on the curve.
  78656. *
  78657. * @method Phaser.Curves.CubicBezier#getStartPoint
  78658. * @since 3.0.0
  78659. *
  78660. * @generic {Phaser.Math.Vector2} O - [out,$return]
  78661. *
  78662. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  78663. *
  78664. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  78665. */
  78666. getStartPoint: function (out)
  78667. {
  78668. if (out === undefined) { out = new Vector2(); }
  78669. return out.copy(this.p0);
  78670. },
  78671. /**
  78672. * Returns the resolution of this curve.
  78673. *
  78674. * @method Phaser.Curves.CubicBezier#getResolution
  78675. * @since 3.0.0
  78676. *
  78677. * @param {number} divisions - The amount of divisions used by this curve.
  78678. *
  78679. * @return {number} The resolution of the curve.
  78680. */
  78681. getResolution: function (divisions)
  78682. {
  78683. return divisions;
  78684. },
  78685. /**
  78686. * Get point at relative position in curve according to length.
  78687. *
  78688. * @method Phaser.Curves.CubicBezier#getPoint
  78689. * @since 3.0.0
  78690. *
  78691. * @generic {Phaser.Math.Vector2} O - [out,$return]
  78692. *
  78693. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  78694. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  78695. *
  78696. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  78697. */
  78698. getPoint: function (t, out)
  78699. {
  78700. if (out === undefined) { out = new Vector2(); }
  78701. var p0 = this.p0;
  78702. var p1 = this.p1;
  78703. var p2 = this.p2;
  78704. var p3 = this.p3;
  78705. return out.set(CubicBezier(t, p0.x, p1.x, p2.x, p3.x), CubicBezier(t, p0.y, p1.y, p2.y, p3.y));
  78706. },
  78707. /**
  78708. * Draws this curve to the specified graphics object.
  78709. *
  78710. * @method Phaser.Curves.CubicBezier#draw
  78711. * @since 3.0.0
  78712. *
  78713. * @generic {Phaser.GameObjects.Graphics} G - [graphics,$return]
  78714. *
  78715. * @param {Phaser.GameObjects.Graphics} graphics - The graphics object this curve should be drawn to.
  78716. * @param {integer} [pointsTotal=32] - The number of intermediary points that make up this curve. A higher number of points will result in a smoother curve.
  78717. *
  78718. * @return {Phaser.GameObjects.Graphics} The graphics object this curve was drawn to. Useful for method chaining.
  78719. */
  78720. draw: function (graphics, pointsTotal)
  78721. {
  78722. if (pointsTotal === undefined) { pointsTotal = 32; }
  78723. var points = this.getPoints(pointsTotal);
  78724. graphics.beginPath();
  78725. graphics.moveTo(this.p0.x, this.p0.y);
  78726. for (var i = 1; i < points.length; i++)
  78727. {
  78728. graphics.lineTo(points[i].x, points[i].y);
  78729. }
  78730. graphics.strokePath();
  78731. // So you can chain graphics calls
  78732. return graphics;
  78733. },
  78734. /**
  78735. * Returns a JSON object that describes this curve.
  78736. *
  78737. * @method Phaser.Curves.CubicBezier#toJSON
  78738. * @since 3.0.0
  78739. *
  78740. * @return {JSONCurve} The JSON object containing this curve data.
  78741. */
  78742. toJSON: function ()
  78743. {
  78744. return {
  78745. type: this.type,
  78746. points: [
  78747. this.p0.x, this.p0.y,
  78748. this.p1.x, this.p1.y,
  78749. this.p2.x, this.p2.y,
  78750. this.p3.x, this.p3.y
  78751. ]
  78752. };
  78753. }
  78754. });
  78755. /**
  78756. * Generates a curve from a JSON object.
  78757. *
  78758. * @function Phaser.Curves.CubicBezier.fromJSON
  78759. * @since 3.0.0
  78760. *
  78761. * @param {JSONCurve} data - The JSON object containing this curve data.
  78762. *
  78763. * @return {Phaser.Curves.CubicBezier} The curve generated from the JSON object.
  78764. */
  78765. CubicBezierCurve.fromJSON = function (data)
  78766. {
  78767. var points = data.points;
  78768. var p0 = new Vector2(points[0], points[1]);
  78769. var p1 = new Vector2(points[2], points[3]);
  78770. var p2 = new Vector2(points[4], points[5]);
  78771. var p3 = new Vector2(points[6], points[7]);
  78772. return new CubicBezierCurve(p0, p1, p2, p3);
  78773. };
  78774. module.exports = CubicBezierCurve;
  78775. /***/ }),
  78776. /* 360 */
  78777. /***/ (function(module, exports) {
  78778. /**
  78779. * @author Richard Davey <rich@photonstorm.com>
  78780. * @copyright 2019 Photon Storm Ltd.
  78781. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78782. */
  78783. /**
  78784. * A 16 color palette by [Arne](http://androidarts.com/palette/16pal.htm)
  78785. *
  78786. * @name Phaser.Create.Palettes.ARNE16
  78787. * @since 3.0.0
  78788. *
  78789. * @type {Palette}
  78790. */
  78791. module.exports = {
  78792. 0: '#000',
  78793. 1: '#9D9D9D',
  78794. 2: '#FFF',
  78795. 3: '#BE2633',
  78796. 4: '#E06F8B',
  78797. 5: '#493C2B',
  78798. 6: '#A46422',
  78799. 7: '#EB8931',
  78800. 8: '#F7E26B',
  78801. 9: '#2F484E',
  78802. A: '#44891A',
  78803. B: '#A3CE27',
  78804. C: '#1B2632',
  78805. D: '#005784',
  78806. E: '#31A2F2',
  78807. F: '#B2DCEF'
  78808. };
  78809. /***/ }),
  78810. /* 361 */
  78811. /***/ (function(module, exports, __webpack_require__) {
  78812. /**
  78813. * @author Richard Davey <rich@photonstorm.com>
  78814. * @copyright 2019 Photon Storm Ltd.
  78815. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78816. */
  78817. var Arne16 = __webpack_require__(360);
  78818. var CanvasPool = __webpack_require__(24);
  78819. var GetValue = __webpack_require__(4);
  78820. /**
  78821. * @callback GenerateTextureRendererCallback
  78822. *
  78823. * @param {HTMLCanvasElement} canvas - [description]
  78824. * @param {CanvasRenderingContext2D} context - [description]
  78825. */
  78826. /**
  78827. * @typedef {object} GenerateTextureConfig
  78828. *
  78829. * @property {array} [data=[]] - [description]
  78830. * @property {HTMLCanvasElement} [canvas=null] - [description]
  78831. * @property {Palette} [palette=Arne16] - [description]
  78832. * @property {number} [pixelWidth=1] - The width of each 'pixel' in the generated texture.
  78833. * @property {number} [pixelHeight=1] - The height of each 'pixel' in the generated texture.
  78834. * @property {boolean} [resizeCanvas=true] - [description]
  78835. * @property {boolean} [clearCanvas=true] - [description]
  78836. * @property {GenerateTextureRendererCallback} [preRender] - [description]
  78837. * @property {GenerateTextureRendererCallback} [postRender] - [description]
  78838. */
  78839. /**
  78840. * [description]
  78841. *
  78842. * @function Phaser.Create.GenerateTexture
  78843. * @since 3.0.0
  78844. *
  78845. * @param {GenerateTextureConfig} config - [description]
  78846. *
  78847. * @return {HTMLCanvasElement} [description]
  78848. */
  78849. var GenerateTexture = function (config)
  78850. {
  78851. var data = GetValue(config, 'data', []);
  78852. var canvas = GetValue(config, 'canvas', null);
  78853. var palette = GetValue(config, 'palette', Arne16);
  78854. var pixelWidth = GetValue(config, 'pixelWidth', 1);
  78855. var pixelHeight = GetValue(config, 'pixelHeight', pixelWidth);
  78856. var resizeCanvas = GetValue(config, 'resizeCanvas', true);
  78857. var clearCanvas = GetValue(config, 'clearCanvas', true);
  78858. var preRender = GetValue(config, 'preRender', null);
  78859. var postRender = GetValue(config, 'postRender', null);
  78860. var width = Math.floor(Math.abs(data[0].length * pixelWidth));
  78861. var height = Math.floor(Math.abs(data.length * pixelHeight));
  78862. if (!canvas)
  78863. {
  78864. canvas = CanvasPool.create2D(this, width, height);
  78865. resizeCanvas = false;
  78866. clearCanvas = false;
  78867. }
  78868. if (resizeCanvas)
  78869. {
  78870. canvas.width = width;
  78871. canvas.height = height;
  78872. }
  78873. var ctx = canvas.getContext('2d');
  78874. if (clearCanvas)
  78875. {
  78876. ctx.clearRect(0, 0, width, height);
  78877. }
  78878. // preRender Callback?
  78879. if (preRender)
  78880. {
  78881. preRender(canvas, ctx);
  78882. }
  78883. // Draw it
  78884. for (var y = 0; y < data.length; y++)
  78885. {
  78886. var row = data[y];
  78887. for (var x = 0; x < row.length; x++)
  78888. {
  78889. var d = row[x];
  78890. if (d !== '.' && d !== ' ')
  78891. {
  78892. ctx.fillStyle = palette[d];
  78893. ctx.fillRect(x * pixelWidth, y * pixelHeight, pixelWidth, pixelHeight);
  78894. }
  78895. }
  78896. }
  78897. // postRender Callback?
  78898. if (postRender)
  78899. {
  78900. postRender(canvas, ctx);
  78901. }
  78902. return canvas;
  78903. };
  78904. module.exports = GenerateTexture;
  78905. /***/ }),
  78906. /* 362 */
  78907. /***/ (function(module, exports, __webpack_require__) {
  78908. /**
  78909. * @author Richard Davey <rich@photonstorm.com>
  78910. * @copyright 2019 Photon Storm Ltd.
  78911. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78912. */
  78913. var Events = __webpack_require__(26);
  78914. /**
  78915. * The Visibility Handler is responsible for listening out for document level visibility change events.
  78916. * This includes `visibilitychange` if the browser supports it, and blur and focus events. It then uses
  78917. * the provided Event Emitter and fires the related events.
  78918. *
  78919. * @function Phaser.Core.VisibilityHandler
  78920. * @fires Phaser.Core.Events#BLUR
  78921. * @fires Phaser.Core.Events#FOCUS
  78922. * @fires Phaser.Core.Events#HIDDEN
  78923. * @fires Phaser.Core.Events#VISIBLE
  78924. * @since 3.0.0
  78925. *
  78926. * @param {Phaser.Game} game - The Game instance this Visibility Handler is working on.
  78927. */
  78928. var VisibilityHandler = function (game)
  78929. {
  78930. var hiddenVar;
  78931. var eventEmitter = game.events;
  78932. if (document.hidden !== undefined)
  78933. {
  78934. hiddenVar = 'visibilitychange';
  78935. }
  78936. else
  78937. {
  78938. var vendors = [ 'webkit', 'moz', 'ms' ];
  78939. vendors.forEach(function (prefix)
  78940. {
  78941. if (document[prefix + 'Hidden'] !== undefined)
  78942. {
  78943. document.hidden = function ()
  78944. {
  78945. return document[prefix + 'Hidden'];
  78946. };
  78947. hiddenVar = prefix + 'visibilitychange';
  78948. }
  78949. });
  78950. }
  78951. var onChange = function (event)
  78952. {
  78953. if (document.hidden || event.type === 'pause')
  78954. {
  78955. eventEmitter.emit(Events.HIDDEN);
  78956. }
  78957. else
  78958. {
  78959. eventEmitter.emit(Events.VISIBLE);
  78960. }
  78961. };
  78962. if (hiddenVar)
  78963. {
  78964. document.addEventListener(hiddenVar, onChange, false);
  78965. }
  78966. window.onblur = function ()
  78967. {
  78968. eventEmitter.emit(Events.BLUR);
  78969. };
  78970. window.onfocus = function ()
  78971. {
  78972. eventEmitter.emit(Events.FOCUS);
  78973. };
  78974. // Automatically give the window focus unless config says otherwise
  78975. if (window.focus && game.config.autoFocus)
  78976. {
  78977. window.focus();
  78978. }
  78979. };
  78980. module.exports = VisibilityHandler;
  78981. /***/ }),
  78982. /* 363 */
  78983. /***/ (function(module, exports, __webpack_require__) {
  78984. /**
  78985. * @author Richard Davey <rich@photonstorm.com>
  78986. * @copyright 2019 Photon Storm Ltd.
  78987. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78988. */
  78989. var Class = __webpack_require__(0);
  78990. var NOOP = __webpack_require__(1);
  78991. /**
  78992. * @classdesc
  78993. * Abstracts away the use of RAF or setTimeOut for the core game update loop.
  78994. * This is invoked automatically by the Phaser.Game instance.
  78995. *
  78996. * @class RequestAnimationFrame
  78997. * @memberof Phaser.DOM
  78998. * @constructor
  78999. * @since 3.0.0
  79000. */
  79001. var RequestAnimationFrame = new Class({
  79002. initialize:
  79003. function RequestAnimationFrame ()
  79004. {
  79005. /**
  79006. * True if RequestAnimationFrame is running, otherwise false.
  79007. *
  79008. * @name Phaser.DOM.RequestAnimationFrame#isRunning
  79009. * @type {boolean}
  79010. * @default false
  79011. * @since 3.0.0
  79012. */
  79013. this.isRunning = false;
  79014. /**
  79015. * The callback to be invoked each step.
  79016. *
  79017. * @name Phaser.DOM.RequestAnimationFrame#callback
  79018. * @type {FrameRequestCallback}
  79019. * @since 3.0.0
  79020. */
  79021. this.callback = NOOP;
  79022. /**
  79023. * The most recent timestamp. Either a DOMHighResTimeStamp under RAF or `Date.now` under SetTimeout.
  79024. *
  79025. * @name Phaser.DOM.RequestAnimationFrame#tick
  79026. * @type {number}
  79027. * @default 0
  79028. * @since 3.0.0
  79029. */
  79030. this.tick = 0;
  79031. /**
  79032. * True if the step is using setTimeout instead of RAF.
  79033. *
  79034. * @name Phaser.DOM.RequestAnimationFrame#isSetTimeOut
  79035. * @type {boolean}
  79036. * @default false
  79037. * @since 3.0.0
  79038. */
  79039. this.isSetTimeOut = false;
  79040. /**
  79041. * The setTimeout or RAF callback ID used when canceling them.
  79042. *
  79043. * @name Phaser.DOM.RequestAnimationFrame#timeOutID
  79044. * @type {?number}
  79045. * @default null
  79046. * @since 3.0.0
  79047. */
  79048. this.timeOutID = null;
  79049. /**
  79050. * The previous time the step was called.
  79051. *
  79052. * @name Phaser.DOM.RequestAnimationFrame#lastTime
  79053. * @type {number}
  79054. * @default 0
  79055. * @since 3.0.0
  79056. */
  79057. this.lastTime = 0;
  79058. var _this = this;
  79059. /**
  79060. * The RAF step function.
  79061. * Updates the local tick value, invokes the callback and schedules another call to requestAnimationFrame.
  79062. *
  79063. * @name Phaser.DOM.RequestAnimationFrame#step
  79064. * @type {FrameRequestCallback}
  79065. * @since 3.0.0
  79066. */
  79067. this.step = function step ()
  79068. {
  79069. // Because we cannot trust the time passed to this callback from the browser and need it kept in sync with event times
  79070. var timestamp = window.performance.now();
  79071. // DOMHighResTimeStamp
  79072. _this.lastTime = _this.tick;
  79073. _this.tick = timestamp;
  79074. _this.callback(timestamp);
  79075. _this.timeOutID = window.requestAnimationFrame(step);
  79076. };
  79077. /**
  79078. * The SetTimeout step function.
  79079. * Updates the local tick value, invokes the callback and schedules another call to setTimeout.
  79080. *
  79081. * @name Phaser.DOM.RequestAnimationFrame#stepTimeout
  79082. * @type {function}
  79083. * @since 3.0.0
  79084. */
  79085. this.stepTimeout = function stepTimeout ()
  79086. {
  79087. var d = Date.now();
  79088. var delay = Math.max(16 + _this.lastTime - d, 0);
  79089. _this.lastTime = _this.tick;
  79090. _this.tick = d;
  79091. _this.callback(d);
  79092. _this.timeOutID = window.setTimeout(stepTimeout, delay);
  79093. };
  79094. },
  79095. /**
  79096. * Starts the requestAnimationFrame or setTimeout process running.
  79097. *
  79098. * @method Phaser.DOM.RequestAnimationFrame#start
  79099. * @since 3.0.0
  79100. *
  79101. * @param {FrameRequestCallback} callback - The callback to invoke each step.
  79102. * @param {boolean} forceSetTimeOut - Should it use SetTimeout, even if RAF is available?
  79103. */
  79104. start: function (callback, forceSetTimeOut)
  79105. {
  79106. if (this.isRunning)
  79107. {
  79108. return;
  79109. }
  79110. this.callback = callback;
  79111. this.isSetTimeOut = forceSetTimeOut;
  79112. this.isRunning = true;
  79113. this.timeOutID = (forceSetTimeOut) ? window.setTimeout(this.stepTimeout, 0) : window.requestAnimationFrame(this.step);
  79114. },
  79115. /**
  79116. * Stops the requestAnimationFrame or setTimeout from running.
  79117. *
  79118. * @method Phaser.DOM.RequestAnimationFrame#stop
  79119. * @since 3.0.0
  79120. */
  79121. stop: function ()
  79122. {
  79123. this.isRunning = false;
  79124. if (this.isSetTimeOut)
  79125. {
  79126. clearTimeout(this.timeOutID);
  79127. }
  79128. else
  79129. {
  79130. window.cancelAnimationFrame(this.timeOutID);
  79131. }
  79132. },
  79133. /**
  79134. * Stops the step from running and clears the callback reference.
  79135. *
  79136. * @method Phaser.DOM.RequestAnimationFrame#destroy
  79137. * @since 3.0.0
  79138. */
  79139. destroy: function ()
  79140. {
  79141. this.stop();
  79142. this.callback = NOOP;
  79143. }
  79144. });
  79145. module.exports = RequestAnimationFrame;
  79146. /***/ }),
  79147. /* 364 */
  79148. /***/ (function(module, exports, __webpack_require__) {
  79149. /**
  79150. * @author Richard Davey <rich@photonstorm.com>
  79151. * @copyright 2019 Photon Storm Ltd.
  79152. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  79153. */
  79154. var Class = __webpack_require__(0);
  79155. var GetValue = __webpack_require__(4);
  79156. var NOOP = __webpack_require__(1);
  79157. var RequestAnimationFrame = __webpack_require__(363);
  79158. // Frame Rate config
  79159. // fps: {
  79160. // min: 10,
  79161. // target: 60,
  79162. // forceSetTimeOut: false,
  79163. // deltaHistory: 10,
  79164. // panicMax: 120
  79165. // }
  79166. // http://www.testufo.com/#test=animation-time-graph
  79167. /**
  79168. * @callback TimeStepCallback
  79169. *
  79170. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  79171. * @param {number} average - The Delta Average.
  79172. * @param {number} interpolation - Interpolation - how far between what is expected and where we are?
  79173. */
  79174. /**
  79175. * @classdesc
  79176. * [description]
  79177. *
  79178. * @class TimeStep
  79179. * @memberof Phaser.Core
  79180. * @constructor
  79181. * @since 3.0.0
  79182. *
  79183. * @param {Phaser.Game} game - A reference to the Phaser.Game instance that owns this Time Step.
  79184. * @param {FPSConfig} config
  79185. */
  79186. var TimeStep = new Class({
  79187. initialize:
  79188. function TimeStep (game, config)
  79189. {
  79190. /**
  79191. * A reference to the Phaser.Game instance.
  79192. *
  79193. * @name Phaser.Core.TimeStep#game
  79194. * @type {Phaser.Game}
  79195. * @readonly
  79196. * @since 3.0.0
  79197. */
  79198. this.game = game;
  79199. /**
  79200. * [description]
  79201. *
  79202. * @name Phaser.Core.TimeStep#raf
  79203. * @type {Phaser.DOM.RequestAnimationFrame}
  79204. * @readonly
  79205. * @since 3.0.0
  79206. */
  79207. this.raf = new RequestAnimationFrame();
  79208. /**
  79209. * A flag that is set once the TimeStep has started running and toggled when it stops.
  79210. *
  79211. * @name Phaser.Core.TimeStep#started
  79212. * @type {boolean}
  79213. * @readonly
  79214. * @default false
  79215. * @since 3.0.0
  79216. */
  79217. this.started = false;
  79218. /**
  79219. * A flag that is set once the TimeStep has started running and toggled when it stops.
  79220. * The difference between this value and `started` is that `running` is toggled when
  79221. * the TimeStep is sent to sleep, where-as `started` remains `true`, only changing if
  79222. * the TimeStep is actually stopped, not just paused.
  79223. *
  79224. * @name Phaser.Core.TimeStep#running
  79225. * @type {boolean}
  79226. * @readonly
  79227. * @default false
  79228. * @since 3.0.0
  79229. */
  79230. this.running = false;
  79231. /**
  79232. * The minimum fps rate you want the Time Step to run at.
  79233. *
  79234. * @name Phaser.Core.TimeStep#minFps
  79235. * @type {integer}
  79236. * @default 5
  79237. * @since 3.0.0
  79238. */
  79239. this.minFps = GetValue(config, 'min', 5);
  79240. /**
  79241. * The target fps rate for the Time Step to run at.
  79242. *
  79243. * Setting this value will not actually change the speed at which the browser runs, that is beyond
  79244. * the control of Phaser. Instead, it allows you to determine performance issues and if the Time Step
  79245. * is spiraling out of control.
  79246. *
  79247. * @name Phaser.Core.TimeStep#targetFps
  79248. * @type {integer}
  79249. * @default 60
  79250. * @since 3.0.0
  79251. */
  79252. this.targetFps = GetValue(config, 'target', 60);
  79253. /**
  79254. * The minFps value in ms.
  79255. * Defaults to 200ms between frames (i.e. super slow!)
  79256. *
  79257. * @name Phaser.Core.TimeStep#_min
  79258. * @type {number}
  79259. * @private
  79260. * @since 3.0.0
  79261. */
  79262. this._min = 1000 / this.minFps;
  79263. /**
  79264. * The targetFps value in ms.
  79265. * Defaults to 16.66ms between frames (i.e. normal)
  79266. *
  79267. * @name Phaser.Core.TimeStep#_target
  79268. * @type {number}
  79269. * @private
  79270. * @since 3.0.0
  79271. */
  79272. this._target = 1000 / this.targetFps;
  79273. /**
  79274. * An exponential moving average of the frames per second.
  79275. *
  79276. * @name Phaser.Core.TimeStep#actualFps
  79277. * @type {integer}
  79278. * @readonly
  79279. * @default 60
  79280. * @since 3.0.0
  79281. */
  79282. this.actualFps = this.targetFps;
  79283. /**
  79284. * [description]
  79285. *
  79286. * @name Phaser.Core.TimeStep#nextFpsUpdate
  79287. * @type {integer}
  79288. * @readonly
  79289. * @default 0
  79290. * @since 3.0.0
  79291. */
  79292. this.nextFpsUpdate = 0;
  79293. /**
  79294. * The number of frames processed this second.
  79295. *
  79296. * @name Phaser.Core.TimeStep#framesThisSecond
  79297. * @type {integer}
  79298. * @readonly
  79299. * @default 0
  79300. * @since 3.0.0
  79301. */
  79302. this.framesThisSecond = 0;
  79303. /**
  79304. * A callback to be invoked each time the Time Step steps.
  79305. *
  79306. * @name Phaser.Core.TimeStep#callback
  79307. * @type {TimeStepCallback}
  79308. * @default NOOP
  79309. * @since 3.0.0
  79310. */
  79311. this.callback = NOOP;
  79312. /**
  79313. * You can force the Time Step to use Set Timeout instead of Request Animation Frame by setting
  79314. * the `forceSetTimeOut` property to `true` in the Game Configuration object. It cannot be changed at run-time.
  79315. *
  79316. * @name Phaser.Core.TimeStep#forceSetTimeOut
  79317. * @type {boolean}
  79318. * @readonly
  79319. * @default false
  79320. * @since 3.0.0
  79321. */
  79322. this.forceSetTimeOut = GetValue(config, 'forceSetTimeOut', false);
  79323. /**
  79324. * [description]
  79325. *
  79326. * @name Phaser.Core.TimeStep#time
  79327. * @type {integer}
  79328. * @default 0
  79329. * @since 3.0.0
  79330. */
  79331. this.time = 0;
  79332. /**
  79333. * [description]
  79334. *
  79335. * @name Phaser.Core.TimeStep#startTime
  79336. * @type {integer}
  79337. * @default 0
  79338. * @since 3.0.0
  79339. */
  79340. this.startTime = 0;
  79341. /**
  79342. * [description]
  79343. *
  79344. * @name Phaser.Core.TimeStep#lastTime
  79345. * @type {integer}
  79346. * @default 0
  79347. * @since 3.0.0
  79348. */
  79349. this.lastTime = 0;
  79350. /**
  79351. * [description]
  79352. *
  79353. * @name Phaser.Core.TimeStep#frame
  79354. * @type {integer}
  79355. * @readonly
  79356. * @default 0
  79357. * @since 3.0.0
  79358. */
  79359. this.frame = 0;
  79360. /**
  79361. * [description]
  79362. *
  79363. * @name Phaser.Core.TimeStep#inFocus
  79364. * @type {boolean}
  79365. * @readonly
  79366. * @default true
  79367. * @since 3.0.0
  79368. */
  79369. this.inFocus = true;
  79370. /**
  79371. * [description]
  79372. *
  79373. * @name Phaser.Core.TimeStep#_pauseTime
  79374. * @type {integer}
  79375. * @private
  79376. * @default 0
  79377. * @since 3.0.0
  79378. */
  79379. this._pauseTime = 0;
  79380. /**
  79381. * [description]
  79382. *
  79383. * @name Phaser.Core.TimeStep#_coolDown
  79384. * @type {integer}
  79385. * @private
  79386. * @default 0
  79387. * @since 3.0.0
  79388. */
  79389. this._coolDown = 0;
  79390. /**
  79391. * [description]
  79392. *
  79393. * @name Phaser.Core.TimeStep#delta
  79394. * @type {integer}
  79395. * @default 0
  79396. * @since 3.0.0
  79397. */
  79398. this.delta = 0;
  79399. /**
  79400. * [description]
  79401. *
  79402. * @name Phaser.Core.TimeStep#deltaIndex
  79403. * @type {integer}
  79404. * @default 0
  79405. * @since 3.0.0
  79406. */
  79407. this.deltaIndex = 0;
  79408. /**
  79409. * [description]
  79410. *
  79411. * @name Phaser.Core.TimeStep#deltaHistory
  79412. * @type {integer[]}
  79413. * @since 3.0.0
  79414. */
  79415. this.deltaHistory = [];
  79416. /**
  79417. * [description]
  79418. *
  79419. * @name Phaser.Core.TimeStep#deltaSmoothingMax
  79420. * @type {integer}
  79421. * @default 10
  79422. * @since 3.0.0
  79423. */
  79424. this.deltaSmoothingMax = GetValue(config, 'deltaHistory', 10);
  79425. /**
  79426. * [description]
  79427. *
  79428. * @name Phaser.Core.TimeStep#panicMax
  79429. * @type {integer}
  79430. * @default 120
  79431. * @since 3.0.0
  79432. */
  79433. this.panicMax = GetValue(config, 'panicMax', 120);
  79434. /**
  79435. * The actual elapsed time in ms between one update and the next.
  79436. * Unlike with `delta` no smoothing, capping, or averaging is applied to this value.
  79437. * So please be careful when using this value in calculations.
  79438. *
  79439. * @name Phaser.Core.TimeStep#rawDelta
  79440. * @type {number}
  79441. * @default 0
  79442. * @since 3.0.0
  79443. */
  79444. this.rawDelta = 0;
  79445. },
  79446. /**
  79447. * Called when the DOM window.onBlur event triggers.
  79448. *
  79449. * @method Phaser.Core.TimeStep#blur
  79450. * @since 3.0.0
  79451. */
  79452. blur: function ()
  79453. {
  79454. this.inFocus = false;
  79455. },
  79456. /**
  79457. * Called when the DOM window.onFocus event triggers.
  79458. *
  79459. * @method Phaser.Core.TimeStep#focus
  79460. * @since 3.0.0
  79461. */
  79462. focus: function ()
  79463. {
  79464. this.inFocus = true;
  79465. this.resetDelta();
  79466. },
  79467. /**
  79468. * Called when the visibility API says the game is 'hidden' (tab switch out of view, etc)
  79469. *
  79470. * @method Phaser.Core.TimeStep#pause
  79471. * @since 3.0.0
  79472. */
  79473. pause: function ()
  79474. {
  79475. this._pauseTime = window.performance.now();
  79476. },
  79477. /**
  79478. * Called when the visibility API says the game is 'visible' again (tab switch back into view, etc)
  79479. *
  79480. * @method Phaser.Core.TimeStep#resume
  79481. * @since 3.0.0
  79482. */
  79483. resume: function ()
  79484. {
  79485. this.resetDelta();
  79486. this.startTime += this.time - this._pauseTime;
  79487. },
  79488. /**
  79489. * [description]
  79490. *
  79491. * @method Phaser.Core.TimeStep#resetDelta
  79492. * @since 3.0.0
  79493. */
  79494. resetDelta: function ()
  79495. {
  79496. var now = window.performance.now();
  79497. this.time = now;
  79498. this.lastTime = now;
  79499. this.nextFpsUpdate = now + 1000;
  79500. this.framesThisSecond = 0;
  79501. this.frame = 0;
  79502. // Pre-populate smoothing array
  79503. for (var i = 0; i < this.deltaSmoothingMax; i++)
  79504. {
  79505. this.deltaHistory[i] = Math.min(this._target, this.deltaHistory[i]);
  79506. }
  79507. this.delta = 0;
  79508. this.deltaIndex = 0;
  79509. this._coolDown = this.panicMax;
  79510. },
  79511. /**
  79512. * Starts the Time Step running, if it is not already doing so.
  79513. * Called automatically by the Game Boot process.
  79514. *
  79515. * @method Phaser.Core.TimeStep#start
  79516. * @since 3.0.0
  79517. *
  79518. * @param {TimeStepCallback} callback - The callback to be invoked each time the Time Step steps.
  79519. */
  79520. start: function (callback)
  79521. {
  79522. if (this.started)
  79523. {
  79524. return this;
  79525. }
  79526. this.started = true;
  79527. this.running = true;
  79528. for (var i = 0; i < this.deltaSmoothingMax; i++)
  79529. {
  79530. this.deltaHistory[i] = this._target;
  79531. }
  79532. this.resetDelta();
  79533. this.startTime = window.performance.now();
  79534. this.callback = callback;
  79535. this.raf.start(this.step.bind(this), this.forceSetTimeOut);
  79536. },
  79537. /**
  79538. * The main step method. This is called each time the browser updates, either by Request Animation Frame,
  79539. * or by Set Timeout. It is responsible for calculating the delta values, frame totals, cool down history and more.
  79540. * You generally should never call this method directly.
  79541. *
  79542. * @method Phaser.Core.TimeStep#step
  79543. * @since 3.0.0
  79544. *
  79545. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  79546. */
  79547. step: function (time)
  79548. {
  79549. var before = time - this.lastTime;
  79550. if (before < 0)
  79551. {
  79552. // Because, Chrome.
  79553. before = 0;
  79554. }
  79555. this.rawDelta = before;
  79556. var idx = this.deltaIndex;
  79557. var history = this.deltaHistory;
  79558. var max = this.deltaSmoothingMax;
  79559. // delta time (time is in ms)
  79560. var dt = before;
  79561. // When a browser switches tab, then comes back again, it takes around 10 frames before
  79562. // the delta time settles down so we employ a 'cooling down' period before we start
  79563. // trusting the delta values again, to avoid spikes flooding through our delta average
  79564. if (this._coolDown > 0 || !this.inFocus)
  79565. {
  79566. this._coolDown--;
  79567. dt = Math.min(dt, this._target);
  79568. }
  79569. if (dt > this._min)
  79570. {
  79571. // Probably super bad start time or browser tab context loss,
  79572. // so use the last 'sane' dt value
  79573. dt = history[idx];
  79574. // Clamp delta to min (in case history has become corrupted somehow)
  79575. dt = Math.min(dt, this._min);
  79576. }
  79577. // Smooth out the delta over the previous X frames
  79578. // add the delta to the smoothing array
  79579. history[idx] = dt;
  79580. // adjusts the delta history array index based on the smoothing count
  79581. // this stops the array growing beyond the size of deltaSmoothingMax
  79582. this.deltaIndex++;
  79583. if (this.deltaIndex > max)
  79584. {
  79585. this.deltaIndex = 0;
  79586. }
  79587. // Delta Average
  79588. var avg = 0;
  79589. // Loop the history array, adding the delta values together
  79590. for (var i = 0; i < max; i++)
  79591. {
  79592. avg += history[i];
  79593. }
  79594. // Then divide by the array length to get the average delta
  79595. avg /= max;
  79596. // Set as the world delta value
  79597. this.delta = avg;
  79598. // Real-world timer advance
  79599. this.time += this.rawDelta;
  79600. // Update the estimate of the frame rate, `fps`. Every second, the number
  79601. // of frames that occurred in that second are included in an exponential
  79602. // moving average of all frames per second, with an alpha of 0.25. This
  79603. // means that more recent seconds affect the estimated frame rate more than
  79604. // older seconds.
  79605. //
  79606. // When a browser window is NOT minimized, but is covered up (i.e. you're using
  79607. // another app which has spawned a window over the top of the browser), then it
  79608. // will start to throttle the raf callback time. It waits for a while, and then
  79609. // starts to drop the frame rate at 1 frame per second until it's down to just over 1fps.
  79610. // So if the game was running at 60fps, and the player opens a new window, then
  79611. // after 60 seconds (+ the 'buffer time') it'll be down to 1fps, so rafin'g at 1Hz.
  79612. //
  79613. // When they make the game visible again, the frame rate is increased at a rate of
  79614. // approx. 8fps, back up to 60fps (or the max it can obtain)
  79615. //
  79616. // There is no easy way to determine if this drop in frame rate is because the
  79617. // browser is throttling raf, or because the game is struggling with performance
  79618. // because you're asking it to do too much on the device.
  79619. if (time > this.nextFpsUpdate)
  79620. {
  79621. // Compute the new exponential moving average with an alpha of 0.25.
  79622. this.actualFps = 0.25 * this.framesThisSecond + 0.75 * this.actualFps;
  79623. this.nextFpsUpdate = time + 1000;
  79624. this.framesThisSecond = 0;
  79625. }
  79626. this.framesThisSecond++;
  79627. // Interpolation - how far between what is expected and where we are?
  79628. var interpolation = avg / this._target;
  79629. this.callback(time, avg, interpolation);
  79630. // Shift time value over
  79631. this.lastTime = time;
  79632. this.frame++;
  79633. },
  79634. /**
  79635. * Manually calls TimeStep.step, passing in the performance.now value to it.
  79636. *
  79637. * @method Phaser.Core.TimeStep#tick
  79638. * @since 3.0.0
  79639. */
  79640. tick: function ()
  79641. {
  79642. this.step(window.performance.now());
  79643. },
  79644. /**
  79645. * Sends the TimeStep to sleep, stopping Request Animation Frame (or SetTimeout) and toggling the `running` flag to false.
  79646. *
  79647. * @method Phaser.Core.TimeStep#sleep
  79648. * @since 3.0.0
  79649. */
  79650. sleep: function ()
  79651. {
  79652. if (this.running)
  79653. {
  79654. this.raf.stop();
  79655. this.running = false;
  79656. }
  79657. },
  79658. /**
  79659. * Wakes-up the TimeStep, restarting Request Animation Frame (or SetTimeout) and toggling the `running` flag to true.
  79660. * The `seamless` argument controls if the wake-up should adjust the start time or not.
  79661. *
  79662. * @method Phaser.Core.TimeStep#wake
  79663. * @since 3.0.0
  79664. *
  79665. * @param {boolean} [seamless=false] - Adjust the startTime based on the lastTime values.
  79666. */
  79667. wake: function (seamless)
  79668. {
  79669. if (this.running)
  79670. {
  79671. this.sleep();
  79672. }
  79673. else if (seamless)
  79674. {
  79675. this.startTime += -this.lastTime + (this.lastTime + window.performance.now());
  79676. }
  79677. this.raf.start(this.step.bind(this), this.useRAF);
  79678. this.running = true;
  79679. this.step(window.performance.now());
  79680. },
  79681. /**
  79682. * Stops the TimeStep running.
  79683. *
  79684. * @method Phaser.Core.TimeStep#stop
  79685. * @since 3.0.0
  79686. *
  79687. * @return {Phaser.Core.TimeStep} The TimeStep object.
  79688. */
  79689. stop: function ()
  79690. {
  79691. this.running = false;
  79692. this.started = false;
  79693. this.raf.stop();
  79694. return this;
  79695. },
  79696. /**
  79697. * Destroys the TimeStep. This will stop Request Animation Frame, stop the step, clear the callbacks and null
  79698. * any objects.
  79699. *
  79700. * @method Phaser.Core.TimeStep#destroy
  79701. * @since 3.0.0
  79702. */
  79703. destroy: function ()
  79704. {
  79705. this.stop();
  79706. this.callback = NOOP;
  79707. this.raf = null;
  79708. this.game = null;
  79709. }
  79710. });
  79711. module.exports = TimeStep;
  79712. /***/ }),
  79713. /* 365 */
  79714. /***/ (function(module, exports, __webpack_require__) {
  79715. /**
  79716. * @author Richard Davey <rich@photonstorm.com>
  79717. * @copyright 2019 Photon Storm Ltd.
  79718. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  79719. */
  79720. var CONST = __webpack_require__(28);
  79721. /**
  79722. * Called automatically by Phaser.Game and responsible for creating the console.log debug header.
  79723. *
  79724. * You can customize or disable the header via the Game Config object.
  79725. *
  79726. * @function Phaser.Core.DebugHeader
  79727. * @since 3.0.0
  79728. *
  79729. * @param {Phaser.Game} game - The Phaser.Game instance which will output this debug header.
  79730. */
  79731. var DebugHeader = function (game)
  79732. {
  79733. var config = game.config;
  79734. if (config.hideBanner)
  79735. {
  79736. return;
  79737. }
  79738. var renderType = 'WebGL';
  79739. if (config.renderType === CONST.CANVAS)
  79740. {
  79741. renderType = 'Canvas';
  79742. }
  79743. else if (config.renderType === CONST.HEADLESS)
  79744. {
  79745. renderType = 'Headless';
  79746. }
  79747. var audioConfig = config.audio;
  79748. var deviceAudio = game.device.audio;
  79749. var audioType;
  79750. if (deviceAudio.webAudio && !(audioConfig && audioConfig.disableWebAudio))
  79751. {
  79752. audioType = 'Web Audio';
  79753. }
  79754. else if ((audioConfig && audioConfig.noAudio) || (!deviceAudio.webAudio && !deviceAudio.audioData))
  79755. {
  79756. audioType = 'No Audio';
  79757. }
  79758. else
  79759. {
  79760. audioType = 'HTML5 Audio';
  79761. }
  79762. if (!game.device.browser.ie)
  79763. {
  79764. var c = '';
  79765. var args = [ c ];
  79766. if (Array.isArray(config.bannerBackgroundColor))
  79767. {
  79768. var lastColor;
  79769. config.bannerBackgroundColor.forEach(function (color)
  79770. {
  79771. c = c.concat('%c ');
  79772. args.push('background: ' + color);
  79773. lastColor = color;
  79774. });
  79775. // inject the text color
  79776. args[args.length - 1] = 'color: ' + config.bannerTextColor + '; background: ' + lastColor;
  79777. }
  79778. else
  79779. {
  79780. c = c.concat('%c ');
  79781. args.push('color: ' + config.bannerTextColor + '; background: ' + config.bannerBackgroundColor);
  79782. }
  79783. // URL link background color (always white)
  79784. args.push('background: #fff');
  79785. if (config.gameTitle)
  79786. {
  79787. c = c.concat(config.gameTitle);
  79788. if (config.gameVersion)
  79789. {
  79790. c = c.concat(' v' + config.gameVersion);
  79791. }
  79792. if (!config.hidePhaser)
  79793. {
  79794. c = c.concat(' / ');
  79795. }
  79796. }
  79797. var fb = ( false) ? undefined : '';
  79798. if (!config.hidePhaser)
  79799. {
  79800. c = c.concat('Phaser v' + CONST.VERSION + fb + ' (' + renderType + ' | ' + audioType + ')');
  79801. }
  79802. c = c.concat(' %c ' + config.gameURL);
  79803. // Inject the new string back into the args array
  79804. args[0] = c;
  79805. console.log.apply(console, args);
  79806. }
  79807. else if (window['console'])
  79808. {
  79809. console.log('Phaser v' + CONST.VERSION + ' / https://phaser.io');
  79810. }
  79811. };
  79812. module.exports = DebugHeader;
  79813. /***/ }),
  79814. /* 366 */
  79815. /***/ (function(module, exports) {
  79816. /**
  79817. * @author Richard Davey <rich@photonstorm.com>
  79818. * @copyright 2019 Photon Storm Ltd.
  79819. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  79820. */
  79821. /**
  79822. * @namespace Phaser.Display.Canvas.CanvasInterpolation
  79823. * @since 3.0.0
  79824. */
  79825. var CanvasInterpolation = {
  79826. /**
  79827. * Sets the CSS image-rendering property on the given canvas to be 'crisp' (aka 'optimize contrast' on webkit).
  79828. *
  79829. * @function Phaser.Display.Canvas.CanvasInterpolation.setCrisp
  79830. * @since 3.0.0
  79831. *
  79832. * @param {HTMLCanvasElement} canvas - The canvas object to have the style set on.
  79833. *
  79834. * @return {HTMLCanvasElement} The canvas.
  79835. */
  79836. setCrisp: function (canvas)
  79837. {
  79838. var types = [ 'optimizeSpeed', 'crisp-edges', '-moz-crisp-edges', '-webkit-optimize-contrast', 'optimize-contrast', 'pixelated' ];
  79839. types.forEach(function (type)
  79840. {
  79841. canvas.style['image-rendering'] = type;
  79842. });
  79843. canvas.style.msInterpolationMode = 'nearest-neighbor';
  79844. return canvas;
  79845. },
  79846. /**
  79847. * Sets the CSS image-rendering property on the given canvas to be 'bicubic' (aka 'auto').
  79848. *
  79849. * @function Phaser.Display.Canvas.CanvasInterpolation.setBicubic
  79850. * @since 3.0.0
  79851. *
  79852. * @param {HTMLCanvasElement} canvas - The canvas object to have the style set on.
  79853. *
  79854. * @return {HTMLCanvasElement} The canvas.
  79855. */
  79856. setBicubic: function (canvas)
  79857. {
  79858. canvas.style['image-rendering'] = 'auto';
  79859. canvas.style.msInterpolationMode = 'bicubic';
  79860. return canvas;
  79861. }
  79862. };
  79863. module.exports = CanvasInterpolation;
  79864. /***/ }),
  79865. /* 367 */
  79866. /***/ (function(module, exports, __webpack_require__) {
  79867. /**
  79868. * @author Richard Davey <rich@photonstorm.com>
  79869. * @copyright 2019 Photon Storm Ltd.
  79870. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  79871. */
  79872. var CanvasInterpolation = __webpack_require__(366);
  79873. var CanvasPool = __webpack_require__(24);
  79874. var CONST = __webpack_require__(28);
  79875. var Features = __webpack_require__(187);
  79876. /**
  79877. * Called automatically by Phaser.Game and responsible for creating the renderer it will use.
  79878. *
  79879. * Relies upon two webpack global flags to be defined: `WEBGL_RENDERER` and `CANVAS_RENDERER` during build time, but not at run-time.
  79880. *
  79881. * @function Phaser.Core.CreateRenderer
  79882. * @since 3.0.0
  79883. *
  79884. * @param {Phaser.Game} game - The Phaser.Game instance on which the renderer will be set.
  79885. */
  79886. var CreateRenderer = function (game)
  79887. {
  79888. var config = game.config;
  79889. if ((config.customEnvironment || config.canvas) && config.renderType === CONST.AUTO)
  79890. {
  79891. throw new Error('Must set explicit renderType in custom environment');
  79892. }
  79893. // Not a custom environment, didn't provide their own canvas and not headless, so determine the renderer:
  79894. if (!config.customEnvironment && !config.canvas && config.renderType !== CONST.HEADLESS)
  79895. {
  79896. if (config.renderType === CONST.CANVAS || (config.renderType !== CONST.CANVAS && !Features.webGL))
  79897. {
  79898. if (Features.canvas)
  79899. {
  79900. // They requested Canvas and their browser supports it
  79901. config.renderType = CONST.CANVAS;
  79902. }
  79903. else
  79904. {
  79905. throw new Error('Cannot create Canvas or WebGL context, aborting.');
  79906. }
  79907. }
  79908. else
  79909. {
  79910. // Game requested WebGL and browser says it supports it
  79911. config.renderType = CONST.WEBGL;
  79912. }
  79913. }
  79914. // Pixel Art mode?
  79915. if (!config.antialias)
  79916. {
  79917. CanvasPool.disableSmoothing();
  79918. }
  79919. var baseSize = game.scale.baseSize;
  79920. var width = baseSize.width;
  79921. var height = baseSize.height;
  79922. // Does the game config provide its own canvas element to use?
  79923. if (config.canvas)
  79924. {
  79925. game.canvas = config.canvas;
  79926. game.canvas.width = width;
  79927. game.canvas.height = height;
  79928. }
  79929. else
  79930. {
  79931. game.canvas = CanvasPool.create(game, width, height, config.renderType);
  79932. }
  79933. // Does the game config provide some canvas css styles to use?
  79934. if (config.canvasStyle)
  79935. {
  79936. game.canvas.style = config.canvasStyle;
  79937. }
  79938. // Pixel Art mode?
  79939. if (!config.antialias)
  79940. {
  79941. CanvasInterpolation.setCrisp(game.canvas);
  79942. }
  79943. if (config.renderType === CONST.HEADLESS)
  79944. {
  79945. // Nothing more to do here
  79946. return;
  79947. }
  79948. var CanvasRenderer;
  79949. var WebGLRenderer;
  79950. if (true)
  79951. {
  79952. CanvasRenderer = __webpack_require__(459);
  79953. WebGLRenderer = __webpack_require__(456);
  79954. // Let the config pick the renderer type, as both are included
  79955. if (config.renderType === CONST.WEBGL)
  79956. {
  79957. game.renderer = new WebGLRenderer(game);
  79958. }
  79959. else
  79960. {
  79961. game.renderer = new CanvasRenderer(game);
  79962. game.context = game.renderer.gameContext;
  79963. }
  79964. }
  79965. if (false)
  79966. {}
  79967. if (false)
  79968. {}
  79969. };
  79970. module.exports = CreateRenderer;
  79971. /***/ }),
  79972. /* 368 */
  79973. /***/ (function(module, exports, __webpack_require__) {
  79974. /**
  79975. * @author Richard Davey <rich@photonstorm.com>
  79976. * @copyright 2019 Photon Storm Ltd.
  79977. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  79978. */
  79979. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  79980. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  79981. var Class = __webpack_require__(0);
  79982. var Vector3 = __webpack_require__(182);
  79983. var Matrix3 = __webpack_require__(370);
  79984. var EPSILON = 0.000001;
  79985. // Some shared 'private' arrays
  79986. var siNext = new Int8Array([ 1, 2, 0 ]);
  79987. var tmp = new Float32Array([ 0, 0, 0 ]);
  79988. var xUnitVec3 = new Vector3(1, 0, 0);
  79989. var yUnitVec3 = new Vector3(0, 1, 0);
  79990. var tmpvec = new Vector3();
  79991. var tmpMat3 = new Matrix3();
  79992. /**
  79993. * @classdesc
  79994. * A quaternion.
  79995. *
  79996. * @class Quaternion
  79997. * @memberof Phaser.Math
  79998. * @constructor
  79999. * @since 3.0.0
  80000. *
  80001. * @param {number} [x] - The x component.
  80002. * @param {number} [y] - The y component.
  80003. * @param {number} [z] - The z component.
  80004. * @param {number} [w] - The w component.
  80005. */
  80006. var Quaternion = new Class({
  80007. initialize:
  80008. function Quaternion (x, y, z, w)
  80009. {
  80010. /**
  80011. * The x component of this Quaternion.
  80012. *
  80013. * @name Phaser.Math.Quaternion#x
  80014. * @type {number}
  80015. * @default 0
  80016. * @since 3.0.0
  80017. */
  80018. /**
  80019. * The y component of this Quaternion.
  80020. *
  80021. * @name Phaser.Math.Quaternion#y
  80022. * @type {number}
  80023. * @default 0
  80024. * @since 3.0.0
  80025. */
  80026. /**
  80027. * The z component of this Quaternion.
  80028. *
  80029. * @name Phaser.Math.Quaternion#z
  80030. * @type {number}
  80031. * @default 0
  80032. * @since 3.0.0
  80033. */
  80034. /**
  80035. * The w component of this Quaternion.
  80036. *
  80037. * @name Phaser.Math.Quaternion#w
  80038. * @type {number}
  80039. * @default 0
  80040. * @since 3.0.0
  80041. */
  80042. if (typeof x === 'object')
  80043. {
  80044. this.x = x.x || 0;
  80045. this.y = x.y || 0;
  80046. this.z = x.z || 0;
  80047. this.w = x.w || 0;
  80048. }
  80049. else
  80050. {
  80051. this.x = x || 0;
  80052. this.y = y || 0;
  80053. this.z = z || 0;
  80054. this.w = w || 0;
  80055. }
  80056. },
  80057. /**
  80058. * Copy the components of a given Quaternion or Vector into this Quaternion.
  80059. *
  80060. * @method Phaser.Math.Quaternion#copy
  80061. * @since 3.0.0
  80062. *
  80063. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} src - The Quaternion or Vector to copy the components from.
  80064. *
  80065. * @return {Phaser.Math.Quaternion} This Quaternion.
  80066. */
  80067. copy: function (src)
  80068. {
  80069. this.x = src.x;
  80070. this.y = src.y;
  80071. this.z = src.z;
  80072. this.w = src.w;
  80073. return this;
  80074. },
  80075. /**
  80076. * Set the components of this Quaternion.
  80077. *
  80078. * @method Phaser.Math.Quaternion#set
  80079. * @since 3.0.0
  80080. *
  80081. * @param {(number|object)} [x=0] - The x component, or an object containing x, y, z, and w components.
  80082. * @param {number} [y=0] - The y component.
  80083. * @param {number} [z=0] - The z component.
  80084. * @param {number} [w=0] - The w component.
  80085. *
  80086. * @return {Phaser.Math.Quaternion} This Quaternion.
  80087. */
  80088. set: function (x, y, z, w)
  80089. {
  80090. if (typeof x === 'object')
  80091. {
  80092. this.x = x.x || 0;
  80093. this.y = x.y || 0;
  80094. this.z = x.z || 0;
  80095. this.w = x.w || 0;
  80096. }
  80097. else
  80098. {
  80099. this.x = x || 0;
  80100. this.y = y || 0;
  80101. this.z = z || 0;
  80102. this.w = w || 0;
  80103. }
  80104. return this;
  80105. },
  80106. /**
  80107. * Add a given Quaternion or Vector to this Quaternion. Addition is component-wise.
  80108. *
  80109. * @method Phaser.Math.Quaternion#add
  80110. * @since 3.0.0
  80111. *
  80112. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} v - The Quaternion or Vector to add to this Quaternion.
  80113. *
  80114. * @return {Phaser.Math.Quaternion} This Quaternion.
  80115. */
  80116. add: function (v)
  80117. {
  80118. this.x += v.x;
  80119. this.y += v.y;
  80120. this.z += v.z;
  80121. this.w += v.w;
  80122. return this;
  80123. },
  80124. /**
  80125. * Subtract a given Quaternion or Vector from this Quaternion. Subtraction is component-wise.
  80126. *
  80127. * @method Phaser.Math.Quaternion#subtract
  80128. * @since 3.0.0
  80129. *
  80130. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} v - The Quaternion or Vector to subtract from this Quaternion.
  80131. *
  80132. * @return {Phaser.Math.Quaternion} This Quaternion.
  80133. */
  80134. subtract: function (v)
  80135. {
  80136. this.x -= v.x;
  80137. this.y -= v.y;
  80138. this.z -= v.z;
  80139. this.w -= v.w;
  80140. return this;
  80141. },
  80142. /**
  80143. * Scale this Quaternion by the given value.
  80144. *
  80145. * @method Phaser.Math.Quaternion#scale
  80146. * @since 3.0.0
  80147. *
  80148. * @param {number} scale - The value to scale this Quaternion by.
  80149. *
  80150. * @return {Phaser.Math.Quaternion} This Quaternion.
  80151. */
  80152. scale: function (scale)
  80153. {
  80154. this.x *= scale;
  80155. this.y *= scale;
  80156. this.z *= scale;
  80157. this.w *= scale;
  80158. return this;
  80159. },
  80160. /**
  80161. * Calculate the length of this Quaternion.
  80162. *
  80163. * @method Phaser.Math.Quaternion#length
  80164. * @since 3.0.0
  80165. *
  80166. * @return {number} The length of this Quaternion.
  80167. */
  80168. length: function ()
  80169. {
  80170. var x = this.x;
  80171. var y = this.y;
  80172. var z = this.z;
  80173. var w = this.w;
  80174. return Math.sqrt(x * x + y * y + z * z + w * w);
  80175. },
  80176. /**
  80177. * Calculate the length of this Quaternion squared.
  80178. *
  80179. * @method Phaser.Math.Quaternion#lengthSq
  80180. * @since 3.0.0
  80181. *
  80182. * @return {number} The length of this Quaternion, squared.
  80183. */
  80184. lengthSq: function ()
  80185. {
  80186. var x = this.x;
  80187. var y = this.y;
  80188. var z = this.z;
  80189. var w = this.w;
  80190. return x * x + y * y + z * z + w * w;
  80191. },
  80192. /**
  80193. * Normalize this Quaternion.
  80194. *
  80195. * @method Phaser.Math.Quaternion#normalize
  80196. * @since 3.0.0
  80197. *
  80198. * @return {Phaser.Math.Quaternion} This Quaternion.
  80199. */
  80200. normalize: function ()
  80201. {
  80202. var x = this.x;
  80203. var y = this.y;
  80204. var z = this.z;
  80205. var w = this.w;
  80206. var len = x * x + y * y + z * z + w * w;
  80207. if (len > 0)
  80208. {
  80209. len = 1 / Math.sqrt(len);
  80210. this.x = x * len;
  80211. this.y = y * len;
  80212. this.z = z * len;
  80213. this.w = w * len;
  80214. }
  80215. return this;
  80216. },
  80217. /**
  80218. * Calculate the dot product of this Quaternion and the given Quaternion or Vector.
  80219. *
  80220. * @method Phaser.Math.Quaternion#dot
  80221. * @since 3.0.0
  80222. *
  80223. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} v - The Quaternion or Vector to dot product with this Quaternion.
  80224. *
  80225. * @return {number} The dot product of this Quaternion and the given Quaternion or Vector.
  80226. */
  80227. dot: function (v)
  80228. {
  80229. return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
  80230. },
  80231. /**
  80232. * Linearly interpolate this Quaternion towards the given Quaternion or Vector.
  80233. *
  80234. * @method Phaser.Math.Quaternion#lerp
  80235. * @since 3.0.0
  80236. *
  80237. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} v - The Quaternion or Vector to interpolate towards.
  80238. * @param {number} [t=0] - The percentage of interpolation.
  80239. *
  80240. * @return {Phaser.Math.Quaternion} This Quaternion.
  80241. */
  80242. lerp: function (v, t)
  80243. {
  80244. if (t === undefined) { t = 0; }
  80245. var ax = this.x;
  80246. var ay = this.y;
  80247. var az = this.z;
  80248. var aw = this.w;
  80249. this.x = ax + t * (v.x - ax);
  80250. this.y = ay + t * (v.y - ay);
  80251. this.z = az + t * (v.z - az);
  80252. this.w = aw + t * (v.w - aw);
  80253. return this;
  80254. },
  80255. /**
  80256. * [description]
  80257. *
  80258. * @method Phaser.Math.Quaternion#rotationTo
  80259. * @since 3.0.0
  80260. *
  80261. * @param {Phaser.Math.Vector3} a - [description]
  80262. * @param {Phaser.Math.Vector3} b - [description]
  80263. *
  80264. * @return {Phaser.Math.Quaternion} This Quaternion.
  80265. */
  80266. rotationTo: function (a, b)
  80267. {
  80268. var dot = a.x * b.x + a.y * b.y + a.z * b.z;
  80269. if (dot < -0.999999)
  80270. {
  80271. if (tmpvec.copy(xUnitVec3).cross(a).length() < EPSILON)
  80272. {
  80273. tmpvec.copy(yUnitVec3).cross(a);
  80274. }
  80275. tmpvec.normalize();
  80276. return this.setAxisAngle(tmpvec, Math.PI);
  80277. }
  80278. else if (dot > 0.999999)
  80279. {
  80280. this.x = 0;
  80281. this.y = 0;
  80282. this.z = 0;
  80283. this.w = 1;
  80284. return this;
  80285. }
  80286. else
  80287. {
  80288. tmpvec.copy(a).cross(b);
  80289. this.x = tmpvec.x;
  80290. this.y = tmpvec.y;
  80291. this.z = tmpvec.z;
  80292. this.w = 1 + dot;
  80293. return this.normalize();
  80294. }
  80295. },
  80296. /**
  80297. * Set the axes of this Quaternion.
  80298. *
  80299. * @method Phaser.Math.Quaternion#setAxes
  80300. * @since 3.0.0
  80301. *
  80302. * @param {Phaser.Math.Vector3} view - The view axis.
  80303. * @param {Phaser.Math.Vector3} right - The right axis.
  80304. * @param {Phaser.Math.Vector3} up - The upwards axis.
  80305. *
  80306. * @return {Phaser.Math.Quaternion} This Quaternion.
  80307. */
  80308. setAxes: function (view, right, up)
  80309. {
  80310. var m = tmpMat3.val;
  80311. m[0] = right.x;
  80312. m[3] = right.y;
  80313. m[6] = right.z;
  80314. m[1] = up.x;
  80315. m[4] = up.y;
  80316. m[7] = up.z;
  80317. m[2] = -view.x;
  80318. m[5] = -view.y;
  80319. m[8] = -view.z;
  80320. return this.fromMat3(tmpMat3).normalize();
  80321. },
  80322. /**
  80323. * Reset this Matrix to an identity (default) Quaternion.
  80324. *
  80325. * @method Phaser.Math.Quaternion#identity
  80326. * @since 3.0.0
  80327. *
  80328. * @return {Phaser.Math.Quaternion} This Quaternion.
  80329. */
  80330. identity: function ()
  80331. {
  80332. this.x = 0;
  80333. this.y = 0;
  80334. this.z = 0;
  80335. this.w = 1;
  80336. return this;
  80337. },
  80338. /**
  80339. * Set the axis angle of this Quaternion.
  80340. *
  80341. * @method Phaser.Math.Quaternion#setAxisAngle
  80342. * @since 3.0.0
  80343. *
  80344. * @param {Phaser.Math.Vector3} axis - The axis.
  80345. * @param {number} rad - The angle in radians.
  80346. *
  80347. * @return {Phaser.Math.Quaternion} This Quaternion.
  80348. */
  80349. setAxisAngle: function (axis, rad)
  80350. {
  80351. rad = rad * 0.5;
  80352. var s = Math.sin(rad);
  80353. this.x = s * axis.x;
  80354. this.y = s * axis.y;
  80355. this.z = s * axis.z;
  80356. this.w = Math.cos(rad);
  80357. return this;
  80358. },
  80359. /**
  80360. * Multiply this Quaternion by the given Quaternion or Vector.
  80361. *
  80362. * @method Phaser.Math.Quaternion#multiply
  80363. * @since 3.0.0
  80364. *
  80365. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} b - The Quaternion or Vector to multiply this Quaternion by.
  80366. *
  80367. * @return {Phaser.Math.Quaternion} This Quaternion.
  80368. */
  80369. multiply: function (b)
  80370. {
  80371. var ax = this.x;
  80372. var ay = this.y;
  80373. var az = this.z;
  80374. var aw = this.w;
  80375. var bx = b.x;
  80376. var by = b.y;
  80377. var bz = b.z;
  80378. var bw = b.w;
  80379. this.x = ax * bw + aw * bx + ay * bz - az * by;
  80380. this.y = ay * bw + aw * by + az * bx - ax * bz;
  80381. this.z = az * bw + aw * bz + ax * by - ay * bx;
  80382. this.w = aw * bw - ax * bx - ay * by - az * bz;
  80383. return this;
  80384. },
  80385. /**
  80386. * Smoothly linearly interpolate this Quaternion towards the given Quaternion or Vector.
  80387. *
  80388. * @method Phaser.Math.Quaternion#slerp
  80389. * @since 3.0.0
  80390. *
  80391. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} b - The Quaternion or Vector to interpolate towards.
  80392. * @param {number} t - The percentage of interpolation.
  80393. *
  80394. * @return {Phaser.Math.Quaternion} This Quaternion.
  80395. */
  80396. slerp: function (b, t)
  80397. {
  80398. // benchmarks: http://jsperf.com/quaternion-slerp-implementations
  80399. var ax = this.x;
  80400. var ay = this.y;
  80401. var az = this.z;
  80402. var aw = this.w;
  80403. var bx = b.x;
  80404. var by = b.y;
  80405. var bz = b.z;
  80406. var bw = b.w;
  80407. // calc cosine
  80408. var cosom = ax * bx + ay * by + az * bz + aw * bw;
  80409. // adjust signs (if necessary)
  80410. if (cosom < 0)
  80411. {
  80412. cosom = -cosom;
  80413. bx = - bx;
  80414. by = - by;
  80415. bz = - bz;
  80416. bw = - bw;
  80417. }
  80418. // "from" and "to" quaternions are very close
  80419. // ... so we can do a linear interpolation
  80420. var scale0 = 1 - t;
  80421. var scale1 = t;
  80422. // calculate coefficients
  80423. if ((1 - cosom) > EPSILON)
  80424. {
  80425. // standard case (slerp)
  80426. var omega = Math.acos(cosom);
  80427. var sinom = Math.sin(omega);
  80428. scale0 = Math.sin((1.0 - t) * omega) / sinom;
  80429. scale1 = Math.sin(t * omega) / sinom;
  80430. }
  80431. // calculate final values
  80432. this.x = scale0 * ax + scale1 * bx;
  80433. this.y = scale0 * ay + scale1 * by;
  80434. this.z = scale0 * az + scale1 * bz;
  80435. this.w = scale0 * aw + scale1 * bw;
  80436. return this;
  80437. },
  80438. /**
  80439. * Invert this Quaternion.
  80440. *
  80441. * @method Phaser.Math.Quaternion#invert
  80442. * @since 3.0.0
  80443. *
  80444. * @return {Phaser.Math.Quaternion} This Quaternion.
  80445. */
  80446. invert: function ()
  80447. {
  80448. var a0 = this.x;
  80449. var a1 = this.y;
  80450. var a2 = this.z;
  80451. var a3 = this.w;
  80452. var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;
  80453. var invDot = (dot) ? 1 / dot : 0;
  80454. // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0
  80455. this.x = -a0 * invDot;
  80456. this.y = -a1 * invDot;
  80457. this.z = -a2 * invDot;
  80458. this.w = a3 * invDot;
  80459. return this;
  80460. },
  80461. /**
  80462. * Convert this Quaternion into its conjugate.
  80463. *
  80464. * Sets the x, y and z components.
  80465. *
  80466. * @method Phaser.Math.Quaternion#conjugate
  80467. * @since 3.0.0
  80468. *
  80469. * @return {Phaser.Math.Quaternion} This Quaternion.
  80470. */
  80471. conjugate: function ()
  80472. {
  80473. this.x = -this.x;
  80474. this.y = -this.y;
  80475. this.z = -this.z;
  80476. return this;
  80477. },
  80478. /**
  80479. * Rotate this Quaternion on the X axis.
  80480. *
  80481. * @method Phaser.Math.Quaternion#rotateX
  80482. * @since 3.0.0
  80483. *
  80484. * @param {number} rad - The rotation angle in radians.
  80485. *
  80486. * @return {Phaser.Math.Quaternion} This Quaternion.
  80487. */
  80488. rotateX: function (rad)
  80489. {
  80490. rad *= 0.5;
  80491. var ax = this.x;
  80492. var ay = this.y;
  80493. var az = this.z;
  80494. var aw = this.w;
  80495. var bx = Math.sin(rad);
  80496. var bw = Math.cos(rad);
  80497. this.x = ax * bw + aw * bx;
  80498. this.y = ay * bw + az * bx;
  80499. this.z = az * bw - ay * bx;
  80500. this.w = aw * bw - ax * bx;
  80501. return this;
  80502. },
  80503. /**
  80504. * Rotate this Quaternion on the Y axis.
  80505. *
  80506. * @method Phaser.Math.Quaternion#rotateY
  80507. * @since 3.0.0
  80508. *
  80509. * @param {number} rad - The rotation angle in radians.
  80510. *
  80511. * @return {Phaser.Math.Quaternion} This Quaternion.
  80512. */
  80513. rotateY: function (rad)
  80514. {
  80515. rad *= 0.5;
  80516. var ax = this.x;
  80517. var ay = this.y;
  80518. var az = this.z;
  80519. var aw = this.w;
  80520. var by = Math.sin(rad);
  80521. var bw = Math.cos(rad);
  80522. this.x = ax * bw - az * by;
  80523. this.y = ay * bw + aw * by;
  80524. this.z = az * bw + ax * by;
  80525. this.w = aw * bw - ay * by;
  80526. return this;
  80527. },
  80528. /**
  80529. * Rotate this Quaternion on the Z axis.
  80530. *
  80531. * @method Phaser.Math.Quaternion#rotateZ
  80532. * @since 3.0.0
  80533. *
  80534. * @param {number} rad - The rotation angle in radians.
  80535. *
  80536. * @return {Phaser.Math.Quaternion} This Quaternion.
  80537. */
  80538. rotateZ: function (rad)
  80539. {
  80540. rad *= 0.5;
  80541. var ax = this.x;
  80542. var ay = this.y;
  80543. var az = this.z;
  80544. var aw = this.w;
  80545. var bz = Math.sin(rad);
  80546. var bw = Math.cos(rad);
  80547. this.x = ax * bw + ay * bz;
  80548. this.y = ay * bw - ax * bz;
  80549. this.z = az * bw + aw * bz;
  80550. this.w = aw * bw - az * bz;
  80551. return this;
  80552. },
  80553. /**
  80554. * Create a unit (or rotation) Quaternion from its x, y, and z components.
  80555. *
  80556. * Sets the w component.
  80557. *
  80558. * @method Phaser.Math.Quaternion#calculateW
  80559. * @since 3.0.0
  80560. *
  80561. * @return {Phaser.Math.Quaternion} This Quaternion.
  80562. */
  80563. calculateW: function ()
  80564. {
  80565. var x = this.x;
  80566. var y = this.y;
  80567. var z = this.z;
  80568. this.w = -Math.sqrt(1.0 - x * x - y * y - z * z);
  80569. return this;
  80570. },
  80571. /**
  80572. * Convert the given Matrix into this Quaternion.
  80573. *
  80574. * @method Phaser.Math.Quaternion#fromMat3
  80575. * @since 3.0.0
  80576. *
  80577. * @param {Phaser.Math.Matrix3} mat - The Matrix to convert from.
  80578. *
  80579. * @return {Phaser.Math.Quaternion} This Quaternion.
  80580. */
  80581. fromMat3: function (mat)
  80582. {
  80583. // benchmarks:
  80584. // http://jsperf.com/typed-array-access-speed
  80585. // http://jsperf.com/conversion-of-3x3-matrix-to-quaternion
  80586. // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
  80587. // article "Quaternion Calculus and Fast Animation".
  80588. var m = mat.val;
  80589. var fTrace = m[0] + m[4] + m[8];
  80590. var fRoot;
  80591. if (fTrace > 0)
  80592. {
  80593. // |w| > 1/2, may as well choose w > 1/2
  80594. fRoot = Math.sqrt(fTrace + 1.0); // 2w
  80595. this.w = 0.5 * fRoot;
  80596. fRoot = 0.5 / fRoot; // 1/(4w)
  80597. this.x = (m[7] - m[5]) * fRoot;
  80598. this.y = (m[2] - m[6]) * fRoot;
  80599. this.z = (m[3] - m[1]) * fRoot;
  80600. }
  80601. else
  80602. {
  80603. // |w| <= 1/2
  80604. var i = 0;
  80605. if (m[4] > m[0])
  80606. {
  80607. i = 1;
  80608. }
  80609. if (m[8] > m[i * 3 + i])
  80610. {
  80611. i = 2;
  80612. }
  80613. var j = siNext[i];
  80614. var k = siNext[j];
  80615. // This isn't quite as clean without array access
  80616. fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1);
  80617. tmp[i] = 0.5 * fRoot;
  80618. fRoot = 0.5 / fRoot;
  80619. tmp[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
  80620. tmp[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;
  80621. this.x = tmp[0];
  80622. this.y = tmp[1];
  80623. this.z = tmp[2];
  80624. this.w = (m[k * 3 + j] - m[j * 3 + k]) * fRoot;
  80625. }
  80626. return this;
  80627. }
  80628. });
  80629. module.exports = Quaternion;
  80630. /***/ }),
  80631. /* 369 */
  80632. /***/ (function(module, exports, __webpack_require__) {
  80633. /**
  80634. * @author Richard Davey <rich@photonstorm.com>
  80635. * @copyright 2019 Photon Storm Ltd.
  80636. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  80637. */
  80638. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  80639. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  80640. var Class = __webpack_require__(0);
  80641. var EPSILON = 0.000001;
  80642. /**
  80643. * @classdesc
  80644. * A four-dimensional matrix.
  80645. *
  80646. * @class Matrix4
  80647. * @memberof Phaser.Math
  80648. * @constructor
  80649. * @since 3.0.0
  80650. *
  80651. * @param {Phaser.Math.Matrix4} [m] - Optional Matrix4 to copy values from.
  80652. */
  80653. var Matrix4 = new Class({
  80654. initialize:
  80655. function Matrix4 (m)
  80656. {
  80657. /**
  80658. * The matrix values.
  80659. *
  80660. * @name Phaser.Math.Matrix4#val
  80661. * @type {Float32Array}
  80662. * @since 3.0.0
  80663. */
  80664. this.val = new Float32Array(16);
  80665. if (m)
  80666. {
  80667. // Assume Matrix4 with val:
  80668. this.copy(m);
  80669. }
  80670. else
  80671. {
  80672. // Default to identity
  80673. this.identity();
  80674. }
  80675. },
  80676. /**
  80677. * Make a clone of this Matrix4.
  80678. *
  80679. * @method Phaser.Math.Matrix4#clone
  80680. * @since 3.0.0
  80681. *
  80682. * @return {Phaser.Math.Matrix4} A clone of this Matrix4.
  80683. */
  80684. clone: function ()
  80685. {
  80686. return new Matrix4(this);
  80687. },
  80688. // TODO - Should work with basic values
  80689. /**
  80690. * This method is an alias for `Matrix4.copy`.
  80691. *
  80692. * @method Phaser.Math.Matrix4#set
  80693. * @since 3.0.0
  80694. *
  80695. * @param {Phaser.Math.Matrix4} src - The Matrix to set the values of this Matrix's from.
  80696. *
  80697. * @return {Phaser.Math.Matrix4} This Matrix4.
  80698. */
  80699. set: function (src)
  80700. {
  80701. return this.copy(src);
  80702. },
  80703. /**
  80704. * Copy the values of a given Matrix into this Matrix.
  80705. *
  80706. * @method Phaser.Math.Matrix4#copy
  80707. * @since 3.0.0
  80708. *
  80709. * @param {Phaser.Math.Matrix4} src - The Matrix to copy the values from.
  80710. *
  80711. * @return {Phaser.Math.Matrix4} This Matrix4.
  80712. */
  80713. copy: function (src)
  80714. {
  80715. var out = this.val;
  80716. var a = src.val;
  80717. out[0] = a[0];
  80718. out[1] = a[1];
  80719. out[2] = a[2];
  80720. out[3] = a[3];
  80721. out[4] = a[4];
  80722. out[5] = a[5];
  80723. out[6] = a[6];
  80724. out[7] = a[7];
  80725. out[8] = a[8];
  80726. out[9] = a[9];
  80727. out[10] = a[10];
  80728. out[11] = a[11];
  80729. out[12] = a[12];
  80730. out[13] = a[13];
  80731. out[14] = a[14];
  80732. out[15] = a[15];
  80733. return this;
  80734. },
  80735. /**
  80736. * Set the values of this Matrix from the given array.
  80737. *
  80738. * @method Phaser.Math.Matrix4#fromArray
  80739. * @since 3.0.0
  80740. *
  80741. * @param {array} a - The array to copy the values from.
  80742. *
  80743. * @return {Phaser.Math.Matrix4} This Matrix4.
  80744. */
  80745. fromArray: function (a)
  80746. {
  80747. var out = this.val;
  80748. out[0] = a[0];
  80749. out[1] = a[1];
  80750. out[2] = a[2];
  80751. out[3] = a[3];
  80752. out[4] = a[4];
  80753. out[5] = a[5];
  80754. out[6] = a[6];
  80755. out[7] = a[7];
  80756. out[8] = a[8];
  80757. out[9] = a[9];
  80758. out[10] = a[10];
  80759. out[11] = a[11];
  80760. out[12] = a[12];
  80761. out[13] = a[13];
  80762. out[14] = a[14];
  80763. out[15] = a[15];
  80764. return this;
  80765. },
  80766. /**
  80767. * Reset this Matrix.
  80768. *
  80769. * Sets all values to `0`.
  80770. *
  80771. * @method Phaser.Math.Matrix4#zero
  80772. * @since 3.0.0
  80773. *
  80774. * @return {Phaser.Math.Matrix4} This Matrix4.
  80775. */
  80776. zero: function ()
  80777. {
  80778. var out = this.val;
  80779. out[0] = 0;
  80780. out[1] = 0;
  80781. out[2] = 0;
  80782. out[3] = 0;
  80783. out[4] = 0;
  80784. out[5] = 0;
  80785. out[6] = 0;
  80786. out[7] = 0;
  80787. out[8] = 0;
  80788. out[9] = 0;
  80789. out[10] = 0;
  80790. out[11] = 0;
  80791. out[12] = 0;
  80792. out[13] = 0;
  80793. out[14] = 0;
  80794. out[15] = 0;
  80795. return this;
  80796. },
  80797. /**
  80798. * Set the `x`, `y` and `z` values of this Matrix.
  80799. *
  80800. * @method Phaser.Math.Matrix4#xyz
  80801. * @since 3.0.0
  80802. *
  80803. * @param {number} x - The x value.
  80804. * @param {number} y - The y value.
  80805. * @param {number} z - The z value.
  80806. *
  80807. * @return {Phaser.Math.Matrix4} This Matrix4.
  80808. */
  80809. xyz: function (x, y, z)
  80810. {
  80811. this.identity();
  80812. var out = this.val;
  80813. out[12] = x;
  80814. out[13] = y;
  80815. out[14] = z;
  80816. return this;
  80817. },
  80818. /**
  80819. * Set the scaling values of this Matrix.
  80820. *
  80821. * @method Phaser.Math.Matrix4#scaling
  80822. * @since 3.0.0
  80823. *
  80824. * @param {number} x - The x scaling value.
  80825. * @param {number} y - The y scaling value.
  80826. * @param {number} z - The z scaling value.
  80827. *
  80828. * @return {Phaser.Math.Matrix4} This Matrix4.
  80829. */
  80830. scaling: function (x, y, z)
  80831. {
  80832. this.zero();
  80833. var out = this.val;
  80834. out[0] = x;
  80835. out[5] = y;
  80836. out[10] = z;
  80837. out[15] = 1;
  80838. return this;
  80839. },
  80840. /**
  80841. * Reset this Matrix to an identity (default) matrix.
  80842. *
  80843. * @method Phaser.Math.Matrix4#identity
  80844. * @since 3.0.0
  80845. *
  80846. * @return {Phaser.Math.Matrix4} This Matrix4.
  80847. */
  80848. identity: function ()
  80849. {
  80850. var out = this.val;
  80851. out[0] = 1;
  80852. out[1] = 0;
  80853. out[2] = 0;
  80854. out[3] = 0;
  80855. out[4] = 0;
  80856. out[5] = 1;
  80857. out[6] = 0;
  80858. out[7] = 0;
  80859. out[8] = 0;
  80860. out[9] = 0;
  80861. out[10] = 1;
  80862. out[11] = 0;
  80863. out[12] = 0;
  80864. out[13] = 0;
  80865. out[14] = 0;
  80866. out[15] = 1;
  80867. return this;
  80868. },
  80869. /**
  80870. * Transpose this Matrix.
  80871. *
  80872. * @method Phaser.Math.Matrix4#transpose
  80873. * @since 3.0.0
  80874. *
  80875. * @return {Phaser.Math.Matrix4} This Matrix4.
  80876. */
  80877. transpose: function ()
  80878. {
  80879. var a = this.val;
  80880. var a01 = a[1];
  80881. var a02 = a[2];
  80882. var a03 = a[3];
  80883. var a12 = a[6];
  80884. var a13 = a[7];
  80885. var a23 = a[11];
  80886. a[1] = a[4];
  80887. a[2] = a[8];
  80888. a[3] = a[12];
  80889. a[4] = a01;
  80890. a[6] = a[9];
  80891. a[7] = a[13];
  80892. a[8] = a02;
  80893. a[9] = a12;
  80894. a[11] = a[14];
  80895. a[12] = a03;
  80896. a[13] = a13;
  80897. a[14] = a23;
  80898. return this;
  80899. },
  80900. /**
  80901. * Invert this Matrix.
  80902. *
  80903. * @method Phaser.Math.Matrix4#invert
  80904. * @since 3.0.0
  80905. *
  80906. * @return {Phaser.Math.Matrix4} This Matrix4.
  80907. */
  80908. invert: function ()
  80909. {
  80910. var a = this.val;
  80911. var a00 = a[0];
  80912. var a01 = a[1];
  80913. var a02 = a[2];
  80914. var a03 = a[3];
  80915. var a10 = a[4];
  80916. var a11 = a[5];
  80917. var a12 = a[6];
  80918. var a13 = a[7];
  80919. var a20 = a[8];
  80920. var a21 = a[9];
  80921. var a22 = a[10];
  80922. var a23 = a[11];
  80923. var a30 = a[12];
  80924. var a31 = a[13];
  80925. var a32 = a[14];
  80926. var a33 = a[15];
  80927. var b00 = a00 * a11 - a01 * a10;
  80928. var b01 = a00 * a12 - a02 * a10;
  80929. var b02 = a00 * a13 - a03 * a10;
  80930. var b03 = a01 * a12 - a02 * a11;
  80931. var b04 = a01 * a13 - a03 * a11;
  80932. var b05 = a02 * a13 - a03 * a12;
  80933. var b06 = a20 * a31 - a21 * a30;
  80934. var b07 = a20 * a32 - a22 * a30;
  80935. var b08 = a20 * a33 - a23 * a30;
  80936. var b09 = a21 * a32 - a22 * a31;
  80937. var b10 = a21 * a33 - a23 * a31;
  80938. var b11 = a22 * a33 - a23 * a32;
  80939. // Calculate the determinant
  80940. var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
  80941. if (!det)
  80942. {
  80943. return null;
  80944. }
  80945. det = 1 / det;
  80946. a[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
  80947. a[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
  80948. a[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
  80949. a[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
  80950. a[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
  80951. a[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
  80952. a[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
  80953. a[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
  80954. a[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
  80955. a[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
  80956. a[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
  80957. a[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
  80958. a[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
  80959. a[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
  80960. a[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
  80961. a[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
  80962. return this;
  80963. },
  80964. /**
  80965. * Calculate the adjoint, or adjugate, of this Matrix.
  80966. *
  80967. * @method Phaser.Math.Matrix4#adjoint
  80968. * @since 3.0.0
  80969. *
  80970. * @return {Phaser.Math.Matrix4} This Matrix4.
  80971. */
  80972. adjoint: function ()
  80973. {
  80974. var a = this.val;
  80975. var a00 = a[0];
  80976. var a01 = a[1];
  80977. var a02 = a[2];
  80978. var a03 = a[3];
  80979. var a10 = a[4];
  80980. var a11 = a[5];
  80981. var a12 = a[6];
  80982. var a13 = a[7];
  80983. var a20 = a[8];
  80984. var a21 = a[9];
  80985. var a22 = a[10];
  80986. var a23 = a[11];
  80987. var a30 = a[12];
  80988. var a31 = a[13];
  80989. var a32 = a[14];
  80990. var a33 = a[15];
  80991. a[0] = (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22));
  80992. a[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));
  80993. a[2] = (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12));
  80994. a[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));
  80995. a[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));
  80996. a[5] = (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22));
  80997. a[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));
  80998. a[7] = (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12));
  80999. a[8] = (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21));
  81000. a[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));
  81001. a[10] = (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11));
  81002. a[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));
  81003. a[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));
  81004. a[13] = (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21));
  81005. a[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));
  81006. a[15] = (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11));
  81007. return this;
  81008. },
  81009. /**
  81010. * Calculate the determinant of this Matrix.
  81011. *
  81012. * @method Phaser.Math.Matrix4#determinant
  81013. * @since 3.0.0
  81014. *
  81015. * @return {number} The determinant of this Matrix.
  81016. */
  81017. determinant: function ()
  81018. {
  81019. var a = this.val;
  81020. var a00 = a[0];
  81021. var a01 = a[1];
  81022. var a02 = a[2];
  81023. var a03 = a[3];
  81024. var a10 = a[4];
  81025. var a11 = a[5];
  81026. var a12 = a[6];
  81027. var a13 = a[7];
  81028. var a20 = a[8];
  81029. var a21 = a[9];
  81030. var a22 = a[10];
  81031. var a23 = a[11];
  81032. var a30 = a[12];
  81033. var a31 = a[13];
  81034. var a32 = a[14];
  81035. var a33 = a[15];
  81036. var b00 = a00 * a11 - a01 * a10;
  81037. var b01 = a00 * a12 - a02 * a10;
  81038. var b02 = a00 * a13 - a03 * a10;
  81039. var b03 = a01 * a12 - a02 * a11;
  81040. var b04 = a01 * a13 - a03 * a11;
  81041. var b05 = a02 * a13 - a03 * a12;
  81042. var b06 = a20 * a31 - a21 * a30;
  81043. var b07 = a20 * a32 - a22 * a30;
  81044. var b08 = a20 * a33 - a23 * a30;
  81045. var b09 = a21 * a32 - a22 * a31;
  81046. var b10 = a21 * a33 - a23 * a31;
  81047. var b11 = a22 * a33 - a23 * a32;
  81048. // Calculate the determinant
  81049. return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
  81050. },
  81051. /**
  81052. * Multiply this Matrix by the given Matrix.
  81053. *
  81054. * @method Phaser.Math.Matrix4#multiply
  81055. * @since 3.0.0
  81056. *
  81057. * @param {Phaser.Math.Matrix4} src - The Matrix to multiply this Matrix by.
  81058. *
  81059. * @return {Phaser.Math.Matrix4} This Matrix4.
  81060. */
  81061. multiply: function (src)
  81062. {
  81063. var a = this.val;
  81064. var a00 = a[0];
  81065. var a01 = a[1];
  81066. var a02 = a[2];
  81067. var a03 = a[3];
  81068. var a10 = a[4];
  81069. var a11 = a[5];
  81070. var a12 = a[6];
  81071. var a13 = a[7];
  81072. var a20 = a[8];
  81073. var a21 = a[9];
  81074. var a22 = a[10];
  81075. var a23 = a[11];
  81076. var a30 = a[12];
  81077. var a31 = a[13];
  81078. var a32 = a[14];
  81079. var a33 = a[15];
  81080. var b = src.val;
  81081. // Cache only the current line of the second matrix
  81082. var b0 = b[0];
  81083. var b1 = b[1];
  81084. var b2 = b[2];
  81085. var b3 = b[3];
  81086. a[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  81087. a[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  81088. a[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  81089. a[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  81090. b0 = b[4];
  81091. b1 = b[5];
  81092. b2 = b[6];
  81093. b3 = b[7];
  81094. a[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  81095. a[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  81096. a[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  81097. a[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  81098. b0 = b[8];
  81099. b1 = b[9];
  81100. b2 = b[10];
  81101. b3 = b[11];
  81102. a[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  81103. a[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  81104. a[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  81105. a[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  81106. b0 = b[12];
  81107. b1 = b[13];
  81108. b2 = b[14];
  81109. b3 = b[15];
  81110. a[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  81111. a[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  81112. a[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  81113. a[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  81114. return this;
  81115. },
  81116. /**
  81117. * [description]
  81118. *
  81119. * @method Phaser.Math.Matrix4#multiplyLocal
  81120. * @since 3.0.0
  81121. *
  81122. * @param {Phaser.Math.Matrix4} src - [description]
  81123. *
  81124. * @return {Phaser.Math.Matrix4} This Matrix4.
  81125. */
  81126. multiplyLocal: function (src)
  81127. {
  81128. var a = [];
  81129. var m1 = this.val;
  81130. var m2 = src.val;
  81131. a[0] = m1[0] * m2[0] + m1[1] * m2[4] + m1[2] * m2[8] + m1[3] * m2[12];
  81132. a[1] = m1[0] * m2[1] + m1[1] * m2[5] + m1[2] * m2[9] + m1[3] * m2[13];
  81133. a[2] = m1[0] * m2[2] + m1[1] * m2[6] + m1[2] * m2[10] + m1[3] * m2[14];
  81134. a[3] = m1[0] * m2[3] + m1[1] * m2[7] + m1[2] * m2[11] + m1[3] * m2[15];
  81135. a[4] = m1[4] * m2[0] + m1[5] * m2[4] + m1[6] * m2[8] + m1[7] * m2[12];
  81136. a[5] = m1[4] * m2[1] + m1[5] * m2[5] + m1[6] * m2[9] + m1[7] * m2[13];
  81137. a[6] = m1[4] * m2[2] + m1[5] * m2[6] + m1[6] * m2[10] + m1[7] * m2[14];
  81138. a[7] = m1[4] * m2[3] + m1[5] * m2[7] + m1[6] * m2[11] + m1[7] * m2[15];
  81139. a[8] = m1[8] * m2[0] + m1[9] * m2[4] + m1[10] * m2[8] + m1[11] * m2[12];
  81140. a[9] = m1[8] * m2[1] + m1[9] * m2[5] + m1[10] * m2[9] + m1[11] * m2[13];
  81141. a[10] = m1[8] * m2[2] + m1[9] * m2[6] + m1[10] * m2[10] + m1[11] * m2[14];
  81142. a[11] = m1[8] * m2[3] + m1[9] * m2[7] + m1[10] * m2[11] + m1[11] * m2[15];
  81143. a[12] = m1[12] * m2[0] + m1[13] * m2[4] + m1[14] * m2[8] + m1[15] * m2[12];
  81144. a[13] = m1[12] * m2[1] + m1[13] * m2[5] + m1[14] * m2[9] + m1[15] * m2[13];
  81145. a[14] = m1[12] * m2[2] + m1[13] * m2[6] + m1[14] * m2[10] + m1[15] * m2[14];
  81146. a[15] = m1[12] * m2[3] + m1[13] * m2[7] + m1[14] * m2[11] + m1[15] * m2[15];
  81147. return this.fromArray(a);
  81148. },
  81149. /**
  81150. * Translate this Matrix using the given Vector.
  81151. *
  81152. * @method Phaser.Math.Matrix4#translate
  81153. * @since 3.0.0
  81154. *
  81155. * @param {(Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to translate this Matrix with.
  81156. *
  81157. * @return {Phaser.Math.Matrix4} This Matrix4.
  81158. */
  81159. translate: function (v)
  81160. {
  81161. var x = v.x;
  81162. var y = v.y;
  81163. var z = v.z;
  81164. var a = this.val;
  81165. a[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
  81166. a[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
  81167. a[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
  81168. a[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
  81169. return this;
  81170. },
  81171. /**
  81172. * Translate this Matrix using the given values.
  81173. *
  81174. * @method Phaser.Math.Matrix4#translateXYZ
  81175. * @since 3.16.0
  81176. *
  81177. * @param {number} x - The x component.
  81178. * @param {number} y - The y component.
  81179. * @param {number} z - The z component.
  81180. *
  81181. * @return {Phaser.Math.Matrix4} This Matrix4.
  81182. */
  81183. translateXYZ: function (x, y, z)
  81184. {
  81185. var a = this.val;
  81186. a[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
  81187. a[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
  81188. a[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
  81189. a[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
  81190. return this;
  81191. },
  81192. /**
  81193. * Apply a scale transformation to this Matrix.
  81194. *
  81195. * Uses the `x`, `y` and `z` components of the given Vector to scale the Matrix.
  81196. *
  81197. * @method Phaser.Math.Matrix4#scale
  81198. * @since 3.0.0
  81199. *
  81200. * @param {(Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to scale this Matrix with.
  81201. *
  81202. * @return {Phaser.Math.Matrix4} This Matrix4.
  81203. */
  81204. scale: function (v)
  81205. {
  81206. var x = v.x;
  81207. var y = v.y;
  81208. var z = v.z;
  81209. var a = this.val;
  81210. a[0] = a[0] * x;
  81211. a[1] = a[1] * x;
  81212. a[2] = a[2] * x;
  81213. a[3] = a[3] * x;
  81214. a[4] = a[4] * y;
  81215. a[5] = a[5] * y;
  81216. a[6] = a[6] * y;
  81217. a[7] = a[7] * y;
  81218. a[8] = a[8] * z;
  81219. a[9] = a[9] * z;
  81220. a[10] = a[10] * z;
  81221. a[11] = a[11] * z;
  81222. return this;
  81223. },
  81224. /**
  81225. * Apply a scale transformation to this Matrix.
  81226. *
  81227. * @method Phaser.Math.Matrix4#scaleXYZ
  81228. * @since 3.16.0
  81229. *
  81230. * @param {number} x - The x component.
  81231. * @param {number} y - The y component.
  81232. * @param {number} z - The z component.
  81233. *
  81234. * @return {Phaser.Math.Matrix4} This Matrix4.
  81235. */
  81236. scaleXYZ: function (x, y, z)
  81237. {
  81238. var a = this.val;
  81239. a[0] = a[0] * x;
  81240. a[1] = a[1] * x;
  81241. a[2] = a[2] * x;
  81242. a[3] = a[3] * x;
  81243. a[4] = a[4] * y;
  81244. a[5] = a[5] * y;
  81245. a[6] = a[6] * y;
  81246. a[7] = a[7] * y;
  81247. a[8] = a[8] * z;
  81248. a[9] = a[9] * z;
  81249. a[10] = a[10] * z;
  81250. a[11] = a[11] * z;
  81251. return this;
  81252. },
  81253. /**
  81254. * Derive a rotation matrix around the given axis.
  81255. *
  81256. * @method Phaser.Math.Matrix4#makeRotationAxis
  81257. * @since 3.0.0
  81258. *
  81259. * @param {(Phaser.Math.Vector3|Phaser.Math.Vector4)} axis - The rotation axis.
  81260. * @param {number} angle - The rotation angle in radians.
  81261. *
  81262. * @return {Phaser.Math.Matrix4} This Matrix4.
  81263. */
  81264. makeRotationAxis: function (axis, angle)
  81265. {
  81266. // Based on http://www.gamedev.net/reference/articles/article1199.asp
  81267. var c = Math.cos(angle);
  81268. var s = Math.sin(angle);
  81269. var t = 1 - c;
  81270. var x = axis.x;
  81271. var y = axis.y;
  81272. var z = axis.z;
  81273. var tx = t * x;
  81274. var ty = t * y;
  81275. this.fromArray([
  81276. tx * x + c, tx * y - s * z, tx * z + s * y, 0,
  81277. tx * y + s * z, ty * y + c, ty * z - s * x, 0,
  81278. tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
  81279. 0, 0, 0, 1
  81280. ]);
  81281. return this;
  81282. },
  81283. /**
  81284. * Apply a rotation transformation to this Matrix.
  81285. *
  81286. * @method Phaser.Math.Matrix4#rotate
  81287. * @since 3.0.0
  81288. *
  81289. * @param {number} rad - The angle in radians to rotate by.
  81290. * @param {Phaser.Math.Vector3} axis - The axis to rotate upon.
  81291. *
  81292. * @return {Phaser.Math.Matrix4} This Matrix4.
  81293. */
  81294. rotate: function (rad, axis)
  81295. {
  81296. var a = this.val;
  81297. var x = axis.x;
  81298. var y = axis.y;
  81299. var z = axis.z;
  81300. var len = Math.sqrt(x * x + y * y + z * z);
  81301. if (Math.abs(len) < EPSILON)
  81302. {
  81303. return null;
  81304. }
  81305. len = 1 / len;
  81306. x *= len;
  81307. y *= len;
  81308. z *= len;
  81309. var s = Math.sin(rad);
  81310. var c = Math.cos(rad);
  81311. var t = 1 - c;
  81312. var a00 = a[0];
  81313. var a01 = a[1];
  81314. var a02 = a[2];
  81315. var a03 = a[3];
  81316. var a10 = a[4];
  81317. var a11 = a[5];
  81318. var a12 = a[6];
  81319. var a13 = a[7];
  81320. var a20 = a[8];
  81321. var a21 = a[9];
  81322. var a22 = a[10];
  81323. var a23 = a[11];
  81324. // Construct the elements of the rotation matrix
  81325. var b00 = x * x * t + c;
  81326. var b01 = y * x * t + z * s;
  81327. var b02 = z * x * t - y * s;
  81328. var b10 = x * y * t - z * s;
  81329. var b11 = y * y * t + c;
  81330. var b12 = z * y * t + x * s;
  81331. var b20 = x * z * t + y * s;
  81332. var b21 = y * z * t - x * s;
  81333. var b22 = z * z * t + c;
  81334. // Perform rotation-specific matrix multiplication
  81335. a[0] = a00 * b00 + a10 * b01 + a20 * b02;
  81336. a[1] = a01 * b00 + a11 * b01 + a21 * b02;
  81337. a[2] = a02 * b00 + a12 * b01 + a22 * b02;
  81338. a[3] = a03 * b00 + a13 * b01 + a23 * b02;
  81339. a[4] = a00 * b10 + a10 * b11 + a20 * b12;
  81340. a[5] = a01 * b10 + a11 * b11 + a21 * b12;
  81341. a[6] = a02 * b10 + a12 * b11 + a22 * b12;
  81342. a[7] = a03 * b10 + a13 * b11 + a23 * b12;
  81343. a[8] = a00 * b20 + a10 * b21 + a20 * b22;
  81344. a[9] = a01 * b20 + a11 * b21 + a21 * b22;
  81345. a[10] = a02 * b20 + a12 * b21 + a22 * b22;
  81346. a[11] = a03 * b20 + a13 * b21 + a23 * b22;
  81347. return this;
  81348. },
  81349. /**
  81350. * Rotate this matrix on its X axis.
  81351. *
  81352. * @method Phaser.Math.Matrix4#rotateX
  81353. * @since 3.0.0
  81354. *
  81355. * @param {number} rad - The angle in radians to rotate by.
  81356. *
  81357. * @return {Phaser.Math.Matrix4} This Matrix4.
  81358. */
  81359. rotateX: function (rad)
  81360. {
  81361. var a = this.val;
  81362. var s = Math.sin(rad);
  81363. var c = Math.cos(rad);
  81364. var a10 = a[4];
  81365. var a11 = a[5];
  81366. var a12 = a[6];
  81367. var a13 = a[7];
  81368. var a20 = a[8];
  81369. var a21 = a[9];
  81370. var a22 = a[10];
  81371. var a23 = a[11];
  81372. // Perform axis-specific matrix multiplication
  81373. a[4] = a10 * c + a20 * s;
  81374. a[5] = a11 * c + a21 * s;
  81375. a[6] = a12 * c + a22 * s;
  81376. a[7] = a13 * c + a23 * s;
  81377. a[8] = a20 * c - a10 * s;
  81378. a[9] = a21 * c - a11 * s;
  81379. a[10] = a22 * c - a12 * s;
  81380. a[11] = a23 * c - a13 * s;
  81381. return this;
  81382. },
  81383. /**
  81384. * Rotate this matrix on its Y axis.
  81385. *
  81386. * @method Phaser.Math.Matrix4#rotateY
  81387. * @since 3.0.0
  81388. *
  81389. * @param {number} rad - The angle to rotate by, in radians.
  81390. *
  81391. * @return {Phaser.Math.Matrix4} This Matrix4.
  81392. */
  81393. rotateY: function (rad)
  81394. {
  81395. var a = this.val;
  81396. var s = Math.sin(rad);
  81397. var c = Math.cos(rad);
  81398. var a00 = a[0];
  81399. var a01 = a[1];
  81400. var a02 = a[2];
  81401. var a03 = a[3];
  81402. var a20 = a[8];
  81403. var a21 = a[9];
  81404. var a22 = a[10];
  81405. var a23 = a[11];
  81406. // Perform axis-specific matrix multiplication
  81407. a[0] = a00 * c - a20 * s;
  81408. a[1] = a01 * c - a21 * s;
  81409. a[2] = a02 * c - a22 * s;
  81410. a[3] = a03 * c - a23 * s;
  81411. a[8] = a00 * s + a20 * c;
  81412. a[9] = a01 * s + a21 * c;
  81413. a[10] = a02 * s + a22 * c;
  81414. a[11] = a03 * s + a23 * c;
  81415. return this;
  81416. },
  81417. /**
  81418. * Rotate this matrix on its Z axis.
  81419. *
  81420. * @method Phaser.Math.Matrix4#rotateZ
  81421. * @since 3.0.0
  81422. *
  81423. * @param {number} rad - The angle to rotate by, in radians.
  81424. *
  81425. * @return {Phaser.Math.Matrix4} This Matrix4.
  81426. */
  81427. rotateZ: function (rad)
  81428. {
  81429. var a = this.val;
  81430. var s = Math.sin(rad);
  81431. var c = Math.cos(rad);
  81432. var a00 = a[0];
  81433. var a01 = a[1];
  81434. var a02 = a[2];
  81435. var a03 = a[3];
  81436. var a10 = a[4];
  81437. var a11 = a[5];
  81438. var a12 = a[6];
  81439. var a13 = a[7];
  81440. // Perform axis-specific matrix multiplication
  81441. a[0] = a00 * c + a10 * s;
  81442. a[1] = a01 * c + a11 * s;
  81443. a[2] = a02 * c + a12 * s;
  81444. a[3] = a03 * c + a13 * s;
  81445. a[4] = a10 * c - a00 * s;
  81446. a[5] = a11 * c - a01 * s;
  81447. a[6] = a12 * c - a02 * s;
  81448. a[7] = a13 * c - a03 * s;
  81449. return this;
  81450. },
  81451. /**
  81452. * Set the values of this Matrix from the given rotation Quaternion and translation Vector.
  81453. *
  81454. * @method Phaser.Math.Matrix4#fromRotationTranslation
  81455. * @since 3.0.0
  81456. *
  81457. * @param {Phaser.Math.Quaternion} q - The Quaternion to set rotation from.
  81458. * @param {Phaser.Math.Vector3} v - The Vector to set translation from.
  81459. *
  81460. * @return {Phaser.Math.Matrix4} This Matrix4.
  81461. */
  81462. fromRotationTranslation: function (q, v)
  81463. {
  81464. // Quaternion math
  81465. var out = this.val;
  81466. var x = q.x;
  81467. var y = q.y;
  81468. var z = q.z;
  81469. var w = q.w;
  81470. var x2 = x + x;
  81471. var y2 = y + y;
  81472. var z2 = z + z;
  81473. var xx = x * x2;
  81474. var xy = x * y2;
  81475. var xz = x * z2;
  81476. var yy = y * y2;
  81477. var yz = y * z2;
  81478. var zz = z * z2;
  81479. var wx = w * x2;
  81480. var wy = w * y2;
  81481. var wz = w * z2;
  81482. out[0] = 1 - (yy + zz);
  81483. out[1] = xy + wz;
  81484. out[2] = xz - wy;
  81485. out[3] = 0;
  81486. out[4] = xy - wz;
  81487. out[5] = 1 - (xx + zz);
  81488. out[6] = yz + wx;
  81489. out[7] = 0;
  81490. out[8] = xz + wy;
  81491. out[9] = yz - wx;
  81492. out[10] = 1 - (xx + yy);
  81493. out[11] = 0;
  81494. out[12] = v.x;
  81495. out[13] = v.y;
  81496. out[14] = v.z;
  81497. out[15] = 1;
  81498. return this;
  81499. },
  81500. /**
  81501. * Set the values of this Matrix from the given Quaternion.
  81502. *
  81503. * @method Phaser.Math.Matrix4#fromQuat
  81504. * @since 3.0.0
  81505. *
  81506. * @param {Phaser.Math.Quaternion} q - The Quaternion to set the values of this Matrix from.
  81507. *
  81508. * @return {Phaser.Math.Matrix4} This Matrix4.
  81509. */
  81510. fromQuat: function (q)
  81511. {
  81512. var out = this.val;
  81513. var x = q.x;
  81514. var y = q.y;
  81515. var z = q.z;
  81516. var w = q.w;
  81517. var x2 = x + x;
  81518. var y2 = y + y;
  81519. var z2 = z + z;
  81520. var xx = x * x2;
  81521. var xy = x * y2;
  81522. var xz = x * z2;
  81523. var yy = y * y2;
  81524. var yz = y * z2;
  81525. var zz = z * z2;
  81526. var wx = w * x2;
  81527. var wy = w * y2;
  81528. var wz = w * z2;
  81529. out[0] = 1 - (yy + zz);
  81530. out[1] = xy + wz;
  81531. out[2] = xz - wy;
  81532. out[3] = 0;
  81533. out[4] = xy - wz;
  81534. out[5] = 1 - (xx + zz);
  81535. out[6] = yz + wx;
  81536. out[7] = 0;
  81537. out[8] = xz + wy;
  81538. out[9] = yz - wx;
  81539. out[10] = 1 - (xx + yy);
  81540. out[11] = 0;
  81541. out[12] = 0;
  81542. out[13] = 0;
  81543. out[14] = 0;
  81544. out[15] = 1;
  81545. return this;
  81546. },
  81547. /**
  81548. * Generate a frustum matrix with the given bounds.
  81549. *
  81550. * @method Phaser.Math.Matrix4#frustum
  81551. * @since 3.0.0
  81552. *
  81553. * @param {number} left - The left bound of the frustum.
  81554. * @param {number} right - The right bound of the frustum.
  81555. * @param {number} bottom - The bottom bound of the frustum.
  81556. * @param {number} top - The top bound of the frustum.
  81557. * @param {number} near - The near bound of the frustum.
  81558. * @param {number} far - The far bound of the frustum.
  81559. *
  81560. * @return {Phaser.Math.Matrix4} This Matrix4.
  81561. */
  81562. frustum: function (left, right, bottom, top, near, far)
  81563. {
  81564. var out = this.val;
  81565. var rl = 1 / (right - left);
  81566. var tb = 1 / (top - bottom);
  81567. var nf = 1 / (near - far);
  81568. out[0] = (near * 2) * rl;
  81569. out[1] = 0;
  81570. out[2] = 0;
  81571. out[3] = 0;
  81572. out[4] = 0;
  81573. out[5] = (near * 2) * tb;
  81574. out[6] = 0;
  81575. out[7] = 0;
  81576. out[8] = (right + left) * rl;
  81577. out[9] = (top + bottom) * tb;
  81578. out[10] = (far + near) * nf;
  81579. out[11] = -1;
  81580. out[12] = 0;
  81581. out[13] = 0;
  81582. out[14] = (far * near * 2) * nf;
  81583. out[15] = 0;
  81584. return this;
  81585. },
  81586. /**
  81587. * Generate a perspective projection matrix with the given bounds.
  81588. *
  81589. * @method Phaser.Math.Matrix4#perspective
  81590. * @since 3.0.0
  81591. *
  81592. * @param {number} fovy - Vertical field of view in radians
  81593. * @param {number} aspect - Aspect ratio. Typically viewport width /height.
  81594. * @param {number} near - Near bound of the frustum.
  81595. * @param {number} far - Far bound of the frustum.
  81596. *
  81597. * @return {Phaser.Math.Matrix4} This Matrix4.
  81598. */
  81599. perspective: function (fovy, aspect, near, far)
  81600. {
  81601. var out = this.val;
  81602. var f = 1.0 / Math.tan(fovy / 2);
  81603. var nf = 1 / (near - far);
  81604. out[0] = f / aspect;
  81605. out[1] = 0;
  81606. out[2] = 0;
  81607. out[3] = 0;
  81608. out[4] = 0;
  81609. out[5] = f;
  81610. out[6] = 0;
  81611. out[7] = 0;
  81612. out[8] = 0;
  81613. out[9] = 0;
  81614. out[10] = (far + near) * nf;
  81615. out[11] = -1;
  81616. out[12] = 0;
  81617. out[13] = 0;
  81618. out[14] = (2 * far * near) * nf;
  81619. out[15] = 0;
  81620. return this;
  81621. },
  81622. /**
  81623. * Generate a perspective projection matrix with the given bounds.
  81624. *
  81625. * @method Phaser.Math.Matrix4#perspectiveLH
  81626. * @since 3.0.0
  81627. *
  81628. * @param {number} width - The width of the frustum.
  81629. * @param {number} height - The height of the frustum.
  81630. * @param {number} near - Near bound of the frustum.
  81631. * @param {number} far - Far bound of the frustum.
  81632. *
  81633. * @return {Phaser.Math.Matrix4} This Matrix4.
  81634. */
  81635. perspectiveLH: function (width, height, near, far)
  81636. {
  81637. var out = this.val;
  81638. out[0] = (2 * near) / width;
  81639. out[1] = 0;
  81640. out[2] = 0;
  81641. out[3] = 0;
  81642. out[4] = 0;
  81643. out[5] = (2 * near) / height;
  81644. out[6] = 0;
  81645. out[7] = 0;
  81646. out[8] = 0;
  81647. out[9] = 0;
  81648. out[10] = -far / (near - far);
  81649. out[11] = 1;
  81650. out[12] = 0;
  81651. out[13] = 0;
  81652. out[14] = (near * far) / (near - far);
  81653. out[15] = 0;
  81654. return this;
  81655. },
  81656. /**
  81657. * Generate an orthogonal projection matrix with the given bounds.
  81658. *
  81659. * @method Phaser.Math.Matrix4#ortho
  81660. * @since 3.0.0
  81661. *
  81662. * @param {number} left - The left bound of the frustum.
  81663. * @param {number} right - The right bound of the frustum.
  81664. * @param {number} bottom - The bottom bound of the frustum.
  81665. * @param {number} top - The top bound of the frustum.
  81666. * @param {number} near - The near bound of the frustum.
  81667. * @param {number} far - The far bound of the frustum.
  81668. *
  81669. * @return {Phaser.Math.Matrix4} This Matrix4.
  81670. */
  81671. ortho: function (left, right, bottom, top, near, far)
  81672. {
  81673. var out = this.val;
  81674. var lr = left - right;
  81675. var bt = bottom - top;
  81676. var nf = near - far;
  81677. // Avoid division by zero
  81678. lr = (lr === 0) ? lr : 1 / lr;
  81679. bt = (bt === 0) ? bt : 1 / bt;
  81680. nf = (nf === 0) ? nf : 1 / nf;
  81681. out[0] = -2 * lr;
  81682. out[1] = 0;
  81683. out[2] = 0;
  81684. out[3] = 0;
  81685. out[4] = 0;
  81686. out[5] = -2 * bt;
  81687. out[6] = 0;
  81688. out[7] = 0;
  81689. out[8] = 0;
  81690. out[9] = 0;
  81691. out[10] = 2 * nf;
  81692. out[11] = 0;
  81693. out[12] = (left + right) * lr;
  81694. out[13] = (top + bottom) * bt;
  81695. out[14] = (far + near) * nf;
  81696. out[15] = 1;
  81697. return this;
  81698. },
  81699. /**
  81700. * Generate a look-at matrix with the given eye position, focal point, and up axis.
  81701. *
  81702. * @method Phaser.Math.Matrix4#lookAt
  81703. * @since 3.0.0
  81704. *
  81705. * @param {Phaser.Math.Vector3} eye - Position of the viewer
  81706. * @param {Phaser.Math.Vector3} center - Point the viewer is looking at
  81707. * @param {Phaser.Math.Vector3} up - vec3 pointing up.
  81708. *
  81709. * @return {Phaser.Math.Matrix4} This Matrix4.
  81710. */
  81711. lookAt: function (eye, center, up)
  81712. {
  81713. var out = this.val;
  81714. var eyex = eye.x;
  81715. var eyey = eye.y;
  81716. var eyez = eye.z;
  81717. var upx = up.x;
  81718. var upy = up.y;
  81719. var upz = up.z;
  81720. var centerx = center.x;
  81721. var centery = center.y;
  81722. var centerz = center.z;
  81723. if (Math.abs(eyex - centerx) < EPSILON &&
  81724. Math.abs(eyey - centery) < EPSILON &&
  81725. Math.abs(eyez - centerz) < EPSILON)
  81726. {
  81727. return this.identity();
  81728. }
  81729. var z0 = eyex - centerx;
  81730. var z1 = eyey - centery;
  81731. var z2 = eyez - centerz;
  81732. var len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
  81733. z0 *= len;
  81734. z1 *= len;
  81735. z2 *= len;
  81736. var x0 = upy * z2 - upz * z1;
  81737. var x1 = upz * z0 - upx * z2;
  81738. var x2 = upx * z1 - upy * z0;
  81739. len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
  81740. if (!len)
  81741. {
  81742. x0 = 0;
  81743. x1 = 0;
  81744. x2 = 0;
  81745. }
  81746. else
  81747. {
  81748. len = 1 / len;
  81749. x0 *= len;
  81750. x1 *= len;
  81751. x2 *= len;
  81752. }
  81753. var y0 = z1 * x2 - z2 * x1;
  81754. var y1 = z2 * x0 - z0 * x2;
  81755. var y2 = z0 * x1 - z1 * x0;
  81756. len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
  81757. if (!len)
  81758. {
  81759. y0 = 0;
  81760. y1 = 0;
  81761. y2 = 0;
  81762. }
  81763. else
  81764. {
  81765. len = 1 / len;
  81766. y0 *= len;
  81767. y1 *= len;
  81768. y2 *= len;
  81769. }
  81770. out[0] = x0;
  81771. out[1] = y0;
  81772. out[2] = z0;
  81773. out[3] = 0;
  81774. out[4] = x1;
  81775. out[5] = y1;
  81776. out[6] = z1;
  81777. out[7] = 0;
  81778. out[8] = x2;
  81779. out[9] = y2;
  81780. out[10] = z2;
  81781. out[11] = 0;
  81782. out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
  81783. out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
  81784. out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
  81785. out[15] = 1;
  81786. return this;
  81787. },
  81788. /**
  81789. * Set the values of this matrix from the given `yaw`, `pitch` and `roll` values.
  81790. *
  81791. * @method Phaser.Math.Matrix4#yawPitchRoll
  81792. * @since 3.0.0
  81793. *
  81794. * @param {number} yaw - [description]
  81795. * @param {number} pitch - [description]
  81796. * @param {number} roll - [description]
  81797. *
  81798. * @return {Phaser.Math.Matrix4} This Matrix4.
  81799. */
  81800. yawPitchRoll: function (yaw, pitch, roll)
  81801. {
  81802. this.zero();
  81803. _tempMat1.zero();
  81804. _tempMat2.zero();
  81805. var m0 = this.val;
  81806. var m1 = _tempMat1.val;
  81807. var m2 = _tempMat2.val;
  81808. // Rotate Z
  81809. var s = Math.sin(roll);
  81810. var c = Math.cos(roll);
  81811. m0[10] = 1;
  81812. m0[15] = 1;
  81813. m0[0] = c;
  81814. m0[1] = s;
  81815. m0[4] = -s;
  81816. m0[5] = c;
  81817. // Rotate X
  81818. s = Math.sin(pitch);
  81819. c = Math.cos(pitch);
  81820. m1[0] = 1;
  81821. m1[15] = 1;
  81822. m1[5] = c;
  81823. m1[10] = c;
  81824. m1[9] = -s;
  81825. m1[6] = s;
  81826. // Rotate Y
  81827. s = Math.sin(yaw);
  81828. c = Math.cos(yaw);
  81829. m2[5] = 1;
  81830. m2[15] = 1;
  81831. m2[0] = c;
  81832. m2[2] = -s;
  81833. m2[8] = s;
  81834. m2[10] = c;
  81835. this.multiplyLocal(_tempMat1);
  81836. this.multiplyLocal(_tempMat2);
  81837. return this;
  81838. },
  81839. /**
  81840. * Generate a world matrix from the given rotation, position, scale, view matrix and projection matrix.
  81841. *
  81842. * @method Phaser.Math.Matrix4#setWorldMatrix
  81843. * @since 3.0.0
  81844. *
  81845. * @param {Phaser.Math.Vector3} rotation - The rotation of the world matrix.
  81846. * @param {Phaser.Math.Vector3} position - The position of the world matrix.
  81847. * @param {Phaser.Math.Vector3} scale - The scale of the world matrix.
  81848. * @param {Phaser.Math.Matrix4} [viewMatrix] - The view matrix.
  81849. * @param {Phaser.Math.Matrix4} [projectionMatrix] - The projection matrix.
  81850. *
  81851. * @return {Phaser.Math.Matrix4} This Matrix4.
  81852. */
  81853. setWorldMatrix: function (rotation, position, scale, viewMatrix, projectionMatrix)
  81854. {
  81855. this.yawPitchRoll(rotation.y, rotation.x, rotation.z);
  81856. _tempMat1.scaling(scale.x, scale.y, scale.z);
  81857. _tempMat2.xyz(position.x, position.y, position.z);
  81858. this.multiplyLocal(_tempMat1);
  81859. this.multiplyLocal(_tempMat2);
  81860. if (viewMatrix !== undefined)
  81861. {
  81862. this.multiplyLocal(viewMatrix);
  81863. }
  81864. if (projectionMatrix !== undefined)
  81865. {
  81866. this.multiplyLocal(projectionMatrix);
  81867. }
  81868. return this;
  81869. }
  81870. });
  81871. var _tempMat1 = new Matrix4();
  81872. var _tempMat2 = new Matrix4();
  81873. module.exports = Matrix4;
  81874. /***/ }),
  81875. /* 370 */
  81876. /***/ (function(module, exports, __webpack_require__) {
  81877. /**
  81878. * @author Richard Davey <rich@photonstorm.com>
  81879. * @copyright 2019 Photon Storm Ltd.
  81880. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  81881. */
  81882. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  81883. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  81884. var Class = __webpack_require__(0);
  81885. /**
  81886. * @classdesc
  81887. * A three-dimensional matrix.
  81888. *
  81889. * Defaults to the identity matrix when instantiated.
  81890. *
  81891. * @class Matrix3
  81892. * @memberof Phaser.Math
  81893. * @constructor
  81894. * @since 3.0.0
  81895. *
  81896. * @param {Phaser.Math.Matrix3} [m] - Optional Matrix3 to copy values from.
  81897. */
  81898. var Matrix3 = new Class({
  81899. initialize:
  81900. function Matrix3 (m)
  81901. {
  81902. /**
  81903. * The matrix values.
  81904. *
  81905. * @name Phaser.Math.Matrix3#val
  81906. * @type {Float32Array}
  81907. * @since 3.0.0
  81908. */
  81909. this.val = new Float32Array(9);
  81910. if (m)
  81911. {
  81912. // Assume Matrix3 with val:
  81913. this.copy(m);
  81914. }
  81915. else
  81916. {
  81917. // Default to identity
  81918. this.identity();
  81919. }
  81920. },
  81921. /**
  81922. * Make a clone of this Matrix3.
  81923. *
  81924. * @method Phaser.Math.Matrix3#clone
  81925. * @since 3.0.0
  81926. *
  81927. * @return {Phaser.Math.Matrix3} A clone of this Matrix3.
  81928. */
  81929. clone: function ()
  81930. {
  81931. return new Matrix3(this);
  81932. },
  81933. /**
  81934. * This method is an alias for `Matrix3.copy`.
  81935. *
  81936. * @method Phaser.Math.Matrix3#set
  81937. * @since 3.0.0
  81938. *
  81939. * @param {Phaser.Math.Matrix3} src - The Matrix to set the values of this Matrix's from.
  81940. *
  81941. * @return {Phaser.Math.Matrix3} This Matrix3.
  81942. */
  81943. set: function (src)
  81944. {
  81945. return this.copy(src);
  81946. },
  81947. /**
  81948. * Copy the values of a given Matrix into this Matrix.
  81949. *
  81950. * @method Phaser.Math.Matrix3#copy
  81951. * @since 3.0.0
  81952. *
  81953. * @param {Phaser.Math.Matrix3} src - The Matrix to copy the values from.
  81954. *
  81955. * @return {Phaser.Math.Matrix3} This Matrix3.
  81956. */
  81957. copy: function (src)
  81958. {
  81959. var out = this.val;
  81960. var a = src.val;
  81961. out[0] = a[0];
  81962. out[1] = a[1];
  81963. out[2] = a[2];
  81964. out[3] = a[3];
  81965. out[4] = a[4];
  81966. out[5] = a[5];
  81967. out[6] = a[6];
  81968. out[7] = a[7];
  81969. out[8] = a[8];
  81970. return this;
  81971. },
  81972. /**
  81973. * Copy the values of a given Matrix4 into this Matrix3.
  81974. *
  81975. * @method Phaser.Math.Matrix3#fromMat4
  81976. * @since 3.0.0
  81977. *
  81978. * @param {Phaser.Math.Matrix4} m - The Matrix4 to copy the values from.
  81979. *
  81980. * @return {Phaser.Math.Matrix3} This Matrix3.
  81981. */
  81982. fromMat4: function (m)
  81983. {
  81984. var a = m.val;
  81985. var out = this.val;
  81986. out[0] = a[0];
  81987. out[1] = a[1];
  81988. out[2] = a[2];
  81989. out[3] = a[4];
  81990. out[4] = a[5];
  81991. out[5] = a[6];
  81992. out[6] = a[8];
  81993. out[7] = a[9];
  81994. out[8] = a[10];
  81995. return this;
  81996. },
  81997. /**
  81998. * Set the values of this Matrix from the given array.
  81999. *
  82000. * @method Phaser.Math.Matrix3#fromArray
  82001. * @since 3.0.0
  82002. *
  82003. * @param {array} a - The array to copy the values from.
  82004. *
  82005. * @return {Phaser.Math.Matrix3} This Matrix3.
  82006. */
  82007. fromArray: function (a)
  82008. {
  82009. var out = this.val;
  82010. out[0] = a[0];
  82011. out[1] = a[1];
  82012. out[2] = a[2];
  82013. out[3] = a[3];
  82014. out[4] = a[4];
  82015. out[5] = a[5];
  82016. out[6] = a[6];
  82017. out[7] = a[7];
  82018. out[8] = a[8];
  82019. return this;
  82020. },
  82021. /**
  82022. * Reset this Matrix to an identity (default) matrix.
  82023. *
  82024. * @method Phaser.Math.Matrix3#identity
  82025. * @since 3.0.0
  82026. *
  82027. * @return {Phaser.Math.Matrix3} This Matrix3.
  82028. */
  82029. identity: function ()
  82030. {
  82031. var out = this.val;
  82032. out[0] = 1;
  82033. out[1] = 0;
  82034. out[2] = 0;
  82035. out[3] = 0;
  82036. out[4] = 1;
  82037. out[5] = 0;
  82038. out[6] = 0;
  82039. out[7] = 0;
  82040. out[8] = 1;
  82041. return this;
  82042. },
  82043. /**
  82044. * Transpose this Matrix.
  82045. *
  82046. * @method Phaser.Math.Matrix3#transpose
  82047. * @since 3.0.0
  82048. *
  82049. * @return {Phaser.Math.Matrix3} This Matrix3.
  82050. */
  82051. transpose: function ()
  82052. {
  82053. var a = this.val;
  82054. var a01 = a[1];
  82055. var a02 = a[2];
  82056. var a12 = a[5];
  82057. a[1] = a[3];
  82058. a[2] = a[6];
  82059. a[3] = a01;
  82060. a[5] = a[7];
  82061. a[6] = a02;
  82062. a[7] = a12;
  82063. return this;
  82064. },
  82065. /**
  82066. * Invert this Matrix.
  82067. *
  82068. * @method Phaser.Math.Matrix3#invert
  82069. * @since 3.0.0
  82070. *
  82071. * @return {Phaser.Math.Matrix3} This Matrix3.
  82072. */
  82073. invert: function ()
  82074. {
  82075. var a = this.val;
  82076. var a00 = a[0];
  82077. var a01 = a[1];
  82078. var a02 = a[2];
  82079. var a10 = a[3];
  82080. var a11 = a[4];
  82081. var a12 = a[5];
  82082. var a20 = a[6];
  82083. var a21 = a[7];
  82084. var a22 = a[8];
  82085. var b01 = a22 * a11 - a12 * a21;
  82086. var b11 = -a22 * a10 + a12 * a20;
  82087. var b21 = a21 * a10 - a11 * a20;
  82088. // Calculate the determinant
  82089. var det = a00 * b01 + a01 * b11 + a02 * b21;
  82090. if (!det)
  82091. {
  82092. return null;
  82093. }
  82094. det = 1 / det;
  82095. a[0] = b01 * det;
  82096. a[1] = (-a22 * a01 + a02 * a21) * det;
  82097. a[2] = (a12 * a01 - a02 * a11) * det;
  82098. a[3] = b11 * det;
  82099. a[4] = (a22 * a00 - a02 * a20) * det;
  82100. a[5] = (-a12 * a00 + a02 * a10) * det;
  82101. a[6] = b21 * det;
  82102. a[7] = (-a21 * a00 + a01 * a20) * det;
  82103. a[8] = (a11 * a00 - a01 * a10) * det;
  82104. return this;
  82105. },
  82106. /**
  82107. * Calculate the adjoint, or adjugate, of this Matrix.
  82108. *
  82109. * @method Phaser.Math.Matrix3#adjoint
  82110. * @since 3.0.0
  82111. *
  82112. * @return {Phaser.Math.Matrix3} This Matrix3.
  82113. */
  82114. adjoint: function ()
  82115. {
  82116. var a = this.val;
  82117. var a00 = a[0];
  82118. var a01 = a[1];
  82119. var a02 = a[2];
  82120. var a10 = a[3];
  82121. var a11 = a[4];
  82122. var a12 = a[5];
  82123. var a20 = a[6];
  82124. var a21 = a[7];
  82125. var a22 = a[8];
  82126. a[0] = (a11 * a22 - a12 * a21);
  82127. a[1] = (a02 * a21 - a01 * a22);
  82128. a[2] = (a01 * a12 - a02 * a11);
  82129. a[3] = (a12 * a20 - a10 * a22);
  82130. a[4] = (a00 * a22 - a02 * a20);
  82131. a[5] = (a02 * a10 - a00 * a12);
  82132. a[6] = (a10 * a21 - a11 * a20);
  82133. a[7] = (a01 * a20 - a00 * a21);
  82134. a[8] = (a00 * a11 - a01 * a10);
  82135. return this;
  82136. },
  82137. /**
  82138. * Calculate the determinant of this Matrix.
  82139. *
  82140. * @method Phaser.Math.Matrix3#determinant
  82141. * @since 3.0.0
  82142. *
  82143. * @return {number} The determinant of this Matrix.
  82144. */
  82145. determinant: function ()
  82146. {
  82147. var a = this.val;
  82148. var a00 = a[0];
  82149. var a01 = a[1];
  82150. var a02 = a[2];
  82151. var a10 = a[3];
  82152. var a11 = a[4];
  82153. var a12 = a[5];
  82154. var a20 = a[6];
  82155. var a21 = a[7];
  82156. var a22 = a[8];
  82157. return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);
  82158. },
  82159. /**
  82160. * Multiply this Matrix by the given Matrix.
  82161. *
  82162. * @method Phaser.Math.Matrix3#multiply
  82163. * @since 3.0.0
  82164. *
  82165. * @param {Phaser.Math.Matrix3} src - The Matrix to multiply this Matrix by.
  82166. *
  82167. * @return {Phaser.Math.Matrix3} This Matrix3.
  82168. */
  82169. multiply: function (src)
  82170. {
  82171. var a = this.val;
  82172. var a00 = a[0];
  82173. var a01 = a[1];
  82174. var a02 = a[2];
  82175. var a10 = a[3];
  82176. var a11 = a[4];
  82177. var a12 = a[5];
  82178. var a20 = a[6];
  82179. var a21 = a[7];
  82180. var a22 = a[8];
  82181. var b = src.val;
  82182. var b00 = b[0];
  82183. var b01 = b[1];
  82184. var b02 = b[2];
  82185. var b10 = b[3];
  82186. var b11 = b[4];
  82187. var b12 = b[5];
  82188. var b20 = b[6];
  82189. var b21 = b[7];
  82190. var b22 = b[8];
  82191. a[0] = b00 * a00 + b01 * a10 + b02 * a20;
  82192. a[1] = b00 * a01 + b01 * a11 + b02 * a21;
  82193. a[2] = b00 * a02 + b01 * a12 + b02 * a22;
  82194. a[3] = b10 * a00 + b11 * a10 + b12 * a20;
  82195. a[4] = b10 * a01 + b11 * a11 + b12 * a21;
  82196. a[5] = b10 * a02 + b11 * a12 + b12 * a22;
  82197. a[6] = b20 * a00 + b21 * a10 + b22 * a20;
  82198. a[7] = b20 * a01 + b21 * a11 + b22 * a21;
  82199. a[8] = b20 * a02 + b21 * a12 + b22 * a22;
  82200. return this;
  82201. },
  82202. /**
  82203. * Translate this Matrix using the given Vector.
  82204. *
  82205. * @method Phaser.Math.Matrix3#translate
  82206. * @since 3.0.0
  82207. *
  82208. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to translate this Matrix with.
  82209. *
  82210. * @return {Phaser.Math.Matrix3} This Matrix3.
  82211. */
  82212. translate: function (v)
  82213. {
  82214. var a = this.val;
  82215. var x = v.x;
  82216. var y = v.y;
  82217. a[6] = x * a[0] + y * a[3] + a[6];
  82218. a[7] = x * a[1] + y * a[4] + a[7];
  82219. a[8] = x * a[2] + y * a[5] + a[8];
  82220. return this;
  82221. },
  82222. /**
  82223. * Apply a rotation transformation to this Matrix.
  82224. *
  82225. * @method Phaser.Math.Matrix3#rotate
  82226. * @since 3.0.0
  82227. *
  82228. * @param {number} rad - The angle in radians to rotate by.
  82229. *
  82230. * @return {Phaser.Math.Matrix3} This Matrix3.
  82231. */
  82232. rotate: function (rad)
  82233. {
  82234. var a = this.val;
  82235. var a00 = a[0];
  82236. var a01 = a[1];
  82237. var a02 = a[2];
  82238. var a10 = a[3];
  82239. var a11 = a[4];
  82240. var a12 = a[5];
  82241. var s = Math.sin(rad);
  82242. var c = Math.cos(rad);
  82243. a[0] = c * a00 + s * a10;
  82244. a[1] = c * a01 + s * a11;
  82245. a[2] = c * a02 + s * a12;
  82246. a[3] = c * a10 - s * a00;
  82247. a[4] = c * a11 - s * a01;
  82248. a[5] = c * a12 - s * a02;
  82249. return this;
  82250. },
  82251. /**
  82252. * Apply a scale transformation to this Matrix.
  82253. *
  82254. * Uses the `x` and `y` components of the given Vector to scale the Matrix.
  82255. *
  82256. * @method Phaser.Math.Matrix3#scale
  82257. * @since 3.0.0
  82258. *
  82259. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to scale this Matrix with.
  82260. *
  82261. * @return {Phaser.Math.Matrix3} This Matrix3.
  82262. */
  82263. scale: function (v)
  82264. {
  82265. var a = this.val;
  82266. var x = v.x;
  82267. var y = v.y;
  82268. a[0] = x * a[0];
  82269. a[1] = x * a[1];
  82270. a[2] = x * a[2];
  82271. a[3] = y * a[3];
  82272. a[4] = y * a[4];
  82273. a[5] = y * a[5];
  82274. return this;
  82275. },
  82276. /**
  82277. * Set the values of this Matrix from the given Quaternion.
  82278. *
  82279. * @method Phaser.Math.Matrix3#fromQuat
  82280. * @since 3.0.0
  82281. *
  82282. * @param {Phaser.Math.Quaternion} q - The Quaternion to set the values of this Matrix from.
  82283. *
  82284. * @return {Phaser.Math.Matrix3} This Matrix3.
  82285. */
  82286. fromQuat: function (q)
  82287. {
  82288. var x = q.x;
  82289. var y = q.y;
  82290. var z = q.z;
  82291. var w = q.w;
  82292. var x2 = x + x;
  82293. var y2 = y + y;
  82294. var z2 = z + z;
  82295. var xx = x * x2;
  82296. var xy = x * y2;
  82297. var xz = x * z2;
  82298. var yy = y * y2;
  82299. var yz = y * z2;
  82300. var zz = z * z2;
  82301. var wx = w * x2;
  82302. var wy = w * y2;
  82303. var wz = w * z2;
  82304. var out = this.val;
  82305. out[0] = 1 - (yy + zz);
  82306. out[3] = xy + wz;
  82307. out[6] = xz - wy;
  82308. out[1] = xy - wz;
  82309. out[4] = 1 - (xx + zz);
  82310. out[7] = yz + wx;
  82311. out[2] = xz + wy;
  82312. out[5] = yz - wx;
  82313. out[8] = 1 - (xx + yy);
  82314. return this;
  82315. },
  82316. /**
  82317. * [description]
  82318. *
  82319. * @method Phaser.Math.Matrix3#normalFromMat4
  82320. * @since 3.0.0
  82321. *
  82322. * @param {Phaser.Math.Matrix4} m - [description]
  82323. *
  82324. * @return {Phaser.Math.Matrix3} This Matrix3.
  82325. */
  82326. normalFromMat4: function (m)
  82327. {
  82328. var a = m.val;
  82329. var out = this.val;
  82330. var a00 = a[0];
  82331. var a01 = a[1];
  82332. var a02 = a[2];
  82333. var a03 = a[3];
  82334. var a10 = a[4];
  82335. var a11 = a[5];
  82336. var a12 = a[6];
  82337. var a13 = a[7];
  82338. var a20 = a[8];
  82339. var a21 = a[9];
  82340. var a22 = a[10];
  82341. var a23 = a[11];
  82342. var a30 = a[12];
  82343. var a31 = a[13];
  82344. var a32 = a[14];
  82345. var a33 = a[15];
  82346. var b00 = a00 * a11 - a01 * a10;
  82347. var b01 = a00 * a12 - a02 * a10;
  82348. var b02 = a00 * a13 - a03 * a10;
  82349. var b03 = a01 * a12 - a02 * a11;
  82350. var b04 = a01 * a13 - a03 * a11;
  82351. var b05 = a02 * a13 - a03 * a12;
  82352. var b06 = a20 * a31 - a21 * a30;
  82353. var b07 = a20 * a32 - a22 * a30;
  82354. var b08 = a20 * a33 - a23 * a30;
  82355. var b09 = a21 * a32 - a22 * a31;
  82356. var b10 = a21 * a33 - a23 * a31;
  82357. var b11 = a22 * a33 - a23 * a32;
  82358. // Calculate the determinant
  82359. var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
  82360. if (!det)
  82361. {
  82362. return null;
  82363. }
  82364. det = 1 / det;
  82365. out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
  82366. out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
  82367. out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
  82368. out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
  82369. out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
  82370. out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
  82371. out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
  82372. out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
  82373. out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
  82374. return this;
  82375. }
  82376. });
  82377. module.exports = Matrix3;
  82378. /***/ }),
  82379. /* 371 */
  82380. /***/ (function(module, exports, __webpack_require__) {
  82381. /**
  82382. * @author Richard Davey <rich@photonstorm.com>
  82383. * @copyright 2019 Photon Storm Ltd.
  82384. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82385. */
  82386. var Vector2 = __webpack_require__(3);
  82387. /**
  82388. * Takes the `x` and `y` coordinates and transforms them into the same space as
  82389. * defined by the position, rotation and scale values.
  82390. *
  82391. * @function Phaser.Math.TransformXY
  82392. * @since 3.0.0
  82393. *
  82394. * @param {number} x - The x coordinate to be transformed.
  82395. * @param {number} y - The y coordinate to be transformed.
  82396. * @param {number} positionX - Horizontal position of the transform point.
  82397. * @param {number} positionY - Vertical position of the transform point.
  82398. * @param {number} rotation - Rotation of the transform point, in radians.
  82399. * @param {number} scaleX - Horizontal scale of the transform point.
  82400. * @param {number} scaleY - Vertical scale of the transform point.
  82401. * @param {(Phaser.Math.Vector2|Phaser.Geom.Point|object)} [output] - The output vector, point or object for the translated coordinates.
  82402. *
  82403. * @return {(Phaser.Math.Vector2|Phaser.Geom.Point|object)} The translated point.
  82404. */
  82405. var TransformXY = function (x, y, positionX, positionY, rotation, scaleX, scaleY, output)
  82406. {
  82407. if (output === undefined) { output = new Vector2(); }
  82408. var radianSin = Math.sin(rotation);
  82409. var radianCos = Math.cos(rotation);
  82410. // Rotate and Scale
  82411. var a = radianCos * scaleX;
  82412. var b = radianSin * scaleX;
  82413. var c = -radianSin * scaleY;
  82414. var d = radianCos * scaleY;
  82415. // Invert
  82416. var id = 1 / ((a * d) + (c * -b));
  82417. output.x = (d * id * x) + (-c * id * y) + (((positionY * c) - (positionX * d)) * id);
  82418. output.y = (a * id * y) + (-b * id * x) + (((-positionY * a) + (positionX * b)) * id);
  82419. return output;
  82420. };
  82421. module.exports = TransformXY;
  82422. /***/ }),
  82423. /* 372 */
  82424. /***/ (function(module, exports) {
  82425. /**
  82426. * @author Richard Davey <rich@photonstorm.com>
  82427. * @copyright 2019 Photon Storm Ltd.
  82428. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82429. */
  82430. /**
  82431. * Round a given number so it is further away from zero. That is, positive numbers are rounded up, and negative numbers are rounded down.
  82432. *
  82433. * @function Phaser.Math.RoundAwayFromZero
  82434. * @since 3.0.0
  82435. *
  82436. * @param {number} value - The number to round.
  82437. *
  82438. * @return {number} The rounded number, rounded away from zero.
  82439. */
  82440. var RoundAwayFromZero = function (value)
  82441. {
  82442. // "Opposite" of truncate.
  82443. return (value > 0) ? Math.ceil(value) : Math.floor(value);
  82444. };
  82445. module.exports = RoundAwayFromZero;
  82446. /***/ }),
  82447. /* 373 */
  82448. /***/ (function(module, exports) {
  82449. /**
  82450. * @author Richard Davey <rich@photonstorm.com>
  82451. * @copyright 2019 Photon Storm Ltd.
  82452. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82453. */
  82454. /**
  82455. * Rotate a given point by a given angle around the origin (0, 0), in an anti-clockwise direction.
  82456. *
  82457. * @function Phaser.Math.Rotate
  82458. * @since 3.0.0
  82459. *
  82460. * @param {(Phaser.Geom.Point|object)} point - The point to be rotated.
  82461. * @param {number} angle - The angle to be rotated by in an anticlockwise direction.
  82462. *
  82463. * @return {Phaser.Geom.Point} The given point, rotated by the given angle in an anticlockwise direction.
  82464. */
  82465. var Rotate = function (point, angle)
  82466. {
  82467. var x = point.x;
  82468. var y = point.y;
  82469. point.x = (x * Math.cos(angle)) - (y * Math.sin(angle));
  82470. point.y = (x * Math.sin(angle)) + (y * Math.cos(angle));
  82471. return point;
  82472. };
  82473. module.exports = Rotate;
  82474. /***/ }),
  82475. /* 374 */
  82476. /***/ (function(module, exports) {
  82477. /**
  82478. * @author Richard Davey <rich@photonstorm.com>
  82479. * @copyright 2019 Photon Storm Ltd.
  82480. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82481. */
  82482. /**
  82483. * Generate a random floating point number between the two given bounds, minimum inclusive, maximum exclusive.
  82484. *
  82485. * @function Phaser.Math.FloatBetween
  82486. * @since 3.0.0
  82487. *
  82488. * @param {number} min - The lower bound for the float, inclusive.
  82489. * @param {number} max - The upper bound for the float exclusive.
  82490. *
  82491. * @return {number} A random float within the given range.
  82492. */
  82493. var FloatBetween = function (min, max)
  82494. {
  82495. return Math.random() * (max - min) + min;
  82496. };
  82497. module.exports = FloatBetween;
  82498. /***/ }),
  82499. /* 375 */
  82500. /***/ (function(module, exports) {
  82501. /**
  82502. * @author Richard Davey <rich@photonstorm.com>
  82503. * @copyright 2019 Photon Storm Ltd.
  82504. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82505. */
  82506. /**
  82507. * Snap a value to nearest grid slice, using ceil.
  82508. *
  82509. * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `15`.
  82510. * As will `14` snap to `15`... but `16` will snap to `20`.
  82511. *
  82512. * @function Phaser.Math.Snap.Ceil
  82513. * @since 3.0.0
  82514. *
  82515. * @param {number} value - The value to snap.
  82516. * @param {number} gap - The interval gap of the grid.
  82517. * @param {number} [start=0] - Optional starting offset for gap.
  82518. * @param {boolean} [divide=false] - If `true` it will divide the snapped value by the gap before returning.
  82519. *
  82520. * @return {number} The snapped value.
  82521. */
  82522. var SnapCeil = function (value, gap, start, divide)
  82523. {
  82524. if (start === undefined) { start = 0; }
  82525. if (gap === 0)
  82526. {
  82527. return value;
  82528. }
  82529. value -= start;
  82530. value = gap * Math.ceil(value / gap);
  82531. return (divide) ? (start + value) / gap : start + value;
  82532. };
  82533. module.exports = SnapCeil;
  82534. /***/ }),
  82535. /* 376 */
  82536. /***/ (function(module, exports) {
  82537. /**
  82538. * @author Richard Davey <rich@photonstorm.com>
  82539. * @copyright 2019 Photon Storm Ltd.
  82540. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82541. */
  82542. /**
  82543. * Returns the nearest power of 2 to the given `value`.
  82544. *
  82545. * @function Phaser.Math.Pow2.GetPowerOfTwo
  82546. * @since 3.0.0
  82547. *
  82548. * @param {number} value - The value.
  82549. *
  82550. * @return {integer} The nearest power of 2 to `value`.
  82551. */
  82552. var GetPowerOfTwo = function (value)
  82553. {
  82554. var index = Math.log(value) / 0.6931471805599453;
  82555. return (1 << Math.ceil(index));
  82556. };
  82557. module.exports = GetPowerOfTwo;
  82558. /***/ }),
  82559. /* 377 */
  82560. /***/ (function(module, exports, __webpack_require__) {
  82561. /**
  82562. * @author Richard Davey <rich@photonstorm.com>
  82563. * @copyright 2019 Photon Storm Ltd.
  82564. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82565. */
  82566. var SmoothStep = __webpack_require__(195);
  82567. /**
  82568. * A Smooth Step interpolation method.
  82569. *
  82570. * @function Phaser.Math.Interpolation.SmoothStep
  82571. * @since 3.9.0
  82572. * @see {@link https://en.wikipedia.org/wiki/Smoothstep}
  82573. *
  82574. * @param {number} t - The percentage of interpolation, between 0 and 1.
  82575. * @param {number} min - The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'.
  82576. * @param {number} max - The maximum value, also known as the 'right edge', assumed greater than the 'left edge'.
  82577. *
  82578. * @return {number} The interpolated value.
  82579. */
  82580. var SmoothStepInterpolation = function (t, min, max)
  82581. {
  82582. return min + (max - min) * SmoothStep(t, 0, 1);
  82583. };
  82584. module.exports = SmoothStepInterpolation;
  82585. /***/ }),
  82586. /* 378 */
  82587. /***/ (function(module, exports) {
  82588. /**
  82589. * @author Richard Davey <rich@photonstorm.com>
  82590. * @copyright 2019 Photon Storm Ltd.
  82591. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82592. */
  82593. function P0 (t, p)
  82594. {
  82595. var k = 1 - t;
  82596. return k * k * p;
  82597. }
  82598. function P1 (t, p)
  82599. {
  82600. return 2 * (1 - t) * t * p;
  82601. }
  82602. function P2 (t, p)
  82603. {
  82604. return t * t * p;
  82605. }
  82606. // p0 = start point
  82607. // p1 = control point 1
  82608. // p2 = end point
  82609. // https://github.com/mrdoob/three.js/blob/master/src/extras/core/Interpolations.js
  82610. /**
  82611. * A quadratic bezier interpolation method.
  82612. *
  82613. * @function Phaser.Math.Interpolation.QuadraticBezier
  82614. * @since 3.2.0
  82615. *
  82616. * @param {number} t - The percentage of interpolation, between 0 and 1.
  82617. * @param {number} p0 - The start point.
  82618. * @param {number} p1 - The control point.
  82619. * @param {number} p2 - The end point.
  82620. *
  82621. * @return {number} The interpolated value.
  82622. */
  82623. var QuadraticBezierInterpolation = function (t, p0, p1, p2)
  82624. {
  82625. return P0(t, p0) + P1(t, p1) + P2(t, p2);
  82626. };
  82627. module.exports = QuadraticBezierInterpolation;
  82628. /***/ }),
  82629. /* 379 */
  82630. /***/ (function(module, exports) {
  82631. /**
  82632. * @author Richard Davey <rich@photonstorm.com>
  82633. * @copyright 2019 Photon Storm Ltd.
  82634. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82635. */
  82636. function P0 (t, p)
  82637. {
  82638. var k = 1 - t;
  82639. return k * k * k * p;
  82640. }
  82641. function P1 (t, p)
  82642. {
  82643. var k = 1 - t;
  82644. return 3 * k * k * t * p;
  82645. }
  82646. function P2 (t, p)
  82647. {
  82648. return 3 * (1 - t) * t * t * p;
  82649. }
  82650. function P3 (t, p)
  82651. {
  82652. return t * t * t * p;
  82653. }
  82654. // p0 = start point
  82655. // p1 = control point 1
  82656. // p2 = control point 2
  82657. // p3 = end point
  82658. // https://medium.com/@adrian_cooney/bezier-interpolation-13b68563313a
  82659. /**
  82660. * A cubic bezier interpolation method.
  82661. *
  82662. * @function Phaser.Math.Interpolation.CubicBezier
  82663. * @since 3.0.0
  82664. *
  82665. * @param {number} t - The percentage of interpolation, between 0 and 1.
  82666. * @param {number} p0 - The start point.
  82667. * @param {number} p1 - The first control point.
  82668. * @param {number} p2 - The second control point.
  82669. * @param {number} p3 - The end point.
  82670. *
  82671. * @return {number} The interpolated value.
  82672. */
  82673. var CubicBezierInterpolation = function (t, p0, p1, p2, p3)
  82674. {
  82675. return P0(t, p0) + P1(t, p1) + P2(t, p2) + P3(t, p3);
  82676. };
  82677. module.exports = CubicBezierInterpolation;
  82678. /***/ }),
  82679. /* 380 */
  82680. /***/ (function(module, exports) {
  82681. /**
  82682. * @author Richard Davey <rich@photonstorm.com>
  82683. * @copyright 2019 Photon Storm Ltd.
  82684. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82685. */
  82686. /**
  82687. * Calculates the factorial of a given number for integer values greater than 0.
  82688. *
  82689. * @function Phaser.Math.Factorial
  82690. * @since 3.0.0
  82691. *
  82692. * @param {number} value - A positive integer to calculate the factorial of.
  82693. *
  82694. * @return {number} The factorial of the given number.
  82695. */
  82696. var Factorial = function (value)
  82697. {
  82698. if (value === 0)
  82699. {
  82700. return 1;
  82701. }
  82702. var res = value;
  82703. while (--value)
  82704. {
  82705. res *= value;
  82706. }
  82707. return res;
  82708. };
  82709. module.exports = Factorial;
  82710. /***/ }),
  82711. /* 381 */
  82712. /***/ (function(module, exports, __webpack_require__) {
  82713. /**
  82714. * @author Richard Davey <rich@photonstorm.com>
  82715. * @copyright 2019 Photon Storm Ltd.
  82716. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82717. */
  82718. var Factorial = __webpack_require__(380);
  82719. /**
  82720. * [description]
  82721. *
  82722. * @function Phaser.Math.Bernstein
  82723. * @since 3.0.0
  82724. *
  82725. * @param {number} n - [description]
  82726. * @param {number} i - [description]
  82727. *
  82728. * @return {number} [description]
  82729. */
  82730. var Bernstein = function (n, i)
  82731. {
  82732. return Factorial(n) / Factorial(i) / Factorial(n - i);
  82733. };
  82734. module.exports = Bernstein;
  82735. /***/ }),
  82736. /* 382 */
  82737. /***/ (function(module, exports) {
  82738. /**
  82739. * @author Richard Davey <rich@photonstorm.com>
  82740. * @copyright 2019 Photon Storm Ltd.
  82741. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82742. */
  82743. /**
  82744. * Check whether `a` is fuzzily less than `b`.
  82745. *
  82746. * `a` is fuzzily less than `b` if it is less than `b + epsilon`.
  82747. *
  82748. * @function Phaser.Math.Fuzzy.LessThan
  82749. * @since 3.0.0
  82750. *
  82751. * @param {number} a - The first value.
  82752. * @param {number} b - The second value.
  82753. * @param {number} [epsilon=0.0001] - The epsilon.
  82754. *
  82755. * @return {boolean} `true` if `a` is fuzzily less than `b`, otherwise `false`.
  82756. */
  82757. var LessThan = function (a, b, epsilon)
  82758. {
  82759. if (epsilon === undefined) { epsilon = 0.0001; }
  82760. return a < b + epsilon;
  82761. };
  82762. module.exports = LessThan;
  82763. /***/ }),
  82764. /* 383 */
  82765. /***/ (function(module, exports) {
  82766. /**
  82767. * @author Richard Davey <rich@photonstorm.com>
  82768. * @copyright 2019 Photon Storm Ltd.
  82769. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82770. */
  82771. /**
  82772. * Check whether `a` is fuzzily greater than `b`.
  82773. *
  82774. * `a` is fuzzily greater than `b` if it is more than `b - epsilon`.
  82775. *
  82776. * @function Phaser.Math.Fuzzy.GreaterThan
  82777. * @since 3.0.0
  82778. *
  82779. * @param {number} a - The first value.
  82780. * @param {number} b - The second value.
  82781. * @param {number} [epsilon=0.0001] - The epsilon.
  82782. *
  82783. * @return {boolean} `true` if `a` is fuzzily greater than than `b`, otherwise `false`.
  82784. */
  82785. var GreaterThan = function (a, b, epsilon)
  82786. {
  82787. if (epsilon === undefined) { epsilon = 0.0001; }
  82788. return a > b - epsilon;
  82789. };
  82790. module.exports = GreaterThan;
  82791. /***/ }),
  82792. /* 384 */
  82793. /***/ (function(module, exports) {
  82794. /**
  82795. * @author Richard Davey <rich@photonstorm.com>
  82796. * @copyright 2019 Photon Storm Ltd.
  82797. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82798. */
  82799. /**
  82800. * Calculate the distance between two sets of coordinates (points), squared.
  82801. *
  82802. * @function Phaser.Math.Distance.Squared
  82803. * @since 3.0.0
  82804. *
  82805. * @param {number} x1 - The x coordinate of the first point.
  82806. * @param {number} y1 - The y coordinate of the first point.
  82807. * @param {number} x2 - The x coordinate of the second point.
  82808. * @param {number} y2 - The y coordinate of the second point.
  82809. *
  82810. * @return {number} The distance between each point, squared.
  82811. */
  82812. var DistanceSquared = function (x1, y1, x2, y2)
  82813. {
  82814. var dx = x1 - x2;
  82815. var dy = y1 - y2;
  82816. return dx * dx + dy * dy;
  82817. };
  82818. module.exports = DistanceSquared;
  82819. /***/ }),
  82820. /* 385 */
  82821. /***/ (function(module, exports) {
  82822. /**
  82823. * @author Richard Davey <rich@photonstorm.com>
  82824. * @copyright 2019 Photon Storm Ltd.
  82825. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82826. */
  82827. /**
  82828. * Normalize an angle to the [0, 2pi] range.
  82829. *
  82830. * @function Phaser.Math.Angle.Normalize
  82831. * @since 3.0.0
  82832. *
  82833. * @param {number} angle - The angle to normalize, in radians.
  82834. *
  82835. * @return {number} The normalized angle, in radians.
  82836. */
  82837. var Normalize = function (angle)
  82838. {
  82839. angle = angle % (2 * Math.PI);
  82840. if (angle >= 0)
  82841. {
  82842. return angle;
  82843. }
  82844. else
  82845. {
  82846. return angle + 2 * Math.PI;
  82847. }
  82848. };
  82849. module.exports = Normalize;
  82850. /***/ }),
  82851. /* 386 */
  82852. /***/ (function(module, exports) {
  82853. /**
  82854. * @author Richard Davey <rich@photonstorm.com>
  82855. * @copyright 2019 Photon Storm Ltd.
  82856. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82857. */
  82858. /**
  82859. * Find the angle of a segment from (x1, y1) -> (x2, y2).
  82860. *
  82861. * @function Phaser.Math.Angle.Between
  82862. * @since 3.0.0
  82863. *
  82864. * @param {number} x1 - The x coordinate of the first point.
  82865. * @param {number} y1 - The y coordinate of the first point.
  82866. * @param {number} x2 - The x coordinate of the second point.
  82867. * @param {number} y2 - The y coordinate of the second point.
  82868. *
  82869. * @return {number} The angle in radians.
  82870. */
  82871. var Between = function (x1, y1, x2, y2)
  82872. {
  82873. return Math.atan2(y2 - y1, x2 - x1);
  82874. };
  82875. module.exports = Between;
  82876. /***/ }),
  82877. /* 387 */
  82878. /***/ (function(module, exports, __webpack_require__) {
  82879. /**
  82880. * @author Richard Davey <rich@photonstorm.com>
  82881. * @copyright 2019 Photon Storm Ltd.
  82882. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82883. */
  82884. var CONST = __webpack_require__(20);
  82885. var Extend = __webpack_require__(19);
  82886. /**
  82887. * @namespace Phaser.Math
  82888. */
  82889. var PhaserMath = {
  82890. // Collections of functions
  82891. Angle: __webpack_require__(1091),
  82892. Distance: __webpack_require__(1083),
  82893. Easing: __webpack_require__(1081),
  82894. Fuzzy: __webpack_require__(1080),
  82895. Interpolation: __webpack_require__(1077),
  82896. Pow2: __webpack_require__(1072),
  82897. Snap: __webpack_require__(1070),
  82898. // Expose the RNG Class
  82899. RandomDataGenerator: __webpack_require__(1068),
  82900. // Single functions
  82901. Average: __webpack_require__(1067),
  82902. Bernstein: __webpack_require__(381),
  82903. Between: __webpack_require__(184),
  82904. CatmullRom: __webpack_require__(185),
  82905. CeilTo: __webpack_require__(1066),
  82906. Clamp: __webpack_require__(23),
  82907. DegToRad: __webpack_require__(34),
  82908. Difference: __webpack_require__(1065),
  82909. Factorial: __webpack_require__(380),
  82910. FloatBetween: __webpack_require__(374),
  82911. FloorTo: __webpack_require__(1064),
  82912. FromPercent: __webpack_require__(100),
  82913. GetSpeed: __webpack_require__(1063),
  82914. IsEven: __webpack_require__(1062),
  82915. IsEvenStrict: __webpack_require__(1061),
  82916. Linear: __webpack_require__(129),
  82917. MaxAdd: __webpack_require__(1060),
  82918. MinSub: __webpack_require__(1059),
  82919. Percent: __webpack_require__(1058),
  82920. RadToDeg: __webpack_require__(183),
  82921. RandomXY: __webpack_require__(1057),
  82922. RandomXYZ: __webpack_require__(1056),
  82923. RandomXYZW: __webpack_require__(1055),
  82924. Rotate: __webpack_require__(373),
  82925. RotateAround: __webpack_require__(428),
  82926. RotateAroundDistance: __webpack_require__(197),
  82927. RoundAwayFromZero: __webpack_require__(372),
  82928. RoundTo: __webpack_require__(1054),
  82929. SinCosTableGenerator: __webpack_require__(1053),
  82930. SmootherStep: __webpack_require__(196),
  82931. SmoothStep: __webpack_require__(195),
  82932. TransformXY: __webpack_require__(371),
  82933. Within: __webpack_require__(1052),
  82934. Wrap: __webpack_require__(57),
  82935. // Vector classes
  82936. Vector2: __webpack_require__(3),
  82937. Vector3: __webpack_require__(182),
  82938. Vector4: __webpack_require__(1051),
  82939. Matrix3: __webpack_require__(370),
  82940. Matrix4: __webpack_require__(369),
  82941. Quaternion: __webpack_require__(368),
  82942. RotateVec3: __webpack_require__(1050)
  82943. };
  82944. // Merge in the consts
  82945. PhaserMath = Extend(false, PhaserMath, CONST);
  82946. // Export it
  82947. module.exports = PhaserMath;
  82948. /***/ }),
  82949. /* 388 */
  82950. /***/ (function(module, exports, __webpack_require__) {
  82951. /**
  82952. * @author Richard Davey <rich@photonstorm.com>
  82953. * @copyright 2019 Photon Storm Ltd.
  82954. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82955. */
  82956. var CanvasPool = __webpack_require__(24);
  82957. /**
  82958. * Determines the canvas features of the browser running this Phaser Game instance.
  82959. * These values are read-only and populated during the boot sequence of the game.
  82960. * They are then referenced by internal game systems and are available for you to access
  82961. * via `this.sys.game.device.canvasFeatures` from within any Scene.
  82962. *
  82963. * @typedef {object} Phaser.Device.CanvasFeatures
  82964. * @since 3.0.0
  82965. *
  82966. * @property {boolean} supportInverseAlpha - Set to true if the browser supports inversed alpha.
  82967. * @property {boolean} supportNewBlendModes - Set to true if the browser supports new canvas blend modes.
  82968. */
  82969. var CanvasFeatures = {
  82970. supportInverseAlpha: false,
  82971. supportNewBlendModes: false
  82972. };
  82973. function checkBlendMode ()
  82974. {
  82975. var pngHead = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAABAQMAAADD8p2OAAAAA1BMVEX/';
  82976. var pngEnd = 'AAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==';
  82977. var magenta = new Image();
  82978. magenta.onload = function ()
  82979. {
  82980. var yellow = new Image();
  82981. yellow.onload = function ()
  82982. {
  82983. var canvas = CanvasPool.create(yellow, 6, 1);
  82984. var context = canvas.getContext('2d');
  82985. context.globalCompositeOperation = 'multiply';
  82986. context.drawImage(magenta, 0, 0);
  82987. context.drawImage(yellow, 2, 0);
  82988. if (!context.getImageData(2, 0, 1, 1))
  82989. {
  82990. return false;
  82991. }
  82992. var data = context.getImageData(2, 0, 1, 1).data;
  82993. CanvasPool.remove(yellow);
  82994. CanvasFeatures.supportNewBlendModes = (data[0] === 255 && data[1] === 0 && data[2] === 0);
  82995. };
  82996. yellow.src = pngHead + '/wCKxvRF' + pngEnd;
  82997. };
  82998. magenta.src = pngHead + 'AP804Oa6' + pngEnd;
  82999. return false;
  83000. }
  83001. function checkInverseAlpha ()
  83002. {
  83003. var canvas = CanvasPool.create(this, 2, 1);
  83004. var context = canvas.getContext('2d');
  83005. context.fillStyle = 'rgba(10, 20, 30, 0.5)';
  83006. // Draw a single pixel
  83007. context.fillRect(0, 0, 1, 1);
  83008. // Get the color values
  83009. var s1 = context.getImageData(0, 0, 1, 1);
  83010. if (s1 === null)
  83011. {
  83012. return false;
  83013. }
  83014. // Plot them to x2
  83015. context.putImageData(s1, 1, 0);
  83016. // Get those values
  83017. var s2 = context.getImageData(1, 0, 1, 1);
  83018. // Compare and return
  83019. return (s2.data[0] === s1.data[0] && s2.data[1] === s1.data[1] && s2.data[2] === s1.data[2] && s2.data[3] === s1.data[3]);
  83020. }
  83021. function init ()
  83022. {
  83023. if (document !== undefined)
  83024. {
  83025. CanvasFeatures.supportNewBlendModes = checkBlendMode();
  83026. CanvasFeatures.supportInverseAlpha = checkInverseAlpha();
  83027. }
  83028. return CanvasFeatures;
  83029. }
  83030. module.exports = init();
  83031. /***/ }),
  83032. /* 389 */
  83033. /***/ (function(module, exports, __webpack_require__) {
  83034. /**
  83035. * @author Richard Davey <rich@photonstorm.com>
  83036. * @copyright 2019 Photon Storm Ltd.
  83037. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83038. */
  83039. // This singleton is instantiated as soon as Phaser loads,
  83040. // before a Phaser.Game instance has even been created.
  83041. // Which means all instances of Phaser Games can share it,
  83042. // without having to re-poll the device all over again
  83043. /**
  83044. * @namespace Phaser.Device
  83045. * @since 3.0.0
  83046. */
  83047. /**
  83048. * @typedef {object} Phaser.DeviceConf
  83049. *
  83050. * @property {Phaser.Device.OS} os - The OS Device functions.
  83051. * @property {Phaser.Device.Browser} browser - The Browser Device functions.
  83052. * @property {Phaser.Device.Features} features - The Features Device functions.
  83053. * @property {Phaser.Device.Input} input - The Input Device functions.
  83054. * @property {Phaser.Device.Audio} audio - The Audio Device functions.
  83055. * @property {Phaser.Device.Video} video - The Video Device functions.
  83056. * @property {Phaser.Device.Fullscreen} fullscreen - The Fullscreen Device functions.
  83057. * @property {Phaser.Device.CanvasFeatures} canvasFeatures - The Canvas Device functions.
  83058. */
  83059. module.exports = {
  83060. os: __webpack_require__(99),
  83061. browser: __webpack_require__(128),
  83062. features: __webpack_require__(187),
  83063. input: __webpack_require__(1095),
  83064. audio: __webpack_require__(1094),
  83065. video: __webpack_require__(1093),
  83066. fullscreen: __webpack_require__(1092),
  83067. canvasFeatures: __webpack_require__(388)
  83068. };
  83069. /***/ }),
  83070. /* 390 */
  83071. /***/ (function(module, exports, __webpack_require__) {
  83072. /**
  83073. * @author Richard Davey <rich@photonstorm.com>
  83074. * @copyright 2019 Photon Storm Ltd.
  83075. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83076. */
  83077. var Class = __webpack_require__(0);
  83078. var CONST = __webpack_require__(28);
  83079. var Device = __webpack_require__(389);
  83080. var GetFastValue = __webpack_require__(2);
  83081. var GetValue = __webpack_require__(4);
  83082. var IsPlainObject = __webpack_require__(8);
  83083. var PhaserMath = __webpack_require__(387);
  83084. var NOOP = __webpack_require__(1);
  83085. var DefaultPlugins = __webpack_require__(181);
  83086. var ValueToColor = __webpack_require__(192);
  83087. /**
  83088. * This callback type is completely empty, a no-operation.
  83089. *
  83090. * @callback NOOP
  83091. */
  83092. /**
  83093. * @callback BootCallback
  83094. *
  83095. * @param {Phaser.Game} game - The game.
  83096. */
  83097. /**
  83098. * Config object containing various sound settings.
  83099. *
  83100. * @typedef {object} AudioConfig
  83101. *
  83102. * @property {boolean} [disableWebAudio=false] - Use HTML5 Audio instead of Web Audio.
  83103. * @property {AudioContext} [context] - An existing Web Audio context.
  83104. * @property {boolean} [noAudio=false] - Disable all audio output.
  83105. *
  83106. * @see Phaser.Sound.SoundManagerCreator
  83107. */
  83108. /**
  83109. * @typedef {object} InputConfig
  83110. *
  83111. * @property {(boolean|KeyboardInputConfig)} [keyboard=true] - Keyboard input configuration. `true` uses the default configuration and `false` disables keyboard input.
  83112. * @property {(boolean|MouseInputConfig)} [mouse=true] - Mouse input configuration. `true` uses the default configuration and `false` disables mouse input.
  83113. * @property {(boolean|TouchInputConfig)} [touch=true] - Touch input configuration. `true` uses the default configuration and `false` disables touch input.
  83114. * @property {(boolean|GamepadInputConfig)} [gamepad=false] - Gamepad input configuration. `true` enables gamepad input.
  83115. * @property {integer} [activePointers=1] - The maximum number of touch pointers. See {@link Phaser.Input.InputManager#pointers}.
  83116. * @property {number} [smoothFactor=0] - The smoothing factor to apply during Pointer movement. See {@link Phaser.Input.Pointer#smoothFactor}.
  83117. * @property {boolean} [inputQueue=false] - Should Phaser use a queued input system for native DOM Events or not?
  83118. */
  83119. /**
  83120. * @typedef {object} MouseInputConfig
  83121. *
  83122. * @property {*} [target=null] - Where the Mouse Manager listens for mouse input events. The default is the game canvas.
  83123. * @property {boolean} [capture=true] - Whether mouse input events have `preventDefault` called on them.
  83124. */
  83125. /**
  83126. * @typedef {object} KeyboardInputConfig
  83127. *
  83128. * @property {*} [target=window] - Where the Keyboard Manager listens for keyboard input events.
  83129. * @property {?integer} [capture] - `preventDefault` will be called on every non-modified key which has a key code in this array. By default it is empty.
  83130. */
  83131. /**
  83132. * @typedef {object} TouchInputConfig
  83133. *
  83134. * @property {*} [target=null] - Where the Touch Manager listens for touch input events. The default is the game canvas.
  83135. * @property {boolean} [capture=true] - Whether touch input events have preventDefault() called on them.
  83136. */
  83137. /**
  83138. * @typedef {object} GamepadInputConfig
  83139. *
  83140. * @property {*} [target=window] - Where the Gamepad Manager listens for gamepad input events.
  83141. */
  83142. /**
  83143. * @typedef {object} BannerConfig
  83144. *
  83145. * @property {boolean} [hidePhaser=false] - Omit Phaser's name and version from the banner.
  83146. * @property {string} [text='#ffffff'] - The color of the banner text.
  83147. * @property {string[]} [background] - The background colors of the banner.
  83148. */
  83149. /**
  83150. * @typedef {object} FPSConfig
  83151. *
  83152. * @property {integer} [min=5] - The minimum acceptable rendering rate, in frames per second.
  83153. * @property {integer} [target=60] - The optimum rendering rate, in frames per second.
  83154. * @property {boolean} [forceSetTimeOut=false] - Use setTimeout instead of requestAnimationFrame to run the game loop.
  83155. * @property {integer} [deltaHistory=10] - Calculate the average frame delta from this many consecutive frame intervals.
  83156. * @property {integer} [panicMax=120] - The amount of frames the time step counts before we trust the delta values again.
  83157. */
  83158. /**
  83159. * @typedef {object} RenderConfig
  83160. *
  83161. * @property {boolean} [antialias=true] - When set to `true`, WebGL uses linear interpolation to draw scaled or rotated textures, giving a smooth appearance. When set to `false`, WebGL uses nearest-neighbor interpolation, giving a crisper appearance. `false` also disables antialiasing of the game canvas itself, if the browser supports it, when the game canvas is scaled.
  83162. * @property {boolean} [pixelArt=false] - Sets `antialias` and `roundPixels` to true. This is the best setting for pixel-art games.
  83163. * @property {boolean} [roundPixels=false] - Draw texture-based Game Objects at only whole-integer positions. Game Objects without textures, like Graphics, ignore this property.
  83164. * @property {boolean} [transparent=false] - Whether the game canvas will be transparent.
  83165. * @property {boolean} [clearBeforeRender=true] - Whether the game canvas will be cleared between each rendering frame.
  83166. * @property {boolean} [premultipliedAlpha=true] - In WebGL mode, the drawing buffer contains colors with pre-multiplied alpha.
  83167. * @property {boolean} [failIfMajorPerformanceCaveat=false] - Let the browser abort creating a WebGL context if it judges performance would be unacceptable.
  83168. * @property {string} [powerPreference='default'] - "high-performance", "low-power" or "default". A hint to the browser on how much device power the game might use.
  83169. * @property {integer} [batchSize=2000] - The default WebGL batch size.
  83170. * @property {integer} [maxLights=10] - The maximum number of lights allowed to be visible within range of a single Camera in the LightManager.
  83171. */
  83172. /**
  83173. * @typedef {object} WidthHeight
  83174. *
  83175. * @property {integer} [width=0] - The width.
  83176. * @property {integer} [height=0] - The height.
  83177. */
  83178. /**
  83179. * @typedef {object} ScaleConfig
  83180. *
  83181. * @property {(integer|string)} [width=1024] - The base width of your game. Can be an integer or a string: '100%'. If a string it will only work if you have set a parent element that has a size.
  83182. * @property {(integer|string)} [height=768] - The base height of your game. Can be an integer or a string: '100%'. If a string it will only work if you have set a parent element that has a size.
  83183. * @property {(Phaser.Scale.ZoomType|integer)} [zoom=1] - The zoom value of the game canvas.
  83184. * @property {number} [resolution=1] - The rendering resolution of the canvas. This is reserved for future use and is currently ignored.
  83185. * @property {?(HTMLElement|string)} [parent] - The DOM element that will contain the game canvas, or its `id`. If undefined, or if the named element doesn't exist, the game canvas is inserted directly into the document body. If `null` no parent will be used and you are responsible for adding the canvas to your environment.
  83186. * @property {boolean} [expandParent=true] - Is the Scale Manager allowed to adjust the CSS height property of the parent and/or document body to be 100%?
  83187. * @property {Phaser.Scale.ScaleModeType} [mode=Phaser.Scale.ScaleModes.NONE] - The scale mode.
  83188. * @property {WidthHeight} [min] - The minimum width and height the canvas can be scaled down to.
  83189. * @property {WidthHeight} [max] - The maximum width the canvas can be scaled up to.
  83190. * @property {boolean} [autoRound=false] - Automatically round the display and style sizes of the canvas. This can help with performance in lower-powered devices.
  83191. * @property {Phaser.Scale.CenterType} [autoCenter=Phaser.Scale.Center.NO_CENTER] - Automatically center the canvas within the parent?
  83192. * @property {integer} [resizeInterval=500] - How many ms should elapse before checking if the browser size has changed?
  83193. * @property {?(HTMLElement|string)} [fullscreenTarget] - The DOM element that will be sent into full screen mode, or its `id`. If undefined Phaser will create its own div and insert the canvas into it when entering fullscreen mode.
  83194. */
  83195. /**
  83196. * @typedef {object} CallbacksConfig
  83197. *
  83198. * @property {BootCallback} [preBoot=NOOP] - A function to run at the start of the boot sequence.
  83199. * @property {BootCallback} [postBoot=NOOP] - A function to run at the end of the boot sequence. At this point, all the game systems have started and plugins have been loaded.
  83200. */
  83201. /**
  83202. * @typedef {object} LoaderConfig
  83203. *
  83204. * @property {string} [baseURL] - A URL used to resolve paths given to the loader. Example: 'http://labs.phaser.io/assets/'.
  83205. * @property {string} [path] - A URL path used to resolve relative paths given to the loader. Example: 'images/sprites/'.
  83206. * @property {integer} [maxParallelDownloads=32] - The maximum number of resources the loader will start loading at once.
  83207. * @property {(string|undefined)} [crossOrigin=undefined] - 'anonymous', 'use-credentials', or `undefined`. If you're not making cross-origin requests, leave this as `undefined`. See {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes}.
  83208. * @property {string} [responseType] - The response type of the XHR request, e.g. `blob`, `text`, etc.
  83209. * @property {boolean} [async=true] - Should the XHR request use async or not?
  83210. * @property {string} [user] - Optional username for all XHR requests.
  83211. * @property {string} [password] - Optional password for all XHR requests.
  83212. * @property {integer} [timeout=0] - Optional XHR timeout value, in ms.
  83213. */
  83214. /**
  83215. * @typedef {object} DOMContainerConfig
  83216. *
  83217. * @property {boolean} [createContainer=false] - Create a div element in which DOM Elements will be contained. You must also provide a parent.
  83218. * @property {boolean} [behindCanvas=false] - Place the DOM Container behind the Phaser Canvas. The default is to place it over the Canvas.
  83219. */
  83220. /**
  83221. * @typedef {object} ImagesConfig
  83222. *
  83223. * @property {string} [default] - URL to use for the 'default' texture.
  83224. * @property {string} [missing] - URL to use for the 'missing' texture.
  83225. */
  83226. /**
  83227. * @typedef {object} PhysicsConfig
  83228. *
  83229. * @property {string} [default] - The default physics system. It will be started for each scene. Phaser provides 'arcade', 'impact', and 'matter'.
  83230. * @property {ArcadeWorldConfig} [arcade] - Arcade Physics configuration.
  83231. * @property {Phaser.Physics.Impact.WorldConfig} [impact] - Impact Physics configuration.
  83232. * @property {object} [matter] - Matter Physics configuration.
  83233. */
  83234. /**
  83235. * @typedef {object} PluginObjectItem
  83236. *
  83237. * @property {string} [key] - A key to identify the plugin in the Plugin Manager.
  83238. * @property {*} [plugin] - The plugin itself. Usually a class/constructor.
  83239. * @property {boolean} [start] - Whether the plugin should be started automatically.
  83240. * @property {string} [systemKey] - For a scene plugin, add the plugin to the scene's systems object under this key (`this.sys.KEY`, from the scene).
  83241. * @property {string} [sceneKey] - For a scene plugin, add the plugin to the scene object under this key (`this.KEY`, from the scene).
  83242. * @property {string} [mapping] - If this plugin is to be injected into the Scene Systems, this is the property key map used.
  83243. * @property {*} [data] - Arbitrary data passed to the plugin's init() method.
  83244. *
  83245. * @example
  83246. * // Global plugin
  83247. * { key: 'BankPlugin', plugin: BankPluginV3, start: true, data: { gold: 5000 } }
  83248. * @example
  83249. * // Scene plugin
  83250. * { key: 'WireFramePlugin', plugin: WireFramePlugin, systemKey: 'wireFramePlugin', sceneKey: 'wireframe' }
  83251. */
  83252. /**
  83253. * @typedef {object} PluginObject
  83254. *
  83255. * @property {?PluginObjectItem[]} [global] - Global plugins to install.
  83256. * @property {?PluginObjectItem[]} [scene] - Scene plugins to install.
  83257. * @property {string[]} [default] - The default set of scene plugins (names).
  83258. * @property {string[]} [defaultMerge] - Plugins to *add* to the default set of scene plugins.
  83259. */
  83260. /**
  83261. * @typedef {object} GameConfig
  83262. *
  83263. * @property {(integer|string)} [width=1024] - The width of the game, in game pixels.
  83264. * @property {(integer|string)} [height=768] - The height of the game, in game pixels.
  83265. * @property {number} [zoom=1] - Simple scale applied to the game canvas. 2 is double size, 0.5 is half size, etc.
  83266. * @property {number} [resolution=1] - The size of each game pixel, in canvas pixels. Values larger than 1 are "high" resolution.
  83267. * @property {number} [type=CONST.AUTO] - Which renderer to use. Phaser.AUTO, Phaser.CANVAS, Phaser.HEADLESS, or Phaser.WEBGL. AUTO picks WEBGL if available, otherwise CANVAS.
  83268. * @property {(HTMLElement|string)} [parent=null] - The DOM element that will contain the game canvas, or its `id`. If undefined or if the named element doesn't exist, the game canvas is inserted directly into the document body. If `null` no parent will be used and you are responsible for adding the canvas to your environment.
  83269. * @property {HTMLCanvasElement} [canvas=null] - Provide your own Canvas element for Phaser to use instead of creating one.
  83270. * @property {string} [canvasStyle=null] - CSS styles to apply to the game canvas instead of Phaser's default styles.
  83271. * @property {CanvasRenderingContext2D} [context] - Provide your own Canvas Context for Phaser to use, instead of creating one.
  83272. * @property {object} [scene=null] - A scene or scenes to add to the game. If several are given, the first is started; the remainder are started only if they have { active: true }.
  83273. * @property {string[]} [seed] - Seed for the random number generator.
  83274. * @property {string} [title=''] - The title of the game. Shown in the browser console.
  83275. * @property {string} [url='http://phaser.io'] - The URL of the game. Shown in the browser console.
  83276. * @property {string} [version=''] - The version of the game. Shown in the browser console.
  83277. * @property {boolean} [autoFocus=true] - Automatically call window.focus() when the game boots. Usually necessary to capture input events if the game is in a separate frame.
  83278. * @property {(boolean|InputConfig)} [input] - Input configuration, or `false` to disable all game input.
  83279. * @property {boolean} [disableContextMenu=false] - Disable the browser's default 'contextmenu' event (usually triggered by a right-button mouse click).
  83280. * @property {(boolean|BannerConfig)} [banner=false] - Configuration for the banner printed in the browser console when the game starts.
  83281. * @property {DOMContainerConfig} [dom] - The DOM Container configuration object.
  83282. * @property {FPSConfig} [fps] - Game loop configuration.
  83283. * @property {RenderConfig} [render] - Game renderer configuration.
  83284. * @property {(string|number)} [backgroundColor=0x000000] - The background color of the game canvas. The default is black.
  83285. * @property {CallbacksConfig} [callbacks] - Optional callbacks to run before or after game boot.
  83286. * @property {LoaderConfig} [loader] - Loader configuration.
  83287. * @property {ImagesConfig} [images] - Images configuration.
  83288. * @property {object} [physics] - Physics configuration.
  83289. * @property {PluginObject|PluginObjectItem[]} [plugins] - Plugins to install.
  83290. * @property {ScaleConfig} [scale] - The Scale Manager configuration.
  83291. */
  83292. /**
  83293. * @classdesc
  83294. * The active game configuration settings, parsed from a {@link GameConfig} object.
  83295. *
  83296. * @class Config
  83297. * @memberof Phaser.Core
  83298. * @constructor
  83299. * @since 3.0.0
  83300. *
  83301. * @param {GameConfig} [GameConfig] - The configuration object for your Phaser Game instance.
  83302. *
  83303. * @see Phaser.Game#config
  83304. */
  83305. var Config = new Class({
  83306. initialize:
  83307. function Config (config)
  83308. {
  83309. if (config === undefined) { config = {}; }
  83310. var defaultBannerColor = [
  83311. '#ff0000',
  83312. '#ffff00',
  83313. '#00ff00',
  83314. '#00ffff',
  83315. '#000000'
  83316. ];
  83317. var defaultBannerTextColor = '#ffffff';
  83318. /**
  83319. * @const {(integer|string)} Phaser.Core.Config#width - The width of the underlying canvas, in pixels.
  83320. */
  83321. this.width = GetValue(config, 'width', 1024);
  83322. /**
  83323. * @const {(integer|string)} Phaser.Core.Config#height - The height of the underlying canvas, in pixels.
  83324. */
  83325. this.height = GetValue(config, 'height', 768);
  83326. /**
  83327. * @const {(Phaser.Scale.ZoomType|integer)} Phaser.Core.Config#zoom - The zoom factor, as used by the Scale Manager.
  83328. */
  83329. this.zoom = GetValue(config, 'zoom', 1);
  83330. /**
  83331. * @const {number} Phaser.Core.Config#resolution - The canvas device pixel resolution. Currently un-used.
  83332. */
  83333. this.resolution = GetValue(config, 'resolution', 1);
  83334. /**
  83335. * @const {?*} Phaser.Core.Config#parent - A parent DOM element into which the canvas created by the renderer will be injected.
  83336. */
  83337. this.parent = GetValue(config, 'parent', undefined);
  83338. /**
  83339. * @const {Phaser.Scale.ScaleModeType} Phaser.Core.Config#scaleMode - The scale mode as used by the Scale Manager. The default is zero, which is no scaling.
  83340. */
  83341. this.scaleMode = GetValue(config, 'scaleMode', 0);
  83342. /**
  83343. * @const {boolean} Phaser.Core.Config#expandParent - Is the Scale Manager allowed to adjust the CSS height property of the parent to be 100%?
  83344. */
  83345. this.expandParent = GetValue(config, 'expandParent', true);
  83346. /**
  83347. * @const {integer} Phaser.Core.Config#autoRound - Automatically round the display and style sizes of the canvas. This can help with performance in lower-powered devices.
  83348. */
  83349. this.autoRound = GetValue(config, 'autoRound', false);
  83350. /**
  83351. * @const {Phaser.Scale.CenterType} Phaser.Core.Config#autoCenter - Automatically center the canvas within the parent?
  83352. */
  83353. this.autoCenter = GetValue(config, 'autoCenter', 0);
  83354. /**
  83355. * @const {integer} Phaser.Core.Config#resizeInterval - How many ms should elapse before checking if the browser size has changed?
  83356. */
  83357. this.resizeInterval = GetValue(config, 'resizeInterval', 500);
  83358. /**
  83359. * @const {?(HTMLElement|string)} Phaser.Core.Config#fullscreenTarget - The DOM element that will be sent into full screen mode, or its `id`. If undefined Phaser will create its own div and insert the canvas into it when entering fullscreen mode.
  83360. */
  83361. this.fullscreenTarget = GetValue(config, 'fullscreenTarget', null);
  83362. /**
  83363. * @const {integer} Phaser.Core.Config#minWidth - The minimum width, in pixels, the canvas will scale down to. A value of zero means no minimum.
  83364. */
  83365. this.minWidth = GetValue(config, 'minWidth', 0);
  83366. /**
  83367. * @const {integer} Phaser.Core.Config#maxWidth - The maximum width, in pixels, the canvas will scale up to. A value of zero means no maximum.
  83368. */
  83369. this.maxWidth = GetValue(config, 'maxWidth', 0);
  83370. /**
  83371. * @const {integer} Phaser.Core.Config#minHeight - The minimum height, in pixels, the canvas will scale down to. A value of zero means no minimum.
  83372. */
  83373. this.minHeight = GetValue(config, 'minHeight', 0);
  83374. /**
  83375. * @const {integer} Phaser.Core.Config#maxHeight - The maximum height, in pixels, the canvas will scale up to. A value of zero means no maximum.
  83376. */
  83377. this.maxHeight = GetValue(config, 'maxHeight', 0);
  83378. // Scale Manager - Anything set in here over-rides anything set above
  83379. var scaleConfig = GetValue(config, 'scale', null);
  83380. if (scaleConfig)
  83381. {
  83382. this.width = GetValue(scaleConfig, 'width', this.width);
  83383. this.height = GetValue(scaleConfig, 'height', this.height);
  83384. this.zoom = GetValue(scaleConfig, 'zoom', this.zoom);
  83385. this.resolution = GetValue(scaleConfig, 'resolution', this.resolution);
  83386. this.parent = GetValue(scaleConfig, 'parent', this.parent);
  83387. this.scaleMode = GetValue(scaleConfig, 'mode', this.scaleMode);
  83388. this.expandParent = GetValue(scaleConfig, 'expandParent', this.expandParent);
  83389. this.autoRound = GetValue(scaleConfig, 'autoRound', this.autoRound);
  83390. this.autoCenter = GetValue(scaleConfig, 'autoCenter', this.autoCenter);
  83391. this.resizeInterval = GetValue(scaleConfig, 'resizeInterval', this.resizeInterval);
  83392. this.fullscreenTarget = GetValue(scaleConfig, 'fullscreenTarget', this.fullscreenTarget);
  83393. this.minWidth = GetValue(scaleConfig, 'min.width', this.minWidth);
  83394. this.maxWidth = GetValue(scaleConfig, 'max.width', this.maxWidth);
  83395. this.minHeight = GetValue(scaleConfig, 'min.height', this.minHeight);
  83396. this.maxHeight = GetValue(scaleConfig, 'max.height', this.maxHeight);
  83397. }
  83398. /**
  83399. * @const {number} Phaser.Core.Config#renderType - Force Phaser to use a specific renderer. Can be `CONST.CANVAS`, `CONST.WEBGL`, `CONST.HEADLESS` or `CONST.AUTO` (default)
  83400. */
  83401. this.renderType = GetValue(config, 'type', CONST.AUTO);
  83402. /**
  83403. * @const {?HTMLCanvasElement} Phaser.Core.Config#canvas - Force Phaser to use your own Canvas element instead of creating one.
  83404. */
  83405. this.canvas = GetValue(config, 'canvas', null);
  83406. /**
  83407. * @const {?(CanvasRenderingContext2D|WebGLRenderingContext)} Phaser.Core.Config#context - Force Phaser to use your own Canvas context instead of creating one.
  83408. */
  83409. this.context = GetValue(config, 'context', null);
  83410. /**
  83411. * @const {?string} Phaser.Core.Config#canvasStyle - Optional CSS attributes to be set on the canvas object created by the renderer.
  83412. */
  83413. this.canvasStyle = GetValue(config, 'canvasStyle', null);
  83414. /**
  83415. * @const {boolean} Phaser.Core.Config#customEnvironment - Is Phaser running under a custom (non-native web) environment? If so, set this to `true` to skip internal Feature detection. If `true` the `renderType` cannot be left as `AUTO`.
  83416. */
  83417. this.customEnvironment = GetValue(config, 'customEnvironment', false);
  83418. /**
  83419. * @const {?object} Phaser.Core.Config#sceneConfig - The default Scene configuration object.
  83420. */
  83421. this.sceneConfig = GetValue(config, 'scene', null);
  83422. /**
  83423. * @const {string[]} Phaser.Core.Config#seed - A seed which the Random Data Generator will use. If not given, a dynamic seed based on the time is used.
  83424. */
  83425. this.seed = GetValue(config, 'seed', [ (Date.now() * Math.random()).toString() ]);
  83426. PhaserMath.RND = new PhaserMath.RandomDataGenerator(this.seed);
  83427. /**
  83428. * @const {string} Phaser.Core.Config#gameTitle - The title of the game.
  83429. */
  83430. this.gameTitle = GetValue(config, 'title', '');
  83431. /**
  83432. * @const {string} Phaser.Core.Config#gameURL - The URL of the game.
  83433. */
  83434. this.gameURL = GetValue(config, 'url', 'https://phaser.io');
  83435. /**
  83436. * @const {string} Phaser.Core.Config#gameVersion - The version of the game.
  83437. */
  83438. this.gameVersion = GetValue(config, 'version', '');
  83439. /**
  83440. * @const {boolean} Phaser.Core.Config#autoFocus - If `true` the window will automatically be given focus immediately and on any future mousedown event.
  83441. */
  83442. this.autoFocus = GetValue(config, 'autoFocus', true);
  83443. // DOM Element Container
  83444. /**
  83445. * @const {?boolean} Phaser.Core.Config#domCreateContainer - EXPERIMENTAL: Do not currently use.
  83446. */
  83447. this.domCreateContainer = GetValue(config, 'dom.createContainer', false);
  83448. /**
  83449. * @const {?boolean} Phaser.Core.Config#domBehindCanvas - EXPERIMENTAL: Do not currently use.
  83450. */
  83451. this.domBehindCanvas = GetValue(config, 'dom.behindCanvas', false);
  83452. // Input
  83453. /**
  83454. * @const {boolean} Phaser.Core.Config#inputKeyboard - Enable the Keyboard Plugin. This can be disabled in games that don't need keyboard input.
  83455. */
  83456. this.inputKeyboard = GetValue(config, 'input.keyboard', true);
  83457. /**
  83458. * @const {*} Phaser.Core.Config#inputKeyboardEventTarget - The DOM Target to listen for keyboard events on. Defaults to `window` if not specified.
  83459. */
  83460. this.inputKeyboardEventTarget = GetValue(config, 'input.keyboard.target', window);
  83461. /**
  83462. * @const {?integer[]} Phaser.Core.Config#inputKeyboardCapture - `preventDefault` will be called on every non-modified key which has a key code in this array. By default, it is empty.
  83463. */
  83464. this.inputKeyboardCapture = GetValue(config, 'input.keyboard.capture', []);
  83465. /**
  83466. * @const {(boolean|object)} Phaser.Core.Config#inputMouse - Enable the Mouse Plugin. This can be disabled in games that don't need mouse input.
  83467. */
  83468. this.inputMouse = GetValue(config, 'input.mouse', true);
  83469. /**
  83470. * @const {?*} Phaser.Core.Config#inputMouseEventTarget - The DOM Target to listen for mouse events on. Defaults to the game canvas if not specified.
  83471. */
  83472. this.inputMouseEventTarget = GetValue(config, 'input.mouse.target', null);
  83473. /**
  83474. * @const {boolean} Phaser.Core.Config#inputMouseCapture - Should mouse events be captured? I.e. have prevent default called on them.
  83475. */
  83476. this.inputMouseCapture = GetValue(config, 'input.mouse.capture', true);
  83477. /**
  83478. * @const {boolean} Phaser.Core.Config#inputTouch - Enable the Touch Plugin. This can be disabled in games that don't need touch input.
  83479. */
  83480. this.inputTouch = GetValue(config, 'input.touch', Device.input.touch);
  83481. /**
  83482. * @const {?*} Phaser.Core.Config#inputTouchEventTarget - The DOM Target to listen for touch events on. Defaults to the game canvas if not specified.
  83483. */
  83484. this.inputTouchEventTarget = GetValue(config, 'input.touch.target', null);
  83485. /**
  83486. * @const {boolean} Phaser.Core.Config#inputTouchCapture - Should touch events be captured? I.e. have prevent default called on them.
  83487. */
  83488. this.inputTouchCapture = GetValue(config, 'input.touch.capture', true);
  83489. /**
  83490. * @const {integer} Phaser.Core.Config#inputActivePointers - The number of Pointer objects created by default. In a mouse-only, or non-multi touch game, you can leave this as 1.
  83491. */
  83492. this.inputActivePointers = GetValue(config, 'input.activePointers', 1);
  83493. /**
  83494. * @const {integer} Phaser.Core.Config#inputSmoothFactor - The smoothing factor to apply during Pointer movement. See {@link Phaser.Input.Pointer#smoothFactor}.
  83495. */
  83496. this.inputSmoothFactor = GetValue(config, 'input.smoothFactor', 0);
  83497. /**
  83498. * @const {boolean} Phaser.Core.Config#inputQueue - Should Phaser use a queued input system for native DOM Events or not?
  83499. */
  83500. this.inputQueue = GetValue(config, 'input.queue', false);
  83501. /**
  83502. * @const {boolean} Phaser.Core.Config#inputGamepad - Enable the Gamepad Plugin. This can be disabled in games that don't need gamepad input.
  83503. */
  83504. this.inputGamepad = GetValue(config, 'input.gamepad', false);
  83505. /**
  83506. * @const {*} Phaser.Core.Config#inputGamepadEventTarget - The DOM Target to listen for gamepad events on. Defaults to `window` if not specified.
  83507. */
  83508. this.inputGamepadEventTarget = GetValue(config, 'input.gamepad.target', window);
  83509. /**
  83510. * @const {boolean} Phaser.Core.Config#disableContextMenu - Set to `true` to disable the right-click context menu.
  83511. */
  83512. this.disableContextMenu = GetValue(config, 'disableContextMenu', false);
  83513. /**
  83514. * @const {AudioConfig} Phaser.Core.Config#audio - The Audio Configuration object.
  83515. */
  83516. this.audio = GetValue(config, 'audio');
  83517. // If you do: { banner: false } it won't display any banner at all
  83518. /**
  83519. * @const {boolean} Phaser.Core.Config#hideBanner - Don't write the banner line to the console.log.
  83520. */
  83521. this.hideBanner = (GetValue(config, 'banner', null) === false);
  83522. /**
  83523. * @const {boolean} Phaser.Core.Config#hidePhaser - Omit Phaser's name and version from the banner.
  83524. */
  83525. this.hidePhaser = GetValue(config, 'banner.hidePhaser', false);
  83526. /**
  83527. * @const {string} Phaser.Core.Config#bannerTextColor - The color of the banner text.
  83528. */
  83529. this.bannerTextColor = GetValue(config, 'banner.text', defaultBannerTextColor);
  83530. /**
  83531. * @const {string[]} Phaser.Core.Config#bannerBackgroundColor - The background colors of the banner.
  83532. */
  83533. this.bannerBackgroundColor = GetValue(config, 'banner.background', defaultBannerColor);
  83534. if (this.gameTitle === '' && this.hidePhaser)
  83535. {
  83536. this.hideBanner = true;
  83537. }
  83538. /**
  83539. * @const {?FPSConfig} Phaser.Core.Config#fps - The Frame Rate Configuration object, as parsed by the Timestep class.
  83540. */
  83541. this.fps = GetValue(config, 'fps', null);
  83542. // Renderer Settings
  83543. // These can either be in a `render` object within the Config, or specified on their own
  83544. var renderConfig = GetValue(config, 'render', config);
  83545. /**
  83546. * @const {boolean} Phaser.Core.Config#antialias - When set to `true`, WebGL uses linear interpolation to draw scaled or rotated textures, giving a smooth appearance. When set to `false`, WebGL uses nearest-neighbor interpolation, giving a crisper appearance. `false` also disables antialiasing of the game canvas itself, if the browser supports it, when the game canvas is scaled.
  83547. */
  83548. this.antialias = GetValue(renderConfig, 'antialias', true);
  83549. /**
  83550. * @const {boolean} Phaser.Core.Config#roundPixels - Draw texture-based Game Objects at only whole-integer positions. Game Objects without textures, like Graphics, ignore this property.
  83551. */
  83552. this.roundPixels = GetValue(renderConfig, 'roundPixels', false);
  83553. /**
  83554. * @const {boolean} Phaser.Core.Config#pixelArt - Prevent pixel art from becoming blurred when scaled. It will remain crisp (tells the WebGL renderer to automatically create textures using a linear filter mode).
  83555. */
  83556. this.pixelArt = GetValue(renderConfig, 'pixelArt', this.zoom !== 1);
  83557. if (this.pixelArt)
  83558. {
  83559. this.antialias = false;
  83560. this.roundPixels = true;
  83561. }
  83562. /**
  83563. * @const {boolean} Phaser.Core.Config#transparent - Whether the game canvas will have a transparent background.
  83564. */
  83565. this.transparent = GetValue(renderConfig, 'transparent', false);
  83566. /**
  83567. * @const {boolean} Phaser.Core.Config#clearBeforeRender - Whether the game canvas will be cleared between each rendering frame. You can disable this if you have a full-screen background image or game object.
  83568. */
  83569. this.clearBeforeRender = GetValue(renderConfig, 'clearBeforeRender', true);
  83570. /**
  83571. * @const {boolean} Phaser.Core.Config#premultipliedAlpha - In WebGL mode, sets the drawing buffer to contain colors with pre-multiplied alpha.
  83572. */
  83573. this.premultipliedAlpha = GetValue(renderConfig, 'premultipliedAlpha', true);
  83574. /**
  83575. * @const {boolean} Phaser.Core.Config#failIfMajorPerformanceCaveat - Let the browser abort creating a WebGL context if it judges performance would be unacceptable.
  83576. */
  83577. this.failIfMajorPerformanceCaveat = GetValue(renderConfig, 'failIfMajorPerformanceCaveat', false);
  83578. /**
  83579. * @const {string} Phaser.Core.Config#powerPreference - "high-performance", "low-power" or "default". A hint to the browser on how much device power the game might use.
  83580. */
  83581. this.powerPreference = GetValue(renderConfig, 'powerPreference', 'default');
  83582. /**
  83583. * @const {integer} Phaser.Core.Config#batchSize - The default WebGL Batch size.
  83584. */
  83585. this.batchSize = GetValue(renderConfig, 'batchSize', 2000);
  83586. /**
  83587. * @const {integer} Phaser.Core.Config#maxLights - The maximum number of lights allowed to be visible within range of a single Camera in the LightManager.
  83588. */
  83589. this.maxLights = GetValue(renderConfig, 'maxLights', 10);
  83590. var bgc = GetValue(config, 'backgroundColor', 0);
  83591. /**
  83592. * @const {Phaser.Display.Color} Phaser.Core.Config#backgroundColor - The background color of the game canvas. The default is black. This value is ignored if `transparent` is set to `true`.
  83593. */
  83594. this.backgroundColor = ValueToColor(bgc);
  83595. if (bgc === 0 && this.transparent)
  83596. {
  83597. this.backgroundColor.alpha = 0;
  83598. }
  83599. /**
  83600. * @const {BootCallback} Phaser.Core.Config#preBoot - Called before Phaser boots. Useful for initializing anything not related to Phaser that Phaser may require while booting.
  83601. */
  83602. this.preBoot = GetValue(config, 'callbacks.preBoot', NOOP);
  83603. /**
  83604. * @const {BootCallback} Phaser.Core.Config#postBoot - A function to run at the end of the boot sequence. At this point, all the game systems have started and plugins have been loaded.
  83605. */
  83606. this.postBoot = GetValue(config, 'callbacks.postBoot', NOOP);
  83607. /**
  83608. * @const {PhysicsConfig} Phaser.Core.Config#physics - The Physics Configuration object.
  83609. */
  83610. this.physics = GetValue(config, 'physics', {});
  83611. /**
  83612. * @const {(boolean|string)} Phaser.Core.Config#defaultPhysicsSystem - The default physics system. It will be started for each scene. Either 'arcade', 'impact' or 'matter'.
  83613. */
  83614. this.defaultPhysicsSystem = GetValue(this.physics, 'default', false);
  83615. /**
  83616. * @const {string} Phaser.Core.Config#loaderBaseURL - A URL used to resolve paths given to the loader. Example: 'http://labs.phaser.io/assets/'.
  83617. */
  83618. this.loaderBaseURL = GetValue(config, 'loader.baseURL', '');
  83619. /**
  83620. * @const {string} Phaser.Core.Config#loaderPath - A URL path used to resolve relative paths given to the loader. Example: 'images/sprites/'.
  83621. */
  83622. this.loaderPath = GetValue(config, 'loader.path', '');
  83623. /**
  83624. * @const {integer} Phaser.Core.Config#loaderMaxParallelDownloads - Maximum parallel downloads allowed for resources (Default to 32).
  83625. */
  83626. this.loaderMaxParallelDownloads = GetValue(config, 'loader.maxParallelDownloads', 32);
  83627. /**
  83628. * @const {(string|undefined)} Phaser.Core.Config#loaderCrossOrigin - 'anonymous', 'use-credentials', or `undefined`. If you're not making cross-origin requests, leave this as `undefined`. See {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes}.
  83629. */
  83630. this.loaderCrossOrigin = GetValue(config, 'loader.crossOrigin', undefined);
  83631. /**
  83632. * @const {string} Phaser.Core.Config#loaderResponseType - The response type of the XHR request, e.g. `blob`, `text`, etc.
  83633. */
  83634. this.loaderResponseType = GetValue(config, 'loader.responseType', '');
  83635. /**
  83636. * @const {boolean} Phaser.Core.Config#loaderAsync - Should the XHR request use async or not?
  83637. */
  83638. this.loaderAsync = GetValue(config, 'loader.async', true);
  83639. /**
  83640. * @const {string} Phaser.Core.Config#loaderUser - Optional username for all XHR requests.
  83641. */
  83642. this.loaderUser = GetValue(config, 'loader.user', '');
  83643. /**
  83644. * @const {string} Phaser.Core.Config#loaderPassword - Optional password for all XHR requests.
  83645. */
  83646. this.loaderPassword = GetValue(config, 'loader.password', '');
  83647. /**
  83648. * @const {integer} Phaser.Core.Config#loaderTimeout - Optional XHR timeout value, in ms.
  83649. */
  83650. this.loaderTimeout = GetValue(config, 'loader.timeout', 0);
  83651. /*
  83652. * Allows `plugins` property to either be an array, in which case it just replaces
  83653. * the default plugins like previously, or a config object.
  83654. *
  83655. * plugins: {
  83656. * global: [
  83657. * { key: 'TestPlugin', plugin: TestPlugin, start: true, data: { msg: 'The plugin is alive' } },
  83658. * ],
  83659. * scene: [
  83660. * { key: 'WireFramePlugin', plugin: WireFramePlugin, systemKey: 'wireFramePlugin', sceneKey: 'wireframe' }
  83661. * ],
  83662. * default: [], OR
  83663. * defaultMerge: [
  83664. * 'ModPlayer'
  83665. * ]
  83666. * }
  83667. */
  83668. /**
  83669. * @const {any} Phaser.Core.Config#installGlobalPlugins - An array of global plugins to be installed.
  83670. */
  83671. this.installGlobalPlugins = [];
  83672. /**
  83673. * @const {any} Phaser.Core.Config#installScenePlugins - An array of Scene level plugins to be installed.
  83674. */
  83675. this.installScenePlugins = [];
  83676. var plugins = GetValue(config, 'plugins', null);
  83677. var defaultPlugins = DefaultPlugins.DefaultScene;
  83678. if (plugins)
  83679. {
  83680. // Old 3.7 array format?
  83681. if (Array.isArray(plugins))
  83682. {
  83683. this.defaultPlugins = plugins;
  83684. }
  83685. else if (IsPlainObject(plugins))
  83686. {
  83687. this.installGlobalPlugins = GetFastValue(plugins, 'global', []);
  83688. this.installScenePlugins = GetFastValue(plugins, 'scene', []);
  83689. if (Array.isArray(plugins.default))
  83690. {
  83691. defaultPlugins = plugins.default;
  83692. }
  83693. else if (Array.isArray(plugins.defaultMerge))
  83694. {
  83695. defaultPlugins = defaultPlugins.concat(plugins.defaultMerge);
  83696. }
  83697. }
  83698. }
  83699. /**
  83700. * @const {any} Phaser.Core.Config#defaultPlugins - The plugins installed into every Scene (in addition to CoreScene and Global).
  83701. */
  83702. this.defaultPlugins = defaultPlugins;
  83703. // Default / Missing Images
  83704. var pngPrefix = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAg';
  83705. /**
  83706. * @const {string} Phaser.Core.Config#defaultImage - A base64 encoded PNG that will be used as the default blank texture.
  83707. */
  83708. this.defaultImage = GetValue(config, 'images.default', pngPrefix + 'AQMAAABJtOi3AAAAA1BMVEX///+nxBvIAAAAAXRSTlMAQObYZgAAABVJREFUeF7NwIEAAAAAgKD9qdeocAMAoAABm3DkcAAAAABJRU5ErkJggg==');
  83709. /**
  83710. * @const {string} Phaser.Core.Config#missingImage - A base64 encoded PNG that will be used as the default texture when a texture is assigned that is missing or not loaded.
  83711. */
  83712. this.missingImage = GetValue(config, 'images.missing', pngPrefix + 'CAIAAAD8GO2jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJ9JREFUeNq01ssOwyAMRFG46v//Mt1ESmgh+DFmE2GPOBARKb2NVjo+17PXLD8a1+pl5+A+wSgFygymWYHBb0FtsKhJDdZlncG2IzJ4ayoMDv20wTmSMzClEgbWYNTAkQ0Z+OJ+A/eWnAaR9+oxCF4Os0H8htsMUp+pwcgBBiMNnAwF8GqIgL2hAzaGFFgZauDPKABmowZ4GL369/0rwACp2yA/ttmvsQAAAABJRU5ErkJggg==');
  83713. if (window)
  83714. {
  83715. if (window.FORCE_WEBGL)
  83716. {
  83717. this.renderType = CONST.WEBGL;
  83718. }
  83719. else if (window.FORCE_CANVAS)
  83720. {
  83721. this.renderType = CONST.CANVAS;
  83722. }
  83723. }
  83724. }
  83725. });
  83726. module.exports = Config;
  83727. /***/ }),
  83728. /* 391 */
  83729. /***/ (function(module, exports, __webpack_require__) {
  83730. /**
  83731. * @author Richard Davey <rich@photonstorm.com>
  83732. * @copyright 2019 Photon Storm Ltd.
  83733. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83734. */
  83735. /**
  83736. * @namespace Phaser.Math.Easing.Stepped
  83737. */
  83738. module.exports = __webpack_require__(1119);
  83739. /***/ }),
  83740. /* 392 */
  83741. /***/ (function(module, exports, __webpack_require__) {
  83742. /**
  83743. * @author Richard Davey <rich@photonstorm.com>
  83744. * @copyright 2019 Photon Storm Ltd.
  83745. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83746. */
  83747. /**
  83748. * @namespace Phaser.Math.Easing.Sine
  83749. */
  83750. module.exports = {
  83751. In: __webpack_require__(1122),
  83752. Out: __webpack_require__(1121),
  83753. InOut: __webpack_require__(1120)
  83754. };
  83755. /***/ }),
  83756. /* 393 */
  83757. /***/ (function(module, exports, __webpack_require__) {
  83758. /**
  83759. * @author Richard Davey <rich@photonstorm.com>
  83760. * @copyright 2019 Photon Storm Ltd.
  83761. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83762. */
  83763. /**
  83764. * @namespace Phaser.Math.Easing.Quintic
  83765. */
  83766. module.exports = {
  83767. In: __webpack_require__(1125),
  83768. Out: __webpack_require__(1124),
  83769. InOut: __webpack_require__(1123)
  83770. };
  83771. /***/ }),
  83772. /* 394 */
  83773. /***/ (function(module, exports, __webpack_require__) {
  83774. /**
  83775. * @author Richard Davey <rich@photonstorm.com>
  83776. * @copyright 2019 Photon Storm Ltd.
  83777. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83778. */
  83779. /**
  83780. * @namespace Phaser.Math.Easing.Quartic
  83781. */
  83782. module.exports = {
  83783. In: __webpack_require__(1128),
  83784. Out: __webpack_require__(1127),
  83785. InOut: __webpack_require__(1126)
  83786. };
  83787. /***/ }),
  83788. /* 395 */
  83789. /***/ (function(module, exports, __webpack_require__) {
  83790. /**
  83791. * @author Richard Davey <rich@photonstorm.com>
  83792. * @copyright 2019 Photon Storm Ltd.
  83793. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83794. */
  83795. /**
  83796. * @namespace Phaser.Math.Easing.Quadratic
  83797. */
  83798. module.exports = {
  83799. In: __webpack_require__(1131),
  83800. Out: __webpack_require__(1130),
  83801. InOut: __webpack_require__(1129)
  83802. };
  83803. /***/ }),
  83804. /* 396 */
  83805. /***/ (function(module, exports, __webpack_require__) {
  83806. /**
  83807. * @author Richard Davey <rich@photonstorm.com>
  83808. * @copyright 2019 Photon Storm Ltd.
  83809. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83810. */
  83811. /**
  83812. * @namespace Phaser.Math.Easing.Linear
  83813. */
  83814. module.exports = __webpack_require__(1132);
  83815. /***/ }),
  83816. /* 397 */
  83817. /***/ (function(module, exports, __webpack_require__) {
  83818. /**
  83819. * @author Richard Davey <rich@photonstorm.com>
  83820. * @copyright 2019 Photon Storm Ltd.
  83821. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83822. */
  83823. /**
  83824. * @namespace Phaser.Math.Easing.Expo
  83825. */
  83826. module.exports = {
  83827. In: __webpack_require__(1135),
  83828. Out: __webpack_require__(1134),
  83829. InOut: __webpack_require__(1133)
  83830. };
  83831. /***/ }),
  83832. /* 398 */
  83833. /***/ (function(module, exports, __webpack_require__) {
  83834. /**
  83835. * @author Richard Davey <rich@photonstorm.com>
  83836. * @copyright 2019 Photon Storm Ltd.
  83837. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83838. */
  83839. /**
  83840. * @namespace Phaser.Math.Easing.Elastic
  83841. */
  83842. module.exports = {
  83843. In: __webpack_require__(1138),
  83844. Out: __webpack_require__(1137),
  83845. InOut: __webpack_require__(1136)
  83846. };
  83847. /***/ }),
  83848. /* 399 */
  83849. /***/ (function(module, exports, __webpack_require__) {
  83850. /**
  83851. * @author Richard Davey <rich@photonstorm.com>
  83852. * @copyright 2019 Photon Storm Ltd.
  83853. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83854. */
  83855. /**
  83856. * @namespace Phaser.Math.Easing.Cubic
  83857. */
  83858. module.exports = {
  83859. In: __webpack_require__(1141),
  83860. Out: __webpack_require__(1140),
  83861. InOut: __webpack_require__(1139)
  83862. };
  83863. /***/ }),
  83864. /* 400 */
  83865. /***/ (function(module, exports, __webpack_require__) {
  83866. /**
  83867. * @author Richard Davey <rich@photonstorm.com>
  83868. * @copyright 2019 Photon Storm Ltd.
  83869. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83870. */
  83871. /**
  83872. * @namespace Phaser.Math.Easing.Circular
  83873. */
  83874. module.exports = {
  83875. In: __webpack_require__(1144),
  83876. Out: __webpack_require__(1143),
  83877. InOut: __webpack_require__(1142)
  83878. };
  83879. /***/ }),
  83880. /* 401 */
  83881. /***/ (function(module, exports, __webpack_require__) {
  83882. /**
  83883. * @author Richard Davey <rich@photonstorm.com>
  83884. * @copyright 2019 Photon Storm Ltd.
  83885. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83886. */
  83887. /**
  83888. * @namespace Phaser.Math.Easing.Bounce
  83889. */
  83890. module.exports = {
  83891. In: __webpack_require__(1147),
  83892. Out: __webpack_require__(1146),
  83893. InOut: __webpack_require__(1145)
  83894. };
  83895. /***/ }),
  83896. /* 402 */
  83897. /***/ (function(module, exports, __webpack_require__) {
  83898. /**
  83899. * @author Richard Davey <rich@photonstorm.com>
  83900. * @copyright 2019 Photon Storm Ltd.
  83901. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83902. */
  83903. /**
  83904. * @namespace Phaser.Math.Easing.Back
  83905. */
  83906. module.exports = {
  83907. In: __webpack_require__(1150),
  83908. Out: __webpack_require__(1149),
  83909. InOut: __webpack_require__(1148)
  83910. };
  83911. /***/ }),
  83912. /* 403 */
  83913. /***/ (function(module, exports, __webpack_require__) {
  83914. /**
  83915. * @author Richard Davey <rich@photonstorm.com>
  83916. * @copyright 2019 Photon Storm Ltd.
  83917. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83918. */
  83919. /**
  83920. * @namespace Phaser.Cameras.Scene2D.Effects
  83921. */
  83922. module.exports = {
  83923. Fade: __webpack_require__(1153),
  83924. Flash: __webpack_require__(1152),
  83925. Pan: __webpack_require__(1151),
  83926. Shake: __webpack_require__(1118),
  83927. Zoom: __webpack_require__(1117)
  83928. };
  83929. /***/ }),
  83930. /* 404 */
  83931. /***/ (function(module, exports, __webpack_require__) {
  83932. /**
  83933. * @author Richard Davey <rich@photonstorm.com>
  83934. * @copyright 2019 Photon Storm Ltd.
  83935. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83936. */
  83937. var Color = __webpack_require__(32);
  83938. /**
  83939. * Converts a CSS 'web' string into a Phaser Color object.
  83940. *
  83941. * The web string can be in the format `'rgb(r,g,b)'` or `'rgba(r,g,b,a)'` where r/g/b are in the range [0..255] and a is in the range [0..1].
  83942. *
  83943. * @function Phaser.Display.Color.RGBStringToColor
  83944. * @since 3.0.0
  83945. *
  83946. * @param {string} rgb - The CSS format color string, using the `rgb` or `rgba` format.
  83947. *
  83948. * @return {Phaser.Display.Color} A Color object.
  83949. */
  83950. var RGBStringToColor = function (rgb)
  83951. {
  83952. var color = new Color();
  83953. var result = (/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d+(?:\.\d+)?))?\s*\)$/).exec(rgb.toLowerCase());
  83954. if (result)
  83955. {
  83956. var r = parseInt(result[1], 10);
  83957. var g = parseInt(result[2], 10);
  83958. var b = parseInt(result[3], 10);
  83959. var a = (result[4] !== undefined) ? parseFloat(result[4]) : 1;
  83960. color.setTo(r, g, b, a * 255);
  83961. }
  83962. return color;
  83963. };
  83964. module.exports = RGBStringToColor;
  83965. /***/ }),
  83966. /* 405 */
  83967. /***/ (function(module, exports, __webpack_require__) {
  83968. /**
  83969. * @author Richard Davey <rich@photonstorm.com>
  83970. * @copyright 2019 Photon Storm Ltd.
  83971. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83972. */
  83973. var Color = __webpack_require__(32);
  83974. /**
  83975. * Converts an object containing `r`, `g`, `b` and `a` properties into a Color class instance.
  83976. *
  83977. * @function Phaser.Display.Color.ObjectToColor
  83978. * @since 3.0.0
  83979. *
  83980. * @param {InputColorObject} input - An object containing `r`, `g`, `b` and `a` properties in the range 0 to 255.
  83981. *
  83982. * @return {Phaser.Display.Color} A Color object.
  83983. */
  83984. var ObjectToColor = function (input)
  83985. {
  83986. return new Color(input.r, input.g, input.b, input.a);
  83987. };
  83988. module.exports = ObjectToColor;
  83989. /***/ }),
  83990. /* 406 */
  83991. /***/ (function(module, exports) {
  83992. /**
  83993. * @author Richard Davey <rich@photonstorm.com>
  83994. * @copyright 2019 Photon Storm Ltd.
  83995. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83996. */
  83997. /**
  83998. * Return the component parts of a color as an Object with the properties alpha, red, green, blue.
  83999. *
  84000. * Alpha will only be set if it exists in the given color (0xAARRGGBB)
  84001. *
  84002. * @function Phaser.Display.Color.IntegerToRGB
  84003. * @since 3.0.0
  84004. *
  84005. * @param {integer} input - The color value to convert into a Color object.
  84006. *
  84007. * @return {ColorObject} An object with the red, green and blue values set in the r, g and b properties.
  84008. */
  84009. var IntegerToRGB = function (color)
  84010. {
  84011. if (color > 16777215)
  84012. {
  84013. // The color value has an alpha component
  84014. return {
  84015. a: color >>> 24,
  84016. r: color >> 16 & 0xFF,
  84017. g: color >> 8 & 0xFF,
  84018. b: color & 0xFF
  84019. };
  84020. }
  84021. else
  84022. {
  84023. return {
  84024. a: 255,
  84025. r: color >> 16 & 0xFF,
  84026. g: color >> 8 & 0xFF,
  84027. b: color & 0xFF
  84028. };
  84029. }
  84030. };
  84031. module.exports = IntegerToRGB;
  84032. /***/ }),
  84033. /* 407 */
  84034. /***/ (function(module, exports, __webpack_require__) {
  84035. /**
  84036. * @author Richard Davey <rich@photonstorm.com>
  84037. * @copyright 2019 Photon Storm Ltd.
  84038. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84039. */
  84040. var Color = __webpack_require__(32);
  84041. var IntegerToRGB = __webpack_require__(406);
  84042. /**
  84043. * Converts the given color value into an instance of a Color object.
  84044. *
  84045. * @function Phaser.Display.Color.IntegerToColor
  84046. * @since 3.0.0
  84047. *
  84048. * @param {integer} input - The color value to convert into a Color object.
  84049. *
  84050. * @return {Phaser.Display.Color} A Color object.
  84051. */
  84052. var IntegerToColor = function (input)
  84053. {
  84054. var rgb = IntegerToRGB(input);
  84055. return new Color(rgb.r, rgb.g, rgb.b, rgb.a);
  84056. };
  84057. module.exports = IntegerToColor;
  84058. /***/ }),
  84059. /* 408 */
  84060. /***/ (function(module, exports) {
  84061. /**
  84062. * @author Richard Davey <rich@photonstorm.com>
  84063. * @copyright 2019 Photon Storm Ltd.
  84064. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84065. */
  84066. /**
  84067. * @typedef {object} HSVColorObject
  84068. *
  84069. * @property {number} h - The hue color value. A number between 0 and 1
  84070. * @property {number} s - The saturation color value. A number between 0 and 1
  84071. * @property {number} v - The lightness color value. A number between 0 and 1
  84072. */
  84073. /**
  84074. * Converts an RGB color value to HSV (hue, saturation and value).
  84075. * Conversion forumla from http://en.wikipedia.org/wiki/HSL_color_space.
  84076. * Assumes RGB values are contained in the set [0, 255] and returns h, s and v in the set [0, 1].
  84077. * Based on code by Michael Jackson (https://github.com/mjijackson)
  84078. *
  84079. * @function Phaser.Display.Color.RGBToHSV
  84080. * @since 3.0.0
  84081. *
  84082. * @param {integer} r - The red color value. A number between 0 and 255.
  84083. * @param {integer} g - The green color value. A number between 0 and 255.
  84084. * @param {integer} b - The blue color value. A number between 0 and 255.
  84085. * @param {(HSVColorObject|Phaser.Display.Color)} [out] - An object to store the color values in. If not given an HSV Color Object will be created.
  84086. *
  84087. * @return {(HSVColorObject|Phaser.Display.Color)} An object with the properties `h`, `s` and `v` set.
  84088. */
  84089. var RGBToHSV = function (r, g, b, out)
  84090. {
  84091. if (out === undefined) { out = { h: 0, s: 0, v: 0 }; }
  84092. r /= 255;
  84093. g /= 255;
  84094. b /= 255;
  84095. var min = Math.min(r, g, b);
  84096. var max = Math.max(r, g, b);
  84097. var d = max - min;
  84098. // achromatic by default
  84099. var h = 0;
  84100. var s = (max === 0) ? 0 : d / max;
  84101. var v = max;
  84102. if (max !== min)
  84103. {
  84104. if (max === r)
  84105. {
  84106. h = (g - b) / d + ((g < b) ? 6 : 0);
  84107. }
  84108. else if (max === g)
  84109. {
  84110. h = (b - r) / d + 2;
  84111. }
  84112. else if (max === b)
  84113. {
  84114. h = (r - g) / d + 4;
  84115. }
  84116. h /= 6;
  84117. }
  84118. if (out.hasOwnProperty('_h'))
  84119. {
  84120. out._h = h;
  84121. out._s = s;
  84122. out._v = v;
  84123. }
  84124. else
  84125. {
  84126. out.h = h;
  84127. out.s = s;
  84128. out.v = v;
  84129. }
  84130. return out;
  84131. };
  84132. module.exports = RGBToHSV;
  84133. /***/ }),
  84134. /* 409 */
  84135. /***/ (function(module, exports) {
  84136. /**
  84137. * @author Richard Davey <rich@photonstorm.com>
  84138. * @copyright 2019 Photon Storm Ltd.
  84139. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84140. */
  84141. /**
  84142. * Given an alpha and 3 color values this will return an integer representation of it.
  84143. *
  84144. * @function Phaser.Display.Color.GetColor32
  84145. * @since 3.0.0
  84146. *
  84147. * @param {integer} red - The red color value. A number between 0 and 255.
  84148. * @param {integer} green - The green color value. A number between 0 and 255.
  84149. * @param {integer} blue - The blue color value. A number between 0 and 255.
  84150. * @param {integer} alpha - The alpha color value. A number between 0 and 255.
  84151. *
  84152. * @return {number} The combined color value.
  84153. */
  84154. var GetColor32 = function (red, green, blue, alpha)
  84155. {
  84156. return alpha << 24 | red << 16 | green << 8 | blue;
  84157. };
  84158. module.exports = GetColor32;
  84159. /***/ }),
  84160. /* 410 */
  84161. /***/ (function(module, exports, __webpack_require__) {
  84162. /**
  84163. * @author Richard Davey <rich@photonstorm.com>
  84164. * @copyright 2019 Photon Storm Ltd.
  84165. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84166. */
  84167. var Color = __webpack_require__(32);
  84168. /**
  84169. * Converts a hex string into a Phaser Color object.
  84170. *
  84171. * The hex string can supplied as `'#0033ff'` or the short-hand format of `'#03f'`; it can begin with an optional "#" or "0x", or be unprefixed.
  84172. *
  84173. * An alpha channel is _not_ supported.
  84174. *
  84175. * @function Phaser.Display.Color.HexStringToColor
  84176. * @since 3.0.0
  84177. *
  84178. * @param {string} hex - The hex color value to convert, such as `#0033ff` or the short-hand format: `#03f`.
  84179. *
  84180. * @return {Phaser.Display.Color} A Color object populated by the values of the given string.
  84181. */
  84182. var HexStringToColor = function (hex)
  84183. {
  84184. var color = new Color();
  84185. // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
  84186. hex = hex.replace(/^(?:#|0x)?([a-f\d])([a-f\d])([a-f\d])$/i, function (m, r, g, b)
  84187. {
  84188. return r + r + g + g + b + b;
  84189. });
  84190. var result = (/^(?:#|0x)?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i).exec(hex);
  84191. if (result)
  84192. {
  84193. var r = parseInt(result[1], 16);
  84194. var g = parseInt(result[2], 16);
  84195. var b = parseInt(result[3], 16);
  84196. color.setTo(r, g, b);
  84197. }
  84198. return color;
  84199. };
  84200. module.exports = HexStringToColor;
  84201. /***/ }),
  84202. /* 411 */
  84203. /***/ (function(module, exports, __webpack_require__) {
  84204. /**
  84205. * @author Richard Davey <rich@photonstorm.com>
  84206. * @copyright 2019 Photon Storm Ltd.
  84207. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84208. */
  84209. var BaseCamera = __webpack_require__(131);
  84210. var CanvasPool = __webpack_require__(24);
  84211. var CenterOn = __webpack_require__(189);
  84212. var Clamp = __webpack_require__(23);
  84213. var Class = __webpack_require__(0);
  84214. var Components = __webpack_require__(13);
  84215. var Effects = __webpack_require__(403);
  84216. var Linear = __webpack_require__(129);
  84217. var Rectangle = __webpack_require__(10);
  84218. var Vector2 = __webpack_require__(3);
  84219. /**
  84220. * @classdesc
  84221. * A Camera.
  84222. *
  84223. * The Camera is the way in which all games are rendered in Phaser. They provide a view into your game world,
  84224. * and can be positioned, rotated, zoomed and scrolled accordingly.
  84225. *
  84226. * A Camera consists of two elements: The viewport and the scroll values.
  84227. *
  84228. * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are
  84229. * created the same size as your game, but their position and size can be set to anything. This means if you
  84230. * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game,
  84231. * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`).
  84232. *
  84233. * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this
  84234. * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the
  84235. * viewport, and changing the viewport has no impact on the scrolling.
  84236. *
  84237. * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method,
  84238. * allowing you to filter Game Objects out on a per-Camera basis.
  84239. *
  84240. * A Camera also has built-in special effects including Fade, Flash and Camera Shake.
  84241. *
  84242. * @class Camera
  84243. * @memberof Phaser.Cameras.Scene2D
  84244. * @constructor
  84245. * @since 3.0.0
  84246. *
  84247. * @extends Phaser.Cameras.Scene2D.BaseCamera
  84248. * @extends Phaser.GameObjects.Components.Flip
  84249. * @extends Phaser.GameObjects.Components.Tint
  84250. *
  84251. * @param {number} x - The x position of the Camera, relative to the top-left of the game canvas.
  84252. * @param {number} y - The y position of the Camera, relative to the top-left of the game canvas.
  84253. * @param {number} width - The width of the Camera, in pixels.
  84254. * @param {number} height - The height of the Camera, in pixels.
  84255. */
  84256. var Camera = new Class({
  84257. Extends: BaseCamera,
  84258. Mixins: [
  84259. Components.Flip,
  84260. Components.Tint
  84261. ],
  84262. initialize:
  84263. function Camera (x, y, width, height)
  84264. {
  84265. BaseCamera.call(this, x, y, width, height);
  84266. /**
  84267. * Does this Camera allow the Game Objects it renders to receive input events?
  84268. *
  84269. * @name Phaser.Cameras.Scene2D.Camera#inputEnabled
  84270. * @type {boolean}
  84271. * @default true
  84272. * @since 3.0.0
  84273. */
  84274. this.inputEnabled = true;
  84275. /**
  84276. * The Camera Fade effect handler.
  84277. * To fade this camera see the `Camera.fade` methods.
  84278. *
  84279. * @name Phaser.Cameras.Scene2D.Camera#fadeEffect
  84280. * @type {Phaser.Cameras.Scene2D.Effects.Fade}
  84281. * @since 3.5.0
  84282. */
  84283. this.fadeEffect = new Effects.Fade(this);
  84284. /**
  84285. * The Camera Flash effect handler.
  84286. * To flash this camera see the `Camera.flash` method.
  84287. *
  84288. * @name Phaser.Cameras.Scene2D.Camera#flashEffect
  84289. * @type {Phaser.Cameras.Scene2D.Effects.Flash}
  84290. * @since 3.5.0
  84291. */
  84292. this.flashEffect = new Effects.Flash(this);
  84293. /**
  84294. * The Camera Shake effect handler.
  84295. * To shake this camera see the `Camera.shake` method.
  84296. *
  84297. * @name Phaser.Cameras.Scene2D.Camera#shakeEffect
  84298. * @type {Phaser.Cameras.Scene2D.Effects.Shake}
  84299. * @since 3.5.0
  84300. */
  84301. this.shakeEffect = new Effects.Shake(this);
  84302. /**
  84303. * The Camera Pan effect handler.
  84304. * To pan this camera see the `Camera.pan` method.
  84305. *
  84306. * @name Phaser.Cameras.Scene2D.Camera#panEffect
  84307. * @type {Phaser.Cameras.Scene2D.Effects.Pan}
  84308. * @since 3.11.0
  84309. */
  84310. this.panEffect = new Effects.Pan(this);
  84311. /**
  84312. * The Camera Zoom effect handler.
  84313. * To zoom this camera see the `Camera.zoom` method.
  84314. *
  84315. * @name Phaser.Cameras.Scene2D.Camera#zoomEffect
  84316. * @type {Phaser.Cameras.Scene2D.Effects.Zoom}
  84317. * @since 3.11.0
  84318. */
  84319. this.zoomEffect = new Effects.Zoom(this);
  84320. /**
  84321. * The linear interpolation value to use when following a target.
  84322. *
  84323. * Can also be set via `setLerp` or as part of the `startFollow` call.
  84324. *
  84325. * The default values of 1 means the camera will instantly snap to the target coordinates.
  84326. * A lower value, such as 0.1 means the camera will more slowly track the target, giving
  84327. * a smooth transition. You can set the horizontal and vertical values independently, and also
  84328. * adjust this value in real-time during your game.
  84329. *
  84330. * Be sure to keep the value between 0 and 1. A value of zero will disable tracking on that axis.
  84331. *
  84332. * @name Phaser.Cameras.Scene2D.Camera#lerp
  84333. * @type {Phaser.Math.Vector2}
  84334. * @since 3.9.0
  84335. */
  84336. this.lerp = new Vector2(1, 1);
  84337. /**
  84338. * The values stored in this property are subtracted from the Camera targets position, allowing you to
  84339. * offset the camera from the actual target x/y coordinates by this amount.
  84340. * Can also be set via `setFollowOffset` or as part of the `startFollow` call.
  84341. *
  84342. * @name Phaser.Cameras.Scene2D.Camera#followOffset
  84343. * @type {Phaser.Math.Vector2}
  84344. * @since 3.9.0
  84345. */
  84346. this.followOffset = new Vector2();
  84347. /**
  84348. * The Camera dead zone.
  84349. *
  84350. * The deadzone is only used when the camera is following a target.
  84351. *
  84352. * It defines a rectangular region within which if the target is present, the camera will not scroll.
  84353. * If the target moves outside of this area, the camera will begin scrolling in order to follow it.
  84354. *
  84355. * The `lerp` values that you can set for a follower target also apply when using a deadzone.
  84356. *
  84357. * You can directly set this property to be an instance of a Rectangle. Or, you can use the
  84358. * `setDeadzone` method for a chainable approach.
  84359. *
  84360. * The rectangle you provide can have its dimensions adjusted dynamically, however, please
  84361. * note that its position is updated every frame, as it is constantly re-centered on the cameras mid point.
  84362. *
  84363. * Calling `setDeadzone` with no arguments will reset an active deadzone, as will setting this property
  84364. * to `null`.
  84365. *
  84366. * @name Phaser.Cameras.Scene2D.Camera#deadzone
  84367. * @type {?Phaser.Geom.Rectangle}
  84368. * @since 3.11.0
  84369. */
  84370. this.deadzone = null;
  84371. /**
  84372. * Internal follow target reference.
  84373. *
  84374. * @name Phaser.Cameras.Scene2D.Camera#_follow
  84375. * @type {?any}
  84376. * @private
  84377. * @default null
  84378. * @since 3.0.0
  84379. */
  84380. this._follow = null;
  84381. /**
  84382. * Is this Camera rendering directly to the canvas or to a texture?
  84383. *
  84384. * Enable rendering to texture with the method `setRenderToTexture` (just enabling this boolean won't be enough)
  84385. *
  84386. * Once enabled you can toggle it by switching this property.
  84387. *
  84388. * To properly remove a render texture you should call the `clearRenderToTexture()` method.
  84389. *
  84390. * @name Phaser.Cameras.Scene2D.Camera#renderToTexture
  84391. * @type {boolean}
  84392. * @default false
  84393. * @since 3.13.0
  84394. */
  84395. this.renderToTexture = false;
  84396. /**
  84397. * If this Camera has been set to render to a texture then this holds a reference
  84398. * to the HTML Canvas Element that the Camera is drawing to.
  84399. *
  84400. * Enable texture rendering using the method `setRenderToTexture`.
  84401. *
  84402. * This is only populated if Phaser is running with the Canvas Renderer.
  84403. *
  84404. * @name Phaser.Cameras.Scene2D.Camera#canvas
  84405. * @type {HTMLCanvasElement}
  84406. * @since 3.13.0
  84407. */
  84408. this.canvas = null;
  84409. /**
  84410. * If this Camera has been set to render to a texture then this holds a reference
  84411. * to the Rendering Context belonging to the Canvas element the Camera is drawing to.
  84412. *
  84413. * Enable texture rendering using the method `setRenderToTexture`.
  84414. *
  84415. * This is only populated if Phaser is running with the Canvas Renderer.
  84416. *
  84417. * @name Phaser.Cameras.Scene2D.Camera#context
  84418. * @type {CanvasRenderingContext2D}
  84419. * @since 3.13.0
  84420. */
  84421. this.context = null;
  84422. /**
  84423. * If this Camera has been set to render to a texture then this holds a reference
  84424. * to the GL Texture belonging the Camera is drawing to.
  84425. *
  84426. * Enable texture rendering using the method `setRenderToTexture`.
  84427. *
  84428. * This is only set if Phaser is running with the WebGL Renderer.
  84429. *
  84430. * @name Phaser.Cameras.Scene2D.Camera#glTexture
  84431. * @type {?WebGLTexture}
  84432. * @since 3.13.0
  84433. */
  84434. this.glTexture = null;
  84435. /**
  84436. * If this Camera has been set to render to a texture then this holds a reference
  84437. * to the GL Frame Buffer belonging the Camera is drawing to.
  84438. *
  84439. * Enable texture rendering using the method `setRenderToTexture`.
  84440. *
  84441. * This is only set if Phaser is running with the WebGL Renderer.
  84442. *
  84443. * @name Phaser.Cameras.Scene2D.Camera#framebuffer
  84444. * @type {?WebGLFramebuffer}
  84445. * @since 3.13.0
  84446. */
  84447. this.framebuffer = null;
  84448. /**
  84449. * If this Camera has been set to render to a texture and to use a custom pipeline,
  84450. * then this holds a reference to the pipeline the Camera is drawing with.
  84451. *
  84452. * Enable texture rendering using the method `setRenderToTexture`.
  84453. *
  84454. * This is only set if Phaser is running with the WebGL Renderer.
  84455. *
  84456. * @name Phaser.Cameras.Scene2D.Camera#pipeline
  84457. * @type {any}
  84458. * @since 3.13.0
  84459. */
  84460. this.pipeline = null;
  84461. },
  84462. /**
  84463. * Sets the Camera to render to a texture instead of to the main canvas.
  84464. *
  84465. * The Camera will redirect all Game Objects it's asked to render to this texture.
  84466. *
  84467. * During the render sequence, the texture itself will then be rendered to the main canvas.
  84468. *
  84469. * Doing this gives you the ability to modify the texture before this happens,
  84470. * allowing for special effects such as Camera specific shaders, or post-processing
  84471. * on the texture.
  84472. *
  84473. * If running under Canvas the Camera will render to its `canvas` property.
  84474. *
  84475. * If running under WebGL the Camera will create a frame buffer, which is stored in its `framebuffer` and `glTexture` properties.
  84476. *
  84477. * If you set a camera to render to a texture then it will emit 2 events during the render loop:
  84478. *
  84479. * First, it will emit the event `prerender`. This happens right before any Game Object's are drawn to the Camera texture.
  84480. *
  84481. * Then, it will emit the event `postrender`. This happens after all Game Object's have been drawn, but right before the
  84482. * Camera texture is rendered to the main game canvas. It's the final point at which you can manipulate the texture before
  84483. * it appears in-game.
  84484. *
  84485. * You should not enable this unless you plan on actually using the texture it creates
  84486. * somehow, otherwise you're just doubling the work required to render your game.
  84487. *
  84488. * To temporarily disable rendering to a texture, toggle the `renderToTexture` boolean.
  84489. *
  84490. * If you no longer require the Camera to render to a texture, call the `clearRenderToTexture` method,
  84491. * which will delete the respective textures and free-up resources.
  84492. *
  84493. * @method Phaser.Cameras.Scene2D.Camera#setRenderToTexture
  84494. * @since 3.13.0
  84495. *
  84496. * @param {(string|Phaser.Renderer.WebGL.WebGLPipeline)} [pipeline] - An optional WebGL Pipeline to render with, can be either a string which is the name of the pipeline, or a pipeline reference.
  84497. *
  84498. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84499. */
  84500. setRenderToTexture: function (pipeline)
  84501. {
  84502. var renderer = this.scene.sys.game.renderer;
  84503. if (renderer.gl)
  84504. {
  84505. this.glTexture = renderer.createTextureFromSource(null, this.width, this.height, 0);
  84506. this.framebuffer = renderer.createFramebuffer(this.width, this.height, this.glTexture, false);
  84507. }
  84508. else
  84509. {
  84510. this.canvas = CanvasPool.create2D(this, this.width, this.height);
  84511. this.context = this.canvas.getContext('2d');
  84512. }
  84513. this.renderToTexture = true;
  84514. if (pipeline)
  84515. {
  84516. this.setPipeline(pipeline);
  84517. }
  84518. return this;
  84519. },
  84520. /**
  84521. * Sets the WebGL pipeline this Camera is using when rendering to a texture.
  84522. *
  84523. * You can pass either the string-based name of the pipeline, or a reference to the pipeline itself.
  84524. *
  84525. * Call this method with no arguments to clear any previously set pipeline.
  84526. *
  84527. * @method Phaser.Cameras.Scene2D.Camera#setPipeline
  84528. * @since 3.13.0
  84529. *
  84530. * @param {(string|Phaser.Renderer.WebGL.WebGLPipeline)} [pipeline] - The WebGL Pipeline to render with, can be either a string which is the name of the pipeline, or a pipeline reference. Or if left empty it will clear the pipeline.
  84531. *
  84532. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84533. */
  84534. setPipeline: function (pipeline)
  84535. {
  84536. if (typeof pipeline === 'string')
  84537. {
  84538. var renderer = this.scene.sys.game.renderer;
  84539. if (renderer.gl && renderer.hasPipeline(pipeline))
  84540. {
  84541. this.pipeline = renderer.getPipeline(pipeline);
  84542. }
  84543. }
  84544. else
  84545. {
  84546. this.pipeline = pipeline;
  84547. }
  84548. return this;
  84549. },
  84550. /**
  84551. * If this Camera was set to render to a texture, this will clear the resources it was using and
  84552. * redirect it to render back to the primary Canvas again.
  84553. *
  84554. * If you only wish to temporarily disable rendering to a texture then you can toggle the
  84555. * property `renderToTexture` instead.
  84556. *
  84557. * @method Phaser.Cameras.Scene2D.Camera#clearRenderToTexture
  84558. * @since 3.13.0
  84559. *
  84560. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84561. */
  84562. clearRenderToTexture: function ()
  84563. {
  84564. var renderer = this.scene.sys.game.renderer;
  84565. if (renderer.gl)
  84566. {
  84567. if (this.framebuffer)
  84568. {
  84569. renderer.deleteFramebuffer(this.framebuffer);
  84570. }
  84571. if (this.glTexture)
  84572. {
  84573. renderer.deleteTexture(this.glTexture);
  84574. }
  84575. this.framebuffer = null;
  84576. this.glTexture = null;
  84577. this.pipeline = null;
  84578. }
  84579. else
  84580. {
  84581. CanvasPool.remove(this);
  84582. this.canvas = null;
  84583. this.context = null;
  84584. }
  84585. this.renderToTexture = false;
  84586. return this;
  84587. },
  84588. /**
  84589. * Sets the Camera dead zone.
  84590. *
  84591. * The deadzone is only used when the camera is following a target.
  84592. *
  84593. * It defines a rectangular region within which if the target is present, the camera will not scroll.
  84594. * If the target moves outside of this area, the camera will begin scrolling in order to follow it.
  84595. *
  84596. * The deadzone rectangle is re-positioned every frame so that it is centered on the mid-point
  84597. * of the camera. This allows you to use the object for additional game related checks, such as
  84598. * testing if an object is within it or not via a Rectangle.contains call.
  84599. *
  84600. * The `lerp` values that you can set for a follower target also apply when using a deadzone.
  84601. *
  84602. * Calling this method with no arguments will reset an active deadzone.
  84603. *
  84604. * @method Phaser.Cameras.Scene2D.Camera#setDeadzone
  84605. * @since 3.11.0
  84606. *
  84607. * @param {number} [width] - The width of the deadzone rectangle in pixels. If not specified the deadzone is removed.
  84608. * @param {number} [height] - The height of the deadzone rectangle in pixels.
  84609. *
  84610. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84611. */
  84612. setDeadzone: function (width, height)
  84613. {
  84614. if (width === undefined)
  84615. {
  84616. this.deadzone = null;
  84617. }
  84618. else
  84619. {
  84620. if (this.deadzone)
  84621. {
  84622. this.deadzone.width = width;
  84623. this.deadzone.height = height;
  84624. }
  84625. else
  84626. {
  84627. this.deadzone = new Rectangle(0, 0, width, height);
  84628. }
  84629. if (this._follow)
  84630. {
  84631. var originX = this.width / 2;
  84632. var originY = this.height / 2;
  84633. var fx = this._follow.x - this.followOffset.x;
  84634. var fy = this._follow.y - this.followOffset.y;
  84635. this.midPoint.set(fx, fy);
  84636. this.scrollX = fx - originX;
  84637. this.scrollY = fy - originY;
  84638. }
  84639. CenterOn(this.deadzone, this.midPoint.x, this.midPoint.y);
  84640. }
  84641. return this;
  84642. },
  84643. /**
  84644. * Fades the Camera in from the given color over the duration specified.
  84645. *
  84646. * @method Phaser.Cameras.Scene2D.Camera#fadeIn
  84647. * @fires Phaser.Cameras.Scene2D.Events#FADE_IN_START
  84648. * @fires Phaser.Cameras.Scene2D.Events#FADE_IN_COMPLETE
  84649. * @since 3.3.0
  84650. *
  84651. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  84652. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  84653. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  84654. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  84655. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  84656. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  84657. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  84658. *
  84659. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84660. */
  84661. fadeIn: function (duration, red, green, blue, callback, context)
  84662. {
  84663. return this.fadeEffect.start(false, duration, red, green, blue, true, callback, context);
  84664. },
  84665. /**
  84666. * Fades the Camera out to the given color over the duration specified.
  84667. * This is an alias for Camera.fade that forces the fade to start, regardless of existing fades.
  84668. *
  84669. * @method Phaser.Cameras.Scene2D.Camera#fadeOut
  84670. * @fires Phaser.Cameras.Scene2D.Events#FADE_OUT_START
  84671. * @fires Phaser.Cameras.Scene2D.Events#FADE_OUT_COMPLETE
  84672. * @since 3.3.0
  84673. *
  84674. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  84675. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  84676. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  84677. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  84678. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  84679. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  84680. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  84681. *
  84682. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84683. */
  84684. fadeOut: function (duration, red, green, blue, callback, context)
  84685. {
  84686. return this.fadeEffect.start(true, duration, red, green, blue, true, callback, context);
  84687. },
  84688. /**
  84689. * Fades the Camera from the given color to transparent over the duration specified.
  84690. *
  84691. * @method Phaser.Cameras.Scene2D.Camera#fadeFrom
  84692. * @fires Phaser.Cameras.Scene2D.Events#FADE_IN_START
  84693. * @fires Phaser.Cameras.Scene2D.Events#FADE_IN_COMPLETE
  84694. * @since 3.5.0
  84695. *
  84696. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  84697. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  84698. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  84699. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  84700. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  84701. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  84702. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  84703. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  84704. *
  84705. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84706. */
  84707. fadeFrom: function (duration, red, green, blue, force, callback, context)
  84708. {
  84709. return this.fadeEffect.start(false, duration, red, green, blue, force, callback, context);
  84710. },
  84711. /**
  84712. * Fades the Camera from transparent to the given color over the duration specified.
  84713. *
  84714. * @method Phaser.Cameras.Scene2D.Camera#fade
  84715. * @fires Phaser.Cameras.Scene2D.Events#FADE_OUT_START
  84716. * @fires Phaser.Cameras.Scene2D.Events#FADE_OUT_COMPLETE
  84717. * @since 3.0.0
  84718. *
  84719. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  84720. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  84721. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  84722. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  84723. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  84724. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  84725. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  84726. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  84727. *
  84728. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84729. */
  84730. fade: function (duration, red, green, blue, force, callback, context)
  84731. {
  84732. return this.fadeEffect.start(true, duration, red, green, blue, force, callback, context);
  84733. },
  84734. /**
  84735. * Flashes the Camera by setting it to the given color immediately and then fading it away again quickly over the duration specified.
  84736. *
  84737. * @method Phaser.Cameras.Scene2D.Camera#flash
  84738. * @fires Phaser.Cameras.Scene2D.Events#FLASH_START
  84739. * @fires Phaser.Cameras.Scene2D.Events#FLASH_COMPLETE
  84740. * @since 3.0.0
  84741. *
  84742. * @param {integer} [duration=250] - The duration of the effect in milliseconds.
  84743. * @param {integer} [red=255] - The amount to fade the red channel towards. A value between 0 and 255.
  84744. * @param {integer} [green=255] - The amount to fade the green channel towards. A value between 0 and 255.
  84745. * @param {integer} [blue=255] - The amount to fade the blue channel towards. A value between 0 and 255.
  84746. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  84747. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  84748. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  84749. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  84750. *
  84751. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84752. */
  84753. flash: function (duration, red, green, blue, force, callback, context)
  84754. {
  84755. return this.flashEffect.start(duration, red, green, blue, force, callback, context);
  84756. },
  84757. /**
  84758. * Shakes the Camera by the given intensity over the duration specified.
  84759. *
  84760. * @method Phaser.Cameras.Scene2D.Camera#shake
  84761. * @fires Phaser.Cameras.Scene2D.Events#SHAKE_START
  84762. * @fires Phaser.Cameras.Scene2D.Events#SHAKE_COMPLETE
  84763. * @since 3.0.0
  84764. *
  84765. * @param {integer} [duration=100] - The duration of the effect in milliseconds.
  84766. * @param {number} [intensity=0.05] - The intensity of the shake.
  84767. * @param {boolean} [force=false] - Force the shake effect to start immediately, even if already running.
  84768. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  84769. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  84770. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  84771. *
  84772. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84773. */
  84774. shake: function (duration, intensity, force, callback, context)
  84775. {
  84776. return this.shakeEffect.start(duration, intensity, force, callback, context);
  84777. },
  84778. /**
  84779. * This effect will scroll the Camera so that the center of its viewport finishes at the given destination,
  84780. * over the duration and with the ease specified.
  84781. *
  84782. * @method Phaser.Cameras.Scene2D.Camera#pan
  84783. * @fires Phaser.Cameras.Scene2D.Events#PAN_START
  84784. * @fires Phaser.Cameras.Scene2D.Events#PAN_COMPLETE
  84785. * @since 3.11.0
  84786. *
  84787. * @param {number} x - The destination x coordinate to scroll the center of the Camera viewport to.
  84788. * @param {number} y - The destination y coordinate to scroll the center of the Camera viewport to.
  84789. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  84790. * @param {(string|function)} [ease='Linear'] - The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function.
  84791. * @param {boolean} [force=false] - Force the pan effect to start immediately, even if already running.
  84792. * @param {CameraPanCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  84793. * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is,
  84794. * the current camera scroll x coordinate and the current camera scroll y coordinate.
  84795. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  84796. *
  84797. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84798. */
  84799. pan: function (x, y, duration, ease, force, callback, context)
  84800. {
  84801. return this.panEffect.start(x, y, duration, ease, force, callback, context);
  84802. },
  84803. /**
  84804. * This effect will zoom the Camera to the given scale, over the duration and with the ease specified.
  84805. *
  84806. * @method Phaser.Cameras.Scene2D.Camera#zoomTo
  84807. * @fires Phaser.Cameras.Scene2D.Events#ZOOM_START
  84808. * @fires Phaser.Cameras.Scene2D.Events#ZOOM_COMPLETE
  84809. * @since 3.11.0
  84810. *
  84811. * @param {number} zoom - The target Camera zoom value.
  84812. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  84813. * @param {(string|function)} [ease='Linear'] - The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function.
  84814. * @param {boolean} [force=false] - Force the pan effect to start immediately, even if already running.
  84815. * @param {CameraPanCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  84816. * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is,
  84817. * the current camera scroll x coordinate and the current camera scroll y coordinate.
  84818. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  84819. *
  84820. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  84821. */
  84822. zoomTo: function (zoom, duration, ease, force, callback, context)
  84823. {
  84824. return this.zoomEffect.start(zoom, duration, ease, force, callback, context);
  84825. },
  84826. /**
  84827. * Internal preRender step.
  84828. *
  84829. * @method Phaser.Cameras.Scene2D.Camera#preRender
  84830. * @protected
  84831. * @since 3.0.0
  84832. *
  84833. * @param {number} resolution - The game resolution, as set in the Scale Manager.
  84834. */
  84835. preRender: function (resolution)
  84836. {
  84837. var width = this.width;
  84838. var height = this.height;
  84839. var halfWidth = width * 0.5;
  84840. var halfHeight = height * 0.5;
  84841. var zoom = this.zoom * resolution;
  84842. var matrix = this.matrix;
  84843. var originX = width * this.originX;
  84844. var originY = height * this.originY;
  84845. var follow = this._follow;
  84846. var deadzone = this.deadzone;
  84847. var sx = this.scrollX;
  84848. var sy = this.scrollY;
  84849. if (deadzone)
  84850. {
  84851. CenterOn(deadzone, this.midPoint.x, this.midPoint.y);
  84852. }
  84853. if (follow)
  84854. {
  84855. var fx = (follow.x - this.followOffset.x);
  84856. var fy = (follow.y - this.followOffset.y);
  84857. if (deadzone)
  84858. {
  84859. if (fx < deadzone.x)
  84860. {
  84861. sx = Linear(sx, sx - (deadzone.x - fx), this.lerp.x);
  84862. }
  84863. else if (fx > deadzone.right)
  84864. {
  84865. sx = Linear(sx, sx + (fx - deadzone.right), this.lerp.x);
  84866. }
  84867. if (fy < deadzone.y)
  84868. {
  84869. sy = Linear(sy, sy - (deadzone.y - fy), this.lerp.y);
  84870. }
  84871. else if (fy > deadzone.bottom)
  84872. {
  84873. sy = Linear(sy, sy + (fy - deadzone.bottom), this.lerp.y);
  84874. }
  84875. }
  84876. else
  84877. {
  84878. sx = Linear(sx, fx - originX, this.lerp.x);
  84879. sy = Linear(sy, fy - originY, this.lerp.y);
  84880. }
  84881. }
  84882. if (this.useBounds)
  84883. {
  84884. sx = this.clampX(sx);
  84885. sy = this.clampY(sy);
  84886. }
  84887. if (this.roundPixels)
  84888. {
  84889. originX = Math.round(originX);
  84890. originY = Math.round(originY);
  84891. }
  84892. // Values are in pixels and not impacted by zooming the Camera
  84893. this.scrollX = sx;
  84894. this.scrollY = sy;
  84895. var midX = sx + halfWidth;
  84896. var midY = sy + halfHeight;
  84897. // The center of the camera, in world space, so taking zoom into account
  84898. // Basically the pixel value of what it's looking at in the middle of the cam
  84899. this.midPoint.set(midX, midY);
  84900. var displayWidth = width / zoom;
  84901. var displayHeight = height / zoom;
  84902. this.worldView.setTo(
  84903. midX - (displayWidth / 2),
  84904. midY - (displayHeight / 2),
  84905. displayWidth,
  84906. displayHeight
  84907. );
  84908. matrix.applyITRS(this.x + originX, this.y + originY, this.rotation, zoom, zoom);
  84909. matrix.translate(-originX, -originY);
  84910. this.shakeEffect.preRender();
  84911. },
  84912. /**
  84913. * Sets the linear interpolation value to use when following a target.
  84914. *
  84915. * The default values of 1 means the camera will instantly snap to the target coordinates.
  84916. * A lower value, such as 0.1 means the camera will more slowly track the target, giving
  84917. * a smooth transition. You can set the horizontal and vertical values independently, and also
  84918. * adjust this value in real-time during your game.
  84919. *
  84920. * Be sure to keep the value between 0 and 1. A value of zero will disable tracking on that axis.
  84921. *
  84922. * @method Phaser.Cameras.Scene2D.Camera#setLerp
  84923. * @since 3.9.0
  84924. *
  84925. * @param {number} [x=1] - The amount added to the horizontal linear interpolation of the follow target.
  84926. * @param {number} [y=1] - The amount added to the vertical linear interpolation of the follow target.
  84927. *
  84928. * @return {this} This Camera instance.
  84929. */
  84930. setLerp: function (x, y)
  84931. {
  84932. if (x === undefined) { x = 1; }
  84933. if (y === undefined) { y = x; }
  84934. this.lerp.set(x, y);
  84935. return this;
  84936. },
  84937. /**
  84938. * Sets the horizontal and vertical offset of the camera from its follow target.
  84939. * The values are subtracted from the targets position during the Cameras update step.
  84940. *
  84941. * @method Phaser.Cameras.Scene2D.Camera#setFollowOffset
  84942. * @since 3.9.0
  84943. *
  84944. * @param {number} [x=0] - The horizontal offset from the camera follow target.x position.
  84945. * @param {number} [y=0] - The vertical offset from the camera follow target.y position.
  84946. *
  84947. * @return {this} This Camera instance.
  84948. */
  84949. setFollowOffset: function (x, y)
  84950. {
  84951. if (x === undefined) { x = 0; }
  84952. if (y === undefined) { y = 0; }
  84953. this.followOffset.set(x, y);
  84954. return this;
  84955. },
  84956. /**
  84957. * Sets the Camera to follow a Game Object.
  84958. *
  84959. * When enabled the Camera will automatically adjust its scroll position to keep the target Game Object
  84960. * in its center.
  84961. *
  84962. * You can set the linear interpolation value used in the follow code.
  84963. * Use low lerp values (such as 0.1) to automatically smooth the camera motion.
  84964. *
  84965. * If you find you're getting a slight "jitter" effect when following an object it's probably to do with sub-pixel
  84966. * rendering of the targets position. This can be rounded by setting the `roundPixels` argument to `true` to
  84967. * force full pixel rounding rendering. Note that this can still be broken if you have specified a non-integer zoom
  84968. * value on the camera. So be sure to keep the camera zoom to integers.
  84969. *
  84970. * @method Phaser.Cameras.Scene2D.Camera#startFollow
  84971. * @since 3.0.0
  84972. *
  84973. * @param {(Phaser.GameObjects.GameObject|object)} target - The target for the Camera to follow.
  84974. * @param {boolean} [roundPixels=false] - Round the camera position to whole integers to avoid sub-pixel rendering?
  84975. * @param {number} [lerpX=1] - A value between 0 and 1. This value specifies the amount of linear interpolation to use when horizontally tracking the target. The closer the value to 1, the faster the camera will track.
  84976. * @param {number} [lerpY=1] - A value between 0 and 1. This value specifies the amount of linear interpolation to use when vertically tracking the target. The closer the value to 1, the faster the camera will track.
  84977. * @param {number} [offsetX=0] - The horizontal offset from the camera follow target.x position.
  84978. * @param {number} [offsetY=0] - The vertical offset from the camera follow target.y position.
  84979. *
  84980. * @return {this} This Camera instance.
  84981. */
  84982. startFollow: function (target, roundPixels, lerpX, lerpY, offsetX, offsetY)
  84983. {
  84984. if (roundPixels === undefined) { roundPixels = false; }
  84985. if (lerpX === undefined) { lerpX = 1; }
  84986. if (lerpY === undefined) { lerpY = lerpX; }
  84987. if (offsetX === undefined) { offsetX = 0; }
  84988. if (offsetY === undefined) { offsetY = offsetX; }
  84989. this._follow = target;
  84990. this.roundPixels = roundPixels;
  84991. lerpX = Clamp(lerpX, 0, 1);
  84992. lerpY = Clamp(lerpY, 0, 1);
  84993. this.lerp.set(lerpX, lerpY);
  84994. this.followOffset.set(offsetX, offsetY);
  84995. var originX = this.width / 2;
  84996. var originY = this.height / 2;
  84997. var fx = target.x - offsetX;
  84998. var fy = target.y - offsetY;
  84999. this.midPoint.set(fx, fy);
  85000. this.scrollX = fx - originX;
  85001. this.scrollY = fy - originY;
  85002. return this;
  85003. },
  85004. /**
  85005. * Stops a Camera from following a Game Object, if previously set via `Camera.startFollow`.
  85006. *
  85007. * @method Phaser.Cameras.Scene2D.Camera#stopFollow
  85008. * @since 3.0.0
  85009. *
  85010. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  85011. */
  85012. stopFollow: function ()
  85013. {
  85014. this._follow = null;
  85015. return this;
  85016. },
  85017. /**
  85018. * Resets any active FX, such as a fade, flash or shake. Useful to call after a fade in order to
  85019. * remove the fade.
  85020. *
  85021. * @method Phaser.Cameras.Scene2D.Camera#resetFX
  85022. * @since 3.0.0
  85023. *
  85024. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  85025. */
  85026. resetFX: function ()
  85027. {
  85028. this.panEffect.reset();
  85029. this.shakeEffect.reset();
  85030. this.flashEffect.reset();
  85031. this.fadeEffect.reset();
  85032. return this;
  85033. },
  85034. /**
  85035. * Internal method called automatically by the Camera Manager.
  85036. *
  85037. * @method Phaser.Cameras.Scene2D.Camera#update
  85038. * @protected
  85039. * @since 3.0.0
  85040. *
  85041. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  85042. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  85043. */
  85044. update: function (time, delta)
  85045. {
  85046. if (this.visible)
  85047. {
  85048. this.panEffect.update(time, delta);
  85049. this.zoomEffect.update(time, delta);
  85050. this.shakeEffect.update(time, delta);
  85051. this.flashEffect.update(time, delta);
  85052. this.fadeEffect.update(time, delta);
  85053. }
  85054. },
  85055. /**
  85056. * Destroys this Camera instance. You rarely need to call this directly.
  85057. *
  85058. * Called by the Camera Manager. If you wish to destroy a Camera please use `CameraManager.remove` as
  85059. * cameras are stored in a pool, ready for recycling later, and calling this directly will prevent that.
  85060. *
  85061. * @method Phaser.Cameras.Scene2D.Camera#destroy
  85062. * @fires CameraDestroyEvent
  85063. * @since 3.0.0
  85064. */
  85065. destroy: function ()
  85066. {
  85067. this.clearRenderToTexture();
  85068. this.resetFX();
  85069. BaseCamera.prototype.destroy.call(this);
  85070. this._follow = null;
  85071. this.deadzone = null;
  85072. }
  85073. });
  85074. module.exports = Camera;
  85075. /***/ }),
  85076. /* 412 */
  85077. /***/ (function(module, exports, __webpack_require__) {
  85078. /**
  85079. * @author Richard Davey <rich@photonstorm.com>
  85080. * @copyright 2019 Photon Storm Ltd.
  85081. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85082. */
  85083. var BaseCache = __webpack_require__(414);
  85084. var Class = __webpack_require__(0);
  85085. var GameEvents = __webpack_require__(26);
  85086. /**
  85087. * @classdesc
  85088. * The Cache Manager is the global cache owned and maintained by the Game instance.
  85089. *
  85090. * Various systems, such as the file Loader, rely on this cache in order to store the files
  85091. * it has loaded. The manager itself doesn't store any files, but instead owns multiple BaseCache
  85092. * instances, one per type of file. You can also add your own custom caches.
  85093. *
  85094. * @class CacheManager
  85095. * @memberof Phaser.Cache
  85096. * @constructor
  85097. * @since 3.0.0
  85098. *
  85099. * @param {Phaser.Game} game - A reference to the Phaser.Game instance that owns this CacheManager.
  85100. */
  85101. var CacheManager = new Class({
  85102. initialize:
  85103. function CacheManager (game)
  85104. {
  85105. /**
  85106. * A reference to the Phaser.Game instance that owns this CacheManager.
  85107. *
  85108. * @name Phaser.Cache.CacheManager#game
  85109. * @type {Phaser.Game}
  85110. * @protected
  85111. * @since 3.0.0
  85112. */
  85113. this.game = game;
  85114. /**
  85115. * A Cache storing all binary files, typically added via the Loader.
  85116. *
  85117. * @name Phaser.Cache.CacheManager#binary
  85118. * @type {Phaser.Cache.BaseCache}
  85119. * @since 3.0.0
  85120. */
  85121. this.binary = new BaseCache();
  85122. /**
  85123. * A Cache storing all bitmap font data files, typically added via the Loader.
  85124. * Only the font data is stored in this cache, the textures are part of the Texture Manager.
  85125. *
  85126. * @name Phaser.Cache.CacheManager#bitmapFont
  85127. * @type {Phaser.Cache.BaseCache}
  85128. * @since 3.0.0
  85129. */
  85130. this.bitmapFont = new BaseCache();
  85131. /**
  85132. * A Cache storing all JSON data files, typically added via the Loader.
  85133. *
  85134. * @name Phaser.Cache.CacheManager#json
  85135. * @type {Phaser.Cache.BaseCache}
  85136. * @since 3.0.0
  85137. */
  85138. this.json = new BaseCache();
  85139. /**
  85140. * A Cache storing all physics data files, typically added via the Loader.
  85141. *
  85142. * @name Phaser.Cache.CacheManager#physics
  85143. * @type {Phaser.Cache.BaseCache}
  85144. * @since 3.0.0
  85145. */
  85146. this.physics = new BaseCache();
  85147. /**
  85148. * A Cache storing all shader source files, typically added via the Loader.
  85149. *
  85150. * @name Phaser.Cache.CacheManager#shader
  85151. * @type {Phaser.Cache.BaseCache}
  85152. * @since 3.0.0
  85153. */
  85154. this.shader = new BaseCache();
  85155. /**
  85156. * A Cache storing all non-streaming audio files, typically added via the Loader.
  85157. *
  85158. * @name Phaser.Cache.CacheManager#audio
  85159. * @type {Phaser.Cache.BaseCache}
  85160. * @since 3.0.0
  85161. */
  85162. this.audio = new BaseCache();
  85163. /**
  85164. * A Cache storing all text files, typically added via the Loader.
  85165. *
  85166. * @name Phaser.Cache.CacheManager#text
  85167. * @type {Phaser.Cache.BaseCache}
  85168. * @since 3.0.0
  85169. */
  85170. this.text = new BaseCache();
  85171. /**
  85172. * A Cache storing all html files, typically added via the Loader.
  85173. *
  85174. * @name Phaser.Cache.CacheManager#html
  85175. * @type {Phaser.Cache.BaseCache}
  85176. * @since 3.12.0
  85177. */
  85178. this.html = new BaseCache();
  85179. /**
  85180. * A Cache storing all WaveFront OBJ files, typically added via the Loader.
  85181. *
  85182. * @name Phaser.Cache.CacheManager#obj
  85183. * @type {Phaser.Cache.BaseCache}
  85184. * @since 3.0.0
  85185. */
  85186. this.obj = new BaseCache();
  85187. /**
  85188. * A Cache storing all tilemap data files, typically added via the Loader.
  85189. * Only the data is stored in this cache, the textures are part of the Texture Manager.
  85190. *
  85191. * @name Phaser.Cache.CacheManager#tilemap
  85192. * @type {Phaser.Cache.BaseCache}
  85193. * @since 3.0.0
  85194. */
  85195. this.tilemap = new BaseCache();
  85196. /**
  85197. * A Cache storing all xml data files, typically added via the Loader.
  85198. *
  85199. * @name Phaser.Cache.CacheManager#xml
  85200. * @type {Phaser.Cache.BaseCache}
  85201. * @since 3.0.0
  85202. */
  85203. this.xml = new BaseCache();
  85204. /**
  85205. * An object that contains your own custom BaseCache entries.
  85206. * Add to this via the `addCustom` method.
  85207. *
  85208. * @name Phaser.Cache.CacheManager#custom
  85209. * @type {Object.<Phaser.Cache.BaseCache>}
  85210. * @since 3.0.0
  85211. */
  85212. this.custom = {};
  85213. this.game.events.once(GameEvents.DESTROY, this.destroy, this);
  85214. },
  85215. /**
  85216. * Add your own custom Cache for storing your own files.
  85217. * The cache will be available under `Cache.custom.key`.
  85218. * The cache will only be created if the key is not already in use.
  85219. *
  85220. * @method Phaser.Cache.CacheManager#addCustom
  85221. * @since 3.0.0
  85222. *
  85223. * @param {string} key - The unique key of your custom cache.
  85224. *
  85225. * @return {Phaser.Cache.BaseCache} A reference to the BaseCache that was created. If the key was already in use, a reference to the existing cache is returned instead.
  85226. */
  85227. addCustom: function (key)
  85228. {
  85229. if (!this.custom.hasOwnProperty(key))
  85230. {
  85231. this.custom[key] = new BaseCache();
  85232. }
  85233. return this.custom[key];
  85234. },
  85235. /**
  85236. * Removes all entries from all BaseCaches and destroys all custom caches.
  85237. *
  85238. * @method Phaser.Cache.CacheManager#destroy
  85239. * @since 3.0.0
  85240. */
  85241. destroy: function ()
  85242. {
  85243. var keys = [
  85244. 'binary',
  85245. 'bitmapFont',
  85246. 'json',
  85247. 'physics',
  85248. 'shader',
  85249. 'audio',
  85250. 'text',
  85251. 'html',
  85252. 'obj',
  85253. 'tilemap',
  85254. 'xml'
  85255. ];
  85256. for (var i = 0; i < keys.length; i++)
  85257. {
  85258. this[keys[i]].destroy();
  85259. this[keys[i]] = null;
  85260. }
  85261. for (var key in this.custom)
  85262. {
  85263. this.custom[key].destroy();
  85264. }
  85265. this.custom = null;
  85266. this.game = null;
  85267. }
  85268. });
  85269. module.exports = CacheManager;
  85270. /***/ }),
  85271. /* 413 */
  85272. /***/ (function(module, exports, __webpack_require__) {
  85273. /**
  85274. * @author Richard Davey <rich@photonstorm.com>
  85275. * @copyright 2019 Photon Storm Ltd.
  85276. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85277. */
  85278. /**
  85279. * @namespace Phaser.Cache.Events
  85280. */
  85281. module.exports = {
  85282. ADD: __webpack_require__(1175),
  85283. REMOVE: __webpack_require__(1174)
  85284. };
  85285. /***/ }),
  85286. /* 414 */
  85287. /***/ (function(module, exports, __webpack_require__) {
  85288. /**
  85289. * @author Richard Davey <rich@photonstorm.com>
  85290. * @copyright 2019 Photon Storm Ltd.
  85291. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85292. */
  85293. var Class = __webpack_require__(0);
  85294. var CustomMap = __webpack_require__(194);
  85295. var EventEmitter = __webpack_require__(11);
  85296. var Events = __webpack_require__(413);
  85297. /**
  85298. * @classdesc
  85299. * The BaseCache is a base Cache class that can be used for storing references to any kind of data.
  85300. *
  85301. * Data can be added, retrieved and removed based on the given keys.
  85302. *
  85303. * Keys are string-based.
  85304. *
  85305. * @class BaseCache
  85306. * @memberof Phaser.Cache
  85307. * @constructor
  85308. * @since 3.0.0
  85309. */
  85310. var BaseCache = new Class({
  85311. initialize:
  85312. function BaseCache ()
  85313. {
  85314. /**
  85315. * The Map in which the cache objects are stored.
  85316. *
  85317. * You can query the Map directly or use the BaseCache methods.
  85318. *
  85319. * @name Phaser.Cache.BaseCache#entries
  85320. * @type {Phaser.Structs.Map.<String, *>}
  85321. * @since 3.0.0
  85322. */
  85323. this.entries = new CustomMap();
  85324. /**
  85325. * An instance of EventEmitter used by the cache to emit related events.
  85326. *
  85327. * @name Phaser.Cache.BaseCache#events
  85328. * @type {Phaser.Events.EventEmitter}
  85329. * @since 3.0.0
  85330. */
  85331. this.events = new EventEmitter();
  85332. },
  85333. /**
  85334. * Adds an item to this cache. The item is referenced by a unique string, which you are responsible
  85335. * for setting and keeping track of. The item can only be retrieved by using this string.
  85336. *
  85337. * @method Phaser.Cache.BaseCache#add
  85338. * @fires Phaser.Cache.Events#ADD
  85339. * @since 3.0.0
  85340. *
  85341. * @param {string} key - The unique key by which the data added to the cache will be referenced.
  85342. * @param {*} data - The data to be stored in the cache.
  85343. *
  85344. * @return {Phaser.Cache.BaseCache} This BaseCache object.
  85345. */
  85346. add: function (key, data)
  85347. {
  85348. this.entries.set(key, data);
  85349. this.events.emit(Events.ADD, this, key, data);
  85350. return this;
  85351. },
  85352. /**
  85353. * Checks if this cache contains an item matching the given key.
  85354. * This performs the same action as `BaseCache.exists`.
  85355. *
  85356. * @method Phaser.Cache.BaseCache#has
  85357. * @since 3.0.0
  85358. *
  85359. * @param {string} key - The unique key of the item to be checked in this cache.
  85360. *
  85361. * @return {boolean} Returns `true` if the cache contains an item matching the given key, otherwise `false`.
  85362. */
  85363. has: function (key)
  85364. {
  85365. return this.entries.has(key);
  85366. },
  85367. /**
  85368. * Checks if this cache contains an item matching the given key.
  85369. * This performs the same action as `BaseCache.has` and is called directly by the Loader.
  85370. *
  85371. * @method Phaser.Cache.BaseCache#exists
  85372. * @since 3.7.0
  85373. *
  85374. * @param {string} key - The unique key of the item to be checked in this cache.
  85375. *
  85376. * @return {boolean} Returns `true` if the cache contains an item matching the given key, otherwise `false`.
  85377. */
  85378. exists: function (key)
  85379. {
  85380. return this.entries.has(key);
  85381. },
  85382. /**
  85383. * Gets an item from this cache based on the given key.
  85384. *
  85385. * @method Phaser.Cache.BaseCache#get
  85386. * @since 3.0.0
  85387. *
  85388. * @param {string} key - The unique key of the item to be retrieved from this cache.
  85389. *
  85390. * @return {*} The item in the cache, or `null` if no item matching the given key was found.
  85391. */
  85392. get: function (key)
  85393. {
  85394. return this.entries.get(key);
  85395. },
  85396. /**
  85397. * Removes and item from this cache based on the given key.
  85398. *
  85399. * If an entry matching the key is found it is removed from the cache and a `remove` event emitted.
  85400. * No additional checks are done on the item removed. If other systems or parts of your game code
  85401. * are relying on this item, it is up to you to sever those relationships prior to removing the item.
  85402. *
  85403. * @method Phaser.Cache.BaseCache#remove
  85404. * @fires Phaser.Cache.Events#REMOVE
  85405. * @since 3.0.0
  85406. *
  85407. * @param {string} key - The unique key of the item to remove from the cache.
  85408. *
  85409. * @return {Phaser.Cache.BaseCache} This BaseCache object.
  85410. */
  85411. remove: function (key)
  85412. {
  85413. var entry = this.get(key);
  85414. if (entry)
  85415. {
  85416. this.entries.delete(key);
  85417. this.events.emit(Events.REMOVE, this, key, entry.data);
  85418. }
  85419. return this;
  85420. },
  85421. /**
  85422. * Destroys this cache and all items within it.
  85423. *
  85424. * @method Phaser.Cache.BaseCache#destroy
  85425. * @since 3.0.0
  85426. */
  85427. destroy: function ()
  85428. {
  85429. this.entries.clear();
  85430. this.events.removeAllListeners();
  85431. this.entries = null;
  85432. this.events = null;
  85433. }
  85434. });
  85435. module.exports = BaseCache;
  85436. /***/ }),
  85437. /* 415 */
  85438. /***/ (function(module, exports, __webpack_require__) {
  85439. /**
  85440. * @author Richard Davey <rich@photonstorm.com>
  85441. * @copyright 2019 Photon Storm Ltd.
  85442. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85443. */
  85444. var Animation = __webpack_require__(205);
  85445. var Class = __webpack_require__(0);
  85446. var CustomMap = __webpack_require__(194);
  85447. var EventEmitter = __webpack_require__(11);
  85448. var Events = __webpack_require__(136);
  85449. var GameEvents = __webpack_require__(26);
  85450. var GetValue = __webpack_require__(4);
  85451. var Pad = __webpack_require__(193);
  85452. /**
  85453. * @classdesc
  85454. * The Animation Manager.
  85455. *
  85456. * Animations are managed by the global Animation Manager. This is a singleton class that is
  85457. * responsible for creating and delivering animations and their corresponding data to all Game Objects.
  85458. * Unlike plugins it is owned by the Game instance, not the Scene.
  85459. *
  85460. * Sprites and other Game Objects get the data they need from the AnimationManager.
  85461. *
  85462. * @class AnimationManager
  85463. * @extends Phaser.Events.EventEmitter
  85464. * @memberof Phaser.Animations
  85465. * @constructor
  85466. * @since 3.0.0
  85467. *
  85468. * @param {Phaser.Game} game - A reference to the Phaser.Game instance.
  85469. */
  85470. var AnimationManager = new Class({
  85471. Extends: EventEmitter,
  85472. initialize:
  85473. function AnimationManager (game)
  85474. {
  85475. EventEmitter.call(this);
  85476. /**
  85477. * A reference to the Phaser.Game instance.
  85478. *
  85479. * @name Phaser.Animations.AnimationManager#game
  85480. * @type {Phaser.Game}
  85481. * @protected
  85482. * @since 3.0.0
  85483. */
  85484. this.game = game;
  85485. /**
  85486. * A reference to the Texture Manager.
  85487. *
  85488. * @name Phaser.Animations.AnimationManager#textureManager
  85489. * @type {Phaser.Textures.TextureManager}
  85490. * @protected
  85491. * @since 3.0.0
  85492. */
  85493. this.textureManager = null;
  85494. /**
  85495. * The global time scale of the Animation Manager.
  85496. *
  85497. * This scales the time delta between two frames, thus influencing the speed of time for the Animation Manager.
  85498. *
  85499. * @name Phaser.Animations.AnimationManager#globalTimeScale
  85500. * @type {number}
  85501. * @default 1
  85502. * @since 3.0.0
  85503. */
  85504. this.globalTimeScale = 1;
  85505. /**
  85506. * The Animations registered in the Animation Manager.
  85507. *
  85508. * This map should be modified with the {@link #add} and {@link #create} methods of the Animation Manager.
  85509. *
  85510. * @name Phaser.Animations.AnimationManager#anims
  85511. * @type {Phaser.Structs.Map.<string, Phaser.Animations.Animation>}
  85512. * @protected
  85513. * @since 3.0.0
  85514. */
  85515. this.anims = new CustomMap();
  85516. /**
  85517. * Whether the Animation Manager is paused along with all of its Animations.
  85518. *
  85519. * @name Phaser.Animations.AnimationManager#paused
  85520. * @type {boolean}
  85521. * @default false
  85522. * @since 3.0.0
  85523. */
  85524. this.paused = false;
  85525. /**
  85526. * The name of this Animation Manager.
  85527. *
  85528. * @name Phaser.Animations.AnimationManager#name
  85529. * @type {string}
  85530. * @since 3.0.0
  85531. */
  85532. this.name = 'AnimationManager';
  85533. game.events.once(GameEvents.BOOT, this.boot, this);
  85534. },
  85535. /**
  85536. * Registers event listeners after the Game boots.
  85537. *
  85538. * @method Phaser.Animations.AnimationManager#boot
  85539. * @listens Phaser.Core.Events#DESTROY
  85540. * @since 3.0.0
  85541. */
  85542. boot: function ()
  85543. {
  85544. this.textureManager = this.game.textures;
  85545. this.game.events.once(GameEvents.DESTROY, this.destroy, this);
  85546. },
  85547. /**
  85548. * Adds an existing Animation to the Animation Manager.
  85549. *
  85550. * @method Phaser.Animations.AnimationManager#add
  85551. * @fires Phaser.Animations.Events#ADD_ANIMATION
  85552. * @since 3.0.0
  85553. *
  85554. * @param {string} key - The key under which the Animation should be added. The Animation will be updated with it. Must be unique.
  85555. * @param {Phaser.Animations.Animation} animation - The Animation which should be added to the Animation Manager.
  85556. *
  85557. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  85558. */
  85559. add: function (key, animation)
  85560. {
  85561. if (this.anims.has(key))
  85562. {
  85563. console.warn('Animation key exists: ' + key);
  85564. return;
  85565. }
  85566. animation.key = key;
  85567. this.anims.set(key, animation);
  85568. this.emit(Events.ADD_ANIMATION, key, animation);
  85569. return this;
  85570. },
  85571. /**
  85572. * Checks to see if the given key is already in use within the Animation Manager or not.
  85573. *
  85574. * Animations are global. Keys created in one scene can be used from any other Scene in your game. They are not Scene specific.
  85575. *
  85576. * @method Phaser.Animations.AnimationManager#exists
  85577. * @since 3.16.0
  85578. *
  85579. * @param {string} key - The key of the Animation to check.
  85580. *
  85581. * @return {boolean} `true` if the Animation already exists in the Animation Manager, or `false` if the key is available.
  85582. */
  85583. exists: function (key)
  85584. {
  85585. return this.anims.has(key);
  85586. },
  85587. /**
  85588. * Creates a new Animation and adds it to the Animation Manager.
  85589. *
  85590. * Animations are global. Once created, you can use them in any Scene in your game. They are not Scene specific.
  85591. *
  85592. * If an invalid key is given this method will return `false`.
  85593. *
  85594. * If you pass the key of an animation that already exists in the Animation Manager, that animation will be returned.
  85595. *
  85596. * A brand new animation is only created if the key is valid and not already in use.
  85597. *
  85598. * If you wish to re-use an existing key, call `AnimationManager.remove` first, then this method.
  85599. *
  85600. * @method Phaser.Animations.AnimationManager#create
  85601. * @fires Phaser.Animations.Events#ADD_ANIMATION
  85602. * @since 3.0.0
  85603. *
  85604. * @param {Phaser.Animations.Types.Animation} config - The configuration settings for the Animation.
  85605. *
  85606. * @return {(Phaser.Animations.Animation|false)} The Animation that was created, or `false` is the key is already in use.
  85607. */
  85608. create: function (config)
  85609. {
  85610. var key = config.key;
  85611. var anim = false;
  85612. if (key)
  85613. {
  85614. anim = this.get(key);
  85615. if (!anim)
  85616. {
  85617. anim = new Animation(this, key, config);
  85618. this.anims.set(key, anim);
  85619. this.emit(Events.ADD_ANIMATION, key, anim);
  85620. }
  85621. }
  85622. return anim;
  85623. },
  85624. /**
  85625. * Loads this Animation Manager's Animations and settings from a JSON object.
  85626. *
  85627. * @method Phaser.Animations.AnimationManager#fromJSON
  85628. * @since 3.0.0
  85629. *
  85630. * @param {(string|Phaser.Animations.Types.JSONAnimations|Phaser.Animations.Types.JSONAnimation)} data - The JSON object to parse.
  85631. * @param {boolean} [clearCurrentAnimations=false] - If set to `true`, the current animations will be removed (`anims.clear()`). If set to `false` (default), the animations in `data` will be added.
  85632. *
  85633. * @return {Phaser.Animations.Animation[]} An array containing all of the Animation objects that were created as a result of this call.
  85634. */
  85635. fromJSON: function (data, clearCurrentAnimations)
  85636. {
  85637. if (clearCurrentAnimations === undefined) { clearCurrentAnimations = false; }
  85638. if (clearCurrentAnimations)
  85639. {
  85640. this.anims.clear();
  85641. }
  85642. // Do we have a String (i.e. from JSON, or an Object?)
  85643. if (typeof data === 'string')
  85644. {
  85645. data = JSON.parse(data);
  85646. }
  85647. var output = [];
  85648. // Array of animations, or a single animation?
  85649. if (data.hasOwnProperty('anims') && Array.isArray(data.anims))
  85650. {
  85651. for (var i = 0; i < data.anims.length; i++)
  85652. {
  85653. output.push(this.create(data.anims[i]));
  85654. }
  85655. if (data.hasOwnProperty('globalTimeScale'))
  85656. {
  85657. this.globalTimeScale = data.globalTimeScale;
  85658. }
  85659. }
  85660. else if (data.hasOwnProperty('key') && data.type === 'frame')
  85661. {
  85662. output.push(this.create(data));
  85663. }
  85664. return output;
  85665. },
  85666. /**
  85667. * [description]
  85668. *
  85669. * @method Phaser.Animations.AnimationManager#generateFrameNames
  85670. * @since 3.0.0
  85671. *
  85672. * @param {string} key - The key for the texture containing the animation frames.
  85673. * @param {Phaser.Animations.Types.GenerateFrameNames} [config] - The configuration object for the animation frame names.
  85674. *
  85675. * @return {Phaser.Animations.Types.AnimationFrame[]} The array of {@link Phaser.Animations.Types.AnimationFrame} objects.
  85676. */
  85677. generateFrameNames: function (key, config)
  85678. {
  85679. var prefix = GetValue(config, 'prefix', '');
  85680. var start = GetValue(config, 'start', 0);
  85681. var end = GetValue(config, 'end', 0);
  85682. var suffix = GetValue(config, 'suffix', '');
  85683. var zeroPad = GetValue(config, 'zeroPad', 0);
  85684. var out = GetValue(config, 'outputArray', []);
  85685. var frames = GetValue(config, 'frames', false);
  85686. var texture = this.textureManager.get(key);
  85687. if (!texture)
  85688. {
  85689. return out;
  85690. }
  85691. var diff = (start < end) ? 1 : -1;
  85692. // Adjust because we use i !== end in the for loop
  85693. end += diff;
  85694. var i;
  85695. var frame;
  85696. if (!config)
  85697. {
  85698. // Use every frame in the atlas?
  85699. frames = texture.getFrameNames();
  85700. for (i = 0; i < frames.length; i++)
  85701. {
  85702. out.push({ key: key, frame: frames[i] });
  85703. }
  85704. }
  85705. else if (Array.isArray(frames))
  85706. {
  85707. // Have they provided their own custom frame sequence array?
  85708. for (i = 0; i < frames.length; i++)
  85709. {
  85710. frame = prefix + Pad(frames[i], zeroPad, '0', 1) + suffix;
  85711. if (texture.has(frame))
  85712. {
  85713. out.push({ key: key, frame: frame });
  85714. }
  85715. }
  85716. }
  85717. else
  85718. {
  85719. for (i = start; i !== end; i += diff)
  85720. {
  85721. frame = prefix + Pad(i, zeroPad, '0', 1) + suffix;
  85722. if (texture.has(frame))
  85723. {
  85724. out.push({ key: key, frame: frame });
  85725. }
  85726. }
  85727. }
  85728. return out;
  85729. },
  85730. /**
  85731. * Generate an array of {@link Phaser.Animations.Types.AnimationFrame} objects from a texture key and configuration object.
  85732. *
  85733. * Generates objects with numbered frame names, as configured by the given {@link Phaser.Animations.Types.GenerateFrameNumbers}.
  85734. *
  85735. * @method Phaser.Animations.AnimationManager#generateFrameNumbers
  85736. * @since 3.0.0
  85737. *
  85738. * @param {string} key - The key for the texture containing the animation frames.
  85739. * @param {Phaser.Animations.Types.GenerateFrameNumbers} config - The configuration object for the animation frames.
  85740. *
  85741. * @return {Phaser.Animations.Types.AnimationFrame[]} The array of {@link Phaser.Animations.Types.AnimationFrame} objects.
  85742. */
  85743. generateFrameNumbers: function (key, config)
  85744. {
  85745. var startFrame = GetValue(config, 'start', 0);
  85746. var endFrame = GetValue(config, 'end', -1);
  85747. var firstFrame = GetValue(config, 'first', false);
  85748. var out = GetValue(config, 'outputArray', []);
  85749. var frames = GetValue(config, 'frames', false);
  85750. var texture = this.textureManager.get(key);
  85751. if (!texture)
  85752. {
  85753. return out;
  85754. }
  85755. if (firstFrame && texture.has(firstFrame))
  85756. {
  85757. out.push({ key: key, frame: firstFrame });
  85758. }
  85759. var i;
  85760. // Have they provided their own custom frame sequence array?
  85761. if (Array.isArray(frames))
  85762. {
  85763. for (i = 0; i < frames.length; i++)
  85764. {
  85765. if (texture.has(frames[i]))
  85766. {
  85767. out.push({ key: key, frame: frames[i] });
  85768. }
  85769. }
  85770. }
  85771. else
  85772. {
  85773. // No endFrame then see if we can get it
  85774. if (endFrame === -1)
  85775. {
  85776. endFrame = texture.frameTotal;
  85777. }
  85778. for (i = startFrame; i <= endFrame; i++)
  85779. {
  85780. if (texture.has(i))
  85781. {
  85782. out.push({ key: key, frame: i });
  85783. }
  85784. }
  85785. }
  85786. return out;
  85787. },
  85788. /**
  85789. * Get an Animation.
  85790. *
  85791. * @method Phaser.Animations.AnimationManager#get
  85792. * @since 3.0.0
  85793. *
  85794. * @param {string} key - The key of the Animation to retrieve.
  85795. *
  85796. * @return {Phaser.Animations.Animation} The Animation.
  85797. */
  85798. get: function (key)
  85799. {
  85800. return this.anims.get(key);
  85801. },
  85802. /**
  85803. * Load an Animation into a Game Object's Animation Component.
  85804. *
  85805. * @method Phaser.Animations.AnimationManager#load
  85806. * @since 3.0.0
  85807. *
  85808. * @param {Phaser.GameObjects.GameObject} child - The Game Object to load the animation into.
  85809. * @param {string} key - The key of the animation to load.
  85810. * @param {(string|integer)} [startFrame] - The name of a start frame to set on the loaded animation.
  85811. *
  85812. * @return {Phaser.GameObjects.GameObject} The Game Object with the animation loaded into it.
  85813. */
  85814. load: function (child, key, startFrame)
  85815. {
  85816. var anim = this.get(key);
  85817. if (anim)
  85818. {
  85819. anim.load(child, startFrame);
  85820. }
  85821. return child;
  85822. },
  85823. /**
  85824. * Pause all animations.
  85825. *
  85826. * @method Phaser.Animations.AnimationManager#pauseAll
  85827. * @fires Phaser.Animations.Events#PAUSE_ALL
  85828. * @since 3.0.0
  85829. *
  85830. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  85831. */
  85832. pauseAll: function ()
  85833. {
  85834. if (!this.paused)
  85835. {
  85836. this.paused = true;
  85837. this.emit(Events.PAUSE_ALL);
  85838. }
  85839. return this;
  85840. },
  85841. /**
  85842. * Play an animation on the given Game Objects that have an Animation Component.
  85843. *
  85844. * @method Phaser.Animations.AnimationManager#play
  85845. * @since 3.0.0
  85846. *
  85847. * @param {string} key - The key of the animation to play on the Game Object.
  85848. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} child - The Game Objects to play the animation on.
  85849. *
  85850. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  85851. */
  85852. play: function (key, child)
  85853. {
  85854. if (!Array.isArray(child))
  85855. {
  85856. child = [ child ];
  85857. }
  85858. var anim = this.get(key);
  85859. if (!anim)
  85860. {
  85861. return;
  85862. }
  85863. for (var i = 0; i < child.length; i++)
  85864. {
  85865. child[i].anims.play(key);
  85866. }
  85867. return this;
  85868. },
  85869. /**
  85870. * Remove an animation.
  85871. *
  85872. * @method Phaser.Animations.AnimationManager#remove
  85873. * @fires Phaser.Animations.Events#REMOVE_ANIMATION
  85874. * @since 3.0.0
  85875. *
  85876. * @param {string} key - The key of the animation to remove.
  85877. *
  85878. * @return {Phaser.Animations.Animation} [description]
  85879. */
  85880. remove: function (key)
  85881. {
  85882. var anim = this.get(key);
  85883. if (anim)
  85884. {
  85885. this.emit(Events.REMOVE_ANIMATION, key, anim);
  85886. this.anims.delete(key);
  85887. }
  85888. return anim;
  85889. },
  85890. /**
  85891. * Resume all paused animations.
  85892. *
  85893. * @method Phaser.Animations.AnimationManager#resumeAll
  85894. * @fires Phaser.Animations.Events#RESUME_ALL
  85895. * @since 3.0.0
  85896. *
  85897. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  85898. */
  85899. resumeAll: function ()
  85900. {
  85901. if (this.paused)
  85902. {
  85903. this.paused = false;
  85904. this.emit(Events.RESUME_ALL);
  85905. }
  85906. return this;
  85907. },
  85908. /**
  85909. * Takes an array of Game Objects that have an Animation Component and then
  85910. * starts the given animation playing on them, each one offset by the
  85911. * `stagger` amount given to this method.
  85912. *
  85913. * @method Phaser.Animations.AnimationManager#staggerPlay
  85914. * @since 3.0.0
  85915. *
  85916. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  85917. *
  85918. * @param {string} key - The key of the animation to play on the Game Objects.
  85919. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} children - An array of Game Objects to play the animation on. They must have an Animation Component.
  85920. * @param {number} [stagger=0] - The amount of time, in milliseconds, to offset each play time by.
  85921. *
  85922. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  85923. */
  85924. staggerPlay: function (key, children, stagger)
  85925. {
  85926. if (stagger === undefined) { stagger = 0; }
  85927. if (!Array.isArray(children))
  85928. {
  85929. children = [ children ];
  85930. }
  85931. var anim = this.get(key);
  85932. if (!anim)
  85933. {
  85934. return;
  85935. }
  85936. for (var i = 0; i < children.length; i++)
  85937. {
  85938. children[i].anims.delayedPlay(stagger * i, key);
  85939. }
  85940. return this;
  85941. },
  85942. /**
  85943. * Get the animation data as javascript object by giving key, or get the data of all animations as array of objects, if key wasn't provided.
  85944. *
  85945. * @method Phaser.Animations.AnimationManager#toJSON
  85946. * @since 3.0.0
  85947. *
  85948. * @param {string} key - [description]
  85949. *
  85950. * @return {Phaser.Animations.Types.JSONAnimations} [description]
  85951. */
  85952. toJSON: function (key)
  85953. {
  85954. if (key !== undefined && key !== '')
  85955. {
  85956. return this.anims.get(key).toJSON();
  85957. }
  85958. else
  85959. {
  85960. var output = {
  85961. anims: [],
  85962. globalTimeScale: this.globalTimeScale
  85963. };
  85964. this.anims.each(function (animationKey, animation)
  85965. {
  85966. output.anims.push(animation.toJSON());
  85967. });
  85968. return output;
  85969. }
  85970. },
  85971. /**
  85972. * Destroy this Animation Manager and clean up animation definitions and references to other objects.
  85973. * This method should not be called directly. It will be called automatically as a response to a `destroy` event from the Phaser.Game instance.
  85974. *
  85975. * @method Phaser.Animations.AnimationManager#destroy
  85976. * @since 3.0.0
  85977. */
  85978. destroy: function ()
  85979. {
  85980. this.anims.clear();
  85981. this.textureManager = null;
  85982. this.game = null;
  85983. }
  85984. });
  85985. module.exports = AnimationManager;
  85986. /***/ }),
  85987. /* 416 */
  85988. /***/ (function(module, exports) {
  85989. /**
  85990. * @author Richard Davey <rich@photonstorm.com>
  85991. * @copyright 2019 Photon Storm Ltd.
  85992. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85993. */
  85994. /**
  85995. * Using Bresenham's line algorithm this will return an array of all coordinates on this line.
  85996. *
  85997. * The `start` and `end` points are rounded before this runs as the algorithm works on integers.
  85998. *
  85999. * @function Phaser.Geom.Line.BresenhamPoints
  86000. * @since 3.0.0
  86001. *
  86002. * @param {Phaser.Geom.Line} line - The line.
  86003. * @param {integer} [stepRate=1] - The optional step rate for the points on the line.
  86004. * @param {array} [results] - An optional array to push the resulting coordinates into.
  86005. *
  86006. * @return {object[]} The array of coordinates on the line.
  86007. */
  86008. var BresenhamPoints = function (line, stepRate, results)
  86009. {
  86010. if (stepRate === undefined) { stepRate = 1; }
  86011. if (results === undefined) { results = []; }
  86012. var x1 = Math.round(line.x1);
  86013. var y1 = Math.round(line.y1);
  86014. var x2 = Math.round(line.x2);
  86015. var y2 = Math.round(line.y2);
  86016. var dx = Math.abs(x2 - x1);
  86017. var dy = Math.abs(y2 - y1);
  86018. var sx = (x1 < x2) ? 1 : -1;
  86019. var sy = (y1 < y2) ? 1 : -1;
  86020. var err = dx - dy;
  86021. results.push({ x: x1, y: y1 });
  86022. var i = 1;
  86023. while (!((x1 === x2) && (y1 === y2)))
  86024. {
  86025. var e2 = err << 1;
  86026. if (e2 > -dy)
  86027. {
  86028. err -= dy;
  86029. x1 += sx;
  86030. }
  86031. if (e2 < dx)
  86032. {
  86033. err += dx;
  86034. y1 += sy;
  86035. }
  86036. if (i % stepRate === 0)
  86037. {
  86038. results.push({ x: x1, y: y1 });
  86039. }
  86040. i++;
  86041. }
  86042. return results;
  86043. };
  86044. module.exports = BresenhamPoints;
  86045. /***/ }),
  86046. /* 417 */
  86047. /***/ (function(module, exports) {
  86048. /**
  86049. * @author Richard Davey <rich@photonstorm.com>
  86050. * @copyright 2019 Photon Storm Ltd.
  86051. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  86052. */
  86053. /**
  86054. * Moves the element at the end of the array to the start, shifting all items in the process.
  86055. * The "rotation" happens to the right.
  86056. *
  86057. * @function Phaser.Utils.Array.RotateRight
  86058. * @since 3.0.0
  86059. *
  86060. * @param {array} array - The array to shift to the right. This array is modified in place.
  86061. * @param {integer} [total=1] - The number of times to shift the array.
  86062. *
  86063. * @return {*} The most recently shifted element.
  86064. */
  86065. var RotateRight = function (array, total)
  86066. {
  86067. if (total === undefined) { total = 1; }
  86068. var element = null;
  86069. for (var i = 0; i < total; i++)
  86070. {
  86071. element = array.pop();
  86072. array.unshift(element);
  86073. }
  86074. return element;
  86075. };
  86076. module.exports = RotateRight;
  86077. /***/ }),
  86078. /* 418 */
  86079. /***/ (function(module, exports) {
  86080. /**
  86081. * @author Richard Davey <rich@photonstorm.com>
  86082. * @copyright 2019 Photon Storm Ltd.
  86083. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  86084. */
  86085. /**
  86086. * Moves the element at the start of the array to the end, shifting all items in the process.
  86087. * The "rotation" happens to the left.
  86088. *
  86089. * @function Phaser.Utils.Array.RotateLeft
  86090. * @since 3.0.0
  86091. *
  86092. * @param {array} array - The array to shift to the left. This array is modified in place.
  86093. * @param {integer} [total=1] - The number of times to shift the array.
  86094. *
  86095. * @return {*} The most recently shifted element.
  86096. */
  86097. var RotateLeft = function (array, total)
  86098. {
  86099. if (total === undefined) { total = 1; }
  86100. var element = null;
  86101. for (var i = 0; i < total; i++)
  86102. {
  86103. element = array.shift();
  86104. array.push(element);
  86105. }
  86106. return element;
  86107. };
  86108. module.exports = RotateLeft;
  86109. /***/ }),
  86110. /* 419 */
  86111. /***/ (function(module, exports, __webpack_require__) {
  86112. /**
  86113. * @author Richard Davey <rich@photonstorm.com>
  86114. * @copyright 2019 Photon Storm Ltd.
  86115. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  86116. */
  86117. var Perimeter = __webpack_require__(135);
  86118. var Point = __webpack_require__(6);
  86119. // Return an array of points from the perimeter of the rectangle
  86120. // each spaced out based on the quantity or step required
  86121. /**
  86122. * [description]
  86123. *
  86124. * @function Phaser.Geom.Rectangle.MarchingAnts
  86125. * @since 3.0.0
  86126. *
  86127. * @generic {Phaser.Geom.Point[]} O - [out,$return]
  86128. *
  86129. * @param {Phaser.Geom.Rectangle} rect - [description]
  86130. * @param {number} step - [description]
  86131. * @param {integer} quantity - [description]
  86132. * @param {(array|Phaser.Geom.Point[])} [out] - [description]
  86133. *
  86134. * @return {(array|Phaser.Geom.Point[])} [description]
  86135. */
  86136. var MarchingAnts = function (rect, step, quantity, out)
  86137. {
  86138. if (out === undefined) { out = []; }
  86139. if (!step && !quantity)
  86140. {
  86141. // Bail out
  86142. return out;
  86143. }
  86144. // If step is a falsey value (false, null, 0, undefined, etc) then we calculate
  86145. // it based on the quantity instead, otherwise we always use the step value
  86146. if (!step)
  86147. {
  86148. step = Perimeter(rect) / quantity;
  86149. }
  86150. else
  86151. {
  86152. quantity = Math.round(Perimeter(rect) / step);
  86153. }
  86154. var x = rect.x;
  86155. var y = rect.y;
  86156. var face = 0;
  86157. // Loop across each face of the rectangle
  86158. for (var i = 0; i < quantity; i++)
  86159. {
  86160. out.push(new Point(x, y));
  86161. switch (face)
  86162. {
  86163. // Top face
  86164. case 0:
  86165. x += step;
  86166. if (x >= rect.right)
  86167. {
  86168. face = 1;
  86169. y += (x - rect.right);
  86170. x = rect.right;
  86171. }
  86172. break;
  86173. // Right face
  86174. case 1:
  86175. y += step;
  86176. if (y >= rect.bottom)
  86177. {
  86178. face = 2;
  86179. x -= (y - rect.bottom);
  86180. y = rect.bottom;
  86181. }
  86182. break;
  86183. // Bottom face
  86184. case 2:
  86185. x -= step;
  86186. if (x <= rect.left)
  86187. {
  86188. face = 3;
  86189. y -= (rect.left - x);
  86190. x = rect.left;
  86191. }
  86192. break;
  86193. // Left face
  86194. case 3:
  86195. y -= step;
  86196. if (y <= rect.top)
  86197. {
  86198. face = 0;
  86199. y = rect.top;
  86200. }
  86201. break;
  86202. }
  86203. }
  86204. return out;
  86205. };
  86206. module.exports = MarchingAnts;
  86207. /***/ }),
  86208. /* 420 */
  86209. /***/ (function(module, exports, __webpack_require__) {
  86210. /**
  86211. * @author Richard Davey <rich@photonstorm.com>
  86212. * @copyright 2019 Photon Storm Ltd.
  86213. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  86214. */
  86215. /**
  86216. * @namespace Phaser.Data.Events
  86217. */
  86218. module.exports = {
  86219. CHANGE_DATA: __webpack_require__(1238),
  86220. CHANGE_DATA_KEY: __webpack_require__(1237),
  86221. REMOVE_DATA: __webpack_require__(1236),
  86222. SET_DATA: __webpack_require__(1235)
  86223. };
  86224. /***/ }),
  86225. /* 421 */
  86226. /***/ (function(module, exports) {
  86227. /**
  86228. * @author Richard Davey <rich@photonstorm.com>
  86229. * @copyright 2019 Photon Storm Ltd.
  86230. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  86231. */
  86232. // bitmask flag for GameObject.renderMask
  86233. var _FLAG = 1; // 0001
  86234. /**
  86235. * Provides methods used for setting the visibility of a Game Object.
  86236. * Should be applied as a mixin and not used directly.
  86237. *
  86238. * @name Phaser.GameObjects.Components.Visible
  86239. * @since 3.0.0
  86240. */
  86241. var Visible = {
  86242. /**
  86243. * Private internal value. Holds the visible value.
  86244. *
  86245. * @name Phaser.GameObjects.Components.Visible#_visible
  86246. * @type {boolean}
  86247. * @private
  86248. * @default true
  86249. * @since 3.0.0
  86250. */
  86251. _visible: true,
  86252. /**
  86253. * The visible state of the Game Object.
  86254. *
  86255. * An invisible Game Object will skip rendering, but will still process update logic.
  86256. *
  86257. * @name Phaser.GameObjects.Components.Visible#visible
  86258. * @type {boolean}
  86259. * @since 3.0.0
  86260. */
  86261. visible: {
  86262. get: function ()
  86263. {
  86264. return this._visible;
  86265. },
  86266. set: function (value)
  86267. {
  86268. if (value)
  86269. {
  86270. this._visible = true;
  86271. this.renderFlags |= _FLAG;
  86272. }
  86273. else
  86274. {
  86275. this._visible = false;
  86276. this.renderFlags &= ~_FLAG;
  86277. }
  86278. }
  86279. },
  86280. /**
  86281. * Sets the visibility of this Game Object.
  86282. *
  86283. * An invisible Game Object will skip rendering, but will still process update logic.
  86284. *
  86285. * @method Phaser.GameObjects.Components.Visible#setVisible
  86286. * @since 3.0.0
  86287. *
  86288. * @param {boolean} value - The visible state of the Game Object.
  86289. *
  86290. * @return {this} This Game Object instance.
  86291. */
  86292. setVisible: function (value)
  86293. {
  86294. this.visible = value;
  86295. return this;
  86296. }
  86297. };
  86298. module.exports = Visible;
  86299. /***/ }),
  86300. /* 422 */
  86301. /***/ (function(module, exports, __webpack_require__) {
  86302. /**
  86303. * @author Richard Davey <rich@photonstorm.com>
  86304. * @copyright 2019 Photon Storm Ltd.
  86305. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  86306. */
  86307. var MATH_CONST = __webpack_require__(20);
  86308. var TransformMatrix = __webpack_require__(41);
  86309. var WrapAngle = __webpack_require__(214);
  86310. var WrapAngleDegrees = __webpack_require__(213);
  86311. // global bitmask flag for GameObject.renderMask (used by Scale)
  86312. var _FLAG = 4; // 0100
  86313. /**
  86314. * Provides methods used for getting and setting the position, scale and rotation of a Game Object.
  86315. *
  86316. * @name Phaser.GameObjects.Components.Transform
  86317. * @since 3.0.0
  86318. */
  86319. var Transform = {
  86320. /**
  86321. * Private internal value. Holds the horizontal scale value.
  86322. *
  86323. * @name Phaser.GameObjects.Components.Transform#_scaleX
  86324. * @type {number}
  86325. * @private
  86326. * @default 1
  86327. * @since 3.0.0
  86328. */
  86329. _scaleX: 1,
  86330. /**
  86331. * Private internal value. Holds the vertical scale value.
  86332. *
  86333. * @name Phaser.GameObjects.Components.Transform#_scaleY
  86334. * @type {number}
  86335. * @private
  86336. * @default 1
  86337. * @since 3.0.0
  86338. */
  86339. _scaleY: 1,
  86340. /**
  86341. * Private internal value. Holds the rotation value in radians.
  86342. *
  86343. * @name Phaser.GameObjects.Components.Transform#_rotation
  86344. * @type {number}
  86345. * @private
  86346. * @default 0
  86347. * @since 3.0.0
  86348. */
  86349. _rotation: 0,
  86350. /**
  86351. * The x position of this Game Object.
  86352. *
  86353. * @name Phaser.GameObjects.Components.Transform#x
  86354. * @type {number}
  86355. * @default 0
  86356. * @since 3.0.0
  86357. */
  86358. x: 0,
  86359. /**
  86360. * The y position of this Game Object.
  86361. *
  86362. * @name Phaser.GameObjects.Components.Transform#y
  86363. * @type {number}
  86364. * @default 0
  86365. * @since 3.0.0
  86366. */
  86367. y: 0,
  86368. /**
  86369. * The z position of this Game Object.
  86370. * Note: Do not use this value to set the z-index, instead see the `depth` property.
  86371. *
  86372. * @name Phaser.GameObjects.Components.Transform#z
  86373. * @type {number}
  86374. * @default 0
  86375. * @since 3.0.0
  86376. */
  86377. z: 0,
  86378. /**
  86379. * The w position of this Game Object.
  86380. *
  86381. * @name Phaser.GameObjects.Components.Transform#w
  86382. * @type {number}
  86383. * @default 0
  86384. * @since 3.0.0
  86385. */
  86386. w: 0,
  86387. /**
  86388. * The horizontal scale of this Game Object.
  86389. *
  86390. * @name Phaser.GameObjects.Components.Transform#scaleX
  86391. * @type {number}
  86392. * @default 1
  86393. * @since 3.0.0
  86394. */
  86395. scaleX: {
  86396. get: function ()
  86397. {
  86398. return this._scaleX;
  86399. },
  86400. set: function (value)
  86401. {
  86402. this._scaleX = value;
  86403. if (this._scaleX === 0)
  86404. {
  86405. this.renderFlags &= ~_FLAG;
  86406. }
  86407. else
  86408. {
  86409. this.renderFlags |= _FLAG;
  86410. }
  86411. }
  86412. },
  86413. /**
  86414. * The vertical scale of this Game Object.
  86415. *
  86416. * @name Phaser.GameObjects.Components.Transform#scaleY
  86417. * @type {number}
  86418. * @default 1
  86419. * @since 3.0.0
  86420. */
  86421. scaleY: {
  86422. get: function ()
  86423. {
  86424. return this._scaleY;
  86425. },
  86426. set: function (value)
  86427. {
  86428. this._scaleY = value;
  86429. if (this._scaleY === 0)
  86430. {
  86431. this.renderFlags &= ~_FLAG;
  86432. }
  86433. else
  86434. {
  86435. this.renderFlags |= _FLAG;
  86436. }
  86437. }
  86438. },
  86439. /**
  86440. * The angle of this Game Object as expressed in degrees.
  86441. *
  86442. * Where 0 is to the right, 90 is down, 180 is left.
  86443. *
  86444. * If you prefer to work in radians, see the `rotation` property instead.
  86445. *
  86446. * @name Phaser.GameObjects.Components.Transform#angle
  86447. * @type {integer}
  86448. * @default 0
  86449. * @since 3.0.0
  86450. */
  86451. angle: {
  86452. get: function ()
  86453. {
  86454. return WrapAngleDegrees(this._rotation * MATH_CONST.RAD_TO_DEG);
  86455. },
  86456. set: function (value)
  86457. {
  86458. // value is in degrees
  86459. this.rotation = WrapAngleDegrees(value) * MATH_CONST.DEG_TO_RAD;
  86460. }
  86461. },
  86462. /**
  86463. * The angle of this Game Object in radians.
  86464. *
  86465. * If you prefer to work in degrees, see the `angle` property instead.
  86466. *
  86467. * @name Phaser.GameObjects.Components.Transform#rotation
  86468. * @type {number}
  86469. * @default 1
  86470. * @since 3.0.0
  86471. */
  86472. rotation: {
  86473. get: function ()
  86474. {
  86475. return this._rotation;
  86476. },
  86477. set: function (value)
  86478. {
  86479. // value is in radians
  86480. this._rotation = WrapAngle(value);
  86481. }
  86482. },
  86483. /**
  86484. * Sets the position of this Game Object.
  86485. *
  86486. * @method Phaser.GameObjects.Components.Transform#setPosition
  86487. * @since 3.0.0
  86488. *
  86489. * @param {number} [x=0] - The x position of this Game Object.
  86490. * @param {number} [y=x] - The y position of this Game Object. If not set it will use the `x` value.
  86491. * @param {number} [z=0] - The z position of this Game Object.
  86492. * @param {number} [w=0] - The w position of this Game Object.
  86493. *
  86494. * @return {this} This Game Object instance.
  86495. */
  86496. setPosition: function (x, y, z, w)
  86497. {
  86498. if (x === undefined) { x = 0; }
  86499. if (y === undefined) { y = x; }
  86500. if (z === undefined) { z = 0; }
  86501. if (w === undefined) { w = 0; }
  86502. this.x = x;
  86503. this.y = y;
  86504. this.z = z;
  86505. this.w = w;
  86506. return this;
  86507. },
  86508. /**
  86509. * Sets the position of this Game Object to be a random position within the confines of
  86510. * the given area.
  86511. *
  86512. * If no area is specified a random position between 0 x 0 and the game width x height is used instead.
  86513. *
  86514. * The position does not factor in the size of this Game Object, meaning that only the origin is
  86515. * guaranteed to be within the area.
  86516. *
  86517. * @method Phaser.GameObjects.Components.Transform#setRandomPosition
  86518. * @since 3.8.0
  86519. *
  86520. * @param {number} [x=0] - The x position of the top-left of the random area.
  86521. * @param {number} [y=0] - The y position of the top-left of the random area.
  86522. * @param {number} [width] - The width of the random area.
  86523. * @param {number} [height] - The height of the random area.
  86524. *
  86525. * @return {this} This Game Object instance.
  86526. */
  86527. setRandomPosition: function (x, y, width, height)
  86528. {
  86529. if (x === undefined) { x = 0; }
  86530. if (y === undefined) { y = 0; }
  86531. if (width === undefined) { width = this.scene.sys.scale.width; }
  86532. if (height === undefined) { height = this.scene.sys.scale.height; }
  86533. this.x = x + (Math.random() * width);
  86534. this.y = y + (Math.random() * height);
  86535. return this;
  86536. },
  86537. /**
  86538. * Sets the rotation of this Game Object.
  86539. *
  86540. * @method Phaser.GameObjects.Components.Transform#setRotation
  86541. * @since 3.0.0
  86542. *
  86543. * @param {number} [radians=0] - The rotation of this Game Object, in radians.
  86544. *
  86545. * @return {this} This Game Object instance.
  86546. */
  86547. setRotation: function (radians)
  86548. {
  86549. if (radians === undefined) { radians = 0; }
  86550. this.rotation = radians;
  86551. return this;
  86552. },
  86553. /**
  86554. * Sets the angle of this Game Object.
  86555. *
  86556. * @method Phaser.GameObjects.Components.Transform#setAngle
  86557. * @since 3.0.0
  86558. *
  86559. * @param {number} [degrees=0] - The rotation of this Game Object, in degrees.
  86560. *
  86561. * @return {this} This Game Object instance.
  86562. */
  86563. setAngle: function (degrees)
  86564. {
  86565. if (degrees === undefined) { degrees = 0; }
  86566. this.angle = degrees;
  86567. return this;
  86568. },
  86569. /**
  86570. * Sets the scale of this Game Object.
  86571. *
  86572. * @method Phaser.GameObjects.Components.Transform#setScale
  86573. * @since 3.0.0
  86574. *
  86575. * @param {number} x - The horizontal scale of this Game Object.
  86576. * @param {number} [y=x] - The vertical scale of this Game Object. If not set it will use the `x` value.
  86577. *
  86578. * @return {this} This Game Object instance.
  86579. */
  86580. setScale: function (x, y)
  86581. {
  86582. if (x === undefined) { x = 1; }
  86583. if (y === undefined) { y = x; }
  86584. this.scaleX = x;
  86585. this.scaleY = y;
  86586. return this;
  86587. },
  86588. /**
  86589. * Sets the x position of this Game Object.
  86590. *
  86591. * @method Phaser.GameObjects.Components.Transform#setX
  86592. * @since 3.0.0
  86593. *
  86594. * @param {number} [value=0] - The x position of this Game Object.
  86595. *
  86596. * @return {this} This Game Object instance.
  86597. */
  86598. setX: function (value)
  86599. {
  86600. if (value === undefined) { value = 0; }
  86601. this.x = value;
  86602. return this;
  86603. },
  86604. /**
  86605. * Sets the y position of this Game Object.
  86606. *
  86607. * @method Phaser.GameObjects.Components.Transform#setY
  86608. * @since 3.0.0
  86609. *
  86610. * @param {number} [value=0] - The y position of this Game Object.
  86611. *
  86612. * @return {this} This Game Object instance.
  86613. */
  86614. setY: function (value)
  86615. {
  86616. if (value === undefined) { value = 0; }
  86617. this.y = value;
  86618. return this;
  86619. },
  86620. /**
  86621. * Sets the z position of this Game Object.
  86622. *
  86623. * @method Phaser.GameObjects.Components.Transform#setZ
  86624. * @since 3.0.0
  86625. *
  86626. * @param {number} [value=0] - The z position of this Game Object.
  86627. *
  86628. * @return {this} This Game Object instance.
  86629. */
  86630. setZ: function (value)
  86631. {
  86632. if (value === undefined) { value = 0; }
  86633. this.z = value;
  86634. return this;
  86635. },
  86636. /**
  86637. * Sets the w position of this Game Object.
  86638. *
  86639. * @method Phaser.GameObjects.Components.Transform#setW
  86640. * @since 3.0.0
  86641. *
  86642. * @param {number} [value=0] - The w position of this Game Object.
  86643. *
  86644. * @return {this} This Game Object instance.
  86645. */
  86646. setW: function (value)
  86647. {
  86648. if (value === undefined) { value = 0; }
  86649. this.w = value;
  86650. return this;
  86651. },
  86652. /**
  86653. * Gets the local transform matrix for this Game Object.
  86654. *
  86655. * @method Phaser.GameObjects.Components.Transform#getLocalTransformMatrix
  86656. * @since 3.4.0
  86657. *
  86658. * @param {Phaser.GameObjects.Components.TransformMatrix} [tempMatrix] - The matrix to populate with the values from this Game Object.
  86659. *
  86660. * @return {Phaser.GameObjects.Components.TransformMatrix} The populated Transform Matrix.
  86661. */
  86662. getLocalTransformMatrix: function (tempMatrix)
  86663. {
  86664. if (tempMatrix === undefined) { tempMatrix = new TransformMatrix(); }
  86665. return tempMatrix.applyITRS(this.x, this.y, this._rotation, this._scaleX, this._scaleY);
  86666. },
  86667. /**
  86668. * Gets the world transform matrix for this Game Object, factoring in any parent Containers.
  86669. *
  86670. * @method Phaser.GameObjects.Components.Transform#getWorldTransformMatrix
  86671. * @since 3.4.0
  86672. *
  86673. * @param {Phaser.GameObjects.Components.TransformMatrix} [tempMatrix] - The matrix to populate with the values from this Game Object.
  86674. * @param {Phaser.GameObjects.Components.TransformMatrix} [parentMatrix] - A temporary matrix to hold parent values during the calculations.
  86675. *
  86676. * @return {Phaser.GameObjects.Components.TransformMatrix} The populated Transform Matrix.
  86677. */
  86678. getWorldTransformMatrix: function (tempMatrix, parentMatrix)
  86679. {
  86680. if (tempMatrix === undefined) { tempMatrix = new TransformMatrix(); }
  86681. if (parentMatrix === undefined) { parentMatrix = new TransformMatrix(); }
  86682. var parent = this.parentContainer;
  86683. if (!parent)
  86684. {
  86685. return this.getLocalTransformMatrix(tempMatrix);
  86686. }
  86687. tempMatrix.applyITRS(this.x, this.y, this._rotation, this._scaleX, this._scaleY);
  86688. while (parent)
  86689. {
  86690. parentMatrix.applyITRS(parent.x, parent.y, parent._rotation, parent._scaleX, parent._scaleY);
  86691. parentMatrix.multiply(tempMatrix, tempMatrix);
  86692. parent = parent.parentContainer;
  86693. }
  86694. return tempMatrix;
  86695. }
  86696. };
  86697. module.exports = Transform;
  86698. /***/ }),
  86699. /* 423 */
  86700. /***/ (function(module, exports) {
  86701. /**
  86702. * @author Richard Davey <rich@photonstorm.com>
  86703. * @copyright 2019 Photon Storm Ltd.
  86704. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  86705. */
  86706. /**
  86707. * @typedef {object} JSONGameObject
  86708. *
  86709. * @property {string} name - The name of this Game Object.
  86710. * @property {string} type - A textual representation of this Game Object, i.e. `sprite`.
  86711. * @property {number} x - The x position of this Game Object.
  86712. * @property {number} y - The y position of this Game Object.
  86713. * @property {object} scale - The scale of this Game Object
  86714. * @property {number} scale.x - The horizontal scale of this Game Object.
  86715. * @property {number} scale.y - The vertical scale of this Game Object.
  86716. * @property {object} origin - The origin of this Game Object.
  86717. * @property {number} origin.x - The horizontal origin of this Game Object.
  86718. * @property {number} origin.y - The vertical origin of this Game Object.
  86719. * @property {boolean} flipX - The horizontally flipped state of the Game Object.
  86720. * @property {boolean} flipY - The vertically flipped state of the Game Object.
  86721. * @property {number} rotation - The angle of this Game Object in radians.
  86722. * @property {number} alpha - The alpha value of the Game Object.
  86723. * @property {boolean} visible - The visible state of the Game Object.
  86724. * @property {integer} scaleMode - The Scale Mode being used by this Game Object.
  86725. * @property {(integer|string)} blendMode - Sets the Blend Mode being used by this Game Object.
  86726. * @property {string} textureKey - The texture key of this Game Object.
  86727. * @property {string} frameKey - The frame key of this Game Object.
  86728. * @property {object} data - The data of this Game Object.
  86729. */
  86730. /**
  86731. * Build a JSON representation of the given Game Object.
  86732. *
  86733. * This is typically extended further by Game Object specific implementations.
  86734. *
  86735. * @method Phaser.GameObjects.Components.ToJSON
  86736. * @since 3.0.0
  86737. *
  86738. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to export as JSON.
  86739. *
  86740. * @return {JSONGameObject} A JSON representation of the Game Object.
  86741. */
  86742. var ToJSON = function (gameObject)
  86743. {
  86744. var out = {
  86745. name: gameObject.name,
  86746. type: gameObject.type,
  86747. x: gameObject.x,
  86748. y: gameObject.y,
  86749. depth: gameObject.depth,
  86750. scale: {
  86751. x: gameObject.scaleX,
  86752. y: gameObject.scaleY
  86753. },
  86754. origin: {
  86755. x: gameObject.originX,
  86756. y: gameObject.originY
  86757. },
  86758. flipX: gameObject.flipX,
  86759. flipY: gameObject.flipY,
  86760. rotation: gameObject.rotation,
  86761. alpha: gameObject.alpha,
  86762. visible: gameObject.visible,
  86763. scaleMode: gameObject.scaleMode,
  86764. blendMode: gameObject.blendMode,
  86765. textureKey: '',
  86766. frameKey: '',
  86767. data: {}
  86768. };
  86769. if (gameObject.texture)
  86770. {
  86771. out.textureKey = gameObject.texture.key;
  86772. out.frameKey = gameObject.frame.name;
  86773. }
  86774. return out;
  86775. };
  86776. module.exports = ToJSON;
  86777. /***/ }),
  86778. /* 424 */
  86779. /***/ (function(module, exports) {
  86780. /**
  86781. * @author Richard Davey <rich@photonstorm.com>
  86782. * @copyright 2019 Photon Storm Ltd.
  86783. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  86784. */
  86785. /**
  86786. * Provides methods used for getting and setting the Scroll Factor of a Game Object.
  86787. *
  86788. * @name Phaser.GameObjects.Components.ScrollFactor
  86789. * @since 3.0.0
  86790. */
  86791. var ScrollFactor = {
  86792. /**
  86793. * The horizontal scroll factor of this Game Object.
  86794. *
  86795. * The scroll factor controls the influence of the movement of a Camera upon this Game Object.
  86796. *
  86797. * When a camera scrolls it will change the location at which this Game Object is rendered on-screen.
  86798. * It does not change the Game Objects actual position values.
  86799. *
  86800. * A value of 1 means it will move exactly in sync with a camera.
  86801. * A value of 0 means it will not move at all, even if the camera moves.
  86802. * Other values control the degree to which the camera movement is mapped to this Game Object.
  86803. *
  86804. * Please be aware that scroll factor values other than 1 are not taken in to consideration when
  86805. * calculating physics collisions. Bodies always collide based on their world position, but changing
  86806. * the scroll factor is a visual adjustment to where the textures are rendered, which can offset
  86807. * them from physics bodies if not accounted for in your code.
  86808. *
  86809. * @name Phaser.GameObjects.Components.ScrollFactor#scrollFactorX
  86810. * @type {number}
  86811. * @default 1
  86812. * @since 3.0.0
  86813. */
  86814. scrollFactorX: 1,
  86815. /**
  86816. * The vertical scroll factor of this Game Object.
  86817. *
  86818. * The scroll factor controls the influence of the movement of a Camera upon this Game Object.
  86819. *
  86820. * When a camera scrolls it will change the location at which this Game Object is rendered on-screen.
  86821. * It does not change the Game Objects actual position values.
  86822. *
  86823. * A value of 1 means it will move exactly in sync with a camera.
  86824. * A value of 0 means it will not move at all, even if the camera moves.
  86825. * Other values control the degree to which the camera movement is mapped to this Game Object.
  86826. *
  86827. * Please be aware that scroll factor values other than 1 are not taken in to consideration when
  86828. * calculating physics collisions. Bodies always collide based on their world position, but changing
  86829. * the scroll factor is a visual adjustment to where the textures are rendered, which can offset
  86830. * them from physics bodies if not accounted for in your code.
  86831. *
  86832. * @name Phaser.GameObjects.Components.ScrollFactor#scrollFactorY
  86833. * @type {number}
  86834. * @default 1
  86835. * @since 3.0.0
  86836. */
  86837. scrollFactorY: 1,
  86838. /**
  86839. * Sets the scroll factor of this Game Object.
  86840. *
  86841. * The scroll factor controls the influence of the movement of a Camera upon this Game Object.
  86842. *
  86843. * When a camera scrolls it will change the location at which this Game Object is rendered on-screen.
  86844. * It does not change the Game Objects actual position values.
  86845. *
  86846. * A value of 1 means it will move exactly in sync with a camera.
  86847. * A value of 0 means it will not move at all, even if the camera moves.
  86848. * Other values control the degree to which the camera movement is mapped to this Game Object.
  86849. *
  86850. * Please be aware that scroll factor values other than 1 are not taken in to consideration when
  86851. * calculating physics collisions. Bodies always collide based on their world position, but changing
  86852. * the scroll factor is a visual adjustment to where the textures are rendered, which can offset
  86853. * them from physics bodies if not accounted for in your code.
  86854. *
  86855. * @method Phaser.GameObjects.Components.ScrollFactor#setScrollFactor
  86856. * @since 3.0.0
  86857. *
  86858. * @param {number} x - The horizontal scroll factor of this Game Object.
  86859. * @param {number} [y=x] - The vertical scroll factor of this Game Object. If not set it will use the `x` value.
  86860. *
  86861. * @return {this} This Game Object instance.
  86862. */
  86863. setScrollFactor: function (x, y)
  86864. {
  86865. if (y === undefined) { y = x; }
  86866. this.scrollFactorX = x;
  86867. this.scrollFactorY = y;
  86868. return this;
  86869. }
  86870. };
  86871. module.exports = ScrollFactor;
  86872. /***/ }),
  86873. /* 425 */
  86874. /***/ (function(module, exports, __webpack_require__) {
  86875. /**
  86876. * @author Richard Davey <rich@photonstorm.com>
  86877. * @copyright 2019 Photon Storm Ltd.
  86878. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  86879. */
  86880. var Class = __webpack_require__(0);
  86881. /**
  86882. * @classdesc
  86883. * A Geometry Mask can be applied to a Game Object to hide any pixels of it which don't intersect
  86884. * a visible pixel from the geometry mask. The mask is essentially a clipping path which can only
  86885. * make a masked pixel fully visible or fully invisible without changing its alpha (opacity).
  86886. *
  86887. * A Geometry Mask uses a Graphics Game Object to determine which pixels of the masked Game Object(s)
  86888. * should be clipped. For any given point of a masked Game Object's texture, the pixel will only be displayed
  86889. * if the Graphics Game Object of the Geometry Mask has a visible pixel at the same position. The color and
  86890. * alpha of the pixel from the Geometry Mask do not matter.
  86891. *
  86892. * The Geometry Mask's location matches the location of its Graphics object, not the location of the masked objects.
  86893. * Moving or transforming the underlying Graphics object will change the mask (and affect the visibility
  86894. * of any masked objects), whereas moving or transforming a masked object will not affect the mask.
  86895. * You can think of the Geometry Mask (or rather, of the its Graphics object) as an invisible curtain placed
  86896. * in front of all masked objects which has its own visual properties and, naturally, respects the camera's
  86897. * visual properties, but isn't affected by and doesn't follow the masked objects by itself.
  86898. *
  86899. * @class GeometryMask
  86900. * @memberof Phaser.Display.Masks
  86901. * @constructor
  86902. * @since 3.0.0
  86903. *
  86904. * @param {Phaser.Scene} scene - This parameter is not used.
  86905. * @param {Phaser.GameObjects.Graphics} graphicsGeometry - The Graphics Game Object to use for the Geometry Mask. Doesn't have to be in the Display List.
  86906. */
  86907. var GeometryMask = new Class({
  86908. initialize:
  86909. function GeometryMask (scene, graphicsGeometry)
  86910. {
  86911. /**
  86912. * The Graphics object which describes the Geometry Mask.
  86913. *
  86914. * @name Phaser.Display.Masks.GeometryMask#geometryMask
  86915. * @type {Phaser.GameObjects.Graphics}
  86916. * @since 3.0.0
  86917. */
  86918. this.geometryMask = graphicsGeometry;
  86919. /**
  86920. * Similar to the BitmapMasks invertAlpha setting this to true will then hide all pixels
  86921. * drawn to the Geometry Mask.
  86922. *
  86923. * @name Phaser.Display.Masks.GeometryMask#invertAlpha
  86924. * @type {boolean}
  86925. * @since 3.16.0
  86926. */
  86927. this.invertAlpha = false;
  86928. },
  86929. /**
  86930. * Sets a new Graphics object for the Geometry Mask.
  86931. *
  86932. * @method Phaser.Display.Masks.GeometryMask#setShape
  86933. * @since 3.0.0
  86934. *
  86935. * @param {Phaser.GameObjects.Graphics} graphicsGeometry - The Graphics object which will be used for the Geometry Mask.
  86936. */
  86937. setShape: function (graphicsGeometry)
  86938. {
  86939. this.geometryMask = graphicsGeometry;
  86940. },
  86941. /**
  86942. * Renders the Geometry Mask's underlying Graphics object to the OpenGL stencil buffer and enables the stencil test, which clips rendered pixels according to the mask.
  86943. *
  86944. * @method Phaser.Display.Masks.GeometryMask#preRenderWebGL
  86945. * @since 3.0.0
  86946. *
  86947. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - The WebGL Renderer instance to draw to.
  86948. * @param {Phaser.GameObjects.GameObject} mask - The Game Object being rendered.
  86949. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera the Game Object is being rendered through.
  86950. */
  86951. preRenderWebGL: function (renderer, mask, camera)
  86952. {
  86953. var gl = renderer.gl;
  86954. var geometryMask = this.geometryMask;
  86955. // Force flushing before drawing to stencil buffer
  86956. renderer.flush();
  86957. // Enable and setup GL state to write to stencil buffer
  86958. gl.enable(gl.STENCIL_TEST);
  86959. gl.clear(gl.STENCIL_BUFFER_BIT);
  86960. gl.colorMask(false, false, false, false);
  86961. gl.stencilFunc(gl.NOTEQUAL, 1, 1);
  86962. gl.stencilOp(gl.REPLACE, gl.REPLACE, gl.REPLACE);
  86963. // Write stencil buffer
  86964. geometryMask.renderWebGL(renderer, geometryMask, 0, camera);
  86965. renderer.flush();
  86966. // Use stencil buffer to affect next rendering object
  86967. gl.colorMask(true, true, true, true);
  86968. if (this.invertAlpha)
  86969. {
  86970. gl.stencilFunc(gl.NOTEQUAL, 1, 1);
  86971. }
  86972. else
  86973. {
  86974. gl.stencilFunc(gl.EQUAL, 1, 1);
  86975. }
  86976. gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
  86977. },
  86978. /**
  86979. * Flushes all rendered pixels and disables the stencil test of a WebGL context, thus disabling the mask for it.
  86980. *
  86981. * @method Phaser.Display.Masks.GeometryMask#postRenderWebGL
  86982. * @since 3.0.0
  86983. *
  86984. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - The WebGL Renderer instance to draw flush.
  86985. */
  86986. postRenderWebGL: function (renderer)
  86987. {
  86988. var gl = renderer.gl;
  86989. // Force flush before disabling stencil test
  86990. renderer.flush();
  86991. gl.disable(gl.STENCIL_TEST);
  86992. },
  86993. /**
  86994. * Sets the clipping path of a 2D canvas context to the Geometry Mask's underlying Graphics object.
  86995. *
  86996. * @method Phaser.Display.Masks.GeometryMask#preRenderCanvas
  86997. * @since 3.0.0
  86998. *
  86999. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - The Canvas Renderer instance to set the clipping path on.
  87000. * @param {Phaser.GameObjects.GameObject} mask - The Game Object being rendered.
  87001. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera the Game Object is being rendered through.
  87002. */
  87003. preRenderCanvas: function (renderer, mask, camera)
  87004. {
  87005. var geometryMask = this.geometryMask;
  87006. renderer.currentContext.save();
  87007. geometryMask.renderCanvas(renderer, geometryMask, 0, camera, null, null, true);
  87008. renderer.currentContext.clip();
  87009. },
  87010. /**
  87011. * Restore the canvas context's previous clipping path, thus turning off the mask for it.
  87012. *
  87013. * @method Phaser.Display.Masks.GeometryMask#postRenderCanvas
  87014. * @since 3.0.0
  87015. *
  87016. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - The Canvas Renderer instance being restored.
  87017. */
  87018. postRenderCanvas: function (renderer)
  87019. {
  87020. renderer.currentContext.restore();
  87021. },
  87022. /**
  87023. * Destroys this GeometryMask and nulls any references it holds.
  87024. *
  87025. * Note that if a Game Object is currently using this mask it will _not_ automatically detect you have destroyed it,
  87026. * so be sure to call `clearMask` on any Game Object using it, before destroying it.
  87027. *
  87028. * @method Phaser.Display.Masks.GeometryMask#destroy
  87029. * @since 3.7.0
  87030. */
  87031. destroy: function ()
  87032. {
  87033. this.geometryMask = null;
  87034. }
  87035. });
  87036. module.exports = GeometryMask;
  87037. /***/ }),
  87038. /* 426 */
  87039. /***/ (function(module, exports, __webpack_require__) {
  87040. /**
  87041. * @author Richard Davey <rich@photonstorm.com>
  87042. * @copyright 2019 Photon Storm Ltd.
  87043. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87044. */
  87045. var Class = __webpack_require__(0);
  87046. /**
  87047. * @classdesc
  87048. * A Bitmap Mask combines the alpha (opacity) of a masked pixel with the alpha of another pixel.
  87049. * Unlike the Geometry Mask, which is a clipping path, a Bitmap Mask behaves like an alpha mask,
  87050. * not a clipping path. It is only available when using the WebGL Renderer.
  87051. *
  87052. * A Bitmap Mask can use any Game Object to determine the alpha of each pixel of the masked Game Object(s).
  87053. * For any given point of a masked Game Object's texture, the pixel's alpha will be multiplied by the alpha
  87054. * of the pixel at the same position in the Bitmap Mask's Game Object. The color of the pixel from the
  87055. * Bitmap Mask doesn't matter.
  87056. *
  87057. * For example, if a pure blue pixel with an alpha of 0.95 is masked with a pure red pixel with an
  87058. * alpha of 0.5, the resulting pixel will be pure blue with an alpha of 0.475. Naturally, this means
  87059. * that a pixel in the mask with an alpha of 0 will hide the corresponding pixel in all masked Game Objects
  87060. * A pixel with an alpha of 1 in the masked Game Object will receive the same alpha as the
  87061. * corresponding pixel in the mask.
  87062. *
  87063. * The Bitmap Mask's location matches the location of its Game Object, not the location of the
  87064. * masked objects. Moving or transforming the underlying Game Object will change the mask
  87065. * (and affect the visibility of any masked objects), whereas moving or transforming a masked object
  87066. * will not affect the mask.
  87067. *
  87068. * The Bitmap Mask will not render its Game Object by itself. If the Game Object is not in a
  87069. * Scene's display list, it will only be used for the mask and its full texture will not be directly
  87070. * visible. Adding the underlying Game Object to a Scene will not cause any problems - it will
  87071. * render as a normal Game Object and will also serve as a mask.
  87072. *
  87073. * @class BitmapMask
  87074. * @memberof Phaser.Display.Masks
  87075. * @constructor
  87076. * @since 3.0.0
  87077. *
  87078. * @param {Phaser.Scene} scene - The Scene which this Bitmap Mask will be used in.
  87079. * @param {Phaser.GameObjects.GameObject} renderable - A renderable Game Object that uses a texture, such as a Sprite.
  87080. */
  87081. var BitmapMask = new Class({
  87082. initialize:
  87083. function BitmapMask (scene, renderable)
  87084. {
  87085. var renderer = scene.sys.game.renderer;
  87086. /**
  87087. * A reference to either the Canvas or WebGL Renderer that this Mask is using.
  87088. *
  87089. * @name Phaser.Display.Masks.BitmapMask#renderer
  87090. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  87091. * @since 3.11.0
  87092. */
  87093. this.renderer = renderer;
  87094. /**
  87095. * A renderable Game Object that uses a texture, such as a Sprite.
  87096. *
  87097. * @name Phaser.Display.Masks.BitmapMask#bitmapMask
  87098. * @type {Phaser.GameObjects.GameObject}
  87099. * @since 3.0.0
  87100. */
  87101. this.bitmapMask = renderable;
  87102. /**
  87103. * The texture used for the mask's framebuffer.
  87104. *
  87105. * @name Phaser.Display.Masks.BitmapMask#maskTexture
  87106. * @type {WebGLTexture}
  87107. * @default null
  87108. * @since 3.0.0
  87109. */
  87110. this.maskTexture = null;
  87111. /**
  87112. * The texture used for the main framebuffer.
  87113. *
  87114. * @name Phaser.Display.Masks.BitmapMask#mainTexture
  87115. * @type {WebGLTexture}
  87116. * @default null
  87117. * @since 3.0.0
  87118. */
  87119. this.mainTexture = null;
  87120. /**
  87121. * Whether the Bitmap Mask is dirty and needs to be updated.
  87122. *
  87123. * @name Phaser.Display.Masks.BitmapMask#dirty
  87124. * @type {boolean}
  87125. * @default true
  87126. * @since 3.0.0
  87127. */
  87128. this.dirty = true;
  87129. /**
  87130. * The framebuffer to which a masked Game Object is rendered.
  87131. *
  87132. * @name Phaser.Display.Masks.BitmapMask#mainFramebuffer
  87133. * @type {WebGLFramebuffer}
  87134. * @since 3.0.0
  87135. */
  87136. this.mainFramebuffer = null;
  87137. /**
  87138. * The framebuffer to which the Bitmap Mask's masking Game Object is rendered.
  87139. *
  87140. * @name Phaser.Display.Masks.BitmapMask#maskFramebuffer
  87141. * @type {WebGLFramebuffer}
  87142. * @since 3.0.0
  87143. */
  87144. this.maskFramebuffer = null;
  87145. /**
  87146. * Whether to invert the mask's alpha.
  87147. *
  87148. * If `true`, the alpha of the masking pixel will be inverted before it's multiplied with the masked pixel. Essentially, this means that a masked area will be visible only if the corresponding area in the mask is invisible.
  87149. *
  87150. * @name Phaser.Display.Masks.BitmapMask#invertAlpha
  87151. * @type {boolean}
  87152. * @since 3.1.2
  87153. */
  87154. this.invertAlpha = false;
  87155. if (renderer && renderer.gl)
  87156. {
  87157. var width = renderer.width;
  87158. var height = renderer.height;
  87159. var pot = ((width & (width - 1)) === 0 && (height & (height - 1)) === 0);
  87160. var gl = renderer.gl;
  87161. var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
  87162. var filter = gl.LINEAR;
  87163. this.mainTexture = renderer.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  87164. this.maskTexture = renderer.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  87165. this.mainFramebuffer = renderer.createFramebuffer(width, height, this.mainTexture, false);
  87166. this.maskFramebuffer = renderer.createFramebuffer(width, height, this.maskTexture, false);
  87167. renderer.onContextRestored(function (renderer)
  87168. {
  87169. var width = renderer.width;
  87170. var height = renderer.height;
  87171. var pot = ((width & (width - 1)) === 0 && (height & (height - 1)) === 0);
  87172. var gl = renderer.gl;
  87173. var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
  87174. var filter = gl.LINEAR;
  87175. this.mainTexture = renderer.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  87176. this.maskTexture = renderer.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  87177. this.mainFramebuffer = renderer.createFramebuffer(width, height, this.mainTexture, false);
  87178. this.maskFramebuffer = renderer.createFramebuffer(width, height, this.maskTexture, false);
  87179. }, this);
  87180. }
  87181. },
  87182. /**
  87183. * Sets a new masking Game Object for the Bitmap Mask.
  87184. *
  87185. * @method Phaser.Display.Masks.BitmapMask#setBitmap
  87186. * @since 3.0.0
  87187. *
  87188. * @param {Phaser.GameObjects.GameObject} renderable - A renderable Game Object that uses a texture, such as a Sprite.
  87189. */
  87190. setBitmap: function (renderable)
  87191. {
  87192. this.bitmapMask = renderable;
  87193. },
  87194. /**
  87195. * Prepares the WebGL Renderer to render a Game Object with this mask applied.
  87196. *
  87197. * This renders the masking Game Object to the mask framebuffer and switches to the main framebuffer so that the masked Game Object will be rendered to it instead of being rendered directly to the frame.
  87198. *
  87199. * @method Phaser.Display.Masks.BitmapMask#preRenderWebGL
  87200. * @since 3.0.0
  87201. *
  87202. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The WebGL Renderer to prepare.
  87203. * @param {Phaser.GameObjects.GameObject} maskedObject - The masked Game Object which will be drawn.
  87204. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to render to.
  87205. */
  87206. preRenderWebGL: function (renderer, maskedObject, camera)
  87207. {
  87208. renderer.pipelines.BitmapMaskPipeline.beginMask(this, maskedObject, camera);
  87209. },
  87210. /**
  87211. * Finalizes rendering of a masked Game Object.
  87212. *
  87213. * This resets the previously bound framebuffer and switches the WebGL Renderer to the Bitmap Mask Pipeline, which uses a special fragment shader to apply the masking effect.
  87214. *
  87215. * @method Phaser.Display.Masks.BitmapMask#postRenderWebGL
  87216. * @since 3.0.0
  87217. *
  87218. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The WebGL Renderer to clean up.
  87219. */
  87220. postRenderWebGL: function (renderer)
  87221. {
  87222. renderer.pipelines.BitmapMaskPipeline.endMask(this);
  87223. },
  87224. /**
  87225. * This is a NOOP method. Bitmap Masks are not supported by the Canvas Renderer.
  87226. *
  87227. * @method Phaser.Display.Masks.BitmapMask#preRenderCanvas
  87228. * @since 3.0.0
  87229. *
  87230. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The Canvas Renderer which would be rendered to.
  87231. * @param {Phaser.GameObjects.GameObject} mask - The masked Game Object which would be rendered.
  87232. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to render to.
  87233. */
  87234. preRenderCanvas: function ()
  87235. {
  87236. // NOOP
  87237. },
  87238. /**
  87239. * This is a NOOP method. Bitmap Masks are not supported by the Canvas Renderer.
  87240. *
  87241. * @method Phaser.Display.Masks.BitmapMask#postRenderCanvas
  87242. * @since 3.0.0
  87243. *
  87244. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The Canvas Renderer which would be rendered to.
  87245. */
  87246. postRenderCanvas: function ()
  87247. {
  87248. // NOOP
  87249. },
  87250. /**
  87251. * Destroys this BitmapMask and nulls any references it holds.
  87252. *
  87253. * Note that if a Game Object is currently using this mask it will _not_ automatically detect you have destroyed it,
  87254. * so be sure to call `clearMask` on any Game Object using it, before destroying it.
  87255. *
  87256. * @method Phaser.Display.Masks.BitmapMask#destroy
  87257. * @since 3.7.0
  87258. */
  87259. destroy: function ()
  87260. {
  87261. this.bitmapMask = null;
  87262. var renderer = this.renderer;
  87263. if (renderer && renderer.gl)
  87264. {
  87265. renderer.deleteTexture(this.mainTexture);
  87266. renderer.deleteTexture(this.maskTexture);
  87267. renderer.deleteFramebuffer(this.mainFramebuffer);
  87268. renderer.deleteFramebuffer(this.maskFramebuffer);
  87269. }
  87270. this.mainTexture = null;
  87271. this.maskTexture = null;
  87272. this.mainFramebuffer = null;
  87273. this.maskFramebuffer = null;
  87274. this.renderer = null;
  87275. }
  87276. });
  87277. module.exports = BitmapMask;
  87278. /***/ }),
  87279. /* 427 */
  87280. /***/ (function(module, exports, __webpack_require__) {
  87281. /**
  87282. * @author Richard Davey <rich@photonstorm.com>
  87283. * @copyright 2019 Photon Storm Ltd.
  87284. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87285. */
  87286. var BitmapMask = __webpack_require__(426);
  87287. var GeometryMask = __webpack_require__(425);
  87288. /**
  87289. * Provides methods used for getting and setting the mask of a Game Object.
  87290. *
  87291. * @name Phaser.GameObjects.Components.Mask
  87292. * @since 3.0.0
  87293. */
  87294. var Mask = {
  87295. /**
  87296. * The Mask this Game Object is using during render.
  87297. *
  87298. * @name Phaser.GameObjects.Components.Mask#mask
  87299. * @type {Phaser.Display.Masks.BitmapMask|Phaser.Display.Masks.GeometryMask}
  87300. * @since 3.0.0
  87301. */
  87302. mask: null,
  87303. /**
  87304. * Sets the mask that this Game Object will use to render with.
  87305. *
  87306. * The mask must have been previously created and can be either a GeometryMask or a BitmapMask.
  87307. * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas.
  87308. *
  87309. * If a mask is already set on this Game Object it will be immediately replaced.
  87310. *
  87311. * Masks are positioned in global space and are not relative to the Game Object to which they
  87312. * are applied. The reason for this is that multiple Game Objects can all share the same mask.
  87313. *
  87314. * Masks have no impact on physics or input detection. They are purely a rendering component
  87315. * that allows you to limit what is visible during the render pass.
  87316. *
  87317. * @method Phaser.GameObjects.Components.Mask#setMask
  87318. * @since 3.6.2
  87319. *
  87320. * @param {Phaser.Display.Masks.BitmapMask|Phaser.Display.Masks.GeometryMask} mask - The mask this Game Object will use when rendering.
  87321. *
  87322. * @return {this} This Game Object instance.
  87323. */
  87324. setMask: function (mask)
  87325. {
  87326. this.mask = mask;
  87327. return this;
  87328. },
  87329. /**
  87330. * Clears the mask that this Game Object was using.
  87331. *
  87332. * @method Phaser.GameObjects.Components.Mask#clearMask
  87333. * @since 3.6.2
  87334. *
  87335. * @param {boolean} [destroyMask=false] - Destroy the mask before clearing it?
  87336. *
  87337. * @return {this} This Game Object instance.
  87338. */
  87339. clearMask: function (destroyMask)
  87340. {
  87341. if (destroyMask === undefined) { destroyMask = false; }
  87342. if (destroyMask && this.mask)
  87343. {
  87344. this.mask.destroy();
  87345. }
  87346. this.mask = null;
  87347. return this;
  87348. },
  87349. /**
  87350. * Creates and returns a Bitmap Mask. This mask can be used by any Game Object,
  87351. * including this one.
  87352. *
  87353. * To create the mask you need to pass in a reference to a renderable Game Object.
  87354. * A renderable Game Object is one that uses a texture to render with, such as an
  87355. * Image, Sprite, Render Texture or BitmapText.
  87356. *
  87357. * If you do not provide a renderable object, and this Game Object has a texture,
  87358. * it will use itself as the object. This means you can call this method to create
  87359. * a Bitmap Mask from any renderable Game Object.
  87360. *
  87361. * @method Phaser.GameObjects.Components.Mask#createBitmapMask
  87362. * @since 3.6.2
  87363. *
  87364. * @param {Phaser.GameObjects.GameObject} [renderable] - A renderable Game Object that uses a texture, such as a Sprite.
  87365. *
  87366. * @return {Phaser.Display.Masks.BitmapMask} This Bitmap Mask that was created.
  87367. */
  87368. createBitmapMask: function (renderable)
  87369. {
  87370. if (renderable === undefined && this.texture)
  87371. {
  87372. // eslint-disable-next-line consistent-this
  87373. renderable = this;
  87374. }
  87375. return new BitmapMask(this.scene, renderable);
  87376. },
  87377. /**
  87378. * Creates and returns a Geometry Mask. This mask can be used by any Game Object,
  87379. * including this one.
  87380. *
  87381. * To create the mask you need to pass in a reference to a Graphics Game Object.
  87382. *
  87383. * If you do not provide a graphics object, and this Game Object is an instance
  87384. * of a Graphics object, then it will use itself to create the mask.
  87385. *
  87386. * This means you can call this method to create a Geometry Mask from any Graphics Game Object.
  87387. *
  87388. * @method Phaser.GameObjects.Components.Mask#createGeometryMask
  87389. * @since 3.6.2
  87390. *
  87391. * @param {Phaser.GameObjects.Graphics} [graphics] - A Graphics Game Object. The geometry within it will be used as the mask.
  87392. *
  87393. * @return {Phaser.Display.Masks.GeometryMask} This Geometry Mask that was created.
  87394. */
  87395. createGeometryMask: function (graphics)
  87396. {
  87397. if (graphics === undefined && this.type === 'Graphics')
  87398. {
  87399. // eslint-disable-next-line consistent-this
  87400. graphics = this;
  87401. }
  87402. return new GeometryMask(this.scene, graphics);
  87403. }
  87404. };
  87405. module.exports = Mask;
  87406. /***/ }),
  87407. /* 428 */
  87408. /***/ (function(module, exports) {
  87409. /**
  87410. * @author Richard Davey <rich@photonstorm.com>
  87411. * @copyright 2019 Photon Storm Ltd.
  87412. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87413. */
  87414. /**
  87415. * Rotate a `point` around `x` and `y` by the given `angle`.
  87416. *
  87417. * @function Phaser.Math.RotateAround
  87418. * @since 3.0.0
  87419. *
  87420. * @param {(Phaser.Geom.Point|object)} point - The point to be rotated.
  87421. * @param {number} x - The horizontal coordinate to rotate around.
  87422. * @param {number} y - The vertical coordinate to rotate around.
  87423. * @param {number} angle - The angle of rotation in radians.
  87424. *
  87425. * @return {Phaser.Geom.Point} The given point, rotated by the given angle around the given coordinates.
  87426. */
  87427. var RotateAround = function (point, x, y, angle)
  87428. {
  87429. var c = Math.cos(angle);
  87430. var s = Math.sin(angle);
  87431. var tx = point.x - x;
  87432. var ty = point.y - y;
  87433. point.x = tx * c - ty * s + x;
  87434. point.y = tx * s + ty * c + y;
  87435. return point;
  87436. };
  87437. module.exports = RotateAround;
  87438. /***/ }),
  87439. /* 429 */
  87440. /***/ (function(module, exports, __webpack_require__) {
  87441. /**
  87442. * @author Richard Davey <rich@photonstorm.com>
  87443. * @copyright 2019 Photon Storm Ltd.
  87444. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87445. */
  87446. var Point = __webpack_require__(6);
  87447. /**
  87448. * Get a point on a line that's a given percentage along its length.
  87449. *
  87450. * @function Phaser.Geom.Line.GetPoint
  87451. * @since 3.0.0
  87452. *
  87453. * @generic {Phaser.Geom.Point} O - [out,$return]
  87454. *
  87455. * @param {Phaser.Geom.Line} line - The line.
  87456. * @param {number} position - A value between 0 and 1, where 0 is the start, 0.5 is the middle and 1 is the end of the line.
  87457. * @param {(Phaser.Geom.Point|object)} [out] - An optional point, or point-like object, to store the coordinates of the point on the line.
  87458. *
  87459. * @return {(Phaser.Geom.Point|object)} The point on the line.
  87460. */
  87461. var GetPoint = function (line, position, out)
  87462. {
  87463. if (out === undefined) { out = new Point(); }
  87464. out.x = line.x1 + (line.x2 - line.x1) * position;
  87465. out.y = line.y1 + (line.y2 - line.y1) * position;
  87466. return out;
  87467. };
  87468. module.exports = GetPoint;
  87469. /***/ }),
  87470. /* 430 */
  87471. /***/ (function(module, exports, __webpack_require__) {
  87472. /**
  87473. * @author Richard Davey <rich@photonstorm.com>
  87474. * @copyright 2019 Photon Storm Ltd.
  87475. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87476. */
  87477. var GetPoint = __webpack_require__(204);
  87478. var Perimeter = __webpack_require__(135);
  87479. // Return an array of points from the perimeter of the rectangle
  87480. // each spaced out based on the quantity or step required
  87481. /**
  87482. * Return an array of points from the perimeter of the rectangle, each spaced out based on the quantity or step required.
  87483. *
  87484. * @function Phaser.Geom.Rectangle.GetPoints
  87485. * @since 3.0.0
  87486. *
  87487. * @generic {Phaser.Geom.Point[]} O - [out,$return]
  87488. *
  87489. * @param {Phaser.Geom.Rectangle} rectangle - The Rectangle object to get the points from.
  87490. * @param {number} step - Step between points. Used to calculate the number of points to return when quantity is falsy. Ignored if quantity is positive.
  87491. * @param {integer} quantity - The number of evenly spaced points from the rectangles perimeter to return. If falsy, step param will be used to calculate the number of points.
  87492. * @param {(array|Phaser.Geom.Point[])} [out] - An optional array to store the points in.
  87493. *
  87494. * @return {(array|Phaser.Geom.Point[])} An array of Points from the perimeter of the rectangle.
  87495. */
  87496. var GetPoints = function (rectangle, quantity, stepRate, out)
  87497. {
  87498. if (out === undefined) { out = []; }
  87499. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  87500. if (!quantity)
  87501. {
  87502. quantity = Perimeter(rectangle) / stepRate;
  87503. }
  87504. for (var i = 0; i < quantity; i++)
  87505. {
  87506. var position = i / quantity;
  87507. out.push(GetPoint(rectangle, position));
  87508. }
  87509. return out;
  87510. };
  87511. module.exports = GetPoints;
  87512. /***/ }),
  87513. /* 431 */
  87514. /***/ (function(module, exports) {
  87515. /**
  87516. * @author Richard Davey <rich@photonstorm.com>
  87517. * @copyright 2019 Photon Storm Ltd.
  87518. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87519. */
  87520. /**
  87521. * Provides methods used for setting the depth of a Game Object.
  87522. * Should be applied as a mixin and not used directly.
  87523. *
  87524. * @name Phaser.GameObjects.Components.Depth
  87525. * @since 3.0.0
  87526. */
  87527. var Depth = {
  87528. /**
  87529. * Private internal value. Holds the depth of the Game Object.
  87530. *
  87531. * @name Phaser.GameObjects.Components.Depth#_depth
  87532. * @type {integer}
  87533. * @private
  87534. * @default 0
  87535. * @since 3.0.0
  87536. */
  87537. _depth: 0,
  87538. /**
  87539. * The depth of this Game Object within the Scene.
  87540. *
  87541. * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order
  87542. * of Game Objects, without actually moving their position in the display list.
  87543. *
  87544. * The depth starts from zero (the default value) and increases from that point. A Game Object with a higher depth
  87545. * value will always render in front of one with a lower value.
  87546. *
  87547. * Setting the depth will queue a depth sort event within the Scene.
  87548. *
  87549. * @name Phaser.GameObjects.Components.Depth#depth
  87550. * @type {number}
  87551. * @since 3.0.0
  87552. */
  87553. depth: {
  87554. get: function ()
  87555. {
  87556. return this._depth;
  87557. },
  87558. set: function (value)
  87559. {
  87560. this.scene.sys.queueDepthSort();
  87561. this._depth = value;
  87562. }
  87563. },
  87564. /**
  87565. * The depth of this Game Object within the Scene.
  87566. *
  87567. * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order
  87568. * of Game Objects, without actually moving their position in the display list.
  87569. *
  87570. * The depth starts from zero (the default value) and increases from that point. A Game Object with a higher depth
  87571. * value will always render in front of one with a lower value.
  87572. *
  87573. * Setting the depth will queue a depth sort event within the Scene.
  87574. *
  87575. * @method Phaser.GameObjects.Components.Depth#setDepth
  87576. * @since 3.0.0
  87577. *
  87578. * @param {integer} value - The depth of this Game Object.
  87579. *
  87580. * @return {this} This Game Object instance.
  87581. */
  87582. setDepth: function (value)
  87583. {
  87584. if (value === undefined) { value = 0; }
  87585. this.depth = value;
  87586. return this;
  87587. }
  87588. };
  87589. module.exports = Depth;
  87590. /***/ }),
  87591. /* 432 */
  87592. /***/ (function(module, exports, __webpack_require__) {
  87593. /**
  87594. * @author Richard Davey <rich@photonstorm.com>
  87595. * @copyright 2019 Photon Storm Ltd.
  87596. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87597. */
  87598. var BlendModes = __webpack_require__(60);
  87599. /**
  87600. * Provides methods used for setting the blend mode of a Game Object.
  87601. * Should be applied as a mixin and not used directly.
  87602. *
  87603. * @name Phaser.GameObjects.Components.BlendMode
  87604. * @since 3.0.0
  87605. */
  87606. var BlendMode = {
  87607. /**
  87608. * Private internal value. Holds the current blend mode.
  87609. *
  87610. * @name Phaser.GameObjects.Components.BlendMode#_blendMode
  87611. * @type {integer}
  87612. * @private
  87613. * @default 0
  87614. * @since 3.0.0
  87615. */
  87616. _blendMode: BlendModes.NORMAL,
  87617. /**
  87618. * Sets the Blend Mode being used by this Game Object.
  87619. *
  87620. * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay)
  87621. *
  87622. * Under WebGL only the following Blend Modes are available:
  87623. *
  87624. * * ADD
  87625. * * MULTIPLY
  87626. * * SCREEN
  87627. * * ERASE
  87628. *
  87629. * Canvas has more available depending on browser support.
  87630. *
  87631. * You can also create your own custom Blend Modes in WebGL.
  87632. *
  87633. * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending
  87634. * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these
  87635. * reasons try to be careful about the construction of your Scene and the frequency of which blend modes
  87636. * are used.
  87637. *
  87638. * @name Phaser.GameObjects.Components.BlendMode#blendMode
  87639. * @type {(Phaser.BlendModes|string)}
  87640. * @since 3.0.0
  87641. */
  87642. blendMode: {
  87643. get: function ()
  87644. {
  87645. return this._blendMode;
  87646. },
  87647. set: function (value)
  87648. {
  87649. if (typeof value === 'string')
  87650. {
  87651. value = BlendModes[value];
  87652. }
  87653. value |= 0;
  87654. if (value >= -1)
  87655. {
  87656. this._blendMode = value;
  87657. }
  87658. }
  87659. },
  87660. /**
  87661. * Sets the Blend Mode being used by this Game Object.
  87662. *
  87663. * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay)
  87664. *
  87665. * Under WebGL only the following Blend Modes are available:
  87666. *
  87667. * * ADD
  87668. * * MULTIPLY
  87669. * * SCREEN
  87670. * * ERASE (only works when rendering to a framebuffer, like a Render Texture)
  87671. *
  87672. * Canvas has more available depending on browser support.
  87673. *
  87674. * You can also create your own custom Blend Modes in WebGL.
  87675. *
  87676. * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending
  87677. * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these
  87678. * reasons try to be careful about the construction of your Scene and the frequency in which blend modes
  87679. * are used.
  87680. *
  87681. * @method Phaser.GameObjects.Components.BlendMode#setBlendMode
  87682. * @since 3.0.0
  87683. *
  87684. * @param {(string|Phaser.BlendModes)} value - The BlendMode value. Either a string or a CONST.
  87685. *
  87686. * @return {this} This Game Object instance.
  87687. */
  87688. setBlendMode: function (value)
  87689. {
  87690. this.blendMode = value;
  87691. return this;
  87692. }
  87693. };
  87694. module.exports = BlendMode;
  87695. /***/ }),
  87696. /* 433 */
  87697. /***/ (function(module, exports, __webpack_require__) {
  87698. /**
  87699. * @author Richard Davey <rich@photonstorm.com>
  87700. * @copyright 2019 Photon Storm Ltd.
  87701. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87702. */
  87703. var Class = __webpack_require__(0);
  87704. /**
  87705. * @classdesc
  87706. * A single frame in an Animation sequence.
  87707. *
  87708. * An AnimationFrame consists of a reference to the Texture it uses for rendering, references to other
  87709. * frames in the animation, and index data. It also has the ability to modify the animation timing.
  87710. *
  87711. * AnimationFrames are generated automatically by the Animation class.
  87712. *
  87713. * @class AnimationFrame
  87714. * @memberof Phaser.Animations
  87715. * @constructor
  87716. * @since 3.0.0
  87717. *
  87718. * @param {string} textureKey - The key of the Texture this AnimationFrame uses.
  87719. * @param {(string|integer)} textureFrame - The key of the Frame within the Texture that this AnimationFrame uses.
  87720. * @param {integer} index - The index of this AnimationFrame within the Animation sequence.
  87721. * @param {Phaser.Textures.Frame} frame - A reference to the Texture Frame this AnimationFrame uses for rendering.
  87722. */
  87723. var AnimationFrame = new Class({
  87724. initialize:
  87725. function AnimationFrame (textureKey, textureFrame, index, frame)
  87726. {
  87727. /**
  87728. * The key of the Texture this AnimationFrame uses.
  87729. *
  87730. * @name Phaser.Animations.AnimationFrame#textureKey
  87731. * @type {string}
  87732. * @since 3.0.0
  87733. */
  87734. this.textureKey = textureKey;
  87735. /**
  87736. * The key of the Frame within the Texture that this AnimationFrame uses.
  87737. *
  87738. * @name Phaser.Animations.AnimationFrame#textureFrame
  87739. * @type {(string|integer)}
  87740. * @since 3.0.0
  87741. */
  87742. this.textureFrame = textureFrame;
  87743. /**
  87744. * The index of this AnimationFrame within the Animation sequence.
  87745. *
  87746. * @name Phaser.Animations.AnimationFrame#index
  87747. * @type {integer}
  87748. * @since 3.0.0
  87749. */
  87750. this.index = index;
  87751. /**
  87752. * A reference to the Texture Frame this AnimationFrame uses for rendering.
  87753. *
  87754. * @name Phaser.Animations.AnimationFrame#frame
  87755. * @type {Phaser.Textures.Frame}
  87756. * @since 3.0.0
  87757. */
  87758. this.frame = frame;
  87759. /**
  87760. * Is this the first frame in an animation sequence?
  87761. *
  87762. * @name Phaser.Animations.AnimationFrame#isFirst
  87763. * @type {boolean}
  87764. * @default false
  87765. * @readonly
  87766. * @since 3.0.0
  87767. */
  87768. this.isFirst = false;
  87769. /**
  87770. * Is this the last frame in an animation sequence?
  87771. *
  87772. * @name Phaser.Animations.AnimationFrame#isLast
  87773. * @type {boolean}
  87774. * @default false
  87775. * @readonly
  87776. * @since 3.0.0
  87777. */
  87778. this.isLast = false;
  87779. /**
  87780. * A reference to the AnimationFrame that comes before this one in the animation, if any.
  87781. *
  87782. * @name Phaser.Animations.AnimationFrame#prevFrame
  87783. * @type {?Phaser.Animations.AnimationFrame}
  87784. * @default null
  87785. * @readonly
  87786. * @since 3.0.0
  87787. */
  87788. this.prevFrame = null;
  87789. /**
  87790. * A reference to the AnimationFrame that comes after this one in the animation, if any.
  87791. *
  87792. * @name Phaser.Animations.AnimationFrame#nextFrame
  87793. * @type {?Phaser.Animations.AnimationFrame}
  87794. * @default null
  87795. * @readonly
  87796. * @since 3.0.0
  87797. */
  87798. this.nextFrame = null;
  87799. /**
  87800. * Additional time (in ms) that this frame should appear for during playback.
  87801. * The value is added onto the msPerFrame set by the animation.
  87802. *
  87803. * @name Phaser.Animations.AnimationFrame#duration
  87804. * @type {number}
  87805. * @default 0
  87806. * @since 3.0.0
  87807. */
  87808. this.duration = 0;
  87809. /**
  87810. * What % through the animation does this frame come?
  87811. * This value is generated when the animation is created and cached here.
  87812. *
  87813. * @name Phaser.Animations.AnimationFrame#progress
  87814. * @type {number}
  87815. * @default 0
  87816. * @readonly
  87817. * @since 3.0.0
  87818. */
  87819. this.progress = 0;
  87820. },
  87821. /**
  87822. * Generates a JavaScript object suitable for converting to JSON.
  87823. *
  87824. * @method Phaser.Animations.AnimationFrame#toJSON
  87825. * @since 3.0.0
  87826. *
  87827. * @return {Phaser.Animations.Types.JSONAnimationFrame} The AnimationFrame data.
  87828. */
  87829. toJSON: function ()
  87830. {
  87831. return {
  87832. key: this.textureKey,
  87833. frame: this.textureFrame,
  87834. duration: this.duration
  87835. };
  87836. },
  87837. /**
  87838. * Destroys this object by removing references to external resources and callbacks.
  87839. *
  87840. * @method Phaser.Animations.AnimationFrame#destroy
  87841. * @since 3.0.0
  87842. */
  87843. destroy: function ()
  87844. {
  87845. this.frame = undefined;
  87846. }
  87847. });
  87848. module.exports = AnimationFrame;
  87849. /***/ }),
  87850. /* 434 */
  87851. /***/ (function(module, exports) {
  87852. /**
  87853. * @author Richard Davey <rich@photonstorm.com>
  87854. * @copyright 2019 Photon Storm Ltd.
  87855. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87856. */
  87857. /**
  87858. * Searches a pre-sorted array for the closet value to the given number.
  87859. *
  87860. * If the `key` argument is given it will assume the array contains objects that all have the required `key` property name,
  87861. * and will check for the closest value of those to the given number.
  87862. *
  87863. * @function Phaser.Utils.Array.FindClosestInSorted
  87864. * @since 3.0.0
  87865. *
  87866. * @param {number} value - The value to search for in the array.
  87867. * @param {array} array - The array to search, which must be sorted.
  87868. * @param {string} [key] - An optional property key. If specified the array elements property will be checked against value.
  87869. *
  87870. * @return {(number|any)} The nearest value found in the array, or if a `key` was given, the nearest object with the matching property value.
  87871. */
  87872. var FindClosestInSorted = function (value, array, key)
  87873. {
  87874. if (!array.length)
  87875. {
  87876. return NaN;
  87877. }
  87878. else if (array.length === 1)
  87879. {
  87880. return array[0];
  87881. }
  87882. var i = 1;
  87883. var low;
  87884. var high;
  87885. if (key)
  87886. {
  87887. if (value < array[0][key])
  87888. {
  87889. return array[0];
  87890. }
  87891. while (array[i][key] < value)
  87892. {
  87893. i++;
  87894. }
  87895. }
  87896. else
  87897. {
  87898. while (array[i] < value)
  87899. {
  87900. i++;
  87901. }
  87902. }
  87903. if (i > array.length)
  87904. {
  87905. i = array.length;
  87906. }
  87907. if (key)
  87908. {
  87909. low = array[i - 1][key];
  87910. high = array[i][key];
  87911. return ((high - value) <= (value - low)) ? array[i] : array[i - 1];
  87912. }
  87913. else
  87914. {
  87915. low = array[i - 1];
  87916. high = array[i];
  87917. return ((high - value) <= (value - low)) ? high : low;
  87918. }
  87919. };
  87920. module.exports = FindClosestInSorted;
  87921. /***/ }),
  87922. /* 435 */
  87923. /***/ (function(module, exports, __webpack_require__) {
  87924. /**
  87925. * @author Richard Davey <rich@photonstorm.com>
  87926. * @copyright 2019 Photon Storm Ltd.
  87927. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87928. */
  87929. var Clamp = __webpack_require__(23);
  87930. // bitmask flag for GameObject.renderMask
  87931. var _FLAG = 2; // 0010
  87932. /**
  87933. * Provides methods used for setting the alpha properties of a Game Object.
  87934. * Should be applied as a mixin and not used directly.
  87935. *
  87936. * @name Phaser.GameObjects.Components.Alpha
  87937. * @since 3.0.0
  87938. */
  87939. var Alpha = {
  87940. /**
  87941. * Private internal value. Holds the global alpha value.
  87942. *
  87943. * @name Phaser.GameObjects.Components.Alpha#_alpha
  87944. * @type {number}
  87945. * @private
  87946. * @default 1
  87947. * @since 3.0.0
  87948. */
  87949. _alpha: 1,
  87950. /**
  87951. * Private internal value. Holds the top-left alpha value.
  87952. *
  87953. * @name Phaser.GameObjects.Components.Alpha#_alphaTL
  87954. * @type {number}
  87955. * @private
  87956. * @default 1
  87957. * @since 3.0.0
  87958. */
  87959. _alphaTL: 1,
  87960. /**
  87961. * Private internal value. Holds the top-right alpha value.
  87962. *
  87963. * @name Phaser.GameObjects.Components.Alpha#_alphaTR
  87964. * @type {number}
  87965. * @private
  87966. * @default 1
  87967. * @since 3.0.0
  87968. */
  87969. _alphaTR: 1,
  87970. /**
  87971. * Private internal value. Holds the bottom-left alpha value.
  87972. *
  87973. * @name Phaser.GameObjects.Components.Alpha#_alphaBL
  87974. * @type {number}
  87975. * @private
  87976. * @default 1
  87977. * @since 3.0.0
  87978. */
  87979. _alphaBL: 1,
  87980. /**
  87981. * Private internal value. Holds the bottom-right alpha value.
  87982. *
  87983. * @name Phaser.GameObjects.Components.Alpha#_alphaBR
  87984. * @type {number}
  87985. * @private
  87986. * @default 1
  87987. * @since 3.0.0
  87988. */
  87989. _alphaBR: 1,
  87990. /**
  87991. * Clears all alpha values associated with this Game Object.
  87992. *
  87993. * Immediately sets the alpha levels back to 1 (fully opaque).
  87994. *
  87995. * @method Phaser.GameObjects.Components.Alpha#clearAlpha
  87996. * @since 3.0.0
  87997. *
  87998. * @return {this} This Game Object instance.
  87999. */
  88000. clearAlpha: function ()
  88001. {
  88002. return this.setAlpha(1);
  88003. },
  88004. /**
  88005. * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders.
  88006. * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque.
  88007. *
  88008. * If your game is running under WebGL you can optionally specify four different alpha values, each of which
  88009. * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used.
  88010. *
  88011. * @method Phaser.GameObjects.Components.Alpha#setAlpha
  88012. * @since 3.0.0
  88013. *
  88014. * @param {number} [topLeft=1] - The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object.
  88015. * @param {number} [topRight] - The alpha value used for the top-right of the Game Object. WebGL only.
  88016. * @param {number} [bottomLeft] - The alpha value used for the bottom-left of the Game Object. WebGL only.
  88017. * @param {number} [bottomRight] - The alpha value used for the bottom-right of the Game Object. WebGL only.
  88018. *
  88019. * @return {this} This Game Object instance.
  88020. */
  88021. setAlpha: function (topLeft, topRight, bottomLeft, bottomRight)
  88022. {
  88023. if (topLeft === undefined) { topLeft = 1; }
  88024. // Treat as if there is only one alpha value for the whole Game Object
  88025. if (topRight === undefined)
  88026. {
  88027. this.alpha = topLeft;
  88028. }
  88029. else
  88030. {
  88031. this._alphaTL = Clamp(topLeft, 0, 1);
  88032. this._alphaTR = Clamp(topRight, 0, 1);
  88033. this._alphaBL = Clamp(bottomLeft, 0, 1);
  88034. this._alphaBR = Clamp(bottomRight, 0, 1);
  88035. }
  88036. return this;
  88037. },
  88038. /**
  88039. * The alpha value of the Game Object.
  88040. *
  88041. * This is a global value, impacting the entire Game Object, not just a region of it.
  88042. *
  88043. * @name Phaser.GameObjects.Components.Alpha#alpha
  88044. * @type {number}
  88045. * @since 3.0.0
  88046. */
  88047. alpha: {
  88048. get: function ()
  88049. {
  88050. return this._alpha;
  88051. },
  88052. set: function (value)
  88053. {
  88054. var v = Clamp(value, 0, 1);
  88055. this._alpha = v;
  88056. this._alphaTL = v;
  88057. this._alphaTR = v;
  88058. this._alphaBL = v;
  88059. this._alphaBR = v;
  88060. if (v === 0)
  88061. {
  88062. this.renderFlags &= ~_FLAG;
  88063. }
  88064. else
  88065. {
  88066. this.renderFlags |= _FLAG;
  88067. }
  88068. }
  88069. },
  88070. /**
  88071. * The alpha value starting from the top-left of the Game Object.
  88072. * This value is interpolated from the corner to the center of the Game Object.
  88073. *
  88074. * @name Phaser.GameObjects.Components.Alpha#alphaTopLeft
  88075. * @type {number}
  88076. * @webglOnly
  88077. * @since 3.0.0
  88078. */
  88079. alphaTopLeft: {
  88080. get: function ()
  88081. {
  88082. return this._alphaTL;
  88083. },
  88084. set: function (value)
  88085. {
  88086. var v = Clamp(value, 0, 1);
  88087. this._alphaTL = v;
  88088. if (v !== 0)
  88089. {
  88090. this.renderFlags |= _FLAG;
  88091. }
  88092. }
  88093. },
  88094. /**
  88095. * The alpha value starting from the top-right of the Game Object.
  88096. * This value is interpolated from the corner to the center of the Game Object.
  88097. *
  88098. * @name Phaser.GameObjects.Components.Alpha#alphaTopRight
  88099. * @type {number}
  88100. * @webglOnly
  88101. * @since 3.0.0
  88102. */
  88103. alphaTopRight: {
  88104. get: function ()
  88105. {
  88106. return this._alphaTR;
  88107. },
  88108. set: function (value)
  88109. {
  88110. var v = Clamp(value, 0, 1);
  88111. this._alphaTR = v;
  88112. if (v !== 0)
  88113. {
  88114. this.renderFlags |= _FLAG;
  88115. }
  88116. }
  88117. },
  88118. /**
  88119. * The alpha value starting from the bottom-left of the Game Object.
  88120. * This value is interpolated from the corner to the center of the Game Object.
  88121. *
  88122. * @name Phaser.GameObjects.Components.Alpha#alphaBottomLeft
  88123. * @type {number}
  88124. * @webglOnly
  88125. * @since 3.0.0
  88126. */
  88127. alphaBottomLeft: {
  88128. get: function ()
  88129. {
  88130. return this._alphaBL;
  88131. },
  88132. set: function (value)
  88133. {
  88134. var v = Clamp(value, 0, 1);
  88135. this._alphaBL = v;
  88136. if (v !== 0)
  88137. {
  88138. this.renderFlags |= _FLAG;
  88139. }
  88140. }
  88141. },
  88142. /**
  88143. * The alpha value starting from the bottom-right of the Game Object.
  88144. * This value is interpolated from the corner to the center of the Game Object.
  88145. *
  88146. * @name Phaser.GameObjects.Components.Alpha#alphaBottomRight
  88147. * @type {number}
  88148. * @webglOnly
  88149. * @since 3.0.0
  88150. */
  88151. alphaBottomRight: {
  88152. get: function ()
  88153. {
  88154. return this._alphaBR;
  88155. },
  88156. set: function (value)
  88157. {
  88158. var v = Clamp(value, 0, 1);
  88159. this._alphaBR = v;
  88160. if (v !== 0)
  88161. {
  88162. this.renderFlags |= _FLAG;
  88163. }
  88164. }
  88165. }
  88166. };
  88167. module.exports = Alpha;
  88168. /***/ }),
  88169. /* 436 */
  88170. /***/ (function(module, exports) {
  88171. /**
  88172. * @author Richard Davey <rich@photonstorm.com>
  88173. * @copyright 2019 Photon Storm Ltd.
  88174. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88175. */
  88176. /**
  88177. * Returns the circumference of the given Circle.
  88178. *
  88179. * @function Phaser.Geom.Circle.Circumference
  88180. * @since 3.0.0
  88181. *
  88182. * @param {Phaser.Geom.Circle} circle - The Circle to get the circumference of.
  88183. *
  88184. * @return {number} The circumference of the Circle.
  88185. */
  88186. var Circumference = function (circle)
  88187. {
  88188. return 2 * (Math.PI * circle.radius);
  88189. };
  88190. module.exports = Circumference;
  88191. /***/ }),
  88192. /* 437 */
  88193. /***/ (function(module, exports, __webpack_require__) {
  88194. /**
  88195. * @author Richard Davey <rich@photonstorm.com>
  88196. * @copyright 2019 Photon Storm Ltd.
  88197. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88198. */
  88199. var Circumference = __webpack_require__(436);
  88200. var CircumferencePoint = __webpack_require__(207);
  88201. var FromPercent = __webpack_require__(100);
  88202. var MATH_CONST = __webpack_require__(20);
  88203. /**
  88204. * Returns an array of Point objects containing the coordinates of the points around the circumference of the Circle,
  88205. * based on the given quantity or stepRate values.
  88206. *
  88207. * @function Phaser.Geom.Circle.GetPoints
  88208. * @since 3.0.0
  88209. *
  88210. * @param {Phaser.Geom.Circle} circle - The Circle to get the points from.
  88211. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  88212. * @param {number} [stepRate] - Sets the quantity by getting the circumference of the circle and dividing it by the stepRate.
  88213. * @param {array} [output] - An array to insert the points in to. If not provided a new array will be created.
  88214. *
  88215. * @return {Phaser.Geom.Point[]} An array of Point objects pertaining to the points around the circumference of the circle.
  88216. */
  88217. var GetPoints = function (circle, quantity, stepRate, out)
  88218. {
  88219. if (out === undefined) { out = []; }
  88220. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  88221. if (!quantity)
  88222. {
  88223. quantity = Circumference(circle) / stepRate;
  88224. }
  88225. for (var i = 0; i < quantity; i++)
  88226. {
  88227. var angle = FromPercent(i / quantity, 0, MATH_CONST.PI2);
  88228. out.push(CircumferencePoint(circle, angle));
  88229. }
  88230. return out;
  88231. };
  88232. module.exports = GetPoints;
  88233. /***/ }),
  88234. /* 438 */
  88235. /***/ (function(module, exports, __webpack_require__) {
  88236. /**
  88237. * @author Richard Davey <rich@photonstorm.com>
  88238. * @copyright 2019 Photon Storm Ltd.
  88239. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88240. */
  88241. var CircumferencePoint = __webpack_require__(207);
  88242. var FromPercent = __webpack_require__(100);
  88243. var MATH_CONST = __webpack_require__(20);
  88244. var Point = __webpack_require__(6);
  88245. /**
  88246. * Returns a Point object containing the coordinates of a point on the circumference of the Circle
  88247. * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point
  88248. * at 180 degrees around the circle.
  88249. *
  88250. * @function Phaser.Geom.Circle.GetPoint
  88251. * @since 3.0.0
  88252. *
  88253. * @generic {Phaser.Geom.Point} O - [out,$return]
  88254. *
  88255. * @param {Phaser.Geom.Circle} circle - The Circle to get the circumference point on.
  88256. * @param {number} position - A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the circle.
  88257. * @param {(Phaser.Geom.Point|object)} [out] - An object to store the return values in. If not given a Point object will be created.
  88258. *
  88259. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point around the circle.
  88260. */
  88261. var GetPoint = function (circle, position, out)
  88262. {
  88263. if (out === undefined) { out = new Point(); }
  88264. var angle = FromPercent(position, 0, MATH_CONST.PI2);
  88265. return CircumferencePoint(circle, angle, out);
  88266. };
  88267. module.exports = GetPoint;
  88268. /***/ }),
  88269. /* 439 */
  88270. /***/ (function(module, exports, __webpack_require__) {
  88271. /**
  88272. * @author Richard Davey <rich@photonstorm.com>
  88273. * @copyright 2019 Photon Storm Ltd.
  88274. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88275. */
  88276. var GetRight = __webpack_require__(47);
  88277. var GetTop = __webpack_require__(45);
  88278. var SetRight = __webpack_require__(46);
  88279. var SetTop = __webpack_require__(44);
  88280. /**
  88281. * Takes given Game Object and aligns it so that it is positioned in the top right of the other.
  88282. *
  88283. * @function Phaser.Display.Align.In.TopRight
  88284. * @since 3.0.0
  88285. *
  88286. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88287. *
  88288. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  88289. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88290. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88291. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88292. *
  88293. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88294. */
  88295. var TopRight = function (gameObject, alignIn, offsetX, offsetY)
  88296. {
  88297. if (offsetX === undefined) { offsetX = 0; }
  88298. if (offsetY === undefined) { offsetY = 0; }
  88299. SetRight(gameObject, GetRight(alignIn) + offsetX);
  88300. SetTop(gameObject, GetTop(alignIn) - offsetY);
  88301. return gameObject;
  88302. };
  88303. module.exports = TopRight;
  88304. /***/ }),
  88305. /* 440 */
  88306. /***/ (function(module, exports, __webpack_require__) {
  88307. /**
  88308. * @author Richard Davey <rich@photonstorm.com>
  88309. * @copyright 2019 Photon Storm Ltd.
  88310. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88311. */
  88312. var GetLeft = __webpack_require__(49);
  88313. var GetTop = __webpack_require__(45);
  88314. var SetLeft = __webpack_require__(48);
  88315. var SetTop = __webpack_require__(44);
  88316. /**
  88317. * Takes given Game Object and aligns it so that it is positioned in the top left of the other.
  88318. *
  88319. * @function Phaser.Display.Align.In.TopLeft
  88320. * @since 3.0.0
  88321. *
  88322. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88323. *
  88324. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  88325. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88326. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88327. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88328. *
  88329. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88330. */
  88331. var TopLeft = function (gameObject, alignIn, offsetX, offsetY)
  88332. {
  88333. if (offsetX === undefined) { offsetX = 0; }
  88334. if (offsetY === undefined) { offsetY = 0; }
  88335. SetLeft(gameObject, GetLeft(alignIn) - offsetX);
  88336. SetTop(gameObject, GetTop(alignIn) - offsetY);
  88337. return gameObject;
  88338. };
  88339. module.exports = TopLeft;
  88340. /***/ }),
  88341. /* 441 */
  88342. /***/ (function(module, exports, __webpack_require__) {
  88343. /**
  88344. * @author Richard Davey <rich@photonstorm.com>
  88345. * @copyright 2019 Photon Storm Ltd.
  88346. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88347. */
  88348. var GetCenterX = __webpack_require__(81);
  88349. var GetTop = __webpack_require__(45);
  88350. var SetCenterX = __webpack_require__(80);
  88351. var SetTop = __webpack_require__(44);
  88352. /**
  88353. * Takes given Game Object and aligns it so that it is positioned in the top center of the other.
  88354. *
  88355. * @function Phaser.Display.Align.In.TopCenter
  88356. * @since 3.0.0
  88357. *
  88358. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88359. *
  88360. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  88361. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88362. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88363. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88364. *
  88365. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88366. */
  88367. var TopCenter = function (gameObject, alignIn, offsetX, offsetY)
  88368. {
  88369. if (offsetX === undefined) { offsetX = 0; }
  88370. if (offsetY === undefined) { offsetY = 0; }
  88371. SetCenterX(gameObject, GetCenterX(alignIn) + offsetX);
  88372. SetTop(gameObject, GetTop(alignIn) - offsetY);
  88373. return gameObject;
  88374. };
  88375. module.exports = TopCenter;
  88376. /***/ }),
  88377. /* 442 */
  88378. /***/ (function(module, exports, __webpack_require__) {
  88379. /**
  88380. * @author Richard Davey <rich@photonstorm.com>
  88381. * @copyright 2019 Photon Storm Ltd.
  88382. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88383. */
  88384. var GetCenterY = __webpack_require__(78);
  88385. var GetRight = __webpack_require__(47);
  88386. var SetCenterY = __webpack_require__(79);
  88387. var SetRight = __webpack_require__(46);
  88388. /**
  88389. * Takes given Game Object and aligns it so that it is positioned in the right center of the other.
  88390. *
  88391. * @function Phaser.Display.Align.In.RightCenter
  88392. * @since 3.0.0
  88393. *
  88394. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88395. *
  88396. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  88397. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88398. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88399. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88400. *
  88401. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88402. */
  88403. var RightCenter = function (gameObject, alignIn, offsetX, offsetY)
  88404. {
  88405. if (offsetX === undefined) { offsetX = 0; }
  88406. if (offsetY === undefined) { offsetY = 0; }
  88407. SetRight(gameObject, GetRight(alignIn) + offsetX);
  88408. SetCenterY(gameObject, GetCenterY(alignIn) + offsetY);
  88409. return gameObject;
  88410. };
  88411. module.exports = RightCenter;
  88412. /***/ }),
  88413. /* 443 */
  88414. /***/ (function(module, exports, __webpack_require__) {
  88415. /**
  88416. * @author Richard Davey <rich@photonstorm.com>
  88417. * @copyright 2019 Photon Storm Ltd.
  88418. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88419. */
  88420. var GetCenterY = __webpack_require__(78);
  88421. var GetLeft = __webpack_require__(49);
  88422. var SetCenterY = __webpack_require__(79);
  88423. var SetLeft = __webpack_require__(48);
  88424. /**
  88425. * Takes given Game Object and aligns it so that it is positioned in the left center of the other.
  88426. *
  88427. * @function Phaser.Display.Align.In.LeftCenter
  88428. * @since 3.0.0
  88429. *
  88430. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88431. *
  88432. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  88433. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88434. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88435. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88436. *
  88437. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88438. */
  88439. var LeftCenter = function (gameObject, alignIn, offsetX, offsetY)
  88440. {
  88441. if (offsetX === undefined) { offsetX = 0; }
  88442. if (offsetY === undefined) { offsetY = 0; }
  88443. SetLeft(gameObject, GetLeft(alignIn) - offsetX);
  88444. SetCenterY(gameObject, GetCenterY(alignIn) + offsetY);
  88445. return gameObject;
  88446. };
  88447. module.exports = LeftCenter;
  88448. /***/ }),
  88449. /* 444 */
  88450. /***/ (function(module, exports, __webpack_require__) {
  88451. /**
  88452. * @author Richard Davey <rich@photonstorm.com>
  88453. * @copyright 2019 Photon Storm Ltd.
  88454. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88455. */
  88456. var SetCenterX = __webpack_require__(80);
  88457. var SetCenterY = __webpack_require__(79);
  88458. /**
  88459. * Positions the Game Object so that it is centered on the given coordinates.
  88460. *
  88461. * @function Phaser.Display.Bounds.CenterOn
  88462. * @since 3.0.0
  88463. *
  88464. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88465. *
  88466. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  88467. * @param {number} x - The horizontal coordinate to position the Game Object on.
  88468. * @param {number} y - The vertical coordinate to position the Game Object on.
  88469. *
  88470. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  88471. */
  88472. var CenterOn = function (gameObject, x, y)
  88473. {
  88474. SetCenterX(gameObject, x);
  88475. return SetCenterY(gameObject, y);
  88476. };
  88477. module.exports = CenterOn;
  88478. /***/ }),
  88479. /* 445 */
  88480. /***/ (function(module, exports, __webpack_require__) {
  88481. /**
  88482. * @author Richard Davey <rich@photonstorm.com>
  88483. * @copyright 2019 Photon Storm Ltd.
  88484. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88485. */
  88486. var CenterOn = __webpack_require__(444);
  88487. var GetCenterX = __webpack_require__(81);
  88488. var GetCenterY = __webpack_require__(78);
  88489. /**
  88490. * Takes given Game Object and aligns it so that it is positioned in the center of the other.
  88491. *
  88492. * @function Phaser.Display.Align.In.Center
  88493. * @since 3.0.0
  88494. *
  88495. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88496. *
  88497. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  88498. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88499. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88500. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88501. *
  88502. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88503. */
  88504. var Center = function (gameObject, alignIn, offsetX, offsetY)
  88505. {
  88506. if (offsetX === undefined) { offsetX = 0; }
  88507. if (offsetY === undefined) { offsetY = 0; }
  88508. CenterOn(gameObject, GetCenterX(alignIn) + offsetX, GetCenterY(alignIn) + offsetY);
  88509. return gameObject;
  88510. };
  88511. module.exports = Center;
  88512. /***/ }),
  88513. /* 446 */
  88514. /***/ (function(module, exports, __webpack_require__) {
  88515. /**
  88516. * @author Richard Davey <rich@photonstorm.com>
  88517. * @copyright 2019 Photon Storm Ltd.
  88518. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88519. */
  88520. var GetBottom = __webpack_require__(51);
  88521. var GetRight = __webpack_require__(47);
  88522. var SetBottom = __webpack_require__(50);
  88523. var SetRight = __webpack_require__(46);
  88524. /**
  88525. * Takes given Game Object and aligns it so that it is positioned in the bottom right of the other.
  88526. *
  88527. * @function Phaser.Display.Align.In.BottomRight
  88528. * @since 3.0.0
  88529. *
  88530. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88531. *
  88532. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  88533. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88534. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88535. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88536. *
  88537. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88538. */
  88539. var BottomRight = function (gameObject, alignIn, offsetX, offsetY)
  88540. {
  88541. if (offsetX === undefined) { offsetX = 0; }
  88542. if (offsetY === undefined) { offsetY = 0; }
  88543. SetRight(gameObject, GetRight(alignIn) + offsetX);
  88544. SetBottom(gameObject, GetBottom(alignIn) + offsetY);
  88545. return gameObject;
  88546. };
  88547. module.exports = BottomRight;
  88548. /***/ }),
  88549. /* 447 */
  88550. /***/ (function(module, exports, __webpack_require__) {
  88551. /**
  88552. * @author Richard Davey <rich@photonstorm.com>
  88553. * @copyright 2019 Photon Storm Ltd.
  88554. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88555. */
  88556. var GetBottom = __webpack_require__(51);
  88557. var GetLeft = __webpack_require__(49);
  88558. var SetBottom = __webpack_require__(50);
  88559. var SetLeft = __webpack_require__(48);
  88560. /**
  88561. * Takes given Game Object and aligns it so that it is positioned in the bottom left of the other.
  88562. *
  88563. * @function Phaser.Display.Align.In.BottomLeft
  88564. * @since 3.0.0
  88565. *
  88566. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88567. *
  88568. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  88569. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88570. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88571. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88572. *
  88573. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88574. */
  88575. var BottomLeft = function (gameObject, alignIn, offsetX, offsetY)
  88576. {
  88577. if (offsetX === undefined) { offsetX = 0; }
  88578. if (offsetY === undefined) { offsetY = 0; }
  88579. SetLeft(gameObject, GetLeft(alignIn) - offsetX);
  88580. SetBottom(gameObject, GetBottom(alignIn) + offsetY);
  88581. return gameObject;
  88582. };
  88583. module.exports = BottomLeft;
  88584. /***/ }),
  88585. /* 448 */
  88586. /***/ (function(module, exports, __webpack_require__) {
  88587. /**
  88588. * @author Richard Davey <rich@photonstorm.com>
  88589. * @copyright 2019 Photon Storm Ltd.
  88590. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88591. */
  88592. var GetBottom = __webpack_require__(51);
  88593. var GetCenterX = __webpack_require__(81);
  88594. var SetBottom = __webpack_require__(50);
  88595. var SetCenterX = __webpack_require__(80);
  88596. /**
  88597. * Takes given Game Object and aligns it so that it is positioned in the bottom center of the other.
  88598. *
  88599. * @function Phaser.Display.Align.In.BottomCenter
  88600. * @since 3.0.0
  88601. *
  88602. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  88603. *
  88604. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  88605. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88606. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88607. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88608. *
  88609. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88610. */
  88611. var BottomCenter = function (gameObject, alignIn, offsetX, offsetY)
  88612. {
  88613. if (offsetX === undefined) { offsetX = 0; }
  88614. if (offsetY === undefined) { offsetY = 0; }
  88615. SetCenterX(gameObject, GetCenterX(alignIn) + offsetX);
  88616. SetBottom(gameObject, GetBottom(alignIn) + offsetY);
  88617. return gameObject;
  88618. };
  88619. module.exports = BottomCenter;
  88620. /***/ }),
  88621. /* 449 */
  88622. /***/ (function(module, exports, __webpack_require__) {
  88623. /**
  88624. * @author Richard Davey <rich@photonstorm.com>
  88625. * @copyright 2019 Photon Storm Ltd.
  88626. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88627. */
  88628. var ALIGN_CONST = __webpack_require__(208);
  88629. var AlignInMap = [];
  88630. AlignInMap[ALIGN_CONST.BOTTOM_CENTER] = __webpack_require__(448);
  88631. AlignInMap[ALIGN_CONST.BOTTOM_LEFT] = __webpack_require__(447);
  88632. AlignInMap[ALIGN_CONST.BOTTOM_RIGHT] = __webpack_require__(446);
  88633. AlignInMap[ALIGN_CONST.CENTER] = __webpack_require__(445);
  88634. AlignInMap[ALIGN_CONST.LEFT_CENTER] = __webpack_require__(443);
  88635. AlignInMap[ALIGN_CONST.RIGHT_CENTER] = __webpack_require__(442);
  88636. AlignInMap[ALIGN_CONST.TOP_CENTER] = __webpack_require__(441);
  88637. AlignInMap[ALIGN_CONST.TOP_LEFT] = __webpack_require__(440);
  88638. AlignInMap[ALIGN_CONST.TOP_RIGHT] = __webpack_require__(439);
  88639. /**
  88640. * Takes given Game Object and aligns it so that it is positioned relative to the other.
  88641. * The alignment used is based on the `position` argument, which is an `ALIGN_CONST` value, such as `LEFT_CENTER` or `TOP_RIGHT`.
  88642. *
  88643. * @function Phaser.Display.Align.In.QuickSet
  88644. * @since 3.0.0
  88645. *
  88646. * @generic {Phaser.GameObjects.GameObject} G - [child,$return]
  88647. *
  88648. * @param {Phaser.GameObjects.GameObject} child - The Game Object that will be positioned.
  88649. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  88650. * @param {integer} position - The position to align the Game Object with. This is an align constant, such as `ALIGN_CONST.LEFT_CENTER`.
  88651. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  88652. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  88653. *
  88654. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  88655. */
  88656. var QuickSet = function (child, alignIn, position, offsetX, offsetY)
  88657. {
  88658. return AlignInMap[position](child, alignIn, offsetX, offsetY);
  88659. };
  88660. module.exports = QuickSet;
  88661. /***/ }),
  88662. /* 450 */
  88663. /***/ (function(module, exports, __webpack_require__) {
  88664. /**
  88665. * @author Richard Davey <rich@photonstorm.com>
  88666. * @copyright 2019 Photon Storm Ltd.
  88667. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88668. */
  88669. /**
  88670. * @namespace Phaser.Actions
  88671. */
  88672. module.exports = {
  88673. Angle: __webpack_require__(1271),
  88674. Call: __webpack_require__(1270),
  88675. GetFirst: __webpack_require__(1269),
  88676. GetLast: __webpack_require__(1268),
  88677. GridAlign: __webpack_require__(1267),
  88678. IncAlpha: __webpack_require__(1233),
  88679. IncX: __webpack_require__(1232),
  88680. IncXY: __webpack_require__(1231),
  88681. IncY: __webpack_require__(1230),
  88682. PlaceOnCircle: __webpack_require__(1229),
  88683. PlaceOnEllipse: __webpack_require__(1228),
  88684. PlaceOnLine: __webpack_require__(1227),
  88685. PlaceOnRectangle: __webpack_require__(1226),
  88686. PlaceOnTriangle: __webpack_require__(1225),
  88687. PlayAnimation: __webpack_require__(1224),
  88688. PropertyValueInc: __webpack_require__(35),
  88689. PropertyValueSet: __webpack_require__(27),
  88690. RandomCircle: __webpack_require__(1223),
  88691. RandomEllipse: __webpack_require__(1222),
  88692. RandomLine: __webpack_require__(1221),
  88693. RandomRectangle: __webpack_require__(1220),
  88694. RandomTriangle: __webpack_require__(1219),
  88695. Rotate: __webpack_require__(1218),
  88696. RotateAround: __webpack_require__(1217),
  88697. RotateAroundDistance: __webpack_require__(1216),
  88698. ScaleX: __webpack_require__(1215),
  88699. ScaleXY: __webpack_require__(1214),
  88700. ScaleY: __webpack_require__(1213),
  88701. SetAlpha: __webpack_require__(1212),
  88702. SetBlendMode: __webpack_require__(1211),
  88703. SetDepth: __webpack_require__(1210),
  88704. SetHitArea: __webpack_require__(1209),
  88705. SetOrigin: __webpack_require__(1208),
  88706. SetRotation: __webpack_require__(1207),
  88707. SetScale: __webpack_require__(1206),
  88708. SetScaleX: __webpack_require__(1205),
  88709. SetScaleY: __webpack_require__(1204),
  88710. SetTint: __webpack_require__(1203),
  88711. SetVisible: __webpack_require__(1202),
  88712. SetX: __webpack_require__(1201),
  88713. SetXY: __webpack_require__(1200),
  88714. SetY: __webpack_require__(1199),
  88715. ShiftPosition: __webpack_require__(1198),
  88716. Shuffle: __webpack_require__(1197),
  88717. SmootherStep: __webpack_require__(1196),
  88718. SmoothStep: __webpack_require__(1195),
  88719. Spread: __webpack_require__(1194),
  88720. ToggleVisible: __webpack_require__(1193),
  88721. WrapInRectangle: __webpack_require__(1192)
  88722. };
  88723. /***/ }),
  88724. /* 451 */
  88725. /***/ (function(module, exports) {
  88726. /**
  88727. * The `Matter.Pair` module contains methods for creating and manipulating collision pairs.
  88728. *
  88729. * @class Pair
  88730. */
  88731. var Pair = {};
  88732. module.exports = Pair;
  88733. (function() {
  88734. /**
  88735. * Creates a pair.
  88736. * @method create
  88737. * @param {collision} collision
  88738. * @param {number} timestamp
  88739. * @return {pair} A new pair
  88740. */
  88741. Pair.create = function(collision, timestamp) {
  88742. var bodyA = collision.bodyA,
  88743. bodyB = collision.bodyB;
  88744. var pair = {
  88745. id: Pair.id(bodyA, bodyB),
  88746. bodyA: bodyA,
  88747. bodyB: bodyB,
  88748. activeContacts: [],
  88749. separation: 0,
  88750. isActive: true,
  88751. confirmedActive: true,
  88752. isSensor: bodyA.isSensor || bodyB.isSensor,
  88753. timeCreated: timestamp,
  88754. timeUpdated: timestamp,
  88755. collision: null,
  88756. inverseMass: 0,
  88757. friction: 0,
  88758. frictionStatic: 0,
  88759. restitution: 0,
  88760. slop: 0
  88761. };
  88762. Pair.update(pair, collision, timestamp);
  88763. return pair;
  88764. };
  88765. /**
  88766. * Updates a pair given a collision.
  88767. * @method update
  88768. * @param {pair} pair
  88769. * @param {collision} collision
  88770. * @param {number} timestamp
  88771. */
  88772. Pair.update = function(pair, collision, timestamp) {
  88773. pair.collision = collision;
  88774. if (collision.collided) {
  88775. var supports = collision.supports,
  88776. activeContacts = pair.activeContacts,
  88777. parentA = collision.parentA,
  88778. parentB = collision.parentB;
  88779. pair.inverseMass = parentA.inverseMass + parentB.inverseMass;
  88780. pair.friction = Math.min(parentA.friction, parentB.friction);
  88781. pair.frictionStatic = Math.max(parentA.frictionStatic, parentB.frictionStatic);
  88782. pair.restitution = Math.max(parentA.restitution, parentB.restitution);
  88783. pair.slop = Math.max(parentA.slop, parentB.slop);
  88784. for (var i = 0; i < supports.length; i++) {
  88785. activeContacts[i] = supports[i].contact;
  88786. }
  88787. // optimise array size
  88788. var supportCount = supports.length;
  88789. if (supportCount < activeContacts.length) {
  88790. activeContacts.length = supportCount;
  88791. }
  88792. pair.separation = collision.depth;
  88793. Pair.setActive(pair, true, timestamp);
  88794. } else {
  88795. if (pair.isActive === true)
  88796. Pair.setActive(pair, false, timestamp);
  88797. }
  88798. };
  88799. /**
  88800. * Set a pair as active or inactive.
  88801. * @method setActive
  88802. * @param {pair} pair
  88803. * @param {bool} isActive
  88804. * @param {number} timestamp
  88805. */
  88806. Pair.setActive = function(pair, isActive, timestamp) {
  88807. if (isActive) {
  88808. pair.isActive = true;
  88809. pair.timeUpdated = timestamp;
  88810. } else {
  88811. pair.isActive = false;
  88812. pair.activeContacts.length = 0;
  88813. }
  88814. };
  88815. /**
  88816. * Get the id for the given pair.
  88817. * @method id
  88818. * @param {body} bodyA
  88819. * @param {body} bodyB
  88820. * @return {string} Unique pairId
  88821. */
  88822. Pair.id = function(bodyA, bodyB) {
  88823. if (bodyA.id < bodyB.id) {
  88824. return 'A' + bodyA.id + 'B' + bodyB.id;
  88825. } else {
  88826. return 'A' + bodyB.id + 'B' + bodyA.id;
  88827. }
  88828. };
  88829. })();
  88830. /***/ }),
  88831. /* 452 */
  88832. /***/ (function(module, exports, __webpack_require__) {
  88833. /**
  88834. * @author Richard Davey <rich@photonstorm.com>
  88835. * @copyright 2019 Photon Storm Ltd.
  88836. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88837. */
  88838. /**
  88839. * @namespace Phaser.Physics.Matter.Components
  88840. */
  88841. module.exports = {
  88842. Bounce: __webpack_require__(1336),
  88843. Collision: __webpack_require__(1335),
  88844. Force: __webpack_require__(1334),
  88845. Friction: __webpack_require__(1333),
  88846. Gravity: __webpack_require__(1332),
  88847. Mass: __webpack_require__(1331),
  88848. Static: __webpack_require__(1330),
  88849. Sensor: __webpack_require__(1329),
  88850. SetBody: __webpack_require__(1328),
  88851. Sleep: __webpack_require__(1326),
  88852. Transform: __webpack_require__(1313),
  88853. Velocity: __webpack_require__(1312)
  88854. };
  88855. /***/ }),
  88856. /* 453 */
  88857. /***/ (function(module, exports, __webpack_require__) {
  88858. /**
  88859. * @author Richard Davey <rich@photonstorm.com>
  88860. * @author Felipe Alfonso <@bitnenfer>
  88861. * @copyright 2019 Photon Storm Ltd.
  88862. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88863. */
  88864. var Class = __webpack_require__(0);
  88865. var ShaderSourceFS = __webpack_require__(1042);
  88866. var TextureTintPipeline = __webpack_require__(211);
  88867. var LIGHT_COUNT = 10;
  88868. /**
  88869. * @classdesc
  88870. * ForwardDiffuseLightPipeline implements a forward rendering approach for 2D lights.
  88871. * This pipeline extends TextureTintPipeline so it implements all it's rendering functions
  88872. * and batching system.
  88873. *
  88874. * @class ForwardDiffuseLightPipeline
  88875. * @extends Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline
  88876. * @memberof Phaser.Renderer.WebGL.Pipelines
  88877. * @constructor
  88878. * @since 3.0.0
  88879. *
  88880. * @param {object} config - The configuration of the pipeline, same as the {@link Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline}. The fragment shader will be replaced with the lighting shader.
  88881. */
  88882. var ForwardDiffuseLightPipeline = new Class({
  88883. Extends: TextureTintPipeline,
  88884. initialize:
  88885. function ForwardDiffuseLightPipeline (config)
  88886. {
  88887. LIGHT_COUNT = config.maxLights;
  88888. config.fragShader = ShaderSourceFS.replace('%LIGHT_COUNT%', LIGHT_COUNT.toString());
  88889. TextureTintPipeline.call(this, config);
  88890. /**
  88891. * Default normal map texture to use.
  88892. *
  88893. * @name Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#defaultNormalMap
  88894. * @type {Phaser.Texture.Frame}
  88895. * @private
  88896. * @since 3.11.0
  88897. */
  88898. this.defaultNormalMap;
  88899. /**
  88900. * Inverse rotation matrix for normal map rotations.
  88901. *
  88902. * @name Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#inverseRotationMatrix
  88903. * @type {Float32Array}
  88904. * @private
  88905. * @since 3.16.0
  88906. */
  88907. this.inverseRotationMatrix = new Float32Array([
  88908. 1, 0, 0,
  88909. 0, 1, 0,
  88910. 0, 0, 1
  88911. ]);
  88912. },
  88913. /**
  88914. * Called when the Game has fully booted and the Renderer has finished setting up.
  88915. *
  88916. * By this stage all Game level systems are now in place and you can perform any final
  88917. * tasks that the pipeline may need that relied on game systems such as the Texture Manager.
  88918. *
  88919. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#boot
  88920. * @override
  88921. * @since 3.11.0
  88922. */
  88923. boot: function ()
  88924. {
  88925. this.defaultNormalMap = this.game.textures.getFrame('__DEFAULT');
  88926. },
  88927. /**
  88928. * This function binds its base class resources and this lights 2D resources.
  88929. *
  88930. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#onBind
  88931. * @override
  88932. * @since 3.0.0
  88933. *
  88934. * @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
  88935. *
  88936. * @return {this} This WebGLPipeline instance.
  88937. */
  88938. onBind: function (gameObject)
  88939. {
  88940. TextureTintPipeline.prototype.onBind.call(this);
  88941. var renderer = this.renderer;
  88942. var program = this.program;
  88943. this.mvpUpdate();
  88944. renderer.setInt1(program, 'uNormSampler', 1);
  88945. renderer.setFloat2(program, 'uResolution', this.width, this.height);
  88946. if (gameObject)
  88947. {
  88948. this.setNormalMap(gameObject);
  88949. }
  88950. return this;
  88951. },
  88952. /**
  88953. * This function sets all the needed resources for each camera pass.
  88954. *
  88955. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#onRender
  88956. * @since 3.0.0
  88957. *
  88958. * @param {Phaser.Scene} scene - The Scene being rendered.
  88959. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Scene Camera being rendered with.
  88960. *
  88961. * @return {this} This WebGLPipeline instance.
  88962. */
  88963. onRender: function (scene, camera)
  88964. {
  88965. this.active = false;
  88966. var lightManager = scene.sys.lights;
  88967. if (!lightManager || lightManager.lights.length <= 0 || !lightManager.active)
  88968. {
  88969. // Passthru
  88970. return this;
  88971. }
  88972. var lights = lightManager.cull(camera);
  88973. var lightCount = Math.min(lights.length, LIGHT_COUNT);
  88974. if (lightCount === 0)
  88975. {
  88976. return this;
  88977. }
  88978. this.active = true;
  88979. var renderer = this.renderer;
  88980. var program = this.program;
  88981. var cameraMatrix = camera.matrix;
  88982. var point = {x: 0, y: 0};
  88983. var height = renderer.height;
  88984. var index;
  88985. for (index = 0; index < LIGHT_COUNT; ++index)
  88986. {
  88987. // Reset lights
  88988. renderer.setFloat1(program, 'uLights[' + index + '].radius', 0);
  88989. }
  88990. renderer.setFloat4(program, 'uCamera', camera.x, camera.y, camera.rotation, camera.zoom);
  88991. renderer.setFloat3(program, 'uAmbientLightColor', lightManager.ambientColor.r, lightManager.ambientColor.g, lightManager.ambientColor.b);
  88992. for (index = 0; index < lightCount; ++index)
  88993. {
  88994. var light = lights[index];
  88995. var lightName = 'uLights[' + index + '].';
  88996. cameraMatrix.transformPoint(light.x, light.y, point);
  88997. renderer.setFloat2(program, lightName + 'position', point.x - (camera.scrollX * light.scrollFactorX * camera.zoom), height - (point.y - (camera.scrollY * light.scrollFactorY) * camera.zoom));
  88998. renderer.setFloat3(program, lightName + 'color', light.r, light.g, light.b);
  88999. renderer.setFloat1(program, lightName + 'intensity', light.intensity);
  89000. renderer.setFloat1(program, lightName + 'radius', light.radius);
  89001. }
  89002. return this;
  89003. },
  89004. /**
  89005. * Generic function for batching a textured quad
  89006. *
  89007. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#batchTexture
  89008. * @since 3.0.0
  89009. *
  89010. * @param {Phaser.GameObjects.GameObject} gameObject - Source GameObject
  89011. * @param {WebGLTexture} texture - Raw WebGLTexture associated with the quad
  89012. * @param {integer} textureWidth - Real texture width
  89013. * @param {integer} textureHeight - Real texture height
  89014. * @param {number} srcX - X coordinate of the quad
  89015. * @param {number} srcY - Y coordinate of the quad
  89016. * @param {number} srcWidth - Width of the quad
  89017. * @param {number} srcHeight - Height of the quad
  89018. * @param {number} scaleX - X component of scale
  89019. * @param {number} scaleY - Y component of scale
  89020. * @param {number} rotation - Rotation of the quad
  89021. * @param {boolean} flipX - Indicates if the quad is horizontally flipped
  89022. * @param {boolean} flipY - Indicates if the quad is vertically flipped
  89023. * @param {number} scrollFactorX - By which factor is the quad affected by the camera horizontal scroll
  89024. * @param {number} scrollFactorY - By which factor is the quad effected by the camera vertical scroll
  89025. * @param {number} displayOriginX - Horizontal origin in pixels
  89026. * @param {number} displayOriginY - Vertical origin in pixels
  89027. * @param {number} frameX - X coordinate of the texture frame
  89028. * @param {number} frameY - Y coordinate of the texture frame
  89029. * @param {number} frameWidth - Width of the texture frame
  89030. * @param {number} frameHeight - Height of the texture frame
  89031. * @param {integer} tintTL - Tint for top left
  89032. * @param {integer} tintTR - Tint for top right
  89033. * @param {integer} tintBL - Tint for bottom left
  89034. * @param {integer} tintBR - Tint for bottom right
  89035. * @param {number} tintEffect - The tint effect (0 for additive, 1 for replacement)
  89036. * @param {number} uOffset - Horizontal offset on texture coordinate
  89037. * @param {number} vOffset - Vertical offset on texture coordinate
  89038. * @param {Phaser.Cameras.Scene2D.Camera} camera - Current used camera
  89039. * @param {Phaser.GameObjects.Components.TransformMatrix} parentTransformMatrix - Parent container
  89040. */
  89041. batchTexture: function (
  89042. gameObject,
  89043. texture,
  89044. textureWidth, textureHeight,
  89045. srcX, srcY,
  89046. srcWidth, srcHeight,
  89047. scaleX, scaleY,
  89048. rotation,
  89049. flipX, flipY,
  89050. scrollFactorX, scrollFactorY,
  89051. displayOriginX, displayOriginY,
  89052. frameX, frameY, frameWidth, frameHeight,
  89053. tintTL, tintTR, tintBL, tintBR, tintEffect,
  89054. uOffset, vOffset,
  89055. camera,
  89056. parentTransformMatrix)
  89057. {
  89058. if (!this.active)
  89059. {
  89060. return;
  89061. }
  89062. this.renderer.setPipeline(this);
  89063. var normalTexture;
  89064. if (gameObject.displayTexture)
  89065. {
  89066. normalTexture = gameObject.displayTexture.dataSource[gameObject.displayFrame.sourceIndex];
  89067. }
  89068. else if (gameObject.texture)
  89069. {
  89070. normalTexture = gameObject.texture.dataSource[gameObject.frame.sourceIndex];
  89071. }
  89072. else if (gameObject.tileset)
  89073. {
  89074. normalTexture = gameObject.tileset.image.dataSource[0];
  89075. }
  89076. if (!normalTexture)
  89077. {
  89078. console.warn('Normal map missing or invalid');
  89079. return;
  89080. }
  89081. this.setTexture2D(normalTexture.glTexture, 1);
  89082. this.setNormalMapRotation(rotation);
  89083. var camMatrix = this._tempMatrix1;
  89084. var spriteMatrix = this._tempMatrix2;
  89085. var calcMatrix = this._tempMatrix3;
  89086. var u0 = (frameX / textureWidth) + uOffset;
  89087. var v0 = (frameY / textureHeight) + vOffset;
  89088. var u1 = (frameX + frameWidth) / textureWidth + uOffset;
  89089. var v1 = (frameY + frameHeight) / textureHeight + vOffset;
  89090. var width = srcWidth;
  89091. var height = srcHeight;
  89092. // var x = -displayOriginX + frameX;
  89093. // var y = -displayOriginY + frameY;
  89094. var x = -displayOriginX;
  89095. var y = -displayOriginY;
  89096. if (gameObject.isCropped)
  89097. {
  89098. var crop = gameObject._crop;
  89099. width = crop.width;
  89100. height = crop.height;
  89101. srcWidth = crop.width;
  89102. srcHeight = crop.height;
  89103. frameX = crop.x;
  89104. frameY = crop.y;
  89105. var ox = frameX;
  89106. var oy = frameY;
  89107. if (flipX)
  89108. {
  89109. ox = (frameWidth - crop.x - crop.width);
  89110. }
  89111. if (flipY && !texture.isRenderTexture)
  89112. {
  89113. oy = (frameHeight - crop.y - crop.height);
  89114. }
  89115. u0 = (ox / textureWidth) + uOffset;
  89116. v0 = (oy / textureHeight) + vOffset;
  89117. u1 = (ox + crop.width) / textureWidth + uOffset;
  89118. v1 = (oy + crop.height) / textureHeight + vOffset;
  89119. x = -displayOriginX + frameX;
  89120. y = -displayOriginY + frameY;
  89121. }
  89122. // Invert the flipY if this is a RenderTexture
  89123. flipY = flipY ^ (texture.isRenderTexture ? 1 : 0);
  89124. if (flipX)
  89125. {
  89126. width *= -1;
  89127. x += srcWidth;
  89128. }
  89129. if (flipY)
  89130. {
  89131. height *= -1;
  89132. y += srcHeight;
  89133. }
  89134. // Do we need this? (doubt it)
  89135. // if (camera.roundPixels)
  89136. // {
  89137. // x |= 0;
  89138. // y |= 0;
  89139. // }
  89140. var xw = x + width;
  89141. var yh = y + height;
  89142. spriteMatrix.applyITRS(srcX, srcY, rotation, scaleX, scaleY);
  89143. camMatrix.copyFrom(camera.matrix);
  89144. if (parentTransformMatrix)
  89145. {
  89146. // Multiply the camera by the parent matrix
  89147. camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * scrollFactorX, -camera.scrollY * scrollFactorY);
  89148. // Undo the camera scroll
  89149. spriteMatrix.e = srcX;
  89150. spriteMatrix.f = srcY;
  89151. // Multiply by the Sprite matrix, store result in calcMatrix
  89152. camMatrix.multiply(spriteMatrix, calcMatrix);
  89153. }
  89154. else
  89155. {
  89156. spriteMatrix.e -= camera.scrollX * scrollFactorX;
  89157. spriteMatrix.f -= camera.scrollY * scrollFactorY;
  89158. // Multiply by the Sprite matrix, store result in calcMatrix
  89159. camMatrix.multiply(spriteMatrix, calcMatrix);
  89160. }
  89161. var tx0 = calcMatrix.getX(x, y);
  89162. var ty0 = calcMatrix.getY(x, y);
  89163. var tx1 = calcMatrix.getX(x, yh);
  89164. var ty1 = calcMatrix.getY(x, yh);
  89165. var tx2 = calcMatrix.getX(xw, yh);
  89166. var ty2 = calcMatrix.getY(xw, yh);
  89167. var tx3 = calcMatrix.getX(xw, y);
  89168. var ty3 = calcMatrix.getY(xw, y);
  89169. if (camera.roundPixels)
  89170. {
  89171. tx0 = Math.round(tx0);
  89172. ty0 = Math.round(ty0);
  89173. tx1 = Math.round(tx1);
  89174. ty1 = Math.round(ty1);
  89175. tx2 = Math.round(tx2);
  89176. ty2 = Math.round(ty2);
  89177. tx3 = Math.round(tx3);
  89178. ty3 = Math.round(ty3);
  89179. }
  89180. this.setTexture2D(texture, 0);
  89181. this.batchQuad(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, 0);
  89182. },
  89183. /**
  89184. * Sets the Game Objects normal map as the active texture.
  89185. *
  89186. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#setNormalMap
  89187. * @since 3.11.0
  89188. *
  89189. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to update.
  89190. */
  89191. setNormalMap: function (gameObject)
  89192. {
  89193. if (!this.active || !gameObject)
  89194. {
  89195. return;
  89196. }
  89197. var normalTexture;
  89198. if (gameObject.texture)
  89199. {
  89200. normalTexture = gameObject.texture.dataSource[gameObject.frame.sourceIndex];
  89201. }
  89202. if (!normalTexture)
  89203. {
  89204. normalTexture = this.defaultNormalMap;
  89205. }
  89206. this.setTexture2D(normalTexture.glTexture, 1);
  89207. this.renderer.setPipeline(gameObject.defaultPipeline);
  89208. },
  89209. /**
  89210. * Rotates the normal map vectors inversely by the given angle.
  89211. * Only works in 2D space.
  89212. *
  89213. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#setNormalMapRotation
  89214. * @since 3.16.0
  89215. *
  89216. * @param {number} rotation - The angle of rotation in radians.
  89217. */
  89218. setNormalMapRotation: function (rotation)
  89219. {
  89220. var inverseRotationMatrix = this.inverseRotationMatrix;
  89221. if (rotation)
  89222. {
  89223. var rot = -rotation;
  89224. var c = Math.cos(rot);
  89225. var s = Math.sin(rot);
  89226. inverseRotationMatrix[1] = s;
  89227. inverseRotationMatrix[3] = -s;
  89228. inverseRotationMatrix[0] = inverseRotationMatrix[4] = c;
  89229. }
  89230. else
  89231. {
  89232. inverseRotationMatrix[0] = inverseRotationMatrix[4] = 1;
  89233. inverseRotationMatrix[1] = inverseRotationMatrix[3] = 0;
  89234. }
  89235. this.renderer.setMatrix3(this.program, 'uInverseRotationMatrix', false, inverseRotationMatrix);
  89236. },
  89237. /**
  89238. * Takes a Sprite Game Object, or any object that extends it, which has a normal texture and adds it to the batch.
  89239. *
  89240. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#batchSprite
  89241. * @since 3.0.0
  89242. *
  89243. * @param {Phaser.GameObjects.Sprite} sprite - The texture-based Game Object to add to the batch.
  89244. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to use for the rendering transform.
  89245. * @param {Phaser.GameObjects.Components.TransformMatrix} parentTransformMatrix - The transform matrix of the parent container, if set.
  89246. */
  89247. batchSprite: function (sprite, camera, parentTransformMatrix)
  89248. {
  89249. if (!this.active)
  89250. {
  89251. return;
  89252. }
  89253. var normalTexture = sprite.texture.dataSource[sprite.frame.sourceIndex];
  89254. if (normalTexture)
  89255. {
  89256. this.renderer.setPipeline(this);
  89257. this.setTexture2D(normalTexture.glTexture, 1);
  89258. this.setNormalMapRotation(sprite.rotation);
  89259. TextureTintPipeline.prototype.batchSprite.call(this, sprite, camera, parentTransformMatrix);
  89260. }
  89261. }
  89262. });
  89263. ForwardDiffuseLightPipeline.LIGHT_COUNT = LIGHT_COUNT;
  89264. module.exports = ForwardDiffuseLightPipeline;
  89265. /***/ }),
  89266. /* 454 */
  89267. /***/ (function(module, exports, __webpack_require__) {
  89268. /**
  89269. * @author Richard Davey <rich@photonstorm.com>
  89270. * @author Felipe Alfonso <@bitnenfer>
  89271. * @copyright 2019 Photon Storm Ltd.
  89272. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89273. */
  89274. var Class = __webpack_require__(0);
  89275. var ShaderSourceFS = __webpack_require__(1044);
  89276. var ShaderSourceVS = __webpack_require__(1043);
  89277. var WebGLPipeline = __webpack_require__(212);
  89278. /**
  89279. * @classdesc
  89280. * BitmapMaskPipeline handles all bitmap masking rendering in WebGL. It works by using
  89281. * sampling two texture on the fragment shader and using the fragment's alpha to clip the region.
  89282. * The config properties are:
  89283. * - game: Current game instance.
  89284. * - renderer: Current WebGL renderer.
  89285. * - topology: This indicates how the primitives are rendered. The default value is GL_TRIANGLES.
  89286. * Here is the full list of rendering primitives (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants).
  89287. * - vertShader: Source for vertex shader as a string.
  89288. * - fragShader: Source for fragment shader as a string.
  89289. * - vertexCapacity: The amount of vertices that shall be allocated
  89290. * - vertexSize: The size of a single vertex in bytes.
  89291. *
  89292. * @class BitmapMaskPipeline
  89293. * @extends Phaser.Renderer.WebGL.WebGLPipeline
  89294. * @memberof Phaser.Renderer.WebGL.Pipelines
  89295. * @constructor
  89296. * @since 3.0.0
  89297. *
  89298. * @param {object} config - Used for overriding shader an pipeline properties if extending this pipeline.
  89299. */
  89300. var BitmapMaskPipeline = new Class({
  89301. Extends: WebGLPipeline,
  89302. initialize:
  89303. function BitmapMaskPipeline (config)
  89304. {
  89305. WebGLPipeline.call(this, {
  89306. game: config.game,
  89307. renderer: config.renderer,
  89308. gl: config.renderer.gl,
  89309. topology: (config.topology ? config.topology : config.renderer.gl.TRIANGLES),
  89310. vertShader: (config.vertShader ? config.vertShader : ShaderSourceVS),
  89311. fragShader: (config.fragShader ? config.fragShader : ShaderSourceFS),
  89312. vertexCapacity: (config.vertexCapacity ? config.vertexCapacity : 3),
  89313. vertexSize: (config.vertexSize ? config.vertexSize :
  89314. Float32Array.BYTES_PER_ELEMENT * 2),
  89315. vertices: new Float32Array([
  89316. -1, +1, -1, -7, +7, +1
  89317. ]).buffer,
  89318. attributes: [
  89319. {
  89320. name: 'inPosition',
  89321. size: 2,
  89322. type: config.renderer.gl.FLOAT,
  89323. normalized: false,
  89324. offset: 0
  89325. }
  89326. ]
  89327. });
  89328. /**
  89329. * Float32 view of the array buffer containing the pipeline's vertices.
  89330. *
  89331. * @name Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#vertexViewF32
  89332. * @type {Float32Array}
  89333. * @since 3.0.0
  89334. */
  89335. this.vertexViewF32 = new Float32Array(this.vertexData);
  89336. /**
  89337. * Size of the batch.
  89338. *
  89339. * @name Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#maxQuads
  89340. * @type {number}
  89341. * @default 1
  89342. * @since 3.0.0
  89343. */
  89344. this.maxQuads = 1;
  89345. /**
  89346. * Dirty flag to check if resolution properties need to be updated on the
  89347. * masking shader.
  89348. *
  89349. * @name Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#resolutionDirty
  89350. * @type {boolean}
  89351. * @default true
  89352. * @since 3.0.0
  89353. */
  89354. this.resolutionDirty = true;
  89355. },
  89356. /**
  89357. * Called every time the pipeline needs to be used.
  89358. * It binds all necessary resources.
  89359. *
  89360. * @method Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#onBind
  89361. * @since 3.0.0
  89362. *
  89363. * @return {this} This WebGLPipeline instance.
  89364. */
  89365. onBind: function ()
  89366. {
  89367. WebGLPipeline.prototype.onBind.call(this);
  89368. var renderer = this.renderer;
  89369. var program = this.program;
  89370. if (this.resolutionDirty)
  89371. {
  89372. renderer.setFloat2(program, 'uResolution', this.width, this.height);
  89373. renderer.setInt1(program, 'uMainSampler', 0);
  89374. renderer.setInt1(program, 'uMaskSampler', 1);
  89375. this.resolutionDirty = false;
  89376. }
  89377. return this;
  89378. },
  89379. /**
  89380. * [description]
  89381. *
  89382. * @method Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#resize
  89383. * @since 3.0.0
  89384. *
  89385. * @param {number} width - [description]
  89386. * @param {number} height - [description]
  89387. * @param {number} resolution - [description]
  89388. *
  89389. * @return {this} This WebGLPipeline instance.
  89390. */
  89391. resize: function (width, height, resolution)
  89392. {
  89393. WebGLPipeline.prototype.resize.call(this, width, height, resolution);
  89394. this.resolutionDirty = true;
  89395. return this;
  89396. },
  89397. /**
  89398. * Binds necessary resources and renders the mask to a separated framebuffer.
  89399. * The framebuffer for the masked object is also bound for further use.
  89400. *
  89401. * @method Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#beginMask
  89402. * @since 3.0.0
  89403. *
  89404. * @param {Phaser.GameObjects.GameObject} mask - GameObject used as mask.
  89405. * @param {Phaser.GameObjects.GameObject} maskedObject - GameObject masked by the mask GameObject.
  89406. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  89407. */
  89408. beginMask: function (mask, maskedObject, camera)
  89409. {
  89410. var renderer = this.renderer;
  89411. var gl = this.gl;
  89412. // The renderable Game Object that is being used for the bitmap mask
  89413. var bitmapMask = mask.bitmapMask;
  89414. if (bitmapMask && gl)
  89415. {
  89416. renderer.flush();
  89417. // First we clear the mask framebuffer
  89418. renderer.setFramebuffer(mask.maskFramebuffer);
  89419. gl.clearColor(0, 0, 0, 0);
  89420. gl.clear(gl.COLOR_BUFFER_BIT);
  89421. // We render our mask source
  89422. bitmapMask.renderWebGL(renderer, bitmapMask, 0, camera);
  89423. renderer.flush();
  89424. // Bind and clear our main source (masked object)
  89425. renderer.setFramebuffer(mask.mainFramebuffer);
  89426. gl.clearColor(0, 0, 0, 0);
  89427. gl.clear(gl.COLOR_BUFFER_BIT);
  89428. }
  89429. },
  89430. /**
  89431. * The masked game object's framebuffer is unbound and it's texture
  89432. * is bound together with the mask texture and the mask shader and
  89433. * a draw call with a single quad is processed. Here is where the
  89434. * masking effect is applied.
  89435. *
  89436. * @method Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#endMask
  89437. * @since 3.0.0
  89438. *
  89439. * @param {Phaser.GameObjects.GameObject} mask - GameObject used as a mask.
  89440. */
  89441. endMask: function (mask)
  89442. {
  89443. var renderer = this.renderer;
  89444. var gl = this.gl;
  89445. // The renderable Game Object that is being used for the bitmap mask
  89446. var bitmapMask = mask.bitmapMask;
  89447. if (bitmapMask && gl)
  89448. {
  89449. // Return to default framebuffer
  89450. renderer.setFramebuffer(null);
  89451. // Bind bitmap mask pipeline and draw
  89452. renderer.setPipeline(this);
  89453. renderer.setTexture2D(mask.maskTexture, 1);
  89454. renderer.setTexture2D(mask.mainTexture, 0);
  89455. renderer.setInt1(this.program, 'uInvertMaskAlpha', mask.invertAlpha);
  89456. // Finally draw a triangle filling the whole screen
  89457. gl.drawArrays(this.topology, 0, 3);
  89458. }
  89459. }
  89460. });
  89461. module.exports = BitmapMaskPipeline;
  89462. /***/ }),
  89463. /* 455 */
  89464. /***/ (function(module, exports, __webpack_require__) {
  89465. /**
  89466. * @author Richard Davey <rich@photonstorm.com>
  89467. * @copyright 2019 Photon Storm Ltd.
  89468. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89469. */
  89470. var CanvasPool = __webpack_require__(24);
  89471. var Color = __webpack_require__(32);
  89472. var GetFastValue = __webpack_require__(2);
  89473. /**
  89474. * Takes a snapshot of an area from the current frame displayed by a WebGL canvas.
  89475. *
  89476. * This is then copied to an Image object. When this loads, the results are sent
  89477. * to the callback provided in the Snapshot Configuration object.
  89478. *
  89479. * @function Phaser.Renderer.Snapshot.WebGL
  89480. * @since 3.0.0
  89481. *
  89482. * @param {HTMLCanvasElement} sourceCanvas - The canvas to take a snapshot of.
  89483. * @param {SnapshotState} config - The snapshot configuration object.
  89484. */
  89485. var WebGLSnapshot = function (sourceCanvas, config)
  89486. {
  89487. var gl = sourceCanvas.getContext('experimental-webgl');
  89488. var callback = GetFastValue(config, 'callback');
  89489. var type = GetFastValue(config, 'type', 'image/png');
  89490. var encoderOptions = GetFastValue(config, 'encoder', 0.92);
  89491. var x = GetFastValue(config, 'x', 0);
  89492. var y = GetFastValue(config, 'y', 0);
  89493. var width = GetFastValue(config, 'width', gl.drawingBufferWidth);
  89494. var height = GetFastValue(config, 'height', gl.drawingBufferHeight);
  89495. var getPixel = GetFastValue(config, 'getPixel', false);
  89496. if (getPixel)
  89497. {
  89498. var pixel = new Uint8Array(4);
  89499. gl.readPixels(x, gl.drawingBufferHeight - y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel);
  89500. callback.call(null, new Color(pixel[0], pixel[1], pixel[2], pixel[3] / 255));
  89501. }
  89502. else
  89503. {
  89504. var pixels = new Uint8Array(width * height * 4);
  89505. gl.readPixels(x, gl.drawingBufferHeight - y - height, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
  89506. var canvas = CanvasPool.createWebGL(this, width, height);
  89507. var ctx = canvas.getContext('2d');
  89508. var imageData = ctx.getImageData(0, 0, width, height);
  89509. var data = imageData.data;
  89510. for (var py = 0; py < height; py++)
  89511. {
  89512. for (var px = 0; px < width; px++)
  89513. {
  89514. var sourceIndex = ((height - py) * width + px) * 4;
  89515. var destIndex = (py * width + px) * 4;
  89516. data[destIndex + 0] = pixels[sourceIndex + 0];
  89517. data[destIndex + 1] = pixels[sourceIndex + 1];
  89518. data[destIndex + 2] = pixels[sourceIndex + 2];
  89519. data[destIndex + 3] = pixels[sourceIndex + 3];
  89520. }
  89521. }
  89522. ctx.putImageData(imageData, 0, 0);
  89523. var image = new Image();
  89524. image.onerror = function ()
  89525. {
  89526. callback.call(null);
  89527. CanvasPool.remove(canvas);
  89528. };
  89529. image.onload = function ()
  89530. {
  89531. callback.call(null, image);
  89532. CanvasPool.remove(canvas);
  89533. };
  89534. image.src = canvas.toDataURL(type, encoderOptions);
  89535. }
  89536. };
  89537. module.exports = WebGLSnapshot;
  89538. /***/ }),
  89539. /* 456 */
  89540. /***/ (function(module, exports, __webpack_require__) {
  89541. /**
  89542. * @author Richard Davey <rich@photonstorm.com>
  89543. * @author Felipe Alfonso <@bitnenfer>
  89544. * @copyright 2019 Photon Storm Ltd.
  89545. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89546. */
  89547. var BaseCamera = __webpack_require__(131);
  89548. var CameraEvents = __webpack_require__(40);
  89549. var Class = __webpack_require__(0);
  89550. var CONST = __webpack_require__(28);
  89551. var IsSizePowerOfTwo = __webpack_require__(127);
  89552. var SpliceOne = __webpack_require__(97);
  89553. var TextureEvents = __webpack_require__(126);
  89554. var TransformMatrix = __webpack_require__(41);
  89555. var Utils = __webpack_require__(9);
  89556. var WebGLSnapshot = __webpack_require__(455);
  89557. // Default Pipelines
  89558. var BitmapMaskPipeline = __webpack_require__(454);
  89559. var ForwardDiffuseLightPipeline = __webpack_require__(453);
  89560. var TextureTintPipeline = __webpack_require__(211);
  89561. /**
  89562. * @callback WebGLContextCallback
  89563. *
  89564. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - The WebGL Renderer which owns the context.
  89565. */
  89566. /**
  89567. * @classdesc
  89568. * WebGLRenderer is a class that contains the needed functionality to keep the
  89569. * WebGLRenderingContext state clean. The main idea of the WebGLRenderer is to keep track of
  89570. * any context change that happens for WebGL rendering inside of Phaser. This means
  89571. * if raw webgl functions are called outside the WebGLRenderer of the Phaser WebGL
  89572. * rendering ecosystem they might pollute the current WebGLRenderingContext state producing
  89573. * unexpected behavior. It's recommended that WebGL interaction is done through
  89574. * WebGLRenderer and/or WebGLPipeline.
  89575. *
  89576. * @class WebGLRenderer
  89577. * @memberof Phaser.Renderer.WebGL
  89578. * @constructor
  89579. * @since 3.0.0
  89580. *
  89581. * @param {Phaser.Game} game - The Game instance which owns this WebGL Renderer.
  89582. */
  89583. var WebGLRenderer = new Class({
  89584. initialize:
  89585. function WebGLRenderer (game)
  89586. {
  89587. // eslint-disable-next-line consistent-this
  89588. var renderer = this;
  89589. var gameConfig = game.config;
  89590. var contextCreationConfig = {
  89591. alpha: gameConfig.transparent,
  89592. depth: false,
  89593. antialias: gameConfig.antialias,
  89594. premultipliedAlpha: gameConfig.premultipliedAlpha,
  89595. stencil: true,
  89596. failIfMajorPerformanceCaveat: gameConfig.failIfMajorPerformanceCaveat,
  89597. powerPreference: gameConfig.powerPreference
  89598. };
  89599. /**
  89600. * The local configuration settings of this WebGL Renderer.
  89601. *
  89602. * @name Phaser.Renderer.WebGL.WebGLRenderer#config
  89603. * @type {object}
  89604. * @since 3.0.0
  89605. */
  89606. this.config = {
  89607. clearBeforeRender: gameConfig.clearBeforeRender,
  89608. antialias: gameConfig.antialias,
  89609. backgroundColor: gameConfig.backgroundColor,
  89610. contextCreation: contextCreationConfig,
  89611. resolution: gameConfig.resolution,
  89612. roundPixels: gameConfig.roundPixels,
  89613. maxTextures: gameConfig.maxTextures,
  89614. maxTextureSize: gameConfig.maxTextureSize,
  89615. batchSize: gameConfig.batchSize,
  89616. maxLights: gameConfig.maxLights
  89617. };
  89618. /**
  89619. * The Game instance which owns this WebGL Renderer.
  89620. *
  89621. * @name Phaser.Renderer.WebGL.WebGLRenderer#game
  89622. * @type {Phaser.Game}
  89623. * @since 3.0.0
  89624. */
  89625. this.game = game;
  89626. /**
  89627. * A constant which allows the renderer to be easily identified as a WebGL Renderer.
  89628. *
  89629. * @name Phaser.Renderer.WebGL.WebGLRenderer#type
  89630. * @type {integer}
  89631. * @since 3.0.0
  89632. */
  89633. this.type = CONST.WEBGL;
  89634. /**
  89635. * The width of the canvas being rendered to.
  89636. * This is populated in the onResize event handler.
  89637. *
  89638. * @name Phaser.Renderer.WebGL.WebGLRenderer#width
  89639. * @type {integer}
  89640. * @since 3.0.0
  89641. */
  89642. this.width = 0;
  89643. /**
  89644. * The height of the canvas being rendered to.
  89645. * This is populated in the onResize event handler.
  89646. *
  89647. * @name Phaser.Renderer.WebGL.WebGLRenderer#height
  89648. * @type {integer}
  89649. * @since 3.0.0
  89650. */
  89651. this.height = 0;
  89652. /**
  89653. * The canvas which this WebGL Renderer draws to.
  89654. *
  89655. * @name Phaser.Renderer.WebGL.WebGLRenderer#canvas
  89656. * @type {HTMLCanvasElement}
  89657. * @since 3.0.0
  89658. */
  89659. this.canvas = game.canvas;
  89660. /**
  89661. * An array of functions to invoke if the WebGL context is lost.
  89662. *
  89663. * @name Phaser.Renderer.WebGL.WebGLRenderer#lostContextCallbacks
  89664. * @type {WebGLContextCallback[]}
  89665. * @since 3.0.0
  89666. */
  89667. this.lostContextCallbacks = [];
  89668. /**
  89669. * An array of functions to invoke if the WebGL context is restored.
  89670. *
  89671. * @name Phaser.Renderer.WebGL.WebGLRenderer#restoredContextCallbacks
  89672. * @type {WebGLContextCallback[]}
  89673. * @since 3.0.0
  89674. */
  89675. this.restoredContextCallbacks = [];
  89676. /**
  89677. * An array of blend modes supported by the WebGL Renderer.
  89678. *
  89679. * This array includes the default blend modes as well as any custom blend modes added through {@link #addBlendMode}.
  89680. *
  89681. * @name Phaser.Renderer.WebGL.WebGLRenderer#blendModes
  89682. * @type {array}
  89683. * @default []
  89684. * @since 3.0.0
  89685. */
  89686. this.blendModes = [];
  89687. /**
  89688. * Keeps track of any WebGLTexture created with the current WebGLRenderingContext
  89689. *
  89690. * @name Phaser.Renderer.WebGL.WebGLRenderer#nativeTextures
  89691. * @type {array}
  89692. * @default []
  89693. * @since 3.0.0
  89694. */
  89695. this.nativeTextures = [];
  89696. /**
  89697. * Set to `true` if the WebGL context of the renderer is lost.
  89698. *
  89699. * @name Phaser.Renderer.WebGL.WebGLRenderer#contextLost
  89700. * @type {boolean}
  89701. * @default false
  89702. * @since 3.0.0
  89703. */
  89704. this.contextLost = false;
  89705. /**
  89706. * This object will store all pipelines created through addPipeline
  89707. *
  89708. * @name Phaser.Renderer.WebGL.WebGLRenderer#pipelines
  89709. * @type {object}
  89710. * @default null
  89711. * @since 3.0.0
  89712. */
  89713. this.pipelines = null;
  89714. /**
  89715. * Details about the currently scheduled snapshot.
  89716. *
  89717. * If a non-null `callback` is set in this object, a snapshot of the canvas will be taken after the current frame is fully rendered.
  89718. *
  89719. * @name Phaser.Renderer.WebGL.WebGLRenderer#snapshotState
  89720. * @type {SnapshotState}
  89721. * @since 3.0.0
  89722. */
  89723. this.snapshotState = {
  89724. x: 0,
  89725. y: 0,
  89726. width: 1,
  89727. height: 1,
  89728. getPixel: false,
  89729. callback: null,
  89730. type: 'image/png',
  89731. encoder: 0.92
  89732. };
  89733. // Internal Renderer State (Textures, Framebuffers, Pipelines, Buffers, etc)
  89734. /**
  89735. * Cached value for the last texture unit that was used
  89736. *
  89737. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentActiveTextureUnit
  89738. * @type {integer}
  89739. * @since 3.1.0
  89740. */
  89741. this.currentActiveTextureUnit = 0;
  89742. /**
  89743. * An array of the last texture handles that were bound to the WebGLRenderingContext
  89744. *
  89745. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentTextures
  89746. * @type {array}
  89747. * @since 3.0.0
  89748. */
  89749. this.currentTextures = new Array(16);
  89750. /**
  89751. * Current framebuffer in use
  89752. *
  89753. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentFramebuffer
  89754. * @type {WebGLFramebuffer}
  89755. * @default null
  89756. * @since 3.0.0
  89757. */
  89758. this.currentFramebuffer = null;
  89759. /**
  89760. * Current WebGLPipeline in use
  89761. *
  89762. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentPipeline
  89763. * @type {Phaser.Renderer.WebGL.WebGLPipeline}
  89764. * @default null
  89765. * @since 3.0.0
  89766. */
  89767. this.currentPipeline = null;
  89768. /**
  89769. * Current WebGLProgram in use
  89770. *
  89771. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentProgram
  89772. * @type {WebGLProgram}
  89773. * @default null
  89774. * @since 3.0.0
  89775. */
  89776. this.currentProgram = null;
  89777. /**
  89778. * Current WebGLBuffer (Vertex buffer) in use
  89779. *
  89780. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentVertexBuffer
  89781. * @type {WebGLBuffer}
  89782. * @default null
  89783. * @since 3.0.0
  89784. */
  89785. this.currentVertexBuffer = null;
  89786. /**
  89787. * Current WebGLBuffer (Index buffer) in use
  89788. *
  89789. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentIndexBuffer
  89790. * @type {WebGLBuffer}
  89791. * @default null
  89792. * @since 3.0.0
  89793. */
  89794. this.currentIndexBuffer = null;
  89795. /**
  89796. * Current blend mode in use
  89797. *
  89798. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentBlendMode
  89799. * @type {integer}
  89800. * @since 3.0.0
  89801. */
  89802. this.currentBlendMode = Infinity;
  89803. /**
  89804. * Indicates if the the scissor state is enabled in WebGLRenderingContext
  89805. *
  89806. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentScissorEnabled
  89807. * @type {boolean}
  89808. * @default false
  89809. * @since 3.0.0
  89810. */
  89811. this.currentScissorEnabled = false;
  89812. /**
  89813. * Stores the current scissor data
  89814. *
  89815. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentScissor
  89816. * @type {Uint32Array}
  89817. * @since 3.0.0
  89818. */
  89819. // this.currentScissor = new Uint32Array([ 0, 0, this.width, this.height ]);
  89820. this.currentScissor = null;
  89821. /**
  89822. * Stack of scissor data
  89823. *
  89824. * @name Phaser.Renderer.WebGL.WebGLRenderer#scissorStack
  89825. * @type {Uint32Array}
  89826. * @since 3.0.0
  89827. */
  89828. this.scissorStack = [];
  89829. // Setup context lost and restore event listeners
  89830. this.canvas.addEventListener('webglcontextlost', function (event)
  89831. {
  89832. renderer.contextLost = true;
  89833. event.preventDefault();
  89834. for (var index = 0; index < renderer.lostContextCallbacks.length; ++index)
  89835. {
  89836. var callback = renderer.lostContextCallbacks[index];
  89837. callback[0].call(callback[1], renderer);
  89838. }
  89839. }, false);
  89840. this.canvas.addEventListener('webglcontextrestored', function ()
  89841. {
  89842. renderer.contextLost = false;
  89843. renderer.init(renderer.config);
  89844. for (var index = 0; index < renderer.restoredContextCallbacks.length; ++index)
  89845. {
  89846. var callback = renderer.restoredContextCallbacks[index];
  89847. callback[0].call(callback[1], renderer);
  89848. }
  89849. }, false);
  89850. // These are initialized post context creation
  89851. /**
  89852. * The underlying WebGL context of the renderer.
  89853. *
  89854. * @name Phaser.Renderer.WebGL.WebGLRenderer#gl
  89855. * @type {WebGLRenderingContext}
  89856. * @default null
  89857. * @since 3.0.0
  89858. */
  89859. this.gl = null;
  89860. /**
  89861. * Array of strings that indicate which WebGL extensions are supported by the browser
  89862. *
  89863. * @name Phaser.Renderer.WebGL.WebGLRenderer#supportedExtensions
  89864. * @type {object}
  89865. * @default null
  89866. * @since 3.0.0
  89867. */
  89868. this.supportedExtensions = null;
  89869. /**
  89870. * Extensions loaded into the current context
  89871. *
  89872. * @name Phaser.Renderer.WebGL.WebGLRenderer#extensions
  89873. * @type {object}
  89874. * @default {}
  89875. * @since 3.0.0
  89876. */
  89877. this.extensions = {};
  89878. /**
  89879. * Stores the current WebGL component formats for further use
  89880. *
  89881. * @name Phaser.Renderer.WebGL.WebGLRenderer#glFormats
  89882. * @type {array}
  89883. * @default []
  89884. * @since 3.2.0
  89885. */
  89886. this.glFormats = [];
  89887. /**
  89888. * Stores the supported WebGL texture compression formats.
  89889. *
  89890. * @name Phaser.Renderer.WebGL.WebGLRenderer#compression
  89891. * @type {array}
  89892. * @since 3.8.0
  89893. */
  89894. this.compression = {
  89895. ETC1: false,
  89896. PVRTC: false,
  89897. S3TC: false
  89898. };
  89899. /**
  89900. * Cached drawing buffer height to reduce gl calls.
  89901. *
  89902. * @name Phaser.Renderer.WebGL.WebGLRenderer#drawingBufferHeight
  89903. * @type {number}
  89904. * @readonly
  89905. * @since 3.11.0
  89906. */
  89907. this.drawingBufferHeight = 0;
  89908. /**
  89909. * A blank 32x32 transparent texture, as used by the Graphics system where needed.
  89910. * This is set in the `boot` method.
  89911. *
  89912. * @name Phaser.Renderer.WebGL.WebGLRenderer#blankTexture
  89913. * @type {WebGLTexture}
  89914. * @readonly
  89915. * @since 3.12.0
  89916. */
  89917. this.blankTexture = null;
  89918. /**
  89919. * A default Camera used in calls when no other camera has been provided.
  89920. *
  89921. * @name Phaser.Renderer.WebGL.WebGLRenderer#defaultCamera
  89922. * @type {Phaser.Cameras.Scene2D.BaseCamera}
  89923. * @since 3.12.0
  89924. */
  89925. this.defaultCamera = new BaseCamera(0, 0, 0, 0);
  89926. /**
  89927. * A temporary Transform Matrix, re-used internally during batching.
  89928. *
  89929. * @name Phaser.Renderer.WebGL.WebGLRenderer#_tempMatrix1
  89930. * @private
  89931. * @type {Phaser.GameObjects.Components.TransformMatrix}
  89932. * @since 3.12.0
  89933. */
  89934. this._tempMatrix1 = new TransformMatrix();
  89935. /**
  89936. * A temporary Transform Matrix, re-used internally during batching.
  89937. *
  89938. * @name Phaser.Renderer.WebGL.WebGLRenderer#_tempMatrix2
  89939. * @private
  89940. * @type {Phaser.GameObjects.Components.TransformMatrix}
  89941. * @since 3.12.0
  89942. */
  89943. this._tempMatrix2 = new TransformMatrix();
  89944. /**
  89945. * A temporary Transform Matrix, re-used internally during batching.
  89946. *
  89947. * @name Phaser.Renderer.WebGL.WebGLRenderer#_tempMatrix3
  89948. * @private
  89949. * @type {Phaser.GameObjects.Components.TransformMatrix}
  89950. * @since 3.12.0
  89951. */
  89952. this._tempMatrix3 = new TransformMatrix();
  89953. /**
  89954. * A temporary Transform Matrix, re-used internally during batching.
  89955. *
  89956. * @name Phaser.Renderer.WebGL.WebGLRenderer#_tempMatrix4
  89957. * @private
  89958. * @type {Phaser.GameObjects.Components.TransformMatrix}
  89959. * @since 3.12.0
  89960. */
  89961. this._tempMatrix4 = new TransformMatrix();
  89962. this.init(this.config);
  89963. },
  89964. /**
  89965. * Creates a new WebGLRenderingContext and initializes all internal state.
  89966. *
  89967. * @method Phaser.Renderer.WebGL.WebGLRenderer#init
  89968. * @since 3.0.0
  89969. *
  89970. * @param {object} config - The configuration object for the renderer.
  89971. *
  89972. * @return {this} This WebGLRenderer instance.
  89973. */
  89974. init: function (config)
  89975. {
  89976. var gl;
  89977. var game = this.game;
  89978. var canvas = this.canvas;
  89979. var clearColor = config.backgroundColor;
  89980. // Did they provide their own context?
  89981. if (game.config.context)
  89982. {
  89983. gl = game.config.context;
  89984. }
  89985. else
  89986. {
  89987. gl = canvas.getContext('webgl', config.contextCreation) || canvas.getContext('experimental-webgl', config.contextCreation);
  89988. }
  89989. if (!gl || gl.isContextLost())
  89990. {
  89991. this.contextLost = true;
  89992. throw new Error('WebGL unsupported');
  89993. }
  89994. this.gl = gl;
  89995. // Set it back into the Game, so developers can access it from there too
  89996. game.context = gl;
  89997. for (var i = 0; i <= 27; i++)
  89998. {
  89999. this.blendModes.push({ func: [ gl.ONE, gl.ONE_MINUS_SRC_ALPHA ], equation: gl.FUNC_ADD });
  90000. }
  90001. // ADD
  90002. this.blendModes[1].func = [ gl.ONE, gl.DST_ALPHA ];
  90003. // MULTIPLY
  90004. this.blendModes[2].func = [ gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA ];
  90005. // SCREEN
  90006. this.blendModes[3].func = [ gl.ONE, gl.ONE_MINUS_SRC_COLOR ];
  90007. // ERASE
  90008. this.blendModes[17] = { func: [ gl.ZERO, gl.ONE_MINUS_SRC_ALPHA ], equation: gl.FUNC_REVERSE_SUBTRACT };
  90009. this.glFormats[0] = gl.BYTE;
  90010. this.glFormats[1] = gl.SHORT;
  90011. this.glFormats[2] = gl.UNSIGNED_BYTE;
  90012. this.glFormats[3] = gl.UNSIGNED_SHORT;
  90013. this.glFormats[4] = gl.FLOAT;
  90014. // Load supported extensions
  90015. var exts = gl.getSupportedExtensions();
  90016. if (!config.maxTextures)
  90017. {
  90018. config.maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
  90019. }
  90020. if (!config.maxTextureSize)
  90021. {
  90022. config.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
  90023. }
  90024. var extString = 'WEBGL_compressed_texture_';
  90025. var wkExtString = 'WEBKIT_' + extString;
  90026. this.compression.ETC1 = gl.getExtension(extString + 'etc1') || gl.getExtension(wkExtString + 'etc1');
  90027. this.compression.PVRTC = gl.getExtension(extString + 'pvrtc') || gl.getExtension(wkExtString + 'pvrtc');
  90028. this.compression.S3TC = gl.getExtension(extString + 's3tc') || gl.getExtension(wkExtString + 's3tc');
  90029. this.supportedExtensions = exts;
  90030. // Setup initial WebGL state
  90031. gl.disable(gl.DEPTH_TEST);
  90032. gl.disable(gl.CULL_FACE);
  90033. gl.enable(gl.BLEND);
  90034. gl.clearColor(clearColor.redGL, clearColor.greenGL, clearColor.blueGL, clearColor.alphaGL);
  90035. // Initialize all textures to null
  90036. for (var index = 0; index < this.currentTextures.length; ++index)
  90037. {
  90038. this.currentTextures[index] = null;
  90039. }
  90040. // Clear previous pipelines and reload default ones
  90041. this.pipelines = {};
  90042. this.addPipeline('TextureTintPipeline', new TextureTintPipeline({ game: game, renderer: this }));
  90043. this.addPipeline('BitmapMaskPipeline', new BitmapMaskPipeline({ game: game, renderer: this }));
  90044. this.addPipeline('Light2D', new ForwardDiffuseLightPipeline({ game: game, renderer: this, maxLights: config.maxLights }));
  90045. this.setBlendMode(CONST.BlendModes.NORMAL);
  90046. game.textures.once(TextureEvents.READY, this.boot, this);
  90047. return this;
  90048. },
  90049. /**
  90050. * Internal boot handler. Calls 'boot' on each pipeline.
  90051. *
  90052. * @method Phaser.Renderer.WebGL.WebGLRenderer#boot
  90053. * @private
  90054. * @since 3.11.0
  90055. */
  90056. boot: function ()
  90057. {
  90058. for (var pipelineName in this.pipelines)
  90059. {
  90060. this.pipelines[pipelineName].boot();
  90061. }
  90062. var blank = this.game.textures.getFrame('__DEFAULT');
  90063. this.pipelines.TextureTintPipeline.currentFrame = blank;
  90064. this.blankTexture = blank;
  90065. var gl = this.gl;
  90066. gl.bindFramebuffer(gl.FRAMEBUFFER, null);
  90067. gl.enable(gl.SCISSOR_TEST);
  90068. this.setPipeline(this.pipelines.TextureTintPipeline);
  90069. this.game.scale.on('resize', this.onResize, this);
  90070. var baseSize = this.game.scale.baseSize;
  90071. this.resize(baseSize.width, baseSize.height, this.game.scale.resolution);
  90072. },
  90073. /**
  90074. * The event handler that manages the `resize` event dispatched by the Scale Manager.
  90075. *
  90076. * @method Phaser.Renderer.WebGL.WebGLRenderer#onResize
  90077. * @since 3.16.0
  90078. *
  90079. * @param {Phaser.Structs.Size} gameSize - The default Game Size object. This is the un-modified game dimensions.
  90080. * @param {Phaser.Structs.Size} baseSize - The base Size object. The game dimensions multiplied by the resolution. The canvas width / height values match this.
  90081. * @param {Phaser.Structs.Size} displaySize - The display Size object. The size of the canvas style width / height attributes.
  90082. * @param {number} [resolution] - The Scale Manager resolution setting.
  90083. */
  90084. onResize: function (gameSize, baseSize, displaySize, resolution)
  90085. {
  90086. // Has the underlying canvas size changed?
  90087. if (baseSize.width !== this.width || baseSize.height !== this.height || resolution !== this.resolution)
  90088. {
  90089. this.resize(baseSize.width, baseSize.height, resolution);
  90090. }
  90091. },
  90092. /**
  90093. * Resizes the drawing buffer to match that required by the Scale Manager.
  90094. *
  90095. * @method Phaser.Renderer.WebGL.WebGLRenderer#resize
  90096. * @since 3.0.0
  90097. *
  90098. * @param {number} [width] - The new width of the renderer.
  90099. * @param {number} [height] - The new height of the renderer.
  90100. * @param {number} [resolution] - The new resolution of the renderer.
  90101. *
  90102. * @return {this} This WebGLRenderer instance.
  90103. */
  90104. resize: function (width, height, resolution)
  90105. {
  90106. var gl = this.gl;
  90107. var pipelines = this.pipelines;
  90108. this.width = width;
  90109. this.height = height;
  90110. this.resolution = resolution;
  90111. gl.viewport(0, 0, width, height);
  90112. // Update all registered pipelines
  90113. for (var pipelineName in pipelines)
  90114. {
  90115. pipelines[pipelineName].resize(width, height, resolution);
  90116. }
  90117. this.drawingBufferHeight = gl.drawingBufferHeight;
  90118. gl.scissor(0, (gl.drawingBufferHeight - height), width, height);
  90119. this.defaultCamera.setSize(width, height);
  90120. return this;
  90121. },
  90122. /**
  90123. * Adds a callback to be invoked when the WebGL context has been restored by the browser.
  90124. *
  90125. * @method Phaser.Renderer.WebGL.WebGLRenderer#onContextRestored
  90126. * @since 3.0.0
  90127. *
  90128. * @param {WebGLContextCallback} callback - The callback to be invoked on context restoration.
  90129. * @param {object} target - The context of the callback.
  90130. *
  90131. * @return {this} This WebGLRenderer instance.
  90132. */
  90133. onContextRestored: function (callback, target)
  90134. {
  90135. this.restoredContextCallbacks.push([ callback, target ]);
  90136. return this;
  90137. },
  90138. /**
  90139. * Adds a callback to be invoked when the WebGL context has been lost by the browser.
  90140. *
  90141. * @method Phaser.Renderer.WebGL.WebGLRenderer#onContextLost
  90142. * @since 3.0.0
  90143. *
  90144. * @param {WebGLContextCallback} callback - The callback to be invoked on context loss.
  90145. * @param {object} target - The context of the callback.
  90146. *
  90147. * @return {this} This WebGLRenderer instance.
  90148. */
  90149. onContextLost: function (callback, target)
  90150. {
  90151. this.lostContextCallbacks.push([ callback, target ]);
  90152. return this;
  90153. },
  90154. /**
  90155. * Checks if a WebGL extension is supported
  90156. *
  90157. * @method Phaser.Renderer.WebGL.WebGLRenderer#hasExtension
  90158. * @since 3.0.0
  90159. *
  90160. * @param {string} extensionName - Name of the WebGL extension
  90161. *
  90162. * @return {boolean} `true` if the extension is supported, otherwise `false`.
  90163. */
  90164. hasExtension: function (extensionName)
  90165. {
  90166. return this.supportedExtensions ? this.supportedExtensions.indexOf(extensionName) : false;
  90167. },
  90168. /**
  90169. * Loads a WebGL extension
  90170. *
  90171. * @method Phaser.Renderer.WebGL.WebGLRenderer#getExtension
  90172. * @since 3.0.0
  90173. *
  90174. * @param {string} extensionName - The name of the extension to load.
  90175. *
  90176. * @return {object} WebGL extension if the extension is supported
  90177. */
  90178. getExtension: function (extensionName)
  90179. {
  90180. if (!this.hasExtension(extensionName)) { return null; }
  90181. if (!(extensionName in this.extensions))
  90182. {
  90183. this.extensions[extensionName] = this.gl.getExtension(extensionName);
  90184. }
  90185. return this.extensions[extensionName];
  90186. },
  90187. /**
  90188. * Flushes the current pipeline if the pipeline is bound
  90189. *
  90190. * @method Phaser.Renderer.WebGL.WebGLRenderer#flush
  90191. * @since 3.0.0
  90192. */
  90193. flush: function ()
  90194. {
  90195. if (this.currentPipeline)
  90196. {
  90197. this.currentPipeline.flush();
  90198. }
  90199. },
  90200. /**
  90201. * Checks if a pipeline is present in the current WebGLRenderer
  90202. *
  90203. * @method Phaser.Renderer.WebGL.WebGLRenderer#hasPipeline
  90204. * @since 3.0.0
  90205. *
  90206. * @param {string} pipelineName - The name of the pipeline.
  90207. *
  90208. * @return {boolean} `true` if the given pipeline is loaded, otherwise `false`.
  90209. */
  90210. hasPipeline: function (pipelineName)
  90211. {
  90212. return (pipelineName in this.pipelines);
  90213. },
  90214. /**
  90215. * Returns the pipeline by name if the pipeline exists
  90216. *
  90217. * @method Phaser.Renderer.WebGL.WebGLRenderer#getPipeline
  90218. * @since 3.0.0
  90219. *
  90220. * @param {string} pipelineName - The name of the pipeline.
  90221. *
  90222. * @return {Phaser.Renderer.WebGL.WebGLPipeline} The pipeline instance, or `null` if not found.
  90223. */
  90224. getPipeline: function (pipelineName)
  90225. {
  90226. return (this.hasPipeline(pipelineName)) ? this.pipelines[pipelineName] : null;
  90227. },
  90228. /**
  90229. * Removes a pipeline by name.
  90230. *
  90231. * @method Phaser.Renderer.WebGL.WebGLRenderer#removePipeline
  90232. * @since 3.0.0
  90233. *
  90234. * @param {string} pipelineName - The name of the pipeline to be removed.
  90235. *
  90236. * @return {this} This WebGLRenderer instance.
  90237. */
  90238. removePipeline: function (pipelineName)
  90239. {
  90240. delete this.pipelines[pipelineName];
  90241. return this;
  90242. },
  90243. /**
  90244. * Adds a pipeline instance into the collection of pipelines
  90245. *
  90246. * @method Phaser.Renderer.WebGL.WebGLRenderer#addPipeline
  90247. * @since 3.0.0
  90248. *
  90249. * @param {string} pipelineName - A unique string-based key for the pipeline.
  90250. * @param {Phaser.Renderer.WebGL.WebGLPipeline} pipelineInstance - A pipeline instance which must extend WebGLPipeline.
  90251. *
  90252. * @return {Phaser.Renderer.WebGL.WebGLPipeline} The pipeline instance that was passed.
  90253. */
  90254. addPipeline: function (pipelineName, pipelineInstance)
  90255. {
  90256. if (!this.hasPipeline(pipelineName))
  90257. {
  90258. this.pipelines[pipelineName] = pipelineInstance;
  90259. }
  90260. else
  90261. {
  90262. console.warn('Pipeline exists: ' + pipelineName);
  90263. }
  90264. pipelineInstance.name = pipelineName;
  90265. this.pipelines[pipelineName].resize(this.width, this.height, this.config.resolution);
  90266. return pipelineInstance;
  90267. },
  90268. /**
  90269. * Pushes a new scissor state. This is used to set nested scissor states.
  90270. *
  90271. * @method Phaser.Renderer.WebGL.WebGLRenderer#pushScissor
  90272. * @since 3.0.0
  90273. *
  90274. * @param {integer} x - The x position of the scissor.
  90275. * @param {integer} y - The y position of the scissor.
  90276. * @param {integer} width - The width of the scissor.
  90277. * @param {integer} height - The height of the scissor.
  90278. * @param {integer} [drawingBufferHeight] - Optional drawingBufferHeight override value.
  90279. *
  90280. * @return {integer[]} An array containing the scissor values.
  90281. */
  90282. pushScissor: function (x, y, width, height, drawingBufferHeight)
  90283. {
  90284. if (drawingBufferHeight === undefined) { drawingBufferHeight = this.drawingBufferHeight; }
  90285. var scissorStack = this.scissorStack;
  90286. var scissor = [ x, y, width, height ];
  90287. scissorStack.push(scissor);
  90288. this.setScissor(x, y, width, height, drawingBufferHeight);
  90289. this.currentScissor = scissor;
  90290. return scissor;
  90291. },
  90292. /**
  90293. * Sets the current scissor state.
  90294. *
  90295. * @method Phaser.Renderer.WebGL.WebGLRenderer#setScissor
  90296. * @since 3.0.0
  90297. *
  90298. * @param {integer} x - The x position of the scissor.
  90299. * @param {integer} y - The y position of the scissor.
  90300. * @param {integer} width - The width of the scissor.
  90301. * @param {integer} height - The height of the scissor.
  90302. * @param {integer} [drawingBufferHeight] - Optional drawingBufferHeight override value.
  90303. */
  90304. setScissor: function (x, y, width, height, drawingBufferHeight)
  90305. {
  90306. var gl = this.gl;
  90307. var current = this.currentScissor;
  90308. var setScissor = (width > 0 && height > 0);
  90309. if (current && setScissor)
  90310. {
  90311. var cx = current[0];
  90312. var cy = current[1];
  90313. var cw = current[2];
  90314. var ch = current[3];
  90315. setScissor = (cx !== x || cy !== y || cw !== width || ch !== height);
  90316. }
  90317. if (setScissor)
  90318. {
  90319. this.flush();
  90320. // https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/scissor
  90321. gl.scissor(x, (drawingBufferHeight - y - height), width, height);
  90322. }
  90323. },
  90324. /**
  90325. * Pops the last scissor state and sets it.
  90326. *
  90327. * @method Phaser.Renderer.WebGL.WebGLRenderer#popScissor
  90328. * @since 3.0.0
  90329. */
  90330. popScissor: function ()
  90331. {
  90332. var scissorStack = this.scissorStack;
  90333. // Remove the current scissor
  90334. scissorStack.pop();
  90335. // Reset the previous scissor
  90336. var scissor = scissorStack[scissorStack.length - 1];
  90337. if (scissor)
  90338. {
  90339. this.setScissor(scissor[0], scissor[1], scissor[2], scissor[3]);
  90340. }
  90341. this.currentScissor = scissor;
  90342. },
  90343. /**
  90344. * Binds a WebGLPipeline and sets it as the current pipeline to be used.
  90345. *
  90346. * @method Phaser.Renderer.WebGL.WebGLRenderer#setPipeline
  90347. * @since 3.0.0
  90348. *
  90349. * @param {Phaser.Renderer.WebGL.WebGLPipeline} pipelineInstance - The pipeline instance to be activated.
  90350. * @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
  90351. *
  90352. * @return {Phaser.Renderer.WebGL.WebGLPipeline} The pipeline that was activated.
  90353. */
  90354. setPipeline: function (pipelineInstance, gameObject)
  90355. {
  90356. if (this.currentPipeline !== pipelineInstance ||
  90357. this.currentPipeline.vertexBuffer !== this.currentVertexBuffer ||
  90358. this.currentPipeline.program !== this.currentProgram)
  90359. {
  90360. this.flush();
  90361. this.currentPipeline = pipelineInstance;
  90362. this.currentPipeline.bind();
  90363. }
  90364. this.currentPipeline.onBind(gameObject);
  90365. return this.currentPipeline;
  90366. },
  90367. /**
  90368. * Use this to reset the gl context to the state that Phaser requires to continue rendering.
  90369. * Calling this will:
  90370. *
  90371. * * Disable `DEPTH_TEST`, `CULL_FACE` and `STENCIL_TEST`.
  90372. * * Clear the depth buffer and stencil buffers.
  90373. * * Reset the viewport size.
  90374. * * Reset the blend mode.
  90375. * * Bind a blank texture as the active texture on texture unit zero.
  90376. * * Rebinds the given pipeline instance.
  90377. *
  90378. * You should call this having previously called `clearPipeline` and then wishing to return
  90379. * control to Phaser again.
  90380. *
  90381. * @method Phaser.Renderer.WebGL.WebGLRenderer#rebindPipeline
  90382. * @since 3.16.0
  90383. *
  90384. * @param {Phaser.Renderer.WebGL.WebGLPipeline} pipelineInstance - The pipeline instance to be activated.
  90385. */
  90386. rebindPipeline: function (pipelineInstance)
  90387. {
  90388. var gl = this.gl;
  90389. gl.disable(gl.DEPTH_TEST);
  90390. gl.disable(gl.CULL_FACE);
  90391. gl.disable(gl.STENCIL_TEST);
  90392. gl.clear(gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
  90393. gl.viewport(0, 0, this.width, this.height);
  90394. this.setBlendMode(0, true);
  90395. gl.activeTexture(gl.TEXTURE0);
  90396. gl.bindTexture(gl.TEXTURE_2D, this.blankTexture.glTexture);
  90397. this.currentActiveTextureUnit = 0;
  90398. this.currentTextures[0] = this.blankTexture.glTexture;
  90399. this.currentPipeline = pipelineInstance;
  90400. this.currentPipeline.bind();
  90401. this.currentPipeline.onBind();
  90402. },
  90403. /**
  90404. * Flushes the current WebGLPipeline being used and then clears it, along with the
  90405. * the current shader program and vertex buffer. Then resets the blend mode to NORMAL.
  90406. * Call this before jumping to your own gl context handler, and then call `rebindPipeline` when
  90407. * you wish to return control to Phaser again.
  90408. *
  90409. * @method Phaser.Renderer.WebGL.WebGLRenderer#clearPipeline
  90410. * @since 3.16.0
  90411. */
  90412. clearPipeline: function ()
  90413. {
  90414. this.flush();
  90415. this.currentPipeline = null;
  90416. this.currentProgram = null;
  90417. this.currentVertexBuffer = null;
  90418. this.currentIndexBuffer = null;
  90419. this.setBlendMode(0, true);
  90420. },
  90421. /**
  90422. * Sets the blend mode to the value given.
  90423. *
  90424. * If the current blend mode is different from the one given, the pipeline is flushed and the new
  90425. * blend mode is enabled.
  90426. *
  90427. * @method Phaser.Renderer.WebGL.WebGLRenderer#setBlendMode
  90428. * @since 3.0.0
  90429. *
  90430. * @param {integer} blendModeId - The blend mode to be set. Can be a `BlendModes` const or an integer value.
  90431. * @param {boolean} [force=false] - Force the blend mode to be set, regardless of the currently set blend mode.
  90432. *
  90433. * @return {boolean} `true` if the blend mode was changed as a result of this call, forcing a flush, otherwise `false`.
  90434. */
  90435. setBlendMode: function (blendModeId, force)
  90436. {
  90437. if (force === undefined) { force = false; }
  90438. var gl = this.gl;
  90439. var blendMode = this.blendModes[blendModeId];
  90440. if (force || (blendModeId !== CONST.BlendModes.SKIP_CHECK && this.currentBlendMode !== blendModeId))
  90441. {
  90442. this.flush();
  90443. gl.enable(gl.BLEND);
  90444. gl.blendEquation(blendMode.equation);
  90445. if (blendMode.func.length > 2)
  90446. {
  90447. gl.blendFuncSeparate(blendMode.func[0], blendMode.func[1], blendMode.func[2], blendMode.func[3]);
  90448. }
  90449. else
  90450. {
  90451. gl.blendFunc(blendMode.func[0], blendMode.func[1]);
  90452. }
  90453. this.currentBlendMode = blendModeId;
  90454. return true;
  90455. }
  90456. return false;
  90457. },
  90458. /**
  90459. * Creates a new custom blend mode for the renderer.
  90460. *
  90461. * @method Phaser.Renderer.WebGL.WebGLRenderer#addBlendMode
  90462. * @since 3.0.0
  90463. *
  90464. * @param {function} func - An array containing the WebGL functions to use for the source and the destination blending factors, respectively. See the possible constants for {@link WebGLRenderingContext#blendFunc()}.
  90465. * @param {function} equation - The equation to use for combining the RGB and alpha components of a new pixel with a rendered one. See the possible constants for {@link WebGLRenderingContext#blendEquation()}.
  90466. *
  90467. * @return {integer} The index of the new blend mode, used for referencing it in the future.
  90468. */
  90469. addBlendMode: function (func, equation)
  90470. {
  90471. var index = this.blendModes.push({ func: func, equation: equation });
  90472. return index - 1;
  90473. },
  90474. /**
  90475. * Updates the function bound to a given custom blend mode.
  90476. *
  90477. * @method Phaser.Renderer.WebGL.WebGLRenderer#updateBlendMode
  90478. * @since 3.0.0
  90479. *
  90480. * @param {integer} index - The index of the custom blend mode.
  90481. * @param {function} func - The function to use for the blend mode.
  90482. * @param {function} equation - The equation to use for the blend mode.
  90483. *
  90484. * @return {this} This WebGLRenderer instance.
  90485. */
  90486. updateBlendMode: function (index, func, equation)
  90487. {
  90488. if (this.blendModes[index])
  90489. {
  90490. this.blendModes[index].func = func;
  90491. if (equation)
  90492. {
  90493. this.blendModes[index].equation = equation;
  90494. }
  90495. }
  90496. return this;
  90497. },
  90498. /**
  90499. * Removes a custom blend mode from the renderer.
  90500. * Any Game Objects still using this blend mode will error, so be sure to clear them first.
  90501. *
  90502. * @method Phaser.Renderer.WebGL.WebGLRenderer#removeBlendMode
  90503. * @since 3.0.0
  90504. *
  90505. * @param {integer} index - The index of the custom blend mode to be removed.
  90506. *
  90507. * @return {this} This WebGLRenderer instance.
  90508. */
  90509. removeBlendMode: function (index)
  90510. {
  90511. if (index > 17 && this.blendModes[index])
  90512. {
  90513. this.blendModes.splice(index, 1);
  90514. }
  90515. return this;
  90516. },
  90517. /**
  90518. * Sets the current active texture for texture unit zero to be a blank texture.
  90519. * This only happens if there isn't a texture already in use by texture unit zero.
  90520. *
  90521. * @method Phaser.Renderer.WebGL.WebGLRenderer#setBlankTexture
  90522. * @private
  90523. * @since 3.12.0
  90524. *
  90525. * @param {boolean} [force=false] - Force a blank texture set, regardless of what's already bound?
  90526. */
  90527. setBlankTexture: function (force)
  90528. {
  90529. if (force === undefined) { force = false; }
  90530. if (force || this.currentActiveTextureUnit !== 0 || !this.currentTextures[0])
  90531. {
  90532. this.setTexture2D(this.blankTexture.glTexture, 0);
  90533. }
  90534. },
  90535. /**
  90536. * Binds a texture at a texture unit. If a texture is already
  90537. * bound to that unit it will force a flush on the current pipeline.
  90538. *
  90539. * @method Phaser.Renderer.WebGL.WebGLRenderer#setTexture2D
  90540. * @since 3.0.0
  90541. *
  90542. * @param {WebGLTexture} texture - The WebGL texture that needs to be bound.
  90543. * @param {integer} textureUnit - The texture unit to which the texture will be bound.
  90544. * @param {boolean} [flush=true] - Will the current pipeline be flushed if this is a new texture, or not?
  90545. *
  90546. * @return {this} This WebGLRenderer instance.
  90547. */
  90548. setTexture2D: function (texture, textureUnit, flush)
  90549. {
  90550. if (flush === undefined) { flush = true; }
  90551. var gl = this.gl;
  90552. if (texture !== this.currentTextures[textureUnit])
  90553. {
  90554. if (flush)
  90555. {
  90556. this.flush();
  90557. }
  90558. if (this.currentActiveTextureUnit !== textureUnit)
  90559. {
  90560. gl.activeTexture(gl.TEXTURE0 + textureUnit);
  90561. this.currentActiveTextureUnit = textureUnit;
  90562. }
  90563. gl.bindTexture(gl.TEXTURE_2D, texture);
  90564. this.currentTextures[textureUnit] = texture;
  90565. }
  90566. return this;
  90567. },
  90568. /**
  90569. * Binds a framebuffer. If there was another framebuffer already bound it will force a pipeline flush.
  90570. *
  90571. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFramebuffer
  90572. * @since 3.0.0
  90573. *
  90574. * @param {WebGLFramebuffer} framebuffer - The framebuffer that needs to be bound.
  90575. * @param {boolean} [updateScissor=false] - If a framebuffer is given, set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack.
  90576. *
  90577. * @return {this} This WebGLRenderer instance.
  90578. */
  90579. setFramebuffer: function (framebuffer, updateScissor)
  90580. {
  90581. if (updateScissor === undefined) { updateScissor = false; }
  90582. var gl = this.gl;
  90583. var width = this.width;
  90584. var height = this.height;
  90585. if (framebuffer !== this.currentFramebuffer)
  90586. {
  90587. if (framebuffer && framebuffer.renderTexture)
  90588. {
  90589. width = framebuffer.renderTexture.width;
  90590. height = framebuffer.renderTexture.height;
  90591. }
  90592. else
  90593. {
  90594. this.flush();
  90595. }
  90596. gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
  90597. gl.viewport(0, 0, width, height);
  90598. if (updateScissor)
  90599. {
  90600. if (framebuffer)
  90601. {
  90602. this.drawingBufferHeight = height;
  90603. this.pushScissor(0, 0, width, height);
  90604. }
  90605. else
  90606. {
  90607. this.drawingBufferHeight = this.height;
  90608. this.popScissor();
  90609. }
  90610. }
  90611. this.currentFramebuffer = framebuffer;
  90612. }
  90613. return this;
  90614. },
  90615. /**
  90616. * Binds a program. If there was another program already bound it will force a pipeline flush.
  90617. *
  90618. * @method Phaser.Renderer.WebGL.WebGLRenderer#setProgram
  90619. * @since 3.0.0
  90620. *
  90621. * @param {WebGLProgram} program - The program that needs to be bound.
  90622. *
  90623. * @return {this} This WebGLRenderer instance.
  90624. */
  90625. setProgram: function (program)
  90626. {
  90627. var gl = this.gl;
  90628. if (program !== this.currentProgram)
  90629. {
  90630. this.flush();
  90631. gl.useProgram(program);
  90632. this.currentProgram = program;
  90633. }
  90634. return this;
  90635. },
  90636. /**
  90637. * Bounds a vertex buffer. If there is a vertex buffer already bound it'll force a pipeline flush.
  90638. *
  90639. * @method Phaser.Renderer.WebGL.WebGLRenderer#setVertexBuffer
  90640. * @since 3.0.0
  90641. *
  90642. * @param {WebGLBuffer} vertexBuffer - The buffer that needs to be bound.
  90643. *
  90644. * @return {this} This WebGLRenderer instance.
  90645. */
  90646. setVertexBuffer: function (vertexBuffer)
  90647. {
  90648. var gl = this.gl;
  90649. if (vertexBuffer !== this.currentVertexBuffer)
  90650. {
  90651. this.flush();
  90652. gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
  90653. this.currentVertexBuffer = vertexBuffer;
  90654. }
  90655. return this;
  90656. },
  90657. /**
  90658. * Bounds a index buffer. If there is a index buffer already bound it'll force a pipeline flush.
  90659. *
  90660. * @method Phaser.Renderer.WebGL.WebGLRenderer#setIndexBuffer
  90661. * @since 3.0.0
  90662. *
  90663. * @param {WebGLBuffer} indexBuffer - The buffer the needs to be bound.
  90664. *
  90665. * @return {this} This WebGLRenderer instance.
  90666. */
  90667. setIndexBuffer: function (indexBuffer)
  90668. {
  90669. var gl = this.gl;
  90670. if (indexBuffer !== this.currentIndexBuffer)
  90671. {
  90672. this.flush();
  90673. gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
  90674. this.currentIndexBuffer = indexBuffer;
  90675. }
  90676. return this;
  90677. },
  90678. /**
  90679. * Creates a texture from an image source. If the source is not valid it creates an empty texture.
  90680. *
  90681. * @method Phaser.Renderer.WebGL.WebGLRenderer#createTextureFromSource
  90682. * @since 3.0.0
  90683. *
  90684. * @param {object} source - The source of the texture.
  90685. * @param {integer} width - The width of the texture.
  90686. * @param {integer} height - The height of the texture.
  90687. * @param {integer} scaleMode - The scale mode to be used by the texture.
  90688. *
  90689. * @return {?WebGLTexture} The WebGL Texture that was created, or `null` if it couldn't be created.
  90690. */
  90691. createTextureFromSource: function (source, width, height, scaleMode)
  90692. {
  90693. var gl = this.gl;
  90694. var filter = gl.NEAREST;
  90695. var wrap = gl.CLAMP_TO_EDGE;
  90696. var texture = null;
  90697. width = source ? source.width : width;
  90698. height = source ? source.height : height;
  90699. if (IsSizePowerOfTwo(width, height))
  90700. {
  90701. wrap = gl.REPEAT;
  90702. }
  90703. if (scaleMode === CONST.ScaleModes.LINEAR && this.config.antialias)
  90704. {
  90705. filter = gl.LINEAR;
  90706. }
  90707. if (!source && typeof width === 'number' && typeof height === 'number')
  90708. {
  90709. texture = this.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  90710. }
  90711. else
  90712. {
  90713. texture = this.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, source);
  90714. }
  90715. return texture;
  90716. },
  90717. /**
  90718. * A wrapper for creating a WebGLTexture. If no pixel data is passed it will create an empty texture.
  90719. *
  90720. * @method Phaser.Renderer.WebGL.WebGLRenderer#createTexture2D
  90721. * @since 3.0.0
  90722. *
  90723. * @param {integer} mipLevel - Mip level of the texture.
  90724. * @param {integer} minFilter - Filtering of the texture.
  90725. * @param {integer} magFilter - Filtering of the texture.
  90726. * @param {integer} wrapT - Wrapping mode of the texture.
  90727. * @param {integer} wrapS - Wrapping mode of the texture.
  90728. * @param {integer} format - Which format does the texture use.
  90729. * @param {object} pixels - pixel data.
  90730. * @param {integer} width - Width of the texture in pixels.
  90731. * @param {integer} height - Height of the texture in pixels.
  90732. * @param {boolean} pma - Does the texture have premultiplied alpha?
  90733. *
  90734. * @return {WebGLTexture} The WebGLTexture that was created.
  90735. */
  90736. createTexture2D: function (mipLevel, minFilter, magFilter, wrapT, wrapS, format, pixels, width, height, pma)
  90737. {
  90738. pma = (pma === undefined || pma === null) ? true : pma;
  90739. var gl = this.gl;
  90740. var texture = gl.createTexture();
  90741. this.setTexture2D(texture, 0);
  90742. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);
  90743. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter);
  90744. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapS);
  90745. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapT);
  90746. gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, pma);
  90747. if (pixels === null || pixels === undefined)
  90748. {
  90749. gl.texImage2D(gl.TEXTURE_2D, mipLevel, format, width, height, 0, format, gl.UNSIGNED_BYTE, null);
  90750. }
  90751. else
  90752. {
  90753. gl.texImage2D(gl.TEXTURE_2D, mipLevel, format, format, gl.UNSIGNED_BYTE, pixels);
  90754. width = pixels.width;
  90755. height = pixels.height;
  90756. }
  90757. this.setTexture2D(null, 0);
  90758. texture.isAlphaPremultiplied = pma;
  90759. texture.isRenderTexture = false;
  90760. texture.width = width;
  90761. texture.height = height;
  90762. this.nativeTextures.push(texture);
  90763. return texture;
  90764. },
  90765. /**
  90766. * Wrapper for creating WebGLFramebuffer.
  90767. *
  90768. * @method Phaser.Renderer.WebGL.WebGLRenderer#createFramebuffer
  90769. * @since 3.0.0
  90770. *
  90771. * @param {integer} width - Width in pixels of the framebuffer
  90772. * @param {integer} height - Height in pixels of the framebuffer
  90773. * @param {WebGLTexture} renderTexture - The color texture to where the color pixels are written
  90774. * @param {boolean} addDepthStencilBuffer - Indicates if the current framebuffer support depth and stencil buffers
  90775. *
  90776. * @return {WebGLFramebuffer} Raw WebGLFramebuffer
  90777. */
  90778. createFramebuffer: function (width, height, renderTexture, addDepthStencilBuffer)
  90779. {
  90780. var gl = this.gl;
  90781. var framebuffer = gl.createFramebuffer();
  90782. var complete = 0;
  90783. this.setFramebuffer(framebuffer);
  90784. if (addDepthStencilBuffer)
  90785. {
  90786. var depthStencilBuffer = gl.createRenderbuffer();
  90787. gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);
  90788. gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
  90789. gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, depthStencilBuffer);
  90790. }
  90791. renderTexture.isRenderTexture = true;
  90792. renderTexture.isAlphaPremultiplied = false;
  90793. gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, renderTexture, 0);
  90794. complete = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
  90795. if (complete !== gl.FRAMEBUFFER_COMPLETE)
  90796. {
  90797. var errors = {
  90798. 36054: 'Incomplete Attachment',
  90799. 36055: 'Missing Attachment',
  90800. 36057: 'Incomplete Dimensions',
  90801. 36061: 'Framebuffer Unsupported'
  90802. };
  90803. throw new Error('Framebuffer incomplete. Framebuffer status: ' + errors[complete]);
  90804. }
  90805. framebuffer.renderTexture = renderTexture;
  90806. this.setFramebuffer(null);
  90807. return framebuffer;
  90808. },
  90809. /**
  90810. * Wrapper for creating a WebGLProgram
  90811. *
  90812. * @method Phaser.Renderer.WebGL.WebGLRenderer#createProgram
  90813. * @since 3.0.0
  90814. *
  90815. * @param {string} vertexShader - Source to the vertex shader
  90816. * @param {string} fragmentShader - Source to the fragment shader
  90817. *
  90818. * @return {WebGLProgram} Raw WebGLProgram
  90819. */
  90820. createProgram: function (vertexShader, fragmentShader)
  90821. {
  90822. var gl = this.gl;
  90823. var program = gl.createProgram();
  90824. var vs = gl.createShader(gl.VERTEX_SHADER);
  90825. var fs = gl.createShader(gl.FRAGMENT_SHADER);
  90826. gl.shaderSource(vs, vertexShader);
  90827. gl.shaderSource(fs, fragmentShader);
  90828. gl.compileShader(vs);
  90829. gl.compileShader(fs);
  90830. if (!gl.getShaderParameter(vs, gl.COMPILE_STATUS))
  90831. {
  90832. throw new Error('Failed to compile Vertex Shader:\n' + gl.getShaderInfoLog(vs));
  90833. }
  90834. if (!gl.getShaderParameter(fs, gl.COMPILE_STATUS))
  90835. {
  90836. throw new Error('Failed to compile Fragment Shader:\n' + gl.getShaderInfoLog(fs));
  90837. }
  90838. gl.attachShader(program, vs);
  90839. gl.attachShader(program, fs);
  90840. gl.linkProgram(program);
  90841. if (!gl.getProgramParameter(program, gl.LINK_STATUS))
  90842. {
  90843. throw new Error('Failed to link program:\n' + gl.getProgramInfoLog(program));
  90844. }
  90845. return program;
  90846. },
  90847. /**
  90848. * Wrapper for creating a vertex buffer.
  90849. *
  90850. * @method Phaser.Renderer.WebGL.WebGLRenderer#createVertexBuffer
  90851. * @since 3.0.0
  90852. *
  90853. * @param {ArrayBuffer} initialDataOrSize - It's either ArrayBuffer or an integer indicating the size of the vbo
  90854. * @param {integer} bufferUsage - How the buffer is used. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW
  90855. *
  90856. * @return {WebGLBuffer} Raw vertex buffer
  90857. */
  90858. createVertexBuffer: function (initialDataOrSize, bufferUsage)
  90859. {
  90860. var gl = this.gl;
  90861. var vertexBuffer = gl.createBuffer();
  90862. this.setVertexBuffer(vertexBuffer);
  90863. gl.bufferData(gl.ARRAY_BUFFER, initialDataOrSize, bufferUsage);
  90864. this.setVertexBuffer(null);
  90865. return vertexBuffer;
  90866. },
  90867. /**
  90868. * Wrapper for creating a vertex buffer.
  90869. *
  90870. * @method Phaser.Renderer.WebGL.WebGLRenderer#createIndexBuffer
  90871. * @since 3.0.0
  90872. *
  90873. * @param {ArrayBuffer} initialDataOrSize - Either ArrayBuffer or an integer indicating the size of the vbo.
  90874. * @param {integer} bufferUsage - How the buffer is used. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW.
  90875. *
  90876. * @return {WebGLBuffer} Raw index buffer
  90877. */
  90878. createIndexBuffer: function (initialDataOrSize, bufferUsage)
  90879. {
  90880. var gl = this.gl;
  90881. var indexBuffer = gl.createBuffer();
  90882. this.setIndexBuffer(indexBuffer);
  90883. gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, initialDataOrSize, bufferUsage);
  90884. this.setIndexBuffer(null);
  90885. return indexBuffer;
  90886. },
  90887. /**
  90888. * Removes the given texture from the nativeTextures array and then deletes it from the GPU.
  90889. *
  90890. * @method Phaser.Renderer.WebGL.WebGLRenderer#deleteTexture
  90891. * @since 3.0.0
  90892. *
  90893. * @param {WebGLTexture} texture - The WebGL Texture to be deleted.
  90894. *
  90895. * @return {this} This WebGLRenderer instance.
  90896. */
  90897. deleteTexture: function (texture)
  90898. {
  90899. var index = this.nativeTextures.indexOf(texture);
  90900. if (index !== -1)
  90901. {
  90902. SpliceOne(this.nativeTextures, index);
  90903. }
  90904. this.gl.deleteTexture(texture);
  90905. if (this.currentTextures[0] === texture && !this.game.pendingDestroy)
  90906. {
  90907. // texture we just deleted is in use, so bind a blank texture
  90908. this.setBlankTexture(true);
  90909. }
  90910. return this;
  90911. },
  90912. /**
  90913. * Deletes a WebGLFramebuffer from the GL instance.
  90914. *
  90915. * @method Phaser.Renderer.WebGL.WebGLRenderer#deleteFramebuffer
  90916. * @since 3.0.0
  90917. *
  90918. * @param {WebGLFramebuffer} framebuffer - The Framebuffer to be deleted.
  90919. *
  90920. * @return {this} This WebGLRenderer instance.
  90921. */
  90922. deleteFramebuffer: function (framebuffer)
  90923. {
  90924. this.gl.deleteFramebuffer(framebuffer);
  90925. return this;
  90926. },
  90927. /**
  90928. * Deletes a WebGLProgram from the GL instance.
  90929. *
  90930. * @method Phaser.Renderer.WebGL.WebGLRenderer#deleteProgram
  90931. * @since 3.0.0
  90932. *
  90933. * @param {WebGLProgram} program - The shader program to be deleted.
  90934. *
  90935. * @return {this} This WebGLRenderer instance.
  90936. */
  90937. deleteProgram: function (program)
  90938. {
  90939. this.gl.deleteProgram(program);
  90940. return this;
  90941. },
  90942. /**
  90943. * Deletes a WebGLBuffer from the GL instance.
  90944. *
  90945. * @method Phaser.Renderer.WebGL.WebGLRenderer#deleteBuffer
  90946. * @since 3.0.0
  90947. *
  90948. * @param {WebGLBuffer} vertexBuffer - The WebGLBuffer to be deleted.
  90949. *
  90950. * @return {this} This WebGLRenderer instance.
  90951. */
  90952. deleteBuffer: function (buffer)
  90953. {
  90954. this.gl.deleteBuffer(buffer);
  90955. return this;
  90956. },
  90957. /**
  90958. * Controls the pre-render operations for the given camera.
  90959. * Handles any clipping needed by the camera and renders the background color if a color is visible.
  90960. *
  90961. * @method Phaser.Renderer.WebGL.WebGLRenderer#preRenderCamera
  90962. * @since 3.0.0
  90963. *
  90964. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to pre-render.
  90965. */
  90966. preRenderCamera: function (camera)
  90967. {
  90968. var cx = camera._cx;
  90969. var cy = camera._cy;
  90970. var cw = camera._cw;
  90971. var ch = camera._ch;
  90972. var TextureTintPipeline = this.pipelines.TextureTintPipeline;
  90973. var color = camera.backgroundColor;
  90974. if (camera.renderToTexture)
  90975. {
  90976. this.flush();
  90977. this.pushScissor(cx, cy, cw, -ch);
  90978. this.setFramebuffer(camera.framebuffer);
  90979. var gl = this.gl;
  90980. gl.clearColor(0, 0, 0, 0);
  90981. gl.clear(gl.COLOR_BUFFER_BIT);
  90982. TextureTintPipeline.projOrtho(cx, cw + cx, cy, ch + cy, -1000, 1000);
  90983. if (color.alphaGL > 0)
  90984. {
  90985. TextureTintPipeline.drawFillRect(
  90986. cx, cy, cw + cx, ch + cy,
  90987. Utils.getTintFromFloats(color.redGL, color.greenGL, color.blueGL, 1),
  90988. color.alphaGL
  90989. );
  90990. }
  90991. camera.emit(CameraEvents.PRE_RENDER, camera);
  90992. }
  90993. else
  90994. {
  90995. this.pushScissor(cx, cy, cw, ch);
  90996. if (color.alphaGL > 0)
  90997. {
  90998. TextureTintPipeline.drawFillRect(
  90999. cx, cy, cw , ch,
  91000. Utils.getTintFromFloats(color.redGL, color.greenGL, color.blueGL, 1),
  91001. color.alphaGL
  91002. );
  91003. }
  91004. }
  91005. },
  91006. /**
  91007. * Controls the post-render operations for the given camera.
  91008. * Renders the foreground camera effects like flash and fading. It resets the current scissor state.
  91009. *
  91010. * @method Phaser.Renderer.WebGL.WebGLRenderer#postRenderCamera
  91011. * @since 3.0.0
  91012. *
  91013. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to post-render.
  91014. */
  91015. postRenderCamera: function (camera)
  91016. {
  91017. var TextureTintPipeline = this.pipelines.TextureTintPipeline;
  91018. camera.flashEffect.postRenderWebGL(TextureTintPipeline, Utils.getTintFromFloats);
  91019. camera.fadeEffect.postRenderWebGL(TextureTintPipeline, Utils.getTintFromFloats);
  91020. camera.dirty = false;
  91021. this.popScissor();
  91022. if (camera.renderToTexture)
  91023. {
  91024. TextureTintPipeline.flush();
  91025. this.setFramebuffer(null);
  91026. camera.emit(CameraEvents.POST_RENDER, camera);
  91027. TextureTintPipeline.projOrtho(0, TextureTintPipeline.width, TextureTintPipeline.height, 0, -1000.0, 1000.0);
  91028. var getTint = Utils.getTintAppendFloatAlpha;
  91029. var pipeline = (camera.pipeline) ? camera.pipeline : TextureTintPipeline;
  91030. pipeline.batchTexture(
  91031. camera,
  91032. camera.glTexture,
  91033. camera.width, camera.height,
  91034. camera.x, camera.y,
  91035. camera.width, camera.height,
  91036. camera.zoom, camera.zoom,
  91037. camera.rotation,
  91038. camera.flipX, !camera.flipY,
  91039. 1, 1,
  91040. 0, 0,
  91041. 0, 0, camera.width, camera.height,
  91042. getTint(camera._tintTL, camera._alphaTL),
  91043. getTint(camera._tintTR, camera._alphaTR),
  91044. getTint(camera._tintBL, camera._alphaBL),
  91045. getTint(camera._tintBR, camera._alphaBR),
  91046. (camera._isTinted && camera.tintFill),
  91047. 0, 0,
  91048. this.defaultCamera,
  91049. null
  91050. );
  91051. // Force clear the current texture so that items next in the batch (like Graphics) don't try and use it
  91052. this.setBlankTexture(true);
  91053. }
  91054. },
  91055. /**
  91056. * Clears the current vertex buffer and updates pipelines.
  91057. *
  91058. * @method Phaser.Renderer.WebGL.WebGLRenderer#preRender
  91059. * @since 3.0.0
  91060. */
  91061. preRender: function ()
  91062. {
  91063. if (this.contextLost) { return; }
  91064. var gl = this.gl;
  91065. var pipelines = this.pipelines;
  91066. // Make sure we are bound to the main frame buffer
  91067. gl.bindFramebuffer(gl.FRAMEBUFFER, null);
  91068. if (this.config.clearBeforeRender)
  91069. {
  91070. var clearColor = this.config.backgroundColor;
  91071. gl.clearColor(clearColor.redGL, clearColor.greenGL, clearColor.blueGL, clearColor.alphaGL);
  91072. gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
  91073. }
  91074. gl.enable(gl.SCISSOR_TEST);
  91075. for (var key in pipelines)
  91076. {
  91077. pipelines[key].onPreRender();
  91078. }
  91079. // TODO - Find a way to stop needing to create these arrays every frame
  91080. // and equally not need a huge array buffer created to hold them
  91081. this.currentScissor = [ 0, 0, this.width, this.height ];
  91082. this.scissorStack = [ this.currentScissor ];
  91083. if (this.game.scene.customViewports)
  91084. {
  91085. gl.scissor(0, (this.drawingBufferHeight - this.height), this.width, this.height);
  91086. }
  91087. this.setPipeline(this.pipelines.TextureTintPipeline);
  91088. },
  91089. /**
  91090. * The core render step for a Scene Camera.
  91091. *
  91092. * Iterates through the given Game Object's array and renders them with the given Camera.
  91093. *
  91094. * This is called by the `CameraManager.render` method. The Camera Manager instance belongs to a Scene, and is invoked
  91095. * by the Scene Systems.render method.
  91096. *
  91097. * This method is not called if `Camera.visible` is `false`, or `Camera.alpha` is zero.
  91098. *
  91099. * @method Phaser.Renderer.WebGL.WebGLRenderer#render
  91100. * @since 3.0.0
  91101. *
  91102. * @param {Phaser.Scene} scene - The Scene to render.
  91103. * @param {Phaser.GameObjects.GameObject} children - The Game Object's within the Scene to be rendered.
  91104. * @param {number} interpolationPercentage - The interpolation percentage to apply. Currently un-used.
  91105. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Scene Camera to render with.
  91106. */
  91107. render: function (scene, children, interpolationPercentage, camera)
  91108. {
  91109. if (this.contextLost) { return; }
  91110. var list = children.list;
  91111. var childCount = list.length;
  91112. var pipelines = this.pipelines;
  91113. for (var key in pipelines)
  91114. {
  91115. pipelines[key].onRender(scene, camera);
  91116. }
  91117. // Apply scissor for cam region + render background color, if not transparent
  91118. this.preRenderCamera(camera);
  91119. for (var i = 0; i < childCount; i++)
  91120. {
  91121. var child = list[i];
  91122. if (!child.willRender(camera))
  91123. {
  91124. continue;
  91125. }
  91126. if (child.blendMode !== this.currentBlendMode)
  91127. {
  91128. this.setBlendMode(child.blendMode);
  91129. }
  91130. var mask = child.mask;
  91131. if (mask)
  91132. {
  91133. mask.preRenderWebGL(this, child, camera);
  91134. child.renderWebGL(this, child, interpolationPercentage, camera);
  91135. mask.postRenderWebGL(this, child);
  91136. }
  91137. else
  91138. {
  91139. child.renderWebGL(this, child, interpolationPercentage, camera);
  91140. }
  91141. }
  91142. this.setBlendMode(CONST.BlendModes.NORMAL);
  91143. // Applies camera effects and pops the scissor, if set
  91144. this.postRenderCamera(camera);
  91145. },
  91146. /**
  91147. * The post-render step happens after all Cameras in all Scenes have been rendered.
  91148. *
  91149. * @method Phaser.Renderer.WebGL.WebGLRenderer#postRender
  91150. * @since 3.0.0
  91151. */
  91152. postRender: function ()
  91153. {
  91154. if (this.contextLost) { return; }
  91155. this.flush();
  91156. // Unbind custom framebuffer here
  91157. var state = this.snapshotState;
  91158. if (state.callback)
  91159. {
  91160. WebGLSnapshot(this.canvas, state);
  91161. state.callback = null;
  91162. }
  91163. var pipelines = this.pipelines;
  91164. for (var key in pipelines)
  91165. {
  91166. pipelines[key].onPostRender();
  91167. }
  91168. },
  91169. /**
  91170. * Schedules a snapshot of the entire game viewport to be taken after the current frame is rendered.
  91171. *
  91172. * To capture a specific area see the `snapshotArea` method. To capture a specific pixel, see `snapshotPixel`.
  91173. *
  91174. * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then
  91175. * calling this method will override it.
  91176. *
  91177. * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer into an ArrayBufferView.
  91178. * It then parses this, copying the contents to a temporary Canvas and finally creating an Image object from it,
  91179. * which is the image returned to the callback provided. All in all, this is a computationally expensive and blocking process,
  91180. * which gets more expensive the larger the canvas size gets, so please be careful how you employ this in your game.
  91181. *
  91182. * @method Phaser.Renderer.WebGL.WebGLRenderer#snapshot
  91183. * @since 3.0.0
  91184. *
  91185. * @param {SnapshotCallback} callback - The Function to invoke after the snapshot image is created.
  91186. * @param {string} [type='image/png'] - The format of the image to create, usually `image/png` or `image/jpeg`.
  91187. * @param {number} [encoderOptions=0.92] - The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`.
  91188. *
  91189. * @return {this} This WebGL Renderer.
  91190. */
  91191. snapshot: function (callback, type, encoderOptions)
  91192. {
  91193. return this.snapshotArea(0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight, callback, type, encoderOptions);
  91194. },
  91195. /**
  91196. * Schedules a snapshot of the given area of the game viewport to be taken after the current frame is rendered.
  91197. *
  91198. * To capture the whole game viewport see the `snapshot` method. To capture a specific pixel, see `snapshotPixel`.
  91199. *
  91200. * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then
  91201. * calling this method will override it.
  91202. *
  91203. * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer into an ArrayBufferView.
  91204. * It then parses this, copying the contents to a temporary Canvas and finally creating an Image object from it,
  91205. * which is the image returned to the callback provided. All in all, this is a computationally expensive and blocking process,
  91206. * which gets more expensive the larger the canvas size gets, so please be careful how you employ this in your game.
  91207. *
  91208. * @method Phaser.Renderer.WebGL.WebGLRenderer#snapshotArea
  91209. * @since 3.16.0
  91210. *
  91211. * @param {integer} x - The x coordinate to grab from.
  91212. * @param {integer} y - The y coordinate to grab from.
  91213. * @param {integer} width - The width of the area to grab.
  91214. * @param {integer} height - The height of the area to grab.
  91215. * @param {SnapshotCallback} callback - The Function to invoke after the snapshot image is created.
  91216. * @param {string} [type='image/png'] - The format of the image to create, usually `image/png` or `image/jpeg`.
  91217. * @param {number} [encoderOptions=0.92] - The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`.
  91218. *
  91219. * @return {this} This WebGL Renderer.
  91220. */
  91221. snapshotArea: function (x, y, width, height, callback, type, encoderOptions)
  91222. {
  91223. var state = this.snapshotState;
  91224. state.callback = callback;
  91225. state.type = type;
  91226. state.encoder = encoderOptions;
  91227. state.getPixel = false;
  91228. state.x = x;
  91229. state.y = y;
  91230. state.width = Math.min(width, this.gl.drawingBufferWidth);
  91231. state.height = Math.min(height, this.gl.drawingBufferHeight);
  91232. return this;
  91233. },
  91234. /**
  91235. * Schedules a snapshot of the given pixel from the game viewport to be taken after the current frame is rendered.
  91236. *
  91237. * To capture the whole game viewport see the `snapshot` method. To capture a specific area, see `snapshotArea`.
  91238. *
  91239. * Only one snapshot can be active _per frame_. If you have already called `snapshotArea`, for example, then
  91240. * calling this method will override it.
  91241. *
  91242. * Unlike the other two snapshot methods, this one will return a `Color` object containing the color data for
  91243. * the requested pixel. It doesn't need to create an internal Canvas or Image object, so is a lot faster to execute,
  91244. * using less memory.
  91245. *
  91246. * @method Phaser.Renderer.WebGL.WebGLRenderer#snapshotPixel
  91247. * @since 3.16.0
  91248. *
  91249. * @param {integer} x - The x coordinate of the pixel to get.
  91250. * @param {integer} y - The y coordinate of the pixel to get.
  91251. * @param {SnapshotCallback} callback - The Function to invoke after the snapshot pixel data is extracted.
  91252. *
  91253. * @return {this} This WebGL Renderer.
  91254. */
  91255. snapshotPixel: function (x, y, callback)
  91256. {
  91257. this.snapshotArea(x, y, 1, 1, callback);
  91258. this.snapshotState.getPixel = true;
  91259. return this;
  91260. },
  91261. /**
  91262. * Creates a WebGL Texture based on the given canvas element.
  91263. *
  91264. * @method Phaser.Renderer.WebGL.WebGLRenderer#canvasToTexture
  91265. * @since 3.0.0
  91266. *
  91267. * @param {HTMLCanvasElement} srcCanvas - The Canvas element that will be used to populate the texture.
  91268. * @param {WebGLTexture} [dstTexture] - Is this going to replace an existing texture? If so, pass it here.
  91269. * @param {boolean} [noRepeat=false] - Should this canvas never be allowed to set REPEAT? (such as for Text objects)
  91270. *
  91271. * @return {WebGLTexture} The newly created WebGL Texture.
  91272. */
  91273. canvasToTexture: function (srcCanvas, dstTexture, noRepeat)
  91274. {
  91275. if (noRepeat === undefined) { noRepeat = false; }
  91276. var gl = this.gl;
  91277. if (!dstTexture)
  91278. {
  91279. var wrapping = gl.CLAMP_TO_EDGE;
  91280. if (!noRepeat && IsSizePowerOfTwo(srcCanvas.width, srcCanvas.height))
  91281. {
  91282. wrapping = gl.REPEAT;
  91283. }
  91284. var filter = (this.config.antialias) ? gl.LINEAR : gl.NEAREST;
  91285. dstTexture = this.createTexture2D(0, filter, filter, wrapping, wrapping, gl.RGBA, srcCanvas, srcCanvas.width, srcCanvas.height, true);
  91286. }
  91287. else
  91288. {
  91289. this.setTexture2D(dstTexture, 0);
  91290. gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, srcCanvas);
  91291. dstTexture.width = srcCanvas.width;
  91292. dstTexture.height = srcCanvas.height;
  91293. this.setTexture2D(null, 0);
  91294. }
  91295. return dstTexture;
  91296. },
  91297. /**
  91298. * Sets the minification and magnification filter for a texture.
  91299. *
  91300. * @method Phaser.Renderer.WebGL.WebGLRenderer#setTextureFilter
  91301. * @since 3.0.0
  91302. *
  91303. * @param {integer} texture - The texture to set the filter for.
  91304. * @param {integer} filter - The filter to set. 0 for linear filtering, 1 for nearest neighbor (blocky) filtering.
  91305. *
  91306. * @return {this} This WebGL Renderer instance.
  91307. */
  91308. setTextureFilter: function (texture, filter)
  91309. {
  91310. var gl = this.gl;
  91311. var glFilter = [ gl.LINEAR, gl.NEAREST ][filter];
  91312. this.setTexture2D(texture, 0);
  91313. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, glFilter);
  91314. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, glFilter);
  91315. this.setTexture2D(null, 0);
  91316. return this;
  91317. },
  91318. /**
  91319. * [description]
  91320. *
  91321. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat1
  91322. * @since 3.0.0
  91323. *
  91324. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91325. * @param {string} name - The name of the uniform to look-up and modify.
  91326. * @param {number} x - [description]
  91327. *
  91328. * @return {this} This WebGL Renderer instance.
  91329. */
  91330. setFloat1: function (program, name, x)
  91331. {
  91332. this.setProgram(program);
  91333. this.gl.uniform1f(this.gl.getUniformLocation(program, name), x);
  91334. return this;
  91335. },
  91336. /**
  91337. * [description]
  91338. *
  91339. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat2
  91340. * @since 3.0.0
  91341. *
  91342. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91343. * @param {string} name - The name of the uniform to look-up and modify.
  91344. * @param {number} x - [description]
  91345. * @param {number} y - [description]
  91346. *
  91347. * @return {this} This WebGL Renderer instance.
  91348. */
  91349. setFloat2: function (program, name, x, y)
  91350. {
  91351. this.setProgram(program);
  91352. this.gl.uniform2f(this.gl.getUniformLocation(program, name), x, y);
  91353. return this;
  91354. },
  91355. /**
  91356. * [description]
  91357. *
  91358. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat3
  91359. * @since 3.0.0
  91360. *
  91361. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91362. * @param {string} name - The name of the uniform to look-up and modify.
  91363. * @param {number} x - [description]
  91364. * @param {number} y - [description]
  91365. * @param {number} z - [description]
  91366. *
  91367. * @return {this} This WebGL Renderer instance.
  91368. */
  91369. setFloat3: function (program, name, x, y, z)
  91370. {
  91371. this.setProgram(program);
  91372. this.gl.uniform3f(this.gl.getUniformLocation(program, name), x, y, z);
  91373. return this;
  91374. },
  91375. /**
  91376. * Sets uniform of a WebGLProgram
  91377. *
  91378. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat4
  91379. * @since 3.0.0
  91380. *
  91381. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91382. * @param {string} name - The name of the uniform to look-up and modify.
  91383. * @param {number} x - X component
  91384. * @param {number} y - Y component
  91385. * @param {number} z - Z component
  91386. * @param {number} w - W component
  91387. *
  91388. * @return {this} This WebGL Renderer instance.
  91389. */
  91390. setFloat4: function (program, name, x, y, z, w)
  91391. {
  91392. this.setProgram(program);
  91393. this.gl.uniform4f(this.gl.getUniformLocation(program, name), x, y, z, w);
  91394. return this;
  91395. },
  91396. /**
  91397. * Sets the value of a uniform variable in the given WebGLProgram.
  91398. *
  91399. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat1v
  91400. * @since 3.13.0
  91401. *
  91402. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91403. * @param {string} name - The name of the uniform to look-up and modify.
  91404. * @param {Float32Array} arr - The new value to be used for the uniform variable.
  91405. *
  91406. * @return {this} This WebGL Renderer instance.
  91407. */
  91408. setFloat1v: function (program, name, arr)
  91409. {
  91410. this.setProgram(program);
  91411. this.gl.uniform1fv(this.gl.getUniformLocation(program, name), arr);
  91412. return this;
  91413. },
  91414. /**
  91415. * Sets the value of a uniform variable in the given WebGLProgram.
  91416. *
  91417. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat2v
  91418. * @since 3.13.0
  91419. *
  91420. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91421. * @param {string} name - The name of the uniform to look-up and modify.
  91422. * @param {Float32Array} arr - The new value to be used for the uniform variable.
  91423. *
  91424. * @return {this} This WebGL Renderer instance.
  91425. */
  91426. setFloat2v: function (program, name, arr)
  91427. {
  91428. this.setProgram(program);
  91429. this.gl.uniform2fv(this.gl.getUniformLocation(program, name), arr);
  91430. return this;
  91431. },
  91432. /**
  91433. * Sets the value of a uniform variable in the given WebGLProgram.
  91434. *
  91435. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat3v
  91436. * @since 3.13.0
  91437. *
  91438. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91439. * @param {string} name - The name of the uniform to look-up and modify.
  91440. * @param {Float32Array} arr - The new value to be used for the uniform variable.
  91441. *
  91442. * @return {this} This WebGL Renderer instance.
  91443. */
  91444. setFloat3v: function (program, name, arr)
  91445. {
  91446. this.setProgram(program);
  91447. this.gl.uniform3fv(this.gl.getUniformLocation(program, name), arr);
  91448. return this;
  91449. },
  91450. /**
  91451. * Sets the value of a uniform variable in the given WebGLProgram.
  91452. *
  91453. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat4v
  91454. * @since 3.13.0
  91455. *
  91456. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91457. * @param {string} name - The name of the uniform to look-up and modify.
  91458. * @param {Float32Array} arr - The new value to be used for the uniform variable.
  91459. *
  91460. * @return {this} This WebGL Renderer instance.
  91461. */
  91462. setFloat4v: function (program, name, arr)
  91463. {
  91464. this.setProgram(program);
  91465. this.gl.uniform4fv(this.gl.getUniformLocation(program, name), arr);
  91466. return this;
  91467. },
  91468. /**
  91469. * Sets the value of a uniform variable in the given WebGLProgram.
  91470. *
  91471. * @method Phaser.Renderer.WebGL.WebGLRenderer#setInt1
  91472. * @since 3.0.0
  91473. *
  91474. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91475. * @param {string} name - The name of the uniform to look-up and modify.
  91476. * @param {integer} x - [description]
  91477. *
  91478. * @return {this} This WebGL Renderer instance.
  91479. */
  91480. setInt1: function (program, name, x)
  91481. {
  91482. this.setProgram(program);
  91483. this.gl.uniform1i(this.gl.getUniformLocation(program, name), x);
  91484. return this;
  91485. },
  91486. /**
  91487. * Sets the value of a uniform variable in the given WebGLProgram.
  91488. *
  91489. * @method Phaser.Renderer.WebGL.WebGLRenderer#setInt2
  91490. * @since 3.0.0
  91491. *
  91492. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91493. * @param {string} name - The name of the uniform to look-up and modify.
  91494. * @param {integer} x - The new X component
  91495. * @param {integer} y - The new Y component
  91496. *
  91497. * @return {this} This WebGL Renderer instance.
  91498. */
  91499. setInt2: function (program, name, x, y)
  91500. {
  91501. this.setProgram(program);
  91502. this.gl.uniform2i(this.gl.getUniformLocation(program, name), x, y);
  91503. return this;
  91504. },
  91505. /**
  91506. * Sets the value of a uniform variable in the given WebGLProgram.
  91507. *
  91508. * @method Phaser.Renderer.WebGL.WebGLRenderer#setInt3
  91509. * @since 3.0.0
  91510. *
  91511. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91512. * @param {string} name - The name of the uniform to look-up and modify.
  91513. * @param {integer} x - The new X component
  91514. * @param {integer} y - The new Y component
  91515. * @param {integer} z - The new Z component
  91516. *
  91517. * @return {this} This WebGL Renderer instance.
  91518. */
  91519. setInt3: function (program, name, x, y, z)
  91520. {
  91521. this.setProgram(program);
  91522. this.gl.uniform3i(this.gl.getUniformLocation(program, name), x, y, z);
  91523. return this;
  91524. },
  91525. /**
  91526. * Sets the value of a uniform variable in the given WebGLProgram.
  91527. *
  91528. * @method Phaser.Renderer.WebGL.WebGLRenderer#setInt4
  91529. * @since 3.0.0
  91530. *
  91531. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91532. * @param {string} name - The name of the uniform to look-up and modify.
  91533. * @param {integer} x - X component
  91534. * @param {integer} y - Y component
  91535. * @param {integer} z - Z component
  91536. * @param {integer} w - W component
  91537. *
  91538. * @return {this} This WebGL Renderer instance.
  91539. */
  91540. setInt4: function (program, name, x, y, z, w)
  91541. {
  91542. this.setProgram(program);
  91543. this.gl.uniform4i(this.gl.getUniformLocation(program, name), x, y, z, w);
  91544. return this;
  91545. },
  91546. /**
  91547. * Sets the value of a 2x2 matrix uniform variable in the given WebGLProgram.
  91548. *
  91549. * @method Phaser.Renderer.WebGL.WebGLRenderer#setMatrix2
  91550. * @since 3.0.0
  91551. *
  91552. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91553. * @param {string} name - The name of the uniform to look-up and modify.
  91554. * @param {boolean} transpose - The value indicating whether to transpose the matrix. Must be false.
  91555. * @param {Float32Array} matrix - The new matrix value.
  91556. *
  91557. * @return {this} This WebGL Renderer instance.
  91558. */
  91559. setMatrix2: function (program, name, transpose, matrix)
  91560. {
  91561. this.setProgram(program);
  91562. this.gl.uniformMatrix2fv(this.gl.getUniformLocation(program, name), transpose, matrix);
  91563. return this;
  91564. },
  91565. /**
  91566. * [description]
  91567. *
  91568. * @method Phaser.Renderer.WebGL.WebGLRenderer#setMatrix3
  91569. * @since 3.0.0
  91570. *
  91571. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91572. * @param {string} name - The name of the uniform to look-up and modify.
  91573. * @param {boolean} transpose - [description]
  91574. * @param {Float32Array} matrix - [description]
  91575. *
  91576. * @return {this} This WebGL Renderer instance.
  91577. */
  91578. setMatrix3: function (program, name, transpose, matrix)
  91579. {
  91580. this.setProgram(program);
  91581. this.gl.uniformMatrix3fv(this.gl.getUniformLocation(program, name), transpose, matrix);
  91582. return this;
  91583. },
  91584. /**
  91585. * Sets uniform of a WebGLProgram
  91586. *
  91587. * @method Phaser.Renderer.WebGL.WebGLRenderer#setMatrix4
  91588. * @since 3.0.0
  91589. *
  91590. * @param {WebGLProgram} program - The target WebGLProgram from which the uniform location will be looked-up.
  91591. * @param {string} name - The name of the uniform to look-up and modify.
  91592. * @param {boolean} transpose - Is the matrix transposed
  91593. * @param {Float32Array} matrix - Matrix data
  91594. *
  91595. * @return {this} This WebGL Renderer instance.
  91596. */
  91597. setMatrix4: function (program, name, transpose, matrix)
  91598. {
  91599. this.setProgram(program);
  91600. this.gl.uniformMatrix4fv(this.gl.getUniformLocation(program, name), transpose, matrix);
  91601. return this;
  91602. },
  91603. /**
  91604. * Returns the maximum number of texture units that can be used in a fragment shader.
  91605. *
  91606. * @method Phaser.Renderer.WebGL.WebGLRenderer#getMaxTextures
  91607. * @since 3.8.0
  91608. *
  91609. * @return {integer} The maximum number of textures WebGL supports.
  91610. */
  91611. getMaxTextures: function ()
  91612. {
  91613. return this.config.maxTextures;
  91614. },
  91615. /**
  91616. * Returns the largest texture size (either width or height) that can be created.
  91617. * Note that VRAM may not allow a texture of any given size, it just expresses
  91618. * hardware / driver support for a given size.
  91619. *
  91620. * @method Phaser.Renderer.WebGL.WebGLRenderer#getMaxTextureSize
  91621. * @since 3.8.0
  91622. *
  91623. * @return {integer} The maximum supported texture size.
  91624. */
  91625. getMaxTextureSize: function ()
  91626. {
  91627. return this.config.maxTextureSize;
  91628. },
  91629. /**
  91630. * Destroy this WebGLRenderer, cleaning up all related resources such as pipelines, native textures, etc.
  91631. *
  91632. * @method Phaser.Renderer.WebGL.WebGLRenderer#destroy
  91633. * @since 3.0.0
  91634. */
  91635. destroy: function ()
  91636. {
  91637. // Clear-up anything that should be cleared :)
  91638. for (var key in this.pipelines)
  91639. {
  91640. this.pipelines[key].destroy();
  91641. delete this.pipelines[key];
  91642. }
  91643. for (var index = 0; index < this.nativeTextures.length; index++)
  91644. {
  91645. this.deleteTexture(this.nativeTextures[index]);
  91646. delete this.nativeTextures[index];
  91647. }
  91648. delete this.gl;
  91649. delete this.game;
  91650. this.contextLost = true;
  91651. this.extensions = {};
  91652. this.nativeTextures.length = 0;
  91653. }
  91654. });
  91655. module.exports = WebGLRenderer;
  91656. /***/ }),
  91657. /* 457 */
  91658. /***/ (function(module, exports, __webpack_require__) {
  91659. /**
  91660. * @author Richard Davey <rich@photonstorm.com>
  91661. * @copyright 2019 Photon Storm Ltd.
  91662. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91663. */
  91664. var modes = __webpack_require__(60);
  91665. var CanvasFeatures = __webpack_require__(388);
  91666. /**
  91667. * Returns an array which maps the default blend modes to supported Canvas blend modes.
  91668. *
  91669. * If the browser doesn't support a blend mode, it will default to the normal `source-over` blend mode.
  91670. *
  91671. * @function Phaser.Renderer.Canvas.GetBlendModes
  91672. * @since 3.0.0
  91673. *
  91674. * @return {array} Which Canvas blend mode corresponds to which default Phaser blend mode.
  91675. */
  91676. var GetBlendModes = function ()
  91677. {
  91678. var output = [];
  91679. var useNew = CanvasFeatures.supportNewBlendModes;
  91680. var so = 'source-over';
  91681. output[modes.NORMAL] = so;
  91682. output[modes.ADD] = 'lighter';
  91683. output[modes.MULTIPLY] = (useNew) ? 'multiply' : so;
  91684. output[modes.SCREEN] = (useNew) ? 'screen' : so;
  91685. output[modes.OVERLAY] = (useNew) ? 'overlay' : so;
  91686. output[modes.DARKEN] = (useNew) ? 'darken' : so;
  91687. output[modes.LIGHTEN] = (useNew) ? 'lighten' : so;
  91688. output[modes.COLOR_DODGE] = (useNew) ? 'color-dodge' : so;
  91689. output[modes.COLOR_BURN] = (useNew) ? 'color-burn' : so;
  91690. output[modes.HARD_LIGHT] = (useNew) ? 'hard-light' : so;
  91691. output[modes.SOFT_LIGHT] = (useNew) ? 'soft-light' : so;
  91692. output[modes.DIFFERENCE] = (useNew) ? 'difference' : so;
  91693. output[modes.EXCLUSION] = (useNew) ? 'exclusion' : so;
  91694. output[modes.HUE] = (useNew) ? 'hue' : so;
  91695. output[modes.SATURATION] = (useNew) ? 'saturation' : so;
  91696. output[modes.COLOR] = (useNew) ? 'color' : so;
  91697. output[modes.LUMINOSITY] = (useNew) ? 'luminosity' : so;
  91698. output[modes.ERASE] = 'destination-out';
  91699. output[modes.SOURCE_IN] = 'source-in';
  91700. output[modes.SOURCE_OUT] = 'source-out';
  91701. output[modes.SOURCE_ATOP] = 'source-atop';
  91702. output[modes.DESTINATION_OVER] = 'destination-over';
  91703. output[modes.DESTINATION_IN] = 'destination-in';
  91704. output[modes.DESTINATION_OUT] = 'destination-out';
  91705. output[modes.DESTINATION_ATOP] = 'destination-atop';
  91706. output[modes.LIGHTER] = 'lighter';
  91707. output[modes.COPY] = 'copy';
  91708. output[modes.XOR] = 'xor';
  91709. return output;
  91710. };
  91711. module.exports = GetBlendModes;
  91712. /***/ }),
  91713. /* 458 */
  91714. /***/ (function(module, exports, __webpack_require__) {
  91715. /**
  91716. * @author Richard Davey <rich@photonstorm.com>
  91717. * @copyright 2019 Photon Storm Ltd.
  91718. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91719. */
  91720. var CanvasPool = __webpack_require__(24);
  91721. var Color = __webpack_require__(32);
  91722. var GetFastValue = __webpack_require__(2);
  91723. /**
  91724. * Takes a snapshot of an area from the current frame displayed by a canvas.
  91725. *
  91726. * This is then copied to an Image object. When this loads, the results are sent
  91727. * to the callback provided in the Snapshot Configuration object.
  91728. *
  91729. * @function Phaser.Renderer.Snapshot.Canvas
  91730. * @since 3.0.0
  91731. *
  91732. * @param {HTMLCanvasElement} sourceCanvas - The canvas to take a snapshot of.
  91733. * @param {SnapshotState} config - The snapshot configuration object.
  91734. */
  91735. var CanvasSnapshot = function (canvas, config)
  91736. {
  91737. var callback = GetFastValue(config, 'callback');
  91738. var type = GetFastValue(config, 'type', 'image/png');
  91739. var encoderOptions = GetFastValue(config, 'encoder', 0.92);
  91740. var x = Math.abs(Math.round(GetFastValue(config, 'x', 0)));
  91741. var y = Math.abs(Math.round(GetFastValue(config, 'y', 0)));
  91742. var width = GetFastValue(config, 'width', canvas.width);
  91743. var height = GetFastValue(config, 'height', canvas.height);
  91744. var getPixel = GetFastValue(config, 'getPixel', false);
  91745. if (getPixel)
  91746. {
  91747. var context = canvas.getContext('2d');
  91748. var imageData = context.getImageData(x, y, 1, 1);
  91749. var data = imageData.data;
  91750. callback.call(null, new Color(data[0], data[1], data[2], data[3] / 255));
  91751. }
  91752. else if (x !== 0 || y !== 0 || width !== canvas.width || height !== canvas.height)
  91753. {
  91754. // Area Grab
  91755. var copyCanvas = CanvasPool.createWebGL(this, width, height);
  91756. var ctx = copyCanvas.getContext('2d');
  91757. ctx.drawImage(canvas, x, y, width, height, 0, 0, width, height);
  91758. var image1 = new Image();
  91759. image1.onerror = function ()
  91760. {
  91761. callback.call(null);
  91762. CanvasPool.remove(copyCanvas);
  91763. };
  91764. image1.onload = function ()
  91765. {
  91766. callback.call(null, image1);
  91767. CanvasPool.remove(copyCanvas);
  91768. };
  91769. image1.src = copyCanvas.toDataURL(type, encoderOptions);
  91770. }
  91771. else
  91772. {
  91773. // Full Grab
  91774. var image2 = new Image();
  91775. image2.onerror = function ()
  91776. {
  91777. callback.call(null);
  91778. };
  91779. image2.onload = function ()
  91780. {
  91781. callback.call(null, image2);
  91782. };
  91783. image2.src = canvas.toDataURL(type, encoderOptions);
  91784. }
  91785. };
  91786. module.exports = CanvasSnapshot;
  91787. /***/ }),
  91788. /* 459 */
  91789. /***/ (function(module, exports, __webpack_require__) {
  91790. /**
  91791. * @author Richard Davey <rich@photonstorm.com>
  91792. * @author Felipe Alfonso <@bitnenfer>
  91793. * @copyright 2019 Photon Storm Ltd.
  91794. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91795. */
  91796. var CanvasSnapshot = __webpack_require__(458);
  91797. var CameraEvents = __webpack_require__(40);
  91798. var Class = __webpack_require__(0);
  91799. var CONST = __webpack_require__(28);
  91800. var GetBlendModes = __webpack_require__(457);
  91801. var ScaleModes = __webpack_require__(101);
  91802. var Smoothing = __webpack_require__(130);
  91803. var TransformMatrix = __webpack_require__(41);
  91804. /**
  91805. * @classdesc
  91806. * The Canvas Renderer is responsible for managing 2D canvas rendering contexts, including the one used by the Game's canvas. It tracks the internal state of a given context and can renderer textured Game Objects to it, taking into account alpha, blending, and scaling.
  91807. *
  91808. * @class CanvasRenderer
  91809. * @memberof Phaser.Renderer.Canvas
  91810. * @constructor
  91811. * @since 3.0.0
  91812. *
  91813. * @param {Phaser.Game} game - The Phaser Game instance that owns this renderer.
  91814. */
  91815. var CanvasRenderer = new Class({
  91816. initialize:
  91817. function CanvasRenderer (game)
  91818. {
  91819. /**
  91820. * The Phaser Game instance that owns this renderer.
  91821. *
  91822. * @name Phaser.Renderer.Canvas.CanvasRenderer#game
  91823. * @type {Phaser.Game}
  91824. * @since 3.0.0
  91825. */
  91826. this.game = game;
  91827. /**
  91828. * A constant which allows the renderer to be easily identified as a Canvas Renderer.
  91829. *
  91830. * @name Phaser.Renderer.Canvas.CanvasRenderer#type
  91831. * @type {integer}
  91832. * @since 3.0.0
  91833. */
  91834. this.type = CONST.CANVAS;
  91835. /**
  91836. * The total number of Game Objects which were rendered in a frame.
  91837. *
  91838. * @name Phaser.Renderer.Canvas.CanvasRenderer#drawCount
  91839. * @type {number}
  91840. * @default 0
  91841. * @since 3.0.0
  91842. */
  91843. this.drawCount = 0;
  91844. /**
  91845. * The width of the canvas being rendered to.
  91846. *
  91847. * @name Phaser.Renderer.Canvas.CanvasRenderer#width
  91848. * @type {integer}
  91849. * @since 3.0.0
  91850. */
  91851. this.width = 0;
  91852. /**
  91853. * The height of the canvas being rendered to.
  91854. *
  91855. * @name Phaser.Renderer.Canvas.CanvasRenderer#height
  91856. * @type {integer}
  91857. * @since 3.0.0
  91858. */
  91859. this.height = 0;
  91860. /**
  91861. * The local configuration settings of the CanvasRenderer.
  91862. *
  91863. * @name Phaser.Renderer.Canvas.CanvasRenderer#config
  91864. * @type {object}
  91865. * @since 3.0.0
  91866. */
  91867. this.config = {
  91868. clearBeforeRender: game.config.clearBeforeRender,
  91869. backgroundColor: game.config.backgroundColor,
  91870. resolution: game.config.resolution,
  91871. antialias: game.config.antialias,
  91872. roundPixels: game.config.roundPixels
  91873. };
  91874. /**
  91875. * The scale mode which should be used by the CanvasRenderer.
  91876. *
  91877. * @name Phaser.Renderer.Canvas.CanvasRenderer#scaleMode
  91878. * @type {integer}
  91879. * @since 3.0.0
  91880. */
  91881. this.scaleMode = (game.config.antialias) ? ScaleModes.LINEAR : ScaleModes.NEAREST;
  91882. /**
  91883. * The canvas element which the Game uses.
  91884. *
  91885. * @name Phaser.Renderer.Canvas.CanvasRenderer#gameCanvas
  91886. * @type {HTMLCanvasElement}
  91887. * @since 3.0.0
  91888. */
  91889. this.gameCanvas = game.canvas;
  91890. /**
  91891. * The canvas context used to render all Cameras in all Scenes during the game loop.
  91892. *
  91893. * @name Phaser.Renderer.Canvas.CanvasRenderer#gameContext
  91894. * @type {CanvasRenderingContext2D}
  91895. * @since 3.0.0
  91896. */
  91897. this.gameContext = (this.game.config.context) ? this.game.config.context : this.gameCanvas.getContext('2d');
  91898. /**
  91899. * The canvas context currently used by the CanvasRenderer for all rendering operations.
  91900. *
  91901. * @name Phaser.Renderer.Canvas.CanvasRenderer#currentContext
  91902. * @type {CanvasRenderingContext2D}
  91903. * @since 3.0.0
  91904. */
  91905. this.currentContext = this.gameContext;
  91906. /**
  91907. * The blend modes supported by the Canvas Renderer.
  91908. *
  91909. * This object maps the {@link Phaser.BlendModes} to canvas compositing operations.
  91910. *
  91911. * @name Phaser.Renderer.Canvas.CanvasRenderer#blendModes
  91912. * @type {array}
  91913. * @since 3.0.0
  91914. */
  91915. this.blendModes = GetBlendModes();
  91916. // image-rendering: optimizeSpeed;
  91917. // image-rendering: pixelated;
  91918. /**
  91919. * The scale mode currently in use by the Canvas Renderer.
  91920. *
  91921. * @name Phaser.Renderer.Canvas.CanvasRenderer#currentScaleMode
  91922. * @type {number}
  91923. * @default 0
  91924. * @since 3.0.0
  91925. */
  91926. this.currentScaleMode = 0;
  91927. /**
  91928. * Details about the currently scheduled snapshot.
  91929. *
  91930. * If a non-null `callback` is set in this object, a snapshot of the canvas will be taken after the current frame is fully rendered.
  91931. *
  91932. * @name Phaser.Renderer.Canvas.CanvasRenderer#snapshotState
  91933. * @type {SnapshotState}
  91934. * @since 3.16.0
  91935. */
  91936. this.snapshotState = {
  91937. x: 0,
  91938. y: 0,
  91939. width: 1,
  91940. height: 1,
  91941. getPixel: false,
  91942. callback: null,
  91943. type: 'image/png',
  91944. encoder: 0.92
  91945. };
  91946. /**
  91947. * A temporary Transform Matrix, re-used internally during batching.
  91948. *
  91949. * @name Phaser.Renderer.Canvas.CanvasRenderer#_tempMatrix1
  91950. * @private
  91951. * @type {Phaser.GameObjects.Components.TransformMatrix}
  91952. * @since 3.12.0
  91953. */
  91954. this._tempMatrix1 = new TransformMatrix();
  91955. /**
  91956. * A temporary Transform Matrix, re-used internally during batching.
  91957. *
  91958. * @name Phaser.Renderer.Canvas.CanvasRenderer#_tempMatrix2
  91959. * @private
  91960. * @type {Phaser.GameObjects.Components.TransformMatrix}
  91961. * @since 3.12.0
  91962. */
  91963. this._tempMatrix2 = new TransformMatrix();
  91964. /**
  91965. * A temporary Transform Matrix, re-used internally during batching.
  91966. *
  91967. * @name Phaser.Renderer.Canvas.CanvasRenderer#_tempMatrix3
  91968. * @private
  91969. * @type {Phaser.GameObjects.Components.TransformMatrix}
  91970. * @since 3.12.0
  91971. */
  91972. this._tempMatrix3 = new TransformMatrix();
  91973. /**
  91974. * A temporary Transform Matrix, re-used internally during batching.
  91975. *
  91976. * @name Phaser.Renderer.Canvas.CanvasRenderer#_tempMatrix4
  91977. * @private
  91978. * @type {Phaser.GameObjects.Components.TransformMatrix}
  91979. * @since 3.12.0
  91980. */
  91981. this._tempMatrix4 = new TransformMatrix();
  91982. this.init();
  91983. },
  91984. /**
  91985. * Prepares the game canvas for rendering.
  91986. *
  91987. * @method Phaser.Renderer.Canvas.CanvasRenderer#init
  91988. * @since 3.0.0
  91989. */
  91990. init: function ()
  91991. {
  91992. this.game.scale.on('resize', this.onResize, this);
  91993. var baseSize = this.game.scale.baseSize;
  91994. this.resize(baseSize.width, baseSize.height);
  91995. },
  91996. /**
  91997. * The event handler that manages the `resize` event dispatched by the Scale Manager.
  91998. *
  91999. * @method Phaser.Renderer.Canvas.CanvasRenderer#onResize
  92000. * @since 3.16.0
  92001. *
  92002. * @param {Phaser.Structs.Size} gameSize - The default Game Size object. This is the un-modified game dimensions.
  92003. * @param {Phaser.Structs.Size} baseSize - The base Size object. The game dimensions multiplied by the resolution. The canvas width / height values match this.
  92004. * @param {Phaser.Structs.Size} displaySize - The display Size object. The size of the canvas style width / height attributes.
  92005. * @param {number} [resolution] - The Scale Manager resolution setting.
  92006. */
  92007. onResize: function (gameSize, baseSize)
  92008. {
  92009. // Has the underlying canvas size changed?
  92010. if (baseSize.width !== this.width || baseSize.height !== this.height)
  92011. {
  92012. this.resize(baseSize.width, baseSize.height);
  92013. }
  92014. },
  92015. /**
  92016. * Resize the main game canvas.
  92017. *
  92018. * @method Phaser.Renderer.Canvas.CanvasRenderer#resize
  92019. * @since 3.0.0
  92020. *
  92021. * @param {number} [width] - The new width of the renderer.
  92022. * @param {number} [height] - The new height of the renderer.
  92023. */
  92024. resize: function (width, height)
  92025. {
  92026. this.width = width;
  92027. this.height = height;
  92028. // Resizing a canvas will reset imageSmoothingEnabled (and probably other properties)
  92029. if (this.scaleMode === ScaleModes.NEAREST)
  92030. {
  92031. Smoothing.disable(this.gameContext);
  92032. }
  92033. },
  92034. /**
  92035. * A NOOP method for handling lost context. Intentionally empty.
  92036. *
  92037. * @method Phaser.Renderer.Canvas.CanvasRenderer#onContextLost
  92038. * @since 3.0.0
  92039. *
  92040. * @param {function} callback - Ignored parameter.
  92041. */
  92042. onContextLost: function ()
  92043. {
  92044. },
  92045. /**
  92046. * A NOOP method for handling restored context. Intentionally empty.
  92047. *
  92048. * @method Phaser.Renderer.Canvas.CanvasRenderer#onContextRestored
  92049. * @since 3.0.0
  92050. *
  92051. * @param {function} callback - Ignored parameter.
  92052. */
  92053. onContextRestored: function ()
  92054. {
  92055. },
  92056. /**
  92057. * Resets the transformation matrix of the current context to the identity matrix, thus resetting any transformation.
  92058. *
  92059. * @method Phaser.Renderer.Canvas.CanvasRenderer#resetTransform
  92060. * @since 3.0.0
  92061. */
  92062. resetTransform: function ()
  92063. {
  92064. this.currentContext.setTransform(1, 0, 0, 1, 0, 0);
  92065. },
  92066. /**
  92067. * Sets the blend mode (compositing operation) of the current context.
  92068. *
  92069. * @method Phaser.Renderer.Canvas.CanvasRenderer#setBlendMode
  92070. * @since 3.0.0
  92071. *
  92072. * @param {string} blendMode - The new blend mode which should be used.
  92073. *
  92074. * @return {this} This CanvasRenderer object.
  92075. */
  92076. setBlendMode: function (blendMode)
  92077. {
  92078. this.currentContext.globalCompositeOperation = blendMode;
  92079. return this;
  92080. },
  92081. /**
  92082. * Changes the Canvas Rendering Context that all draw operations are performed against.
  92083. *
  92084. * @method Phaser.Renderer.Canvas.CanvasRenderer#setContext
  92085. * @since 3.12.0
  92086. *
  92087. * @param {?CanvasRenderingContext2D} [ctx] - The new Canvas Rendering Context to draw everything to. Leave empty to reset to the Game Canvas.
  92088. *
  92089. * @return {this} The Canvas Renderer instance.
  92090. */
  92091. setContext: function (ctx)
  92092. {
  92093. this.currentContext = (ctx) ? ctx : this.gameContext;
  92094. return this;
  92095. },
  92096. /**
  92097. * Sets the global alpha of the current context.
  92098. *
  92099. * @method Phaser.Renderer.Canvas.CanvasRenderer#setAlpha
  92100. * @since 3.0.0
  92101. *
  92102. * @param {number} alpha - The new alpha to use, where 0 is fully transparent and 1 is fully opaque.
  92103. *
  92104. * @return {this} This CanvasRenderer object.
  92105. */
  92106. setAlpha: function (alpha)
  92107. {
  92108. this.currentContext.globalAlpha = alpha;
  92109. return this;
  92110. },
  92111. /**
  92112. * Called at the start of the render loop.
  92113. *
  92114. * @method Phaser.Renderer.Canvas.CanvasRenderer#preRender
  92115. * @since 3.0.0
  92116. */
  92117. preRender: function ()
  92118. {
  92119. var ctx = this.gameContext;
  92120. var config = this.config;
  92121. var width = this.width;
  92122. var height = this.height;
  92123. ctx.globalAlpha = 1;
  92124. ctx.globalCompositeOperation = 'source-over';
  92125. ctx.setTransform(1, 0, 0, 1, 0, 0);
  92126. if (config.clearBeforeRender)
  92127. {
  92128. ctx.clearRect(0, 0, width, height);
  92129. }
  92130. if (!config.transparent)
  92131. {
  92132. ctx.fillStyle = config.backgroundColor.rgba;
  92133. ctx.fillRect(0, 0, width, height);
  92134. }
  92135. ctx.save();
  92136. this.drawCount = 0;
  92137. },
  92138. /**
  92139. * Renders the Scene to the given Camera.
  92140. *
  92141. * @method Phaser.Renderer.Canvas.CanvasRenderer#render
  92142. * @since 3.0.0
  92143. *
  92144. * @param {Phaser.Scene} scene - The Scene to render.
  92145. * @param {Phaser.GameObjects.DisplayList} children - The Game Objects within the Scene to be rendered.
  92146. * @param {number} interpolationPercentage - The interpolation percentage to apply. Currently unused.
  92147. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Scene Camera to render with.
  92148. */
  92149. render: function (scene, children, interpolationPercentage, camera)
  92150. {
  92151. var list = children.list;
  92152. var childCount = list.length;
  92153. var cx = camera._cx;
  92154. var cy = camera._cy;
  92155. var cw = camera._cw;
  92156. var ch = camera._ch;
  92157. var ctx = (camera.renderToTexture) ? camera.context : scene.sys.context;
  92158. // Save context pre-clip
  92159. ctx.save();
  92160. if (this.game.scene.customViewports)
  92161. {
  92162. ctx.beginPath();
  92163. ctx.rect(cx, cy, cw, ch);
  92164. ctx.clip();
  92165. }
  92166. this.currentContext = ctx;
  92167. if (!camera.transparent)
  92168. {
  92169. ctx.fillStyle = camera.backgroundColor.rgba;
  92170. ctx.fillRect(cx, cy, cw, ch);
  92171. }
  92172. ctx.globalAlpha = camera.alpha;
  92173. ctx.globalCompositeOperation = 'source-over';
  92174. this.drawCount += list.length;
  92175. if (camera.renderToTexture)
  92176. {
  92177. camera.emit(CameraEvents.PRE_RENDER, camera);
  92178. }
  92179. camera.matrix.copyToContext(ctx);
  92180. for (var i = 0; i < childCount; i++)
  92181. {
  92182. var child = list[i];
  92183. if (!child.willRender(camera))
  92184. {
  92185. continue;
  92186. }
  92187. if (child.mask)
  92188. {
  92189. child.mask.preRenderCanvas(this, child, camera);
  92190. }
  92191. child.renderCanvas(this, child, interpolationPercentage, camera);
  92192. if (child.mask)
  92193. {
  92194. child.mask.postRenderCanvas(this, child, camera);
  92195. }
  92196. }
  92197. ctx.setTransform(1, 0, 0, 1, 0, 0);
  92198. ctx.globalCompositeOperation = 'source-over';
  92199. ctx.globalAlpha = 1;
  92200. camera.flashEffect.postRenderCanvas(ctx);
  92201. camera.fadeEffect.postRenderCanvas(ctx);
  92202. camera.dirty = false;
  92203. // Restore pre-clip context
  92204. ctx.restore();
  92205. if (camera.renderToTexture)
  92206. {
  92207. camera.emit(CameraEvents.POST_RENDER, camera);
  92208. scene.sys.context.drawImage(camera.canvas, cx, cy);
  92209. }
  92210. },
  92211. /**
  92212. * Restores the game context's global settings and takes a snapshot if one is scheduled.
  92213. *
  92214. * The post-render step happens after all Cameras in all Scenes have been rendered.
  92215. *
  92216. * @method Phaser.Renderer.Canvas.CanvasRenderer#postRender
  92217. * @since 3.0.0
  92218. */
  92219. postRender: function ()
  92220. {
  92221. var ctx = this.gameContext;
  92222. ctx.restore();
  92223. var state = this.snapshotState;
  92224. if (state.callback)
  92225. {
  92226. CanvasSnapshot(this.gameCanvas, state);
  92227. state.callback = null;
  92228. }
  92229. },
  92230. /**
  92231. * Schedules a snapshot of the entire game viewport to be taken after the current frame is rendered.
  92232. *
  92233. * To capture a specific area see the `snapshotArea` method. To capture a specific pixel, see `snapshotPixel`.
  92234. *
  92235. * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then
  92236. * calling this method will override it.
  92237. *
  92238. * Snapshots work by creating an Image object from the canvas data, this is a blocking process, which gets
  92239. * more expensive the larger the canvas size gets, so please be careful how you employ this in your game.
  92240. *
  92241. * @method Phaser.Renderer.Canvas.CanvasRenderer#snapshot
  92242. * @since 3.0.0
  92243. *
  92244. * @param {SnapshotCallback} callback - The Function to invoke after the snapshot image is created.
  92245. * @param {string} [type='image/png'] - The format of the image to create, usually `image/png` or `image/jpeg`.
  92246. * @param {number} [encoderOptions=0.92] - The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`.
  92247. *
  92248. * @return {this} This WebGL Renderer.
  92249. */
  92250. snapshot: function (callback, type, encoderOptions)
  92251. {
  92252. return this.snapshotArea(0, 0, this.gameCanvas.width, this.gameCanvas.height, callback, type, encoderOptions);
  92253. },
  92254. /**
  92255. * Schedules a snapshot of the given area of the game viewport to be taken after the current frame is rendered.
  92256. *
  92257. * To capture the whole game viewport see the `snapshot` method. To capture a specific pixel, see `snapshotPixel`.
  92258. *
  92259. * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then
  92260. * calling this method will override it.
  92261. *
  92262. * Snapshots work by creating an Image object from the canvas data, this is a blocking process, which gets
  92263. * more expensive the larger the canvas size gets, so please be careful how you employ this in your game.
  92264. *
  92265. * @method Phaser.Renderer.Canvas.CanvasRenderer#snapshotArea
  92266. * @since 3.16.0
  92267. *
  92268. * @param {integer} x - The x coordinate to grab from.
  92269. * @param {integer} y - The y coordinate to grab from.
  92270. * @param {integer} width - The width of the area to grab.
  92271. * @param {integer} height - The height of the area to grab.
  92272. * @param {SnapshotCallback} callback - The Function to invoke after the snapshot image is created.
  92273. * @param {string} [type='image/png'] - The format of the image to create, usually `image/png` or `image/jpeg`.
  92274. * @param {number} [encoderOptions=0.92] - The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`.
  92275. *
  92276. * @return {this} This WebGL Renderer.
  92277. */
  92278. snapshotArea: function (x, y, width, height, callback, type, encoderOptions)
  92279. {
  92280. var state = this.snapshotState;
  92281. state.callback = callback;
  92282. state.type = type;
  92283. state.encoder = encoderOptions;
  92284. state.getPixel = false;
  92285. state.x = x;
  92286. state.y = y;
  92287. state.width = Math.min(width, this.gameCanvas.width);
  92288. state.height = Math.min(height, this.gameCanvas.height);
  92289. return this;
  92290. },
  92291. /**
  92292. * Schedules a snapshot of the given pixel from the game viewport to be taken after the current frame is rendered.
  92293. *
  92294. * To capture the whole game viewport see the `snapshot` method. To capture a specific area, see `snapshotArea`.
  92295. *
  92296. * Only one snapshot can be active _per frame_. If you have already called `snapshotArea`, for example, then
  92297. * calling this method will override it.
  92298. *
  92299. * Unlike the other two snapshot methods, this one will return a `Color` object containing the color data for
  92300. * the requested pixel. It doesn't need to create an internal Canvas or Image object, so is a lot faster to execute,
  92301. * using less memory.
  92302. *
  92303. * @method Phaser.Renderer.Canvas.CanvasRenderer#snapshotPixel
  92304. * @since 3.16.0
  92305. *
  92306. * @param {integer} x - The x coordinate of the pixel to get.
  92307. * @param {integer} y - The y coordinate of the pixel to get.
  92308. * @param {SnapshotCallback} callback - The Function to invoke after the snapshot pixel data is extracted.
  92309. *
  92310. * @return {this} This WebGL Renderer.
  92311. */
  92312. snapshotPixel: function (x, y, callback)
  92313. {
  92314. this.snapshotArea(x, y, 1, 1, callback);
  92315. this.snapshotState.getPixel = true;
  92316. return this;
  92317. },
  92318. /**
  92319. * Takes a Sprite Game Object, or any object that extends it, and draws it to the current context.
  92320. *
  92321. * @method Phaser.Renderer.Canvas.CanvasRenderer#batchSprite
  92322. * @since 3.12.0
  92323. *
  92324. * @param {Phaser.GameObjects.GameObject} sprite - The texture based Game Object to draw.
  92325. * @param {Phaser.Textures.Frame} frame - The frame to draw, doesn't have to be that owned by the Game Object.
  92326. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to use for the rendering transform.
  92327. * @param {Phaser.GameObjects.Components.TransformMatrix} [parentTransformMatrix] - The transform matrix of the parent container, if set.
  92328. */
  92329. batchSprite: function (sprite, frame, camera, parentTransformMatrix)
  92330. {
  92331. var alpha = camera.alpha * sprite.alpha;
  92332. if (alpha === 0)
  92333. {
  92334. // Nothing to see, so abort early
  92335. return;
  92336. }
  92337. var ctx = this.currentContext;
  92338. var camMatrix = this._tempMatrix1;
  92339. var spriteMatrix = this._tempMatrix2;
  92340. var calcMatrix = this._tempMatrix3;
  92341. var cd = frame.canvasData;
  92342. var frameX = cd.x;
  92343. var frameY = cd.y;
  92344. var frameWidth = frame.cutWidth;
  92345. var frameHeight = frame.cutHeight;
  92346. var res = frame.source.resolution;
  92347. var x = -sprite.displayOriginX + frame.x;
  92348. var y = -sprite.displayOriginY + frame.y;
  92349. var fx = (sprite.flipX) ? -1 : 1;
  92350. var fy = (sprite.flipY) ? -1 : 1;
  92351. if (sprite.isCropped)
  92352. {
  92353. var crop = sprite._crop;
  92354. if (crop.flipX !== sprite.flipX || crop.flipY !== sprite.flipY)
  92355. {
  92356. frame.updateCropUVs(crop, sprite.flipX, sprite.flipY);
  92357. }
  92358. frameWidth = crop.cw;
  92359. frameHeight = crop.ch;
  92360. frameX = crop.cx;
  92361. frameY = crop.cy;
  92362. x = -sprite.displayOriginX + crop.x;
  92363. y = -sprite.displayOriginY + crop.y;
  92364. if (fx === -1)
  92365. {
  92366. if (x >= 0)
  92367. {
  92368. x = -(x + frameWidth);
  92369. }
  92370. else if (x < 0)
  92371. {
  92372. x = (Math.abs(x) - frameWidth);
  92373. }
  92374. }
  92375. if (fy === -1)
  92376. {
  92377. if (y >= 0)
  92378. {
  92379. y = -(y + frameHeight);
  92380. }
  92381. else if (y < 0)
  92382. {
  92383. y = (Math.abs(y) - frameHeight);
  92384. }
  92385. }
  92386. }
  92387. spriteMatrix.applyITRS(sprite.x, sprite.y, sprite.rotation, sprite.scaleX, sprite.scaleY);
  92388. camMatrix.copyFrom(camera.matrix);
  92389. if (parentTransformMatrix)
  92390. {
  92391. // Multiply the camera by the parent matrix
  92392. camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * sprite.scrollFactorX, -camera.scrollY * sprite.scrollFactorY);
  92393. // Undo the camera scroll
  92394. spriteMatrix.e = sprite.x;
  92395. spriteMatrix.f = sprite.y;
  92396. // Multiply by the Sprite matrix, store result in calcMatrix
  92397. camMatrix.multiply(spriteMatrix, calcMatrix);
  92398. }
  92399. else
  92400. {
  92401. spriteMatrix.e -= camera.scrollX * sprite.scrollFactorX;
  92402. spriteMatrix.f -= camera.scrollY * sprite.scrollFactorY;
  92403. // Multiply by the Sprite matrix, store result in calcMatrix
  92404. camMatrix.multiply(spriteMatrix, calcMatrix);
  92405. }
  92406. ctx.save();
  92407. calcMatrix.setToContext(ctx);
  92408. ctx.scale(fx, fy);
  92409. ctx.globalCompositeOperation = this.blendModes[sprite.blendMode];
  92410. ctx.globalAlpha = alpha;
  92411. ctx.drawImage(frame.source.image, frameX, frameY, frameWidth, frameHeight, x, y, frameWidth / res, frameHeight / res);
  92412. ctx.restore();
  92413. },
  92414. /**
  92415. * Destroys all object references in the Canvas Renderer.
  92416. *
  92417. * @method Phaser.Renderer.Canvas.CanvasRenderer#destroy
  92418. * @since 3.0.0
  92419. */
  92420. destroy: function ()
  92421. {
  92422. this.gameCanvas = null;
  92423. this.gameContext = null;
  92424. this.game = null;
  92425. }
  92426. });
  92427. module.exports = CanvasRenderer;
  92428. /***/ }),
  92429. /* 460 */
  92430. /***/ (function(module, exports, __webpack_require__) {
  92431. /**
  92432. * @author Richard Davey <rich@photonstorm.com>
  92433. * @copyright 2019 Photon Storm Ltd.
  92434. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  92435. */
  92436. var BaseAnimation = __webpack_require__(205);
  92437. var Class = __webpack_require__(0);
  92438. var Events = __webpack_require__(136);
  92439. /**
  92440. * @classdesc
  92441. * A Game Object Animation Controller.
  92442. *
  92443. * This controller lives as an instance within a Game Object, accessible as `sprite.anims`.
  92444. *
  92445. * @class Animation
  92446. * @memberof Phaser.GameObjects.Components
  92447. * @constructor
  92448. * @since 3.0.0
  92449. *
  92450. * @param {Phaser.GameObjects.GameObject} parent - The Game Object to which this animation controller belongs.
  92451. */
  92452. var Animation = new Class({
  92453. initialize:
  92454. function Animation (parent)
  92455. {
  92456. /**
  92457. * The Game Object to which this animation controller belongs.
  92458. *
  92459. * @name Phaser.GameObjects.Components.Animation#parent
  92460. * @type {Phaser.GameObjects.GameObject}
  92461. * @since 3.0.0
  92462. */
  92463. this.parent = parent;
  92464. /**
  92465. * A reference to the global Animation Manager.
  92466. *
  92467. * @name Phaser.GameObjects.Components.Animation#animationManager
  92468. * @type {Phaser.Animations.AnimationManager}
  92469. * @since 3.0.0
  92470. */
  92471. this.animationManager = parent.scene.sys.anims;
  92472. this.animationManager.once(Events.REMOVE_ANIMATION, this.remove, this);
  92473. /**
  92474. * Is an animation currently playing or not?
  92475. *
  92476. * @name Phaser.GameObjects.Components.Animation#isPlaying
  92477. * @type {boolean}
  92478. * @default false
  92479. * @since 3.0.0
  92480. */
  92481. this.isPlaying = false;
  92482. /**
  92483. * The current Animation loaded into this Animation Controller.
  92484. *
  92485. * @name Phaser.GameObjects.Components.Animation#currentAnim
  92486. * @type {?Phaser.Animations.Animation}
  92487. * @default null
  92488. * @since 3.0.0
  92489. */
  92490. this.currentAnim = null;
  92491. /**
  92492. * The current AnimationFrame being displayed by this Animation Controller.
  92493. *
  92494. * @name Phaser.GameObjects.Components.Animation#currentFrame
  92495. * @type {?Phaser.Animations.AnimationFrame}
  92496. * @default null
  92497. * @since 3.0.0
  92498. */
  92499. this.currentFrame = null;
  92500. /**
  92501. * The key of the next Animation to be loaded into this Animation Controller when the current animation completes.
  92502. *
  92503. * @name Phaser.GameObjects.Components.Animation#nextAnim
  92504. * @type {?string}
  92505. * @default null
  92506. * @since 3.16.0
  92507. */
  92508. this.nextAnim = null;
  92509. /**
  92510. * Time scale factor.
  92511. *
  92512. * @name Phaser.GameObjects.Components.Animation#_timeScale
  92513. * @type {number}
  92514. * @private
  92515. * @default 1
  92516. * @since 3.0.0
  92517. */
  92518. this._timeScale = 1;
  92519. /**
  92520. * The frame rate of playback in frames per second.
  92521. * The default is 24 if the `duration` property is `null`.
  92522. *
  92523. * @name Phaser.GameObjects.Components.Animation#frameRate
  92524. * @type {number}
  92525. * @default 0
  92526. * @since 3.0.0
  92527. */
  92528. this.frameRate = 0;
  92529. /**
  92530. * How long the animation should play for, in milliseconds.
  92531. * If the `frameRate` property has been set then it overrides this value,
  92532. * otherwise the `frameRate` is derived from `duration`.
  92533. *
  92534. * @name Phaser.GameObjects.Components.Animation#duration
  92535. * @type {number}
  92536. * @default 0
  92537. * @since 3.0.0
  92538. */
  92539. this.duration = 0;
  92540. /**
  92541. * ms per frame, not including frame specific modifiers that may be present in the Animation data.
  92542. *
  92543. * @name Phaser.GameObjects.Components.Animation#msPerFrame
  92544. * @type {number}
  92545. * @default 0
  92546. * @since 3.0.0
  92547. */
  92548. this.msPerFrame = 0;
  92549. /**
  92550. * Skip frames if the time lags, or always advanced anyway?
  92551. *
  92552. * @name Phaser.GameObjects.Components.Animation#skipMissedFrames
  92553. * @type {boolean}
  92554. * @default true
  92555. * @since 3.0.0
  92556. */
  92557. this.skipMissedFrames = true;
  92558. /**
  92559. * A delay before starting playback, in milliseconds.
  92560. *
  92561. * @name Phaser.GameObjects.Components.Animation#_delay
  92562. * @type {number}
  92563. * @private
  92564. * @default 0
  92565. * @since 3.0.0
  92566. */
  92567. this._delay = 0;
  92568. /**
  92569. * Number of times to repeat the animation (-1 for infinity)
  92570. *
  92571. * @name Phaser.GameObjects.Components.Animation#_repeat
  92572. * @type {number}
  92573. * @private
  92574. * @default 0
  92575. * @since 3.0.0
  92576. */
  92577. this._repeat = 0;
  92578. /**
  92579. * Delay before the repeat starts, in milliseconds.
  92580. *
  92581. * @name Phaser.GameObjects.Components.Animation#_repeatDelay
  92582. * @type {number}
  92583. * @private
  92584. * @default 0
  92585. * @since 3.0.0
  92586. */
  92587. this._repeatDelay = 0;
  92588. /**
  92589. * Should the animation yoyo? (reverse back down to the start) before repeating?
  92590. *
  92591. * @name Phaser.GameObjects.Components.Animation#_yoyo
  92592. * @type {boolean}
  92593. * @private
  92594. * @default false
  92595. * @since 3.0.0
  92596. */
  92597. this._yoyo = false;
  92598. /**
  92599. * Will the playhead move forwards (`true`) or in reverse (`false`).
  92600. *
  92601. * @name Phaser.GameObjects.Components.Animation#forward
  92602. * @type {boolean}
  92603. * @default true
  92604. * @since 3.0.0
  92605. */
  92606. this.forward = true;
  92607. /**
  92608. * An Internal trigger that's play the animation in reverse mode ('true') or not ('false'),
  92609. * needed because forward can be changed by yoyo feature.
  92610. *
  92611. * @name Phaser.GameObjects.Components.Animation#_reverse
  92612. * @type {boolean}
  92613. * @default false
  92614. * @private
  92615. * @since 3.12.0
  92616. */
  92617. this._reverse = false;
  92618. /**
  92619. * Internal time overflow accumulator.
  92620. *
  92621. * @name Phaser.GameObjects.Components.Animation#accumulator
  92622. * @type {number}
  92623. * @default 0
  92624. * @since 3.0.0
  92625. */
  92626. this.accumulator = 0;
  92627. /**
  92628. * The time point at which the next animation frame will change.
  92629. *
  92630. * @name Phaser.GameObjects.Components.Animation#nextTick
  92631. * @type {number}
  92632. * @default 0
  92633. * @since 3.0.0
  92634. */
  92635. this.nextTick = 0;
  92636. /**
  92637. * An internal counter keeping track of how many repeats are left to play.
  92638. *
  92639. * @name Phaser.GameObjects.Components.Animation#repeatCounter
  92640. * @type {number}
  92641. * @default 0
  92642. * @since 3.0.0
  92643. */
  92644. this.repeatCounter = 0;
  92645. /**
  92646. * An internal flag keeping track of pending repeats.
  92647. *
  92648. * @name Phaser.GameObjects.Components.Animation#pendingRepeat
  92649. * @type {boolean}
  92650. * @default false
  92651. * @since 3.0.0
  92652. */
  92653. this.pendingRepeat = false;
  92654. /**
  92655. * Is the Animation paused?
  92656. *
  92657. * @name Phaser.GameObjects.Components.Animation#_paused
  92658. * @type {boolean}
  92659. * @private
  92660. * @default false
  92661. * @since 3.0.0
  92662. */
  92663. this._paused = false;
  92664. /**
  92665. * Was the animation previously playing before being paused?
  92666. *
  92667. * @name Phaser.GameObjects.Components.Animation#_wasPlaying
  92668. * @type {boolean}
  92669. * @private
  92670. * @default false
  92671. * @since 3.0.0
  92672. */
  92673. this._wasPlaying = false;
  92674. /**
  92675. * Internal property tracking if this Animation is waiting to stop.
  92676. *
  92677. * 0 = No
  92678. * 1 = Waiting for ms to pass
  92679. * 2 = Waiting for repeat
  92680. * 3 = Waiting for specific frame
  92681. *
  92682. * @name Phaser.GameObjects.Components.Animation#_pendingStop
  92683. * @type {integer}
  92684. * @private
  92685. * @since 3.4.0
  92686. */
  92687. this._pendingStop = 0;
  92688. /**
  92689. * Internal property used by _pendingStop.
  92690. *
  92691. * @name Phaser.GameObjects.Components.Animation#_pendingStopValue
  92692. * @type {any}
  92693. * @private
  92694. * @since 3.4.0
  92695. */
  92696. this._pendingStopValue;
  92697. },
  92698. /**
  92699. * Sets an animation to be played immediately after the current one completes.
  92700. *
  92701. * The current animation must enter a 'completed' state for this to happen, i.e. finish all of its repeats, delays, etc, or have the `stop` method called directly on it.
  92702. *
  92703. * An animation set to repeat forever will never enter a completed state.
  92704. *
  92705. * You can chain a new animation at any point, including before the current one starts playing, during it, or when it ends (via its `animationcomplete` callback).
  92706. * Chained animations are specific to a Game Object, meaning different Game Objects can have different chained animations without impacting the global animation they're playing.
  92707. *
  92708. * Call this method with no arguments to reset the chained animation.
  92709. *
  92710. * @method Phaser.GameObjects.Components.Animation#chain
  92711. * @since 3.16.0
  92712. *
  92713. * @param {(string|Phaser.Animations.Animation)} [key] - The string-based key of the animation to play next, as defined previously in the Animation Manager. Or an Animation instance.
  92714. *
  92715. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92716. */
  92717. chain: function (key)
  92718. {
  92719. if (key instanceof BaseAnimation)
  92720. {
  92721. key = key.key;
  92722. }
  92723. this.nextAnim = key;
  92724. return this.parent;
  92725. },
  92726. /**
  92727. * Sets the amount of time, in milliseconds, that the animation will be delayed before starting playback.
  92728. *
  92729. * @method Phaser.GameObjects.Components.Animation#setDelay
  92730. * @since 3.4.0
  92731. *
  92732. * @param {integer} [value=0] - The amount of time, in milliseconds, to wait before starting playback.
  92733. *
  92734. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92735. */
  92736. setDelay: function (value)
  92737. {
  92738. if (value === undefined) { value = 0; }
  92739. this._delay = value;
  92740. return this.parent;
  92741. },
  92742. /**
  92743. * Gets the amount of time, in milliseconds that the animation will be delayed before starting playback.
  92744. *
  92745. * @method Phaser.GameObjects.Components.Animation#getDelay
  92746. * @since 3.4.0
  92747. *
  92748. * @return {integer} The amount of time, in milliseconds, the Animation will wait before starting playback.
  92749. */
  92750. getDelay: function ()
  92751. {
  92752. return this._delay;
  92753. },
  92754. /**
  92755. * Waits for the specified delay, in milliseconds, then starts playback of the requested animation.
  92756. *
  92757. * @method Phaser.GameObjects.Components.Animation#delayedPlay
  92758. * @since 3.0.0
  92759. *
  92760. * @param {integer} delay - The delay, in milliseconds, to wait before starting the animation playing.
  92761. * @param {string} key - The key of the animation to play.
  92762. * @param {integer} [startFrame=0] - The frame of the animation to start from.
  92763. *
  92764. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92765. */
  92766. delayedPlay: function (delay, key, startFrame)
  92767. {
  92768. this.play(key, true, startFrame);
  92769. this.nextTick += delay;
  92770. return this.parent;
  92771. },
  92772. /**
  92773. * Returns the key of the animation currently loaded into this component.
  92774. *
  92775. * @method Phaser.GameObjects.Components.Animation#getCurrentKey
  92776. * @since 3.0.0
  92777. *
  92778. * @return {string} The key of the Animation loaded into this component.
  92779. */
  92780. getCurrentKey: function ()
  92781. {
  92782. if (this.currentAnim)
  92783. {
  92784. return this.currentAnim.key;
  92785. }
  92786. },
  92787. /**
  92788. * Internal method used to load an animation into this component.
  92789. *
  92790. * @method Phaser.GameObjects.Components.Animation#load
  92791. * @protected
  92792. * @since 3.0.0
  92793. *
  92794. * @param {string} key - The key of the animation to load.
  92795. * @param {integer} [startFrame=0] - The start frame of the animation to load.
  92796. *
  92797. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92798. */
  92799. load: function (key, startFrame)
  92800. {
  92801. if (startFrame === undefined) { startFrame = 0; }
  92802. if (this.isPlaying)
  92803. {
  92804. this.stop();
  92805. }
  92806. // Load the new animation in
  92807. this.animationManager.load(this, key, startFrame);
  92808. return this.parent;
  92809. },
  92810. /**
  92811. * Pause the current animation and set the `isPlaying` property to `false`.
  92812. * You can optionally pause it at a specific frame.
  92813. *
  92814. * @method Phaser.GameObjects.Components.Animation#pause
  92815. * @since 3.0.0
  92816. *
  92817. * @param {Phaser.Animations.AnimationFrame} [atFrame] - An optional frame to set after pausing the animation.
  92818. *
  92819. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92820. */
  92821. pause: function (atFrame)
  92822. {
  92823. if (!this._paused)
  92824. {
  92825. this._paused = true;
  92826. this._wasPlaying = this.isPlaying;
  92827. this.isPlaying = false;
  92828. }
  92829. if (atFrame !== undefined)
  92830. {
  92831. this.updateFrame(atFrame);
  92832. }
  92833. return this.parent;
  92834. },
  92835. /**
  92836. * Resumes playback of a paused animation and sets the `isPlaying` property to `true`.
  92837. * You can optionally tell it to start playback from a specific frame.
  92838. *
  92839. * @method Phaser.GameObjects.Components.Animation#resume
  92840. * @since 3.0.0
  92841. *
  92842. * @param {Phaser.Animations.AnimationFrame} [fromFrame] - An optional frame to set before restarting playback.
  92843. *
  92844. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92845. */
  92846. resume: function (fromFrame)
  92847. {
  92848. if (this._paused)
  92849. {
  92850. this._paused = false;
  92851. this.isPlaying = this._wasPlaying;
  92852. }
  92853. if (fromFrame !== undefined)
  92854. {
  92855. this.updateFrame(fromFrame);
  92856. }
  92857. return this.parent;
  92858. },
  92859. /**
  92860. * `true` if the current animation is paused, otherwise `false`.
  92861. *
  92862. * @name Phaser.GameObjects.Components.Animation#isPaused
  92863. * @readonly
  92864. * @type {boolean}
  92865. * @since 3.4.0
  92866. */
  92867. isPaused: {
  92868. get: function ()
  92869. {
  92870. return this._paused;
  92871. }
  92872. },
  92873. /**
  92874. * Plays an Animation on a Game Object that has the Animation component, such as a Sprite.
  92875. *
  92876. * Animations are stored in the global Animation Manager and are referenced by a unique string-based key.
  92877. *
  92878. * @method Phaser.GameObjects.Components.Animation#play
  92879. * @fires Phaser.GameObjects.Components.Animation#onStartEvent
  92880. * @since 3.0.0
  92881. *
  92882. * @param {(string|Phaser.Animations.Animation)} key - The string-based key of the animation to play, as defined previously in the Animation Manager. Or an Animation instance.
  92883. * @param {boolean} [ignoreIfPlaying=false] - If an animation is already playing then ignore this call.
  92884. * @param {integer} [startFrame=0] - Optionally start the animation playing from this frame index.
  92885. *
  92886. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92887. */
  92888. play: function (key, ignoreIfPlaying, startFrame)
  92889. {
  92890. if (ignoreIfPlaying === undefined) { ignoreIfPlaying = false; }
  92891. if (startFrame === undefined) { startFrame = 0; }
  92892. if (key instanceof BaseAnimation)
  92893. {
  92894. key = key.key;
  92895. }
  92896. if (ignoreIfPlaying && this.isPlaying && this.currentAnim.key === key)
  92897. {
  92898. return this.parent;
  92899. }
  92900. this.forward = true;
  92901. this._reverse = false;
  92902. return this._startAnimation(key, startFrame);
  92903. },
  92904. /**
  92905. * Plays an Animation (in reverse mode) on the Game Object that owns this Animation Component.
  92906. *
  92907. * @method Phaser.GameObjects.Components.Animation#playReverse
  92908. * @fires Phaser.GameObjects.Components.Animation#onStartEvent
  92909. * @since 3.12.0
  92910. *
  92911. * @param {(string|Phaser.Animations.Animation)} key - The string-based key of the animation to play, as defined previously in the Animation Manager. Or an Animation instance.
  92912. * @param {boolean} [ignoreIfPlaying=false] - If an animation is already playing then ignore this call.
  92913. * @param {integer} [startFrame=0] - Optionally start the animation playing from this frame index.
  92914. *
  92915. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92916. */
  92917. playReverse: function (key, ignoreIfPlaying, startFrame)
  92918. {
  92919. if (ignoreIfPlaying === undefined) { ignoreIfPlaying = false; }
  92920. if (startFrame === undefined) { startFrame = 0; }
  92921. if (key instanceof BaseAnimation)
  92922. {
  92923. key = key.key;
  92924. }
  92925. if (ignoreIfPlaying && this.isPlaying && this.currentAnim.key === key)
  92926. {
  92927. return this.parent;
  92928. }
  92929. this.forward = false;
  92930. this._reverse = true;
  92931. return this._startAnimation(key, startFrame);
  92932. },
  92933. /**
  92934. * Load an Animation and fires 'onStartEvent' event, extracted from 'play' method.
  92935. *
  92936. * @method Phaser.GameObjects.Components.Animation#_startAnimation
  92937. * @fires Phaser.Animations.Events#START_ANIMATION_EVENT
  92938. * @fires Phaser.Animations.Events#SPRITE_START_ANIMATION_EVENT
  92939. * @fires Phaser.Animations.Events#SPRITE_START_KEY_ANIMATION_EVENT
  92940. * @since 3.12.0
  92941. *
  92942. * @param {string} key - The string-based key of the animation to play, as defined previously in the Animation Manager.
  92943. * @param {integer} [startFrame=0] - Optionally start the animation playing from this frame index.
  92944. *
  92945. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92946. */
  92947. _startAnimation: function (key, startFrame)
  92948. {
  92949. this.load(key, startFrame);
  92950. var anim = this.currentAnim;
  92951. var gameObject = this.parent;
  92952. // Should give us 9,007,199,254,740,991 safe repeats
  92953. this.repeatCounter = (this._repeat === -1) ? Number.MAX_VALUE : this._repeat;
  92954. anim.getFirstTick(this);
  92955. this.isPlaying = true;
  92956. this.pendingRepeat = false;
  92957. if (anim.showOnStart)
  92958. {
  92959. gameObject.visible = true;
  92960. }
  92961. var frame = this.currentFrame;
  92962. anim.emit(Events.ANIMATION_START, anim, frame, gameObject);
  92963. gameObject.emit(Events.SPRITE_ANIMATION_KEY_START + key, anim, frame, gameObject);
  92964. gameObject.emit(Events.SPRITE_ANIMATION_START, anim, frame, gameObject);
  92965. return gameObject;
  92966. },
  92967. /**
  92968. * Reverse the Animation that is already playing on the Game Object.
  92969. *
  92970. * @method Phaser.GameObjects.Components.Animation#reverse
  92971. * @since 3.12.0
  92972. *
  92973. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  92974. */
  92975. reverse: function ()
  92976. {
  92977. if (this.isPlaying)
  92978. {
  92979. this._reverse = !this._reverse;
  92980. this.forward = !this.forward;
  92981. }
  92982. return this.parent;
  92983. },
  92984. /**
  92985. * Returns a value between 0 and 1 indicating how far this animation is through, ignoring repeats and yoyos.
  92986. * If the animation has a non-zero repeat defined, `getProgress` and `getTotalProgress` will be different
  92987. * because `getProgress` doesn't include any repeats or repeat delays, whereas `getTotalProgress` does.
  92988. *
  92989. * @method Phaser.GameObjects.Components.Animation#getProgress
  92990. * @since 3.4.0
  92991. *
  92992. * @return {number} The progress of the current animation, between 0 and 1.
  92993. */
  92994. getProgress: function ()
  92995. {
  92996. var p = this.currentFrame.progress;
  92997. if (!this.forward)
  92998. {
  92999. p = 1 - p;
  93000. }
  93001. return p;
  93002. },
  93003. /**
  93004. * Takes a value between 0 and 1 and uses it to set how far this animation is through playback.
  93005. * Does not factor in repeats or yoyos, but does handle playing forwards or backwards.
  93006. *
  93007. * @method Phaser.GameObjects.Components.Animation#setProgress
  93008. * @since 3.4.0
  93009. *
  93010. * @param {number} [value=0] - The progress value, between 0 and 1.
  93011. *
  93012. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  93013. */
  93014. setProgress: function (value)
  93015. {
  93016. if (!this.forward)
  93017. {
  93018. value = 1 - value;
  93019. }
  93020. this.setCurrentFrame(this.currentAnim.getFrameByProgress(value));
  93021. return this.parent;
  93022. },
  93023. /**
  93024. * Handle the removal of an animation from the Animation Manager.
  93025. *
  93026. * @method Phaser.GameObjects.Components.Animation#remove
  93027. * @since 3.0.0
  93028. *
  93029. * @param {string} [key] - The key of the removed Animation.
  93030. * @param {Phaser.Animations.Animation} [animation] - The removed Animation.
  93031. */
  93032. remove: function (key, animation)
  93033. {
  93034. if (animation === undefined) { animation = this.currentAnim; }
  93035. if (this.isPlaying && animation.key === this.currentAnim.key)
  93036. {
  93037. this.stop();
  93038. this.setCurrentFrame(this.currentAnim.frames[0]);
  93039. }
  93040. },
  93041. /**
  93042. * Gets the number of times that the animation will repeat
  93043. * after its first iteration. For example, if returns 1, the animation will
  93044. * play a total of twice (the initial play plus 1 repeat).
  93045. * A value of -1 means the animation will repeat indefinitely.
  93046. *
  93047. * @method Phaser.GameObjects.Components.Animation#getRepeat
  93048. * @since 3.4.0
  93049. *
  93050. * @return {integer} The number of times that the animation will repeat.
  93051. */
  93052. getRepeat: function ()
  93053. {
  93054. return this._repeat;
  93055. },
  93056. /**
  93057. * Sets the number of times that the animation should repeat
  93058. * after its first iteration. For example, if repeat is 1, the animation will
  93059. * play a total of twice (the initial play plus 1 repeat).
  93060. * To repeat indefinitely, use -1. repeat should always be an integer.
  93061. *
  93062. * @method Phaser.GameObjects.Components.Animation#setRepeat
  93063. * @since 3.4.0
  93064. *
  93065. * @param {integer} value - The number of times that the animation should repeat.
  93066. *
  93067. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  93068. */
  93069. setRepeat: function (value)
  93070. {
  93071. this._repeat = value;
  93072. this.repeatCounter = 0;
  93073. return this.parent;
  93074. },
  93075. /**
  93076. * Gets the amount of delay between repeats, if any.
  93077. *
  93078. * @method Phaser.GameObjects.Components.Animation#getRepeatDelay
  93079. * @since 3.4.0
  93080. *
  93081. * @return {number} The delay between repeats.
  93082. */
  93083. getRepeatDelay: function ()
  93084. {
  93085. return this._repeatDelay;
  93086. },
  93087. /**
  93088. * Sets the amount of time in seconds between repeats.
  93089. * For example, if `repeat` is 2 and `repeatDelay` is 10, the animation will play initially,
  93090. * then wait for 10 seconds before repeating, then play again, then wait another 10 seconds
  93091. * before doing its final repeat.
  93092. *
  93093. * @method Phaser.GameObjects.Components.Animation#setRepeatDelay
  93094. * @since 3.4.0
  93095. *
  93096. * @param {number} value - The delay to wait between repeats, in seconds.
  93097. *
  93098. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  93099. */
  93100. setRepeatDelay: function (value)
  93101. {
  93102. this._repeatDelay = value;
  93103. return this.parent;
  93104. },
  93105. /**
  93106. * Restarts the current animation from its beginning, optionally including its delay value.
  93107. *
  93108. * @method Phaser.GameObjects.Components.Animation#restart
  93109. * @fires Phaser.Animations.Events#RESTART_ANIMATION_EVENT
  93110. * @fires Phaser.Animations.Events#SPRITE_RESTART_ANIMATION_EVENT
  93111. * @fires Phaser.Animations.Events#SPRITE_RESTART_KEY_ANIMATION_EVENT
  93112. * @since 3.0.0
  93113. *
  93114. * @param {boolean} [includeDelay=false] - Whether to include the delay value of the animation when restarting.
  93115. *
  93116. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  93117. */
  93118. restart: function (includeDelay)
  93119. {
  93120. if (includeDelay === undefined) { includeDelay = false; }
  93121. var anim = this.currentAnim;
  93122. anim.getFirstTick(this, includeDelay);
  93123. this.forward = true;
  93124. this.isPlaying = true;
  93125. this.pendingRepeat = false;
  93126. this._paused = false;
  93127. // Set frame
  93128. this.updateFrame(anim.frames[0]);
  93129. var gameObject = this.parent;
  93130. var frame = this.currentFrame;
  93131. anim.emit(Events.ANIMATION_RESTART, anim, frame, gameObject);
  93132. gameObject.emit(Events.SPRITE_ANIMATION_KEY_RESTART + anim.key, anim, frame, gameObject);
  93133. gameObject.emit(Events.SPRITE_ANIMATION_RESTART, anim, frame, gameObject);
  93134. return this.parent;
  93135. },
  93136. /**
  93137. * Immediately stops the current animation from playing and dispatches the `animationcomplete` event.
  93138. *
  93139. * If no animation is set, no event will be dispatched.
  93140. *
  93141. * If there is another animation queued (via the `chain` method) then it will start playing immediately.
  93142. *
  93143. * @method Phaser.GameObjects.Components.Animation#stop
  93144. * @fires Phaser.GameObjects.Components.Animation#onCompleteEvent
  93145. * @since 3.0.0
  93146. *
  93147. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  93148. */
  93149. stop: function ()
  93150. {
  93151. this._pendingStop = 0;
  93152. this.isPlaying = false;
  93153. var gameObject = this.parent;
  93154. var anim = this.currentAnim;
  93155. var frame = this.currentFrame;
  93156. if (anim)
  93157. {
  93158. anim.emit(Events.ANIMATION_COMPLETE, anim, frame, gameObject);
  93159. gameObject.emit(Events.SPRITE_ANIMATION_KEY_COMPLETE + anim.key, anim, frame, gameObject);
  93160. gameObject.emit(Events.SPRITE_ANIMATION_COMPLETE, anim, frame, gameObject);
  93161. }
  93162. if (this.nextAnim)
  93163. {
  93164. var key = this.nextAnim;
  93165. this.nextAnim = null;
  93166. this.play(key);
  93167. }
  93168. return gameObject;
  93169. },
  93170. /**
  93171. * Stops the current animation from playing after the specified time delay, given in milliseconds.
  93172. *
  93173. * @method Phaser.GameObjects.Components.Animation#stopAfterDelay
  93174. * @fires Phaser.GameObjects.Components.Animation#onCompleteEvent
  93175. * @since 3.4.0
  93176. *
  93177. * @param {integer} delay - The number of milliseconds to wait before stopping this animation.
  93178. *
  93179. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  93180. */
  93181. stopAfterDelay: function (delay)
  93182. {
  93183. this._pendingStop = 1;
  93184. this._pendingStopValue = delay;
  93185. return this.parent;
  93186. },
  93187. /**
  93188. * Stops the current animation from playing when it next repeats.
  93189. *
  93190. * @method Phaser.GameObjects.Components.Animation#stopOnRepeat
  93191. * @fires Phaser.GameObjects.Components.Animation#onCompleteEvent
  93192. * @since 3.4.0
  93193. *
  93194. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  93195. */
  93196. stopOnRepeat: function ()
  93197. {
  93198. this._pendingStop = 2;
  93199. return this.parent;
  93200. },
  93201. /**
  93202. * Stops the current animation from playing when it next sets the given frame.
  93203. * If this frame doesn't exist within the animation it will not stop it from playing.
  93204. *
  93205. * @method Phaser.GameObjects.Components.Animation#stopOnFrame
  93206. * @fires Phaser.GameObjects.Components.Animation#onCompleteEvent
  93207. * @since 3.4.0
  93208. *
  93209. * @param {Phaser.Animations.AnimationFrame} frame - The frame to check before stopping this animation.
  93210. *
  93211. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  93212. */
  93213. stopOnFrame: function (frame)
  93214. {
  93215. this._pendingStop = 3;
  93216. this._pendingStopValue = frame;
  93217. return this.parent;
  93218. },
  93219. /**
  93220. * Sets the Time Scale factor, allowing you to make the animation go go faster or slower than default.
  93221. * Where 1 = normal speed (the default), 0.5 = half speed, 2 = double speed, etc.
  93222. *
  93223. * @method Phaser.GameObjects.Components.Animation#setTimeScale
  93224. * @since 3.4.0
  93225. *
  93226. * @param {number} [value=1] - The time scale factor, where 1 is no change, 0.5 is half speed, etc.
  93227. *
  93228. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  93229. */
  93230. setTimeScale: function (value)
  93231. {
  93232. if (value === undefined) { value = 1; }
  93233. this._timeScale = value;
  93234. return this.parent;
  93235. },
  93236. /**
  93237. * Gets the Time Scale factor.
  93238. *
  93239. * @method Phaser.GameObjects.Components.Animation#getTimeScale
  93240. * @since 3.4.0
  93241. *
  93242. * @return {number} The Time Scale value.
  93243. */
  93244. getTimeScale: function ()
  93245. {
  93246. return this._timeScale;
  93247. },
  93248. /**
  93249. * Returns the total number of frames in this animation.
  93250. *
  93251. * @method Phaser.GameObjects.Components.Animation#getTotalFrames
  93252. * @since 3.4.0
  93253. *
  93254. * @return {integer} The total number of frames in this animation.
  93255. */
  93256. getTotalFrames: function ()
  93257. {
  93258. return this.currentAnim.frames.length;
  93259. },
  93260. /**
  93261. * The internal update loop for the Animation Component.
  93262. *
  93263. * @method Phaser.GameObjects.Components.Animation#update
  93264. * @since 3.0.0
  93265. *
  93266. * @param {number} time - The current timestamp.
  93267. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  93268. */
  93269. update: function (time, delta)
  93270. {
  93271. if (!this.currentAnim || !this.isPlaying || this.currentAnim.paused)
  93272. {
  93273. return;
  93274. }
  93275. this.accumulator += delta * this._timeScale;
  93276. if (this._pendingStop === 1)
  93277. {
  93278. this._pendingStopValue -= delta;
  93279. if (this._pendingStopValue <= 0)
  93280. {
  93281. return this.currentAnim.completeAnimation(this);
  93282. }
  93283. }
  93284. if (this.accumulator >= this.nextTick)
  93285. {
  93286. this.currentAnim.setFrame(this);
  93287. }
  93288. },
  93289. /**
  93290. * Sets the given Animation Frame as being the current frame
  93291. * and applies it to the parent Game Object, adjusting its size and origin as needed.
  93292. *
  93293. * @method Phaser.GameObjects.Components.Animation#setCurrentFrame
  93294. * @since 3.4.0
  93295. *
  93296. * @param {Phaser.Animations.AnimationFrame} animationFrame - The Animation Frame to set as being current.
  93297. *
  93298. * @return {Phaser.GameObjects.GameObject} The Game Object this Animation Component belongs to.
  93299. */
  93300. setCurrentFrame: function (animationFrame)
  93301. {
  93302. var gameObject = this.parent;
  93303. this.currentFrame = animationFrame;
  93304. gameObject.texture = animationFrame.frame.texture;
  93305. gameObject.frame = animationFrame.frame;
  93306. if (gameObject.isCropped)
  93307. {
  93308. gameObject.frame.updateCropUVs(gameObject._crop, gameObject.flipX, gameObject.flipY);
  93309. }
  93310. gameObject.setSizeToFrame();
  93311. if (animationFrame.frame.customPivot)
  93312. {
  93313. gameObject.setOrigin(animationFrame.frame.pivotX, animationFrame.frame.pivotY);
  93314. }
  93315. else
  93316. {
  93317. gameObject.updateDisplayOrigin();
  93318. }
  93319. return gameObject;
  93320. },
  93321. /**
  93322. * Internal frame change handler.
  93323. *
  93324. * @method Phaser.GameObjects.Components.Animation#updateFrame
  93325. * @fires Phaser.Animations.Events#SPRITE_ANIMATION_UPDATE_EVENT
  93326. * @fires Phaser.Animations.Events#SPRITE_ANIMATION_KEY_UPDATE_EVENT
  93327. * @private
  93328. * @since 3.0.0
  93329. *
  93330. * @param {Phaser.Animations.AnimationFrame} animationFrame - The animation frame to change to.
  93331. */
  93332. updateFrame: function (animationFrame)
  93333. {
  93334. var gameObject = this.setCurrentFrame(animationFrame);
  93335. if (this.isPlaying)
  93336. {
  93337. if (animationFrame.setAlpha)
  93338. {
  93339. gameObject.alpha = animationFrame.alpha;
  93340. }
  93341. var anim = this.currentAnim;
  93342. gameObject.emit(Events.SPRITE_ANIMATION_KEY_UPDATE + anim.key, anim, animationFrame, gameObject);
  93343. gameObject.emit(Events.SPRITE_ANIMATION_UPDATE, anim, animationFrame, gameObject);
  93344. if (this._pendingStop === 3 && this._pendingStopValue === animationFrame)
  93345. {
  93346. this.currentAnim.completeAnimation(this);
  93347. }
  93348. }
  93349. },
  93350. /**
  93351. * Advances the animation to the next frame, regardless of the time or animation state.
  93352. * If the animation is set to repeat, or yoyo, this will still take effect.
  93353. *
  93354. * Calling this does not change the direction of the animation. I.e. if it was currently
  93355. * playing in reverse, calling this method doesn't then change the direction to forwards.
  93356. *
  93357. * @method Phaser.GameObjects.Components.Animation#nextFrame
  93358. * @since 3.16.0
  93359. *
  93360. * @return {Phaser.GameObjects.GameObject} The Game Object this Animation Component belongs to.
  93361. */
  93362. nextFrame: function ()
  93363. {
  93364. if (this.currentAnim)
  93365. {
  93366. this.currentAnim.nextFrame(this);
  93367. }
  93368. return this.parent;
  93369. },
  93370. /**
  93371. * Advances the animation to the previous frame, regardless of the time or animation state.
  93372. * If the animation is set to repeat, or yoyo, this will still take effect.
  93373. *
  93374. * Calling this does not change the direction of the animation. I.e. if it was currently
  93375. * playing in forwards, calling this method doesn't then change the direction to backwards.
  93376. *
  93377. * @method Phaser.GameObjects.Components.Animation#previousFrame
  93378. * @since 3.16.0
  93379. *
  93380. * @return {Phaser.GameObjects.GameObject} The Game Object this Animation Component belongs to.
  93381. */
  93382. previousFrame: function ()
  93383. {
  93384. if (this.currentAnim)
  93385. {
  93386. this.currentAnim.previousFrame(this);
  93387. }
  93388. return this.parent;
  93389. },
  93390. /**
  93391. * Sets if the current Animation will yoyo when it reaches the end.
  93392. * A yoyo'ing animation will play through consecutively, and then reverse-play back to the start again.
  93393. *
  93394. * @method Phaser.GameObjects.Components.Animation#setYoyo
  93395. * @since 3.4.0
  93396. *
  93397. * @param {boolean} [value=false] - `true` if the animation should yoyo, `false` to not.
  93398. *
  93399. * @return {Phaser.GameObjects.GameObject} The Game Object this Animation Component belongs to.
  93400. */
  93401. setYoyo: function (value)
  93402. {
  93403. if (value === undefined) { value = false; }
  93404. this._yoyo = value;
  93405. return this.parent;
  93406. },
  93407. /**
  93408. * Gets if the current Animation will yoyo when it reaches the end.
  93409. * A yoyo'ing animation will play through consecutively, and then reverse-play back to the start again.
  93410. *
  93411. * @method Phaser.GameObjects.Components.Animation#getYoyo
  93412. * @since 3.4.0
  93413. *
  93414. * @return {boolean} `true` if the animation is set to yoyo, `false` if not.
  93415. */
  93416. getYoyo: function ()
  93417. {
  93418. return this._yoyo;
  93419. },
  93420. /**
  93421. * Destroy this Animation component.
  93422. *
  93423. * Unregisters event listeners and cleans up its references.
  93424. *
  93425. * @method Phaser.GameObjects.Components.Animation#destroy
  93426. * @since 3.0.0
  93427. */
  93428. destroy: function ()
  93429. {
  93430. this.animationManager.off(Events.REMOVE_ANIMATION, this.remove, this);
  93431. this.animationManager = null;
  93432. this.parent = null;
  93433. this.currentAnim = null;
  93434. this.currentFrame = null;
  93435. }
  93436. });
  93437. module.exports = Animation;
  93438. /***/ }),
  93439. /* 461 */
  93440. /***/ (function(module, exports) {
  93441. /**
  93442. * @author Richard Davey <rich@photonstorm.com>
  93443. * @copyright 2019 Photon Storm Ltd.
  93444. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93445. */
  93446. /**
  93447. * Takes the given string and reverses it, returning the reversed string.
  93448. * For example if given the string `Atari 520ST` it would return `TS025 iratA`.
  93449. *
  93450. * @function Phaser.Utils.String.Reverse
  93451. * @since 3.0.0
  93452. *
  93453. * @param {string} string - The string to be reversed.
  93454. *
  93455. * @return {string} The reversed string.
  93456. */
  93457. var Reverse = function (string)
  93458. {
  93459. return string.split('').reverse().join('');
  93460. };
  93461. module.exports = Reverse;
  93462. /***/ }),
  93463. /* 462 */
  93464. /***/ (function(module, exports) {
  93465. /**
  93466. * @author Richard Davey <rich@photonstorm.com>
  93467. * @copyright 2019 Photon Storm Ltd.
  93468. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93469. */
  93470. /**
  93471. * Takes a string and replaces instances of markers with values in the given array.
  93472. * The markers take the form of `%1`, `%2`, etc. I.e.:
  93473. *
  93474. * `Format("The %1 is worth %2 gold", [ 'Sword', 500 ])`
  93475. *
  93476. * @function Phaser.Utils.String.Format
  93477. * @since 3.0.0
  93478. *
  93479. * @param {string} string - The string containing the replacement markers.
  93480. * @param {array} values - An array containing values that will replace the markers. If no value exists an empty string is inserted instead.
  93481. *
  93482. * @return {string} The string containing replaced values.
  93483. */
  93484. var Format = function (string, values)
  93485. {
  93486. return string.replace(/%([0-9]+)/g, function (s, n)
  93487. {
  93488. return values[Number(n) - 1];
  93489. });
  93490. };
  93491. module.exports = Format;
  93492. /***/ }),
  93493. /* 463 */
  93494. /***/ (function(module, exports, __webpack_require__) {
  93495. /**
  93496. * @author Richard Davey <rich@photonstorm.com>
  93497. * @copyright 2019 Photon Storm Ltd.
  93498. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93499. */
  93500. /**
  93501. * @namespace Phaser.Utils.String
  93502. */
  93503. module.exports = {
  93504. Format: __webpack_require__(462),
  93505. Pad: __webpack_require__(193),
  93506. Reverse: __webpack_require__(461),
  93507. UppercaseFirst: __webpack_require__(330),
  93508. UUID: __webpack_require__(299)
  93509. };
  93510. /***/ }),
  93511. /* 464 */
  93512. /***/ (function(module, exports, __webpack_require__) {
  93513. /**
  93514. * @author Richard Davey <rich@photonstorm.com>
  93515. * @copyright 2019 Photon Storm Ltd.
  93516. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93517. */
  93518. var Clone = __webpack_require__(70);
  93519. /**
  93520. * Creates a new Object using all values from obj1.
  93521. *
  93522. * Then scans obj2. If a property is found in obj2 that *also* exists in obj1, the value from obj2 is used, otherwise the property is skipped.
  93523. *
  93524. * @function Phaser.Utils.Objects.MergeRight
  93525. * @since 3.0.0
  93526. *
  93527. * @param {object} obj1 - The first object to merge.
  93528. * @param {object} obj2 - The second object to merge. Keys from this object which also exist in `obj1` will be copied to `obj1`.
  93529. *
  93530. * @return {object} The merged object. `obj1` and `obj2` are not modified.
  93531. */
  93532. var MergeRight = function (obj1, obj2)
  93533. {
  93534. var clone = Clone(obj1);
  93535. for (var key in obj2)
  93536. {
  93537. if (clone.hasOwnProperty(key))
  93538. {
  93539. clone[key] = obj2[key];
  93540. }
  93541. }
  93542. return clone;
  93543. };
  93544. module.exports = MergeRight;
  93545. /***/ }),
  93546. /* 465 */
  93547. /***/ (function(module, exports) {
  93548. /**
  93549. * @author Richard Davey <rich@photonstorm.com>
  93550. * @copyright 2019 Photon Storm Ltd.
  93551. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93552. */
  93553. /**
  93554. * Verifies that an object contains all requested keys
  93555. *
  93556. * @function Phaser.Utils.Objects.HasAll
  93557. * @since 3.0.0
  93558. *
  93559. * @param {object} source - an object on which to check for key existence
  93560. * @param {string[]} keys - an array of keys to ensure the source object contains
  93561. *
  93562. * @return {boolean} true if the source object contains all keys, false otherwise.
  93563. */
  93564. var HasAll = function (source, keys)
  93565. {
  93566. for (var i = 0; i < keys.length; i++)
  93567. {
  93568. if (!source.hasOwnProperty(keys[i]))
  93569. {
  93570. return false;
  93571. }
  93572. }
  93573. return true;
  93574. };
  93575. module.exports = HasAll;
  93576. /***/ }),
  93577. /* 466 */
  93578. /***/ (function(module, exports, __webpack_require__) {
  93579. /**
  93580. * @author Richard Davey <rich@photonstorm.com>
  93581. * @copyright 2019 Photon Storm Ltd.
  93582. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93583. */
  93584. var GetValue = __webpack_require__(4);
  93585. var Clamp = __webpack_require__(23);
  93586. /**
  93587. * Retrieves and clamps a numerical value from an object.
  93588. *
  93589. * @function Phaser.Utils.Objects.GetMinMaxValue
  93590. * @since 3.0.0
  93591. *
  93592. * @param {object} source - The object to retrieve the value from.
  93593. * @param {string} key - The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`).
  93594. * @param {number} min - The minimum value which can be returned.
  93595. * @param {number} max - The maximum value which can be returned.
  93596. * @param {number} defaultValue - The value to return if the property doesn't exist. It's also constrained to the given bounds.
  93597. *
  93598. * @return {number} The clamped value from the `source` object.
  93599. */
  93600. var GetMinMaxValue = function (source, key, min, max, defaultValue)
  93601. {
  93602. if (defaultValue === undefined) { defaultValue = min; }
  93603. var value = GetValue(source, key, defaultValue);
  93604. return Clamp(value, min, max);
  93605. };
  93606. module.exports = GetMinMaxValue;
  93607. /***/ }),
  93608. /* 467 */
  93609. /***/ (function(module, exports, __webpack_require__) {
  93610. /**
  93611. * @author Richard Davey <rich@photonstorm.com>
  93612. * @copyright 2019 Photon Storm Ltd.
  93613. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93614. */
  93615. /**
  93616. * @namespace Phaser.Utils.Objects
  93617. */
  93618. module.exports = {
  93619. Clone: __webpack_require__(70),
  93620. Extend: __webpack_require__(19),
  93621. GetAdvancedValue: __webpack_require__(12),
  93622. GetFastValue: __webpack_require__(2),
  93623. GetMinMaxValue: __webpack_require__(466),
  93624. GetValue: __webpack_require__(4),
  93625. HasAll: __webpack_require__(465),
  93626. HasAny: __webpack_require__(302),
  93627. HasValue: __webpack_require__(91),
  93628. IsPlainObject: __webpack_require__(8),
  93629. Merge: __webpack_require__(103),
  93630. MergeRight: __webpack_require__(464)
  93631. };
  93632. /***/ }),
  93633. /* 468 */
  93634. /***/ (function(module, exports, __webpack_require__) {
  93635. /**
  93636. * @author Richard Davey <rich@photonstorm.com>
  93637. * @copyright 2019 Photon Storm Ltd.
  93638. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93639. */
  93640. /**
  93641. * @namespace Phaser.Utils
  93642. */
  93643. module.exports = {
  93644. Array: __webpack_require__(174),
  93645. Objects: __webpack_require__(467),
  93646. String: __webpack_require__(463)
  93647. };
  93648. /***/ }),
  93649. /* 469 */
  93650. /***/ (function(module, exports, __webpack_require__) {
  93651. /**
  93652. * @author Richard Davey <rich@photonstorm.com>
  93653. * @copyright 2019 Photon Storm Ltd.
  93654. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93655. */
  93656. var Class = __webpack_require__(0);
  93657. var NumberTweenBuilder = __webpack_require__(219);
  93658. var PluginCache = __webpack_require__(17);
  93659. var SceneEvents = __webpack_require__(16);
  93660. var TimelineBuilder = __webpack_require__(218);
  93661. var TWEEN_CONST = __webpack_require__(89);
  93662. var TweenBuilder = __webpack_require__(104);
  93663. /**
  93664. * @classdesc
  93665. * The Tween Manager is a default Scene Plugin which controls and updates Tweens and Timelines.
  93666. *
  93667. * @class TweenManager
  93668. * @memberof Phaser.Tweens
  93669. * @constructor
  93670. * @since 3.0.0
  93671. *
  93672. * @param {Phaser.Scene} scene - The Scene which owns this Tween Manager.
  93673. */
  93674. var TweenManager = new Class({
  93675. initialize:
  93676. function TweenManager (scene)
  93677. {
  93678. /**
  93679. * The Scene which owns this Tween Manager.
  93680. *
  93681. * @name Phaser.Tweens.TweenManager#scene
  93682. * @type {Phaser.Scene}
  93683. * @since 3.0.0
  93684. */
  93685. this.scene = scene;
  93686. /**
  93687. * The Systems object of the Scene which owns this Tween Manager.
  93688. *
  93689. * @name Phaser.Tweens.TweenManager#systems
  93690. * @type {Phaser.Scenes.Systems}
  93691. * @since 3.0.0
  93692. */
  93693. this.systems = scene.sys;
  93694. /**
  93695. * The time scale of the Tween Manager.
  93696. *
  93697. * This value scales the time delta between two frames, thus influencing the speed of time for all Tweens owned by this Tween Manager.
  93698. *
  93699. * @name Phaser.Tweens.TweenManager#timeScale
  93700. * @type {number}
  93701. * @default 1
  93702. * @since 3.0.0
  93703. */
  93704. this.timeScale = 1;
  93705. /**
  93706. * An array of Tweens and Timelines which will be added to the Tween Manager at the start of the frame.
  93707. *
  93708. * @name Phaser.Tweens.TweenManager#_add
  93709. * @type {array}
  93710. * @private
  93711. * @since 3.0.0
  93712. */
  93713. this._add = [];
  93714. /**
  93715. * An array of Tweens and Timelines pending to be later added to the Tween Manager.
  93716. *
  93717. * @name Phaser.Tweens.TweenManager#_pending
  93718. * @type {array}
  93719. * @private
  93720. * @since 3.0.0
  93721. */
  93722. this._pending = [];
  93723. /**
  93724. * An array of Tweens and Timelines which are still incomplete and are actively processed by the Tween Manager.
  93725. *
  93726. * @name Phaser.Tweens.TweenManager#_active
  93727. * @type {array}
  93728. * @private
  93729. * @since 3.0.0
  93730. */
  93731. this._active = [];
  93732. /**
  93733. * An array of Tweens and Timelines which will be removed from the Tween Manager at the start of the frame.
  93734. *
  93735. * @name Phaser.Tweens.TweenManager#_destroy
  93736. * @type {array}
  93737. * @private
  93738. * @since 3.0.0
  93739. */
  93740. this._destroy = [];
  93741. /**
  93742. * The number of Tweens and Timelines which need to be processed by the Tween Manager at the start of the frame.
  93743. *
  93744. * @name Phaser.Tweens.TweenManager#_toProcess
  93745. * @type {integer}
  93746. * @private
  93747. * @default 0
  93748. * @since 3.0.0
  93749. */
  93750. this._toProcess = 0;
  93751. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  93752. scene.sys.events.on(SceneEvents.START, this.start, this);
  93753. },
  93754. /**
  93755. * This method is called automatically, only once, when the Scene is first created.
  93756. * Do not invoke it directly.
  93757. *
  93758. * @method Phaser.Tweens.TweenManager#boot
  93759. * @private
  93760. * @since 3.5.1
  93761. */
  93762. boot: function ()
  93763. {
  93764. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  93765. },
  93766. /**
  93767. * This method is called automatically by the Scene when it is starting up.
  93768. * It is responsible for creating local systems, properties and listening for Scene events.
  93769. * Do not invoke it directly.
  93770. *
  93771. * @method Phaser.Tweens.TweenManager#start
  93772. * @private
  93773. * @since 3.5.0
  93774. */
  93775. start: function ()
  93776. {
  93777. var eventEmitter = this.systems.events;
  93778. eventEmitter.on(SceneEvents.PRE_UPDATE, this.preUpdate, this);
  93779. eventEmitter.on(SceneEvents.UPDATE, this.update, this);
  93780. eventEmitter.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  93781. this.timeScale = 1;
  93782. },
  93783. /**
  93784. * Create a Tween Timeline and return it, but do NOT add it to the active or pending Tween lists.
  93785. *
  93786. * @method Phaser.Tweens.TweenManager#createTimeline
  93787. * @since 3.0.0
  93788. *
  93789. * @param {object} config - The configuration object for the Timeline and its Tweens.
  93790. *
  93791. * @return {Phaser.Tweens.Timeline} The created Timeline object.
  93792. */
  93793. createTimeline: function (config)
  93794. {
  93795. return TimelineBuilder(this, config);
  93796. },
  93797. /**
  93798. * Create a Tween Timeline and add it to the active Tween list/
  93799. *
  93800. * @method Phaser.Tweens.TweenManager#timeline
  93801. * @since 3.0.0
  93802. *
  93803. * @param {object} config - The configuration object for the Timeline and its Tweens.
  93804. *
  93805. * @return {Phaser.Tweens.Timeline} The created Timeline object.
  93806. */
  93807. timeline: function (config)
  93808. {
  93809. var timeline = TimelineBuilder(this, config);
  93810. if (!timeline.paused)
  93811. {
  93812. this._add.push(timeline);
  93813. this._toProcess++;
  93814. }
  93815. return timeline;
  93816. },
  93817. /**
  93818. * Create a Tween and return it, but do NOT add it to the active or pending Tween lists.
  93819. *
  93820. * @method Phaser.Tweens.TweenManager#create
  93821. * @since 3.0.0
  93822. *
  93823. * @param {object} config - The configuration object for the Tween as per {@link Phaser.Tweens.Builders.TweenBuilder}.
  93824. *
  93825. * @return {Phaser.Tweens.Tween} The created Tween object.
  93826. */
  93827. create: function (config)
  93828. {
  93829. return TweenBuilder(this, config);
  93830. },
  93831. /**
  93832. * Create a Tween and add it to the active Tween list.
  93833. *
  93834. * @method Phaser.Tweens.TweenManager#add
  93835. * @since 3.0.0
  93836. *
  93837. * @param {object} config - The configuration object for the Tween as per the {@link Phaser.Tweens.Builders.TweenBuilder}.
  93838. *
  93839. * @return {Phaser.Tweens.Tween} The created Tween.
  93840. */
  93841. add: function (config)
  93842. {
  93843. var tween = TweenBuilder(this, config);
  93844. this._add.push(tween);
  93845. this._toProcess++;
  93846. return tween;
  93847. },
  93848. /**
  93849. * Add an existing tween into the active Tween list.
  93850. *
  93851. * @method Phaser.Tweens.TweenManager#existing
  93852. * @since 3.0.0
  93853. *
  93854. * @param {Phaser.Tweens.Tween} tween - The Tween to add.
  93855. *
  93856. * @return {Phaser.Tweens.TweenManager} This Tween Manager object.
  93857. */
  93858. existing: function (tween)
  93859. {
  93860. this._add.push(tween);
  93861. this._toProcess++;
  93862. return this;
  93863. },
  93864. /**
  93865. * Create a Tween and add it to the active Tween list.
  93866. *
  93867. * @method Phaser.Tweens.TweenManager#addCounter
  93868. * @since 3.0.0
  93869. *
  93870. * @param {object} config - The configuration object for the Number Tween as per the {@link Phaser.Tweens.Builders.NumberTweenBuilder}.
  93871. *
  93872. * @return {Phaser.Tweens.Tween} The created Number Tween.
  93873. */
  93874. addCounter: function (config)
  93875. {
  93876. var tween = NumberTweenBuilder(this, config);
  93877. this._add.push(tween);
  93878. this._toProcess++;
  93879. return tween;
  93880. },
  93881. /**
  93882. * Updates the Tween Manager's internal lists at the start of the frame.
  93883. *
  93884. * This method will return immediately if no changes have been indicated.
  93885. *
  93886. * @method Phaser.Tweens.TweenManager#preUpdate
  93887. * @since 3.0.0
  93888. */
  93889. preUpdate: function ()
  93890. {
  93891. if (this._toProcess === 0)
  93892. {
  93893. // Quick bail
  93894. return;
  93895. }
  93896. var list = this._destroy;
  93897. var active = this._active;
  93898. var pending = this._pending;
  93899. var i;
  93900. var tween;
  93901. // Clear the 'destroy' list
  93902. for (i = 0; i < list.length; i++)
  93903. {
  93904. tween = list[i];
  93905. // Remove from the 'active' array
  93906. var idx = active.indexOf(tween);
  93907. if (idx === -1)
  93908. {
  93909. // Not in the active array, is it in pending instead?
  93910. idx = pending.indexOf(tween);
  93911. if (idx > -1)
  93912. {
  93913. tween.state = TWEEN_CONST.REMOVED;
  93914. pending.splice(idx, 1);
  93915. }
  93916. }
  93917. else
  93918. {
  93919. tween.state = TWEEN_CONST.REMOVED;
  93920. active.splice(idx, 1);
  93921. }
  93922. }
  93923. list.length = 0;
  93924. // Process the addition list
  93925. // This stops callbacks and out of sync events from populating the active array mid-way during the update
  93926. list = this._add;
  93927. for (i = 0; i < list.length; i++)
  93928. {
  93929. tween = list[i];
  93930. if (tween.state === TWEEN_CONST.PENDING_ADD)
  93931. {
  93932. // Return true if the Tween should be started right away, otherwise false
  93933. if (tween.init())
  93934. {
  93935. tween.play();
  93936. this._active.push(tween);
  93937. }
  93938. else
  93939. {
  93940. this._pending.push(tween);
  93941. }
  93942. }
  93943. }
  93944. list.length = 0;
  93945. this._toProcess = 0;
  93946. },
  93947. /**
  93948. * Updates all Tweens and Timelines of the Tween Manager.
  93949. *
  93950. * @method Phaser.Tweens.TweenManager#update
  93951. * @since 3.0.0
  93952. *
  93953. * @param {number} timestamp - The current time in milliseconds.
  93954. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  93955. */
  93956. update: function (timestamp, delta)
  93957. {
  93958. // Process active tweens
  93959. var list = this._active;
  93960. var tween;
  93961. // Scale the delta
  93962. delta *= this.timeScale;
  93963. for (var i = 0; i < list.length; i++)
  93964. {
  93965. tween = list[i];
  93966. // If Tween.update returns 'true' then it means it has completed,
  93967. // so move it to the destroy list
  93968. if (tween.update(timestamp, delta))
  93969. {
  93970. this._destroy.push(tween);
  93971. this._toProcess++;
  93972. }
  93973. }
  93974. },
  93975. /**
  93976. * Checks if a Tween or Timeline is active and adds it to the Tween Manager at the start of the frame if it isn't.
  93977. *
  93978. * @method Phaser.Tweens.TweenManager#makeActive
  93979. * @since 3.0.0
  93980. *
  93981. * @param {Phaser.Tweens.Tween} tween - The Tween to check.
  93982. *
  93983. * @return {Phaser.Tweens.TweenManager} This Tween Manager object.
  93984. */
  93985. makeActive: function (tween)
  93986. {
  93987. if (this._add.indexOf(tween) !== -1 || this._active.indexOf(tween) !== -1)
  93988. {
  93989. return;
  93990. }
  93991. var idx = this._pending.indexOf(tween);
  93992. if (idx !== -1)
  93993. {
  93994. this._pending.splice(idx, 1);
  93995. }
  93996. this._add.push(tween);
  93997. tween.state = TWEEN_CONST.PENDING_ADD;
  93998. this._toProcess++;
  93999. return this;
  94000. },
  94001. /**
  94002. * Passes all Tweens to the given callback.
  94003. *
  94004. * @method Phaser.Tweens.TweenManager#each
  94005. * @since 3.0.0
  94006. *
  94007. * @param {function} callback - The function to call.
  94008. * @param {object} [scope] - The scope (`this` object) to call the function with.
  94009. * @param {...*} [args] - The arguments to pass into the function. Its first argument will always be the Tween currently being iterated.
  94010. */
  94011. each: function (callback, scope)
  94012. {
  94013. var args = [ null ];
  94014. for (var i = 1; i < arguments.length; i++)
  94015. {
  94016. args.push(arguments[i]);
  94017. }
  94018. for (var texture in this.list)
  94019. {
  94020. args[0] = this.list[texture];
  94021. callback.apply(scope, args);
  94022. }
  94023. },
  94024. /**
  94025. * Returns an array of all active Tweens and Timelines in the Tween Manager.
  94026. *
  94027. * @method Phaser.Tweens.TweenManager#getAllTweens
  94028. * @since 3.0.0
  94029. *
  94030. * @return {Phaser.Tweens.Tween[]} A new array containing references to all active Tweens and Timelines.
  94031. */
  94032. getAllTweens: function ()
  94033. {
  94034. var list = this._active;
  94035. var output = [];
  94036. for (var i = 0; i < list.length; i++)
  94037. {
  94038. output.push(list[i]);
  94039. }
  94040. return output;
  94041. },
  94042. /**
  94043. * Returns the scale of the time delta for all Tweens and Timelines owned by this Tween Manager.
  94044. *
  94045. * @method Phaser.Tweens.TweenManager#getGlobalTimeScale
  94046. * @since 3.0.0
  94047. *
  94048. * @return {number} The scale of the time delta, usually 1.
  94049. */
  94050. getGlobalTimeScale: function ()
  94051. {
  94052. return this.timeScale;
  94053. },
  94054. /**
  94055. * Returns an array of all Tweens or Timelines in the Tween Manager which affect the given target or array of targets.
  94056. *
  94057. * @method Phaser.Tweens.TweenManager#getTweensOf
  94058. * @since 3.0.0
  94059. *
  94060. * @param {(object|array)} target - The target to look for. Provide an array to look for multiple targets.
  94061. *
  94062. * @return {Phaser.Tweens.Tween[]} A new array containing all Tweens and Timelines which affect the given target(s).
  94063. */
  94064. getTweensOf: function (target)
  94065. {
  94066. var list = this._active;
  94067. var tween;
  94068. var output = [];
  94069. var i;
  94070. if (Array.isArray(target))
  94071. {
  94072. for (i = 0; i < list.length; i++)
  94073. {
  94074. tween = list[i];
  94075. for (var t = 0; t < target.length; t++)
  94076. {
  94077. if (tween.hasTarget(target[t]))
  94078. {
  94079. output.push(tween);
  94080. }
  94081. }
  94082. }
  94083. }
  94084. else
  94085. {
  94086. for (i = 0; i < list.length; i++)
  94087. {
  94088. tween = list[i];
  94089. if (tween.hasTarget(target))
  94090. {
  94091. output.push(tween);
  94092. }
  94093. }
  94094. }
  94095. return output;
  94096. },
  94097. /**
  94098. * Checks if the given object is being affected by a playing Tween.
  94099. *
  94100. * @method Phaser.Tweens.TweenManager#isTweening
  94101. * @since 3.0.0
  94102. *
  94103. * @param {object} target - target Phaser.Tweens.Tween object
  94104. *
  94105. * @return {boolean} returns if target tween object is active or not
  94106. */
  94107. isTweening: function (target)
  94108. {
  94109. var list = this._active;
  94110. var tween;
  94111. for (var i = 0; i < list.length; i++)
  94112. {
  94113. tween = list[i];
  94114. if (tween.hasTarget(target) && tween.isPlaying())
  94115. {
  94116. return true;
  94117. }
  94118. }
  94119. return false;
  94120. },
  94121. /**
  94122. * Stops all Tweens in this Tween Manager. They will be removed at the start of the frame.
  94123. *
  94124. * @method Phaser.Tweens.TweenManager#killAll
  94125. * @since 3.0.0
  94126. *
  94127. * @return {Phaser.Tweens.TweenManager} This Tween Manager.
  94128. */
  94129. killAll: function ()
  94130. {
  94131. var tweens = this.getAllTweens();
  94132. for (var i = 0; i < tweens.length; i++)
  94133. {
  94134. tweens[i].stop();
  94135. }
  94136. return this;
  94137. },
  94138. /**
  94139. * Stops all Tweens which affect the given target or array of targets. The Tweens will be removed from the Tween Manager at the start of the frame.
  94140. *
  94141. * @see {@link #getTweensOf}
  94142. *
  94143. * @method Phaser.Tweens.TweenManager#killTweensOf
  94144. * @since 3.0.0
  94145. *
  94146. * @param {(object|array)} target - The target to look for. Provide an array to look for multiple targets.
  94147. *
  94148. * @return {Phaser.Tweens.TweenManager} This Tween Manager.
  94149. */
  94150. killTweensOf: function (target)
  94151. {
  94152. var tweens = this.getTweensOf(target);
  94153. for (var i = 0; i < tweens.length; i++)
  94154. {
  94155. tweens[i].stop();
  94156. }
  94157. return this;
  94158. },
  94159. /**
  94160. * Pauses all Tweens in this Tween Manager.
  94161. *
  94162. * @method Phaser.Tweens.TweenManager#pauseAll
  94163. * @since 3.0.0
  94164. *
  94165. * @return {Phaser.Tweens.TweenManager} This Tween Manager.
  94166. */
  94167. pauseAll: function ()
  94168. {
  94169. var list = this._active;
  94170. for (var i = 0; i < list.length; i++)
  94171. {
  94172. list[i].pause();
  94173. }
  94174. return this;
  94175. },
  94176. /**
  94177. * Resumes all Tweens in this Tween Manager.
  94178. *
  94179. * @method Phaser.Tweens.TweenManager#resumeAll
  94180. * @since 3.0.0
  94181. *
  94182. * @return {Phaser.Tweens.TweenManager} This Tween Manager.
  94183. */
  94184. resumeAll: function ()
  94185. {
  94186. var list = this._active;
  94187. for (var i = 0; i < list.length; i++)
  94188. {
  94189. list[i].resume();
  94190. }
  94191. return this;
  94192. },
  94193. /**
  94194. * Sets a new scale of the time delta for this Tween Manager.
  94195. *
  94196. * The time delta is the time elapsed between two consecutive frames and influences the speed of time for this Tween Manager and all Tweens it owns. Values higher than 1 increase the speed of time, while values smaller than 1 decrease it. A value of 0 freezes time and is effectively equivalent to pausing all Tweens.
  94197. *
  94198. * @method Phaser.Tweens.TweenManager#setGlobalTimeScale
  94199. * @since 3.0.0
  94200. *
  94201. * @param {number} value - The new scale of the time delta, where 1 is the normal speed.
  94202. *
  94203. * @return {Phaser.Tweens.TweenManager} This Tween Manager.
  94204. */
  94205. setGlobalTimeScale: function (value)
  94206. {
  94207. this.timeScale = value;
  94208. return this;
  94209. },
  94210. /**
  94211. * The Scene that owns this plugin is shutting down.
  94212. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  94213. *
  94214. * @method Phaser.Tweens.TweenManager#shutdown
  94215. * @since 3.0.0
  94216. */
  94217. shutdown: function ()
  94218. {
  94219. this.killAll();
  94220. this._add = [];
  94221. this._pending = [];
  94222. this._active = [];
  94223. this._destroy = [];
  94224. this._toProcess = 0;
  94225. var eventEmitter = this.systems.events;
  94226. eventEmitter.off(SceneEvents.PRE_UPDATE, this.preUpdate, this);
  94227. eventEmitter.off(SceneEvents.UPDATE, this.update, this);
  94228. eventEmitter.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  94229. },
  94230. /**
  94231. * The Scene that owns this plugin is being destroyed.
  94232. * We need to shutdown and then kill off all external references.
  94233. *
  94234. * @method Phaser.Tweens.TweenManager#destroy
  94235. * @since 3.0.0
  94236. */
  94237. destroy: function ()
  94238. {
  94239. this.shutdown();
  94240. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  94241. this.scene = null;
  94242. this.systems = null;
  94243. }
  94244. });
  94245. PluginCache.register('TweenManager', TweenManager, 'tweens');
  94246. module.exports = TweenManager;
  94247. /***/ }),
  94248. /* 470 */
  94249. /***/ (function(module, exports) {
  94250. /**
  94251. * @author Richard Davey <rich@photonstorm.com>
  94252. * @copyright 2019 Photon Storm Ltd.
  94253. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94254. */
  94255. /**
  94256. * The Timeline Update Event.
  94257. *
  94258. * This event is dispatched by a Tween Timeline every time it updates, which can happen a lot of times per second,
  94259. * so be careful about listening to this event unless you absolutely require it.
  94260. *
  94261. * Listen to it from a Timeline instance using `Timeline.on('update', listener)`, i.e.:
  94262. *
  94263. * ```javascript
  94264. * var timeline = this.tweens.timeline({
  94265. * targets: image,
  94266. * ease: 'Power1',
  94267. * duration: 3000,
  94268. * tweens: [ { x: 600 }, { y: 500 }, { x: 100 }, { y: 100 } ]
  94269. * });
  94270. * timeline.on('update', listener);
  94271. * timeline.play();
  94272. * ```
  94273. *
  94274. * @event Phaser.Tweens.Events#TIMELINE_UPDATE
  94275. *
  94276. * @param {Phaser.Tweens.Timeline} timeline - A reference to the Timeline instance that emitted the event.
  94277. */
  94278. module.exports = 'update';
  94279. /***/ }),
  94280. /* 471 */
  94281. /***/ (function(module, exports) {
  94282. /**
  94283. * @author Richard Davey <rich@photonstorm.com>
  94284. * @copyright 2019 Photon Storm Ltd.
  94285. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94286. */
  94287. /**
  94288. * The Timeline Start Event.
  94289. *
  94290. * This event is dispatched by a Tween Timeline when it starts.
  94291. *
  94292. * Listen to it from a Timeline instance using `Timeline.on('start', listener)`, i.e.:
  94293. *
  94294. * ```javascript
  94295. * var timeline = this.tweens.timeline({
  94296. * targets: image,
  94297. * ease: 'Power1',
  94298. * duration: 3000,
  94299. * tweens: [ { x: 600 }, { y: 500 }, { x: 100 }, { y: 100 } ]
  94300. * });
  94301. * timeline.on('start', listener);
  94302. * timeline.play();
  94303. * ```
  94304. *
  94305. * @event Phaser.Tweens.Events#TIMELINE_START
  94306. *
  94307. * @param {Phaser.Tweens.Timeline} timeline - A reference to the Timeline instance that emitted the event.
  94308. */
  94309. module.exports = 'start';
  94310. /***/ }),
  94311. /* 472 */
  94312. /***/ (function(module, exports) {
  94313. /**
  94314. * @author Richard Davey <rich@photonstorm.com>
  94315. * @copyright 2019 Photon Storm Ltd.
  94316. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94317. */
  94318. /**
  94319. * The Timeline Resume Event.
  94320. *
  94321. * This event is dispatched by a Tween Timeline when it is resumed from a paused state.
  94322. *
  94323. * Listen to it from a Timeline instance using `Timeline.on('resume', listener)`, i.e.:
  94324. *
  94325. * ```javascript
  94326. * var timeline = this.tweens.timeline({
  94327. * targets: image,
  94328. * ease: 'Power1',
  94329. * duration: 3000,
  94330. * tweens: [ { x: 600 }, { y: 500 }, { x: 100 }, { y: 100 } ]
  94331. * });
  94332. * timeline.on('resume', listener);
  94333. * // At some point later ...
  94334. * timeline.resume();
  94335. * ```
  94336. *
  94337. * @event Phaser.Tweens.Events#TIMELINE_RESUME
  94338. *
  94339. * @param {Phaser.Tweens.Timeline} timeline - A reference to the Timeline instance that emitted the event.
  94340. */
  94341. module.exports = 'resume';
  94342. /***/ }),
  94343. /* 473 */
  94344. /***/ (function(module, exports) {
  94345. /**
  94346. * @author Richard Davey <rich@photonstorm.com>
  94347. * @copyright 2019 Photon Storm Ltd.
  94348. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94349. */
  94350. /**
  94351. * The Timeline Pause Event.
  94352. *
  94353. * This event is dispatched by a Tween Timeline when it is paused.
  94354. *
  94355. * Listen to it from a Timeline instance using `Timeline.on('pause', listener)`, i.e.:
  94356. *
  94357. * ```javascript
  94358. * var timeline = this.tweens.timeline({
  94359. * targets: image,
  94360. * ease: 'Power1',
  94361. * duration: 3000,
  94362. * tweens: [ { x: 600 }, { y: 500 }, { x: 100 }, { y: 100 } ]
  94363. * });
  94364. * timeline.on('pause', listener);
  94365. * // At some point later ...
  94366. * timeline.pause();
  94367. * ```
  94368. *
  94369. * @event Phaser.Tweens.Events#TIMELINE_PAUSE
  94370. *
  94371. * @param {Phaser.Tweens.Timeline} timeline - A reference to the Timeline instance that emitted the event.
  94372. */
  94373. module.exports = 'pause';
  94374. /***/ }),
  94375. /* 474 */
  94376. /***/ (function(module, exports) {
  94377. /**
  94378. * @author Richard Davey <rich@photonstorm.com>
  94379. * @copyright 2019 Photon Storm Ltd.
  94380. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94381. */
  94382. /**
  94383. * The Timeline Loop Event.
  94384. *
  94385. * This event is dispatched by a Tween Timeline every time it loops.
  94386. *
  94387. * Listen to it from a Timeline instance using `Timeline.on('loop', listener)`, i.e.:
  94388. *
  94389. * ```javascript
  94390. * var timeline = this.tweens.timeline({
  94391. * targets: image,
  94392. * ease: 'Power1',
  94393. * duration: 3000,
  94394. * loop: 4,
  94395. * tweens: [ { x: 600 }, { y: 500 }, { x: 100 }, { y: 100 } ]
  94396. * });
  94397. * timeline.on('loop', listener);
  94398. * timeline.play();
  94399. * ```
  94400. *
  94401. * @event Phaser.Tweens.Events#TIMELINE_LOOP
  94402. *
  94403. * @param {Phaser.Tweens.Timeline} timeline - A reference to the Timeline instance that emitted the event.
  94404. * @param {integer} loopCount - The number of loops left before this Timeline completes.
  94405. */
  94406. module.exports = 'loop';
  94407. /***/ }),
  94408. /* 475 */
  94409. /***/ (function(module, exports) {
  94410. /**
  94411. * @author Richard Davey <rich@photonstorm.com>
  94412. * @copyright 2019 Photon Storm Ltd.
  94413. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94414. */
  94415. /**
  94416. * The Timeline Complete Event.
  94417. *
  94418. * This event is dispatched by a Tween Timeline when it completes playback.
  94419. *
  94420. * Listen to it from a Timeline instance using `Timeline.on('complete', listener)`, i.e.:
  94421. *
  94422. * ```javascript
  94423. * var timeline = this.tweens.timeline({
  94424. * targets: image,
  94425. * ease: 'Power1',
  94426. * duration: 3000,
  94427. * tweens: [ { x: 600 }, { y: 500 }, { x: 100 }, { y: 100 } ]
  94428. * });
  94429. * timeline.on('complete', listener);
  94430. * timeline.play();
  94431. * ```
  94432. *
  94433. * @event Phaser.Tweens.Events#TIMELINE_COMPLETE
  94434. *
  94435. * @param {Phaser.Tweens.Timeline} timeline - A reference to the Timeline instance that emitted the event.
  94436. */
  94437. module.exports = 'complete';
  94438. /***/ }),
  94439. /* 476 */
  94440. /***/ (function(module, exports) {
  94441. /**
  94442. * @author Richard Davey <rich@photonstorm.com>
  94443. * @copyright 2019 Photon Storm Ltd.
  94444. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94445. */
  94446. // RESERVED properties that a Tween config object uses
  94447. // completeDelay: The time the tween will wait before the onComplete event is dispatched once it has completed
  94448. // delay: The time the tween will wait before it first starts
  94449. // duration: The duration of the tween
  94450. // ease: The ease function used by the tween
  94451. // easeParams: The parameters to go with the ease function (if any)
  94452. // flipX: flip X the GameObject on tween end
  94453. // flipY: flip Y the GameObject on tween end// hold: The time the tween will pause before running a yoyo
  94454. // hold: The time the tween will pause before running a yoyo
  94455. // loop: The time the tween will pause before starting either a yoyo or returning to the start for a repeat
  94456. // loopDelay:
  94457. // offset: Used when the Tween is part of a Timeline
  94458. // paused: Does the tween start in a paused state, or playing?
  94459. // props: The properties being tweened by the tween
  94460. // repeat: The number of times the tween will repeat itself (a value of 1 means the tween will play twice, as it repeated once)
  94461. // repeatDelay: The time the tween will pause for before starting a repeat. The tween holds in the start state.
  94462. // targets: The targets the tween is updating.
  94463. // useFrames: Use frames or milliseconds?
  94464. // yoyo: boolean - Does the tween reverse itself (yoyo) when it reaches the end?
  94465. module.exports = [
  94466. 'callbackScope',
  94467. 'completeDelay',
  94468. 'delay',
  94469. 'duration',
  94470. 'ease',
  94471. 'easeParams',
  94472. 'flipX',
  94473. 'flipY',
  94474. 'hold',
  94475. 'loop',
  94476. 'loopDelay',
  94477. 'offset',
  94478. 'onComplete',
  94479. 'onCompleteParams',
  94480. 'onCompleteScope',
  94481. 'onLoop',
  94482. 'onLoopParams',
  94483. 'onLoopScope',
  94484. 'onRepeat',
  94485. 'onRepeatParams',
  94486. 'onRepeatScope',
  94487. 'onStart',
  94488. 'onStartParams',
  94489. 'onStartScope',
  94490. 'onUpdate',
  94491. 'onUpdateParams',
  94492. 'onUpdateScope',
  94493. 'onYoyo',
  94494. 'onYoyoParams',
  94495. 'onYoyoScope',
  94496. 'paused',
  94497. 'props',
  94498. 'repeat',
  94499. 'repeatDelay',
  94500. 'targets',
  94501. 'useFrames',
  94502. 'yoyo'
  94503. ];
  94504. /***/ }),
  94505. /* 477 */
  94506. /***/ (function(module, exports, __webpack_require__) {
  94507. /**
  94508. * @author Richard Davey <rich@photonstorm.com>
  94509. * @copyright 2019 Photon Storm Ltd.
  94510. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94511. */
  94512. /**
  94513. * @namespace Phaser.Tweens.Builders
  94514. */
  94515. module.exports = {
  94516. GetBoolean: __webpack_require__(90),
  94517. GetEaseFunction: __webpack_require__(92),
  94518. GetNewValue: __webpack_require__(105),
  94519. GetProps: __webpack_require__(221),
  94520. GetTargets: __webpack_require__(143),
  94521. GetTweens: __webpack_require__(220),
  94522. GetValueOp: __webpack_require__(142),
  94523. NumberTweenBuilder: __webpack_require__(219),
  94524. TimelineBuilder: __webpack_require__(218),
  94525. TweenBuilder: __webpack_require__(104)
  94526. };
  94527. /***/ }),
  94528. /* 478 */
  94529. /***/ (function(module, exports, __webpack_require__) {
  94530. /**
  94531. * @author Richard Davey <rich@photonstorm.com>
  94532. * @copyright 2019 Photon Storm Ltd.
  94533. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94534. */
  94535. var CONST = __webpack_require__(89);
  94536. var Extend = __webpack_require__(19);
  94537. /**
  94538. * @namespace Phaser.Tweens
  94539. */
  94540. var Tweens = {
  94541. Builders: __webpack_require__(477),
  94542. Events: __webpack_require__(216),
  94543. TweenManager: __webpack_require__(469),
  94544. Tween: __webpack_require__(140),
  94545. TweenData: __webpack_require__(139),
  94546. Timeline: __webpack_require__(217)
  94547. };
  94548. // Merge in the consts
  94549. Tweens = Extend(false, Tweens, CONST);
  94550. module.exports = Tweens;
  94551. /***/ }),
  94552. /* 479 */
  94553. /***/ (function(module, exports, __webpack_require__) {
  94554. /**
  94555. * @author Richard Davey <rich@photonstorm.com>
  94556. * @copyright 2019 Photon Storm Ltd.
  94557. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94558. */
  94559. var Class = __webpack_require__(0);
  94560. var PluginCache = __webpack_require__(17);
  94561. var SceneEvents = __webpack_require__(16);
  94562. var TimerEvent = __webpack_require__(222);
  94563. /**
  94564. * @classdesc
  94565. * The Clock is a Scene plugin which creates and updates Timer Events for its Scene.
  94566. *
  94567. * @class Clock
  94568. * @memberof Phaser.Time
  94569. * @constructor
  94570. * @since 3.0.0
  94571. *
  94572. * @param {Phaser.Scene} scene - The Scene which owns this Clock.
  94573. */
  94574. var Clock = new Class({
  94575. initialize:
  94576. function Clock (scene)
  94577. {
  94578. /**
  94579. * The Scene which owns this Clock.
  94580. *
  94581. * @name Phaser.Time.Clock#scene
  94582. * @type {Phaser.Scene}
  94583. * @since 3.0.0
  94584. */
  94585. this.scene = scene;
  94586. /**
  94587. * The Scene Systems object of the Scene which owns this Clock.
  94588. *
  94589. * @name Phaser.Time.Clock#systems
  94590. * @type {Phaser.Scenes.Systems}
  94591. * @since 3.0.0
  94592. */
  94593. this.systems = scene.sys;
  94594. /**
  94595. * The current time of the Clock, in milliseconds.
  94596. *
  94597. * If accessed externally, this is equivalent to the `time` parameter normally passed to a Scene's `update` method.
  94598. *
  94599. * @name Phaser.Time.Clock#now
  94600. * @type {number}
  94601. * @since 3.0.0
  94602. */
  94603. this.now = Date.now();
  94604. // Scale the delta time coming into the Clock by this factor
  94605. // which then influences anything using this Clock for calculations, like TimerEvents
  94606. /**
  94607. * The scale of the Clock's time delta.
  94608. *
  94609. * The time delta is the time elapsed between two consecutive frames and influences the speed of time for this Clock and anything which uses it, such as its Timer Events. Values higher than 1 increase the speed of time, while values smaller than 1 decrease it. A value of 0 freezes time and is effectively equivalent to pausing the Clock.
  94610. *
  94611. * @name Phaser.Time.Clock#timeScale
  94612. * @type {number}
  94613. * @default 1
  94614. * @since 3.0.0
  94615. */
  94616. this.timeScale = 1;
  94617. /**
  94618. * Whether the Clock is paused (`true`) or active (`false`).
  94619. *
  94620. * When paused, the Clock will not update any of its Timer Events, thus freezing time.
  94621. *
  94622. * @name Phaser.Time.Clock#paused
  94623. * @type {boolean}
  94624. * @default false
  94625. * @since 3.0.0
  94626. */
  94627. this.paused = false;
  94628. /**
  94629. * An array of all Timer Events whose delays haven't expired - these are actively updating Timer Events.
  94630. *
  94631. * @name Phaser.Time.Clock#_active
  94632. * @type {Phaser.Time.TimerEvent[]}
  94633. * @private
  94634. * @default []
  94635. * @since 3.0.0
  94636. */
  94637. this._active = [];
  94638. /**
  94639. * An array of all Timer Events which will be added to the Clock at the start of the frame.
  94640. *
  94641. * @name Phaser.Time.Clock#_pendingInsertion
  94642. * @type {Phaser.Time.TimerEvent[]}
  94643. * @private
  94644. * @default []
  94645. * @since 3.0.0
  94646. */
  94647. this._pendingInsertion = [];
  94648. /**
  94649. * An array of all Timer Events which will be removed from the Clock at the start of the frame.
  94650. *
  94651. * @name Phaser.Time.Clock#_pendingRemoval
  94652. * @type {Phaser.Time.TimerEvent[]}
  94653. * @private
  94654. * @default []
  94655. * @since 3.0.0
  94656. */
  94657. this._pendingRemoval = [];
  94658. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  94659. scene.sys.events.on(SceneEvents.START, this.start, this);
  94660. },
  94661. /**
  94662. * This method is called automatically, only once, when the Scene is first created.
  94663. * Do not invoke it directly.
  94664. *
  94665. * @method Phaser.Time.Clock#boot
  94666. * @private
  94667. * @since 3.5.1
  94668. */
  94669. boot: function ()
  94670. {
  94671. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  94672. },
  94673. /**
  94674. * This method is called automatically by the Scene when it is starting up.
  94675. * It is responsible for creating local systems, properties and listening for Scene events.
  94676. * Do not invoke it directly.
  94677. *
  94678. * @method Phaser.Time.Clock#start
  94679. * @private
  94680. * @since 3.5.0
  94681. */
  94682. start: function ()
  94683. {
  94684. var eventEmitter = this.systems.events;
  94685. eventEmitter.on(SceneEvents.PRE_UPDATE, this.preUpdate, this);
  94686. eventEmitter.on(SceneEvents.UPDATE, this.update, this);
  94687. eventEmitter.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  94688. },
  94689. /**
  94690. * Creates a Timer Event and adds it to the Clock at the start of the frame.
  94691. *
  94692. * @method Phaser.Time.Clock#addEvent
  94693. * @since 3.0.0
  94694. *
  94695. * @param {TimerEventConfig} config - The configuration for the Timer Event.
  94696. *
  94697. * @return {Phaser.Time.TimerEvent} The Timer Event which was created.
  94698. */
  94699. addEvent: function (config)
  94700. {
  94701. var event = new TimerEvent(config);
  94702. this._pendingInsertion.push(event);
  94703. return event;
  94704. },
  94705. /**
  94706. * Creates a Timer Event and adds it to the Clock at the start of the frame.
  94707. *
  94708. * This is a shortcut for {@link #addEvent} which can be shorter and is compatible with the syntax of the GreenSock Animation Platform (GSAP).
  94709. *
  94710. * @method Phaser.Time.Clock#delayedCall
  94711. * @since 3.0.0
  94712. *
  94713. * @param {number} delay - The delay of the function call, in milliseconds.
  94714. * @param {function} callback - The function to call after the delay expires.
  94715. * @param {Array.<*>} args - The arguments to call the function with.
  94716. * @param {*} callbackScope - The scope (`this` object) to call the function with.
  94717. *
  94718. * @return {Phaser.Time.TimerEvent} The Timer Event which was created.
  94719. */
  94720. delayedCall: function (delay, callback, args, callbackScope)
  94721. {
  94722. return this.addEvent({ delay: delay, callback: callback, args: args, callbackScope: callbackScope });
  94723. },
  94724. /**
  94725. * Clears and recreates the array of pending Timer Events.
  94726. *
  94727. * @method Phaser.Time.Clock#clearPendingEvents
  94728. * @since 3.0.0
  94729. *
  94730. * @return {Phaser.Time.Clock} This Clock object.
  94731. */
  94732. clearPendingEvents: function ()
  94733. {
  94734. this._pendingInsertion = [];
  94735. return this;
  94736. },
  94737. /**
  94738. * Schedules all active Timer Events for removal at the start of the frame.
  94739. *
  94740. * @method Phaser.Time.Clock#removeAllEvents
  94741. * @since 3.0.0
  94742. *
  94743. * @return {Phaser.Time.Clock} This Clock object.
  94744. */
  94745. removeAllEvents: function ()
  94746. {
  94747. this._pendingRemoval = this._pendingRemoval.concat(this._active);
  94748. return this;
  94749. },
  94750. /**
  94751. * Updates the arrays of active and pending Timer Events. Called at the start of the frame.
  94752. *
  94753. * @method Phaser.Time.Clock#preUpdate
  94754. * @since 3.0.0
  94755. *
  94756. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  94757. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  94758. */
  94759. preUpdate: function ()
  94760. {
  94761. var toRemove = this._pendingRemoval.length;
  94762. var toInsert = this._pendingInsertion.length;
  94763. if (toRemove === 0 && toInsert === 0)
  94764. {
  94765. // Quick bail
  94766. return;
  94767. }
  94768. var i;
  94769. var event;
  94770. // Delete old events
  94771. for (i = 0; i < toRemove; i++)
  94772. {
  94773. event = this._pendingRemoval[i];
  94774. var index = this._active.indexOf(event);
  94775. if (index > -1)
  94776. {
  94777. this._active.splice(index, 1);
  94778. }
  94779. // Pool them?
  94780. event.destroy();
  94781. }
  94782. for (i = 0; i < toInsert; i++)
  94783. {
  94784. event = this._pendingInsertion[i];
  94785. this._active.push(event);
  94786. }
  94787. // Clear the lists
  94788. this._pendingRemoval.length = 0;
  94789. this._pendingInsertion.length = 0;
  94790. },
  94791. /**
  94792. * Updates the Clock's internal time and all of its Timer Events.
  94793. *
  94794. * @method Phaser.Time.Clock#update
  94795. * @since 3.0.0
  94796. *
  94797. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  94798. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  94799. */
  94800. update: function (time, delta)
  94801. {
  94802. this.now = time;
  94803. if (this.paused)
  94804. {
  94805. return;
  94806. }
  94807. delta *= this.timeScale;
  94808. for (var i = 0; i < this._active.length; i++)
  94809. {
  94810. var event = this._active[i];
  94811. if (event.paused)
  94812. {
  94813. continue;
  94814. }
  94815. // Use delta time to increase elapsed.
  94816. // Avoids needing to adjust for pause / resume.
  94817. // Automatically smoothed by TimeStep class.
  94818. // In testing accurate to +- 1ms!
  94819. event.elapsed += delta * event.timeScale;
  94820. if (event.elapsed >= event.delay)
  94821. {
  94822. var remainder = event.elapsed - event.delay;
  94823. // Limit it, in case it's checked in the callback
  94824. event.elapsed = event.delay;
  94825. // Process the event
  94826. if (!event.hasDispatched && event.callback)
  94827. {
  94828. event.hasDispatched = true;
  94829. event.callback.apply(event.callbackScope, event.args);
  94830. }
  94831. if (event.repeatCount > 0)
  94832. {
  94833. event.repeatCount--;
  94834. event.elapsed = remainder;
  94835. event.hasDispatched = false;
  94836. }
  94837. else
  94838. {
  94839. this._pendingRemoval.push(event);
  94840. }
  94841. }
  94842. }
  94843. },
  94844. /**
  94845. * The Scene that owns this plugin is shutting down.
  94846. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  94847. *
  94848. * @method Phaser.Time.Clock#shutdown
  94849. * @private
  94850. * @since 3.0.0
  94851. */
  94852. shutdown: function ()
  94853. {
  94854. var i;
  94855. for (i = 0; i < this._pendingInsertion.length; i++)
  94856. {
  94857. this._pendingInsertion[i].destroy();
  94858. }
  94859. for (i = 0; i < this._active.length; i++)
  94860. {
  94861. this._active[i].destroy();
  94862. }
  94863. for (i = 0; i < this._pendingRemoval.length; i++)
  94864. {
  94865. this._pendingRemoval[i].destroy();
  94866. }
  94867. this._active.length = 0;
  94868. this._pendingRemoval.length = 0;
  94869. this._pendingInsertion.length = 0;
  94870. var eventEmitter = this.systems.events;
  94871. eventEmitter.off(SceneEvents.PRE_UPDATE, this.preUpdate, this);
  94872. eventEmitter.off(SceneEvents.UPDATE, this.update, this);
  94873. eventEmitter.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  94874. },
  94875. /**
  94876. * The Scene that owns this plugin is being destroyed.
  94877. * We need to shutdown and then kill off all external references.
  94878. *
  94879. * @method Phaser.Time.Clock#destroy
  94880. * @private
  94881. * @since 3.0.0
  94882. */
  94883. destroy: function ()
  94884. {
  94885. this.shutdown();
  94886. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  94887. this.scene = null;
  94888. this.systems = null;
  94889. }
  94890. });
  94891. PluginCache.register('Clock', Clock, 'time');
  94892. module.exports = Clock;
  94893. /***/ }),
  94894. /* 480 */
  94895. /***/ (function(module, exports, __webpack_require__) {
  94896. /**
  94897. * @author Richard Davey <rich@photonstorm.com>
  94898. * @copyright 2019 Photon Storm Ltd.
  94899. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94900. */
  94901. /**
  94902. * @namespace Phaser.Time
  94903. */
  94904. module.exports = {
  94905. Clock: __webpack_require__(479),
  94906. TimerEvent: __webpack_require__(222)
  94907. };
  94908. /***/ }),
  94909. /* 481 */
  94910. /***/ (function(module, exports, __webpack_require__) {
  94911. /**
  94912. * @author Richard Davey <rich@photonstorm.com>
  94913. * @copyright 2019 Photon Storm Ltd.
  94914. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94915. */
  94916. var GameObjectFactory = __webpack_require__(5);
  94917. var ParseToTilemap = __webpack_require__(144);
  94918. /**
  94919. * Creates a Tilemap from the given key or data, or creates a blank Tilemap if no key/data provided.
  94920. * When loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing
  94921. * from a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map
  94922. * data. For an empty map, you should specify tileWidth, tileHeight, width & height.
  94923. *
  94924. * @method Phaser.GameObjects.GameObjectFactory#tilemap
  94925. * @since 3.0.0
  94926. *
  94927. * @param {string} [key] - The key in the Phaser cache that corresponds to the loaded tilemap data.
  94928. * @param {integer} [tileWidth=32] - The width of a tile in pixels. Pass in `null` to leave as the
  94929. * default.
  94930. * @param {integer} [tileHeight=32] - The height of a tile in pixels. Pass in `null` to leave as the
  94931. * default.
  94932. * @param {integer} [width=10] - The width of the map in tiles. Pass in `null` to leave as the
  94933. * default.
  94934. * @param {integer} [height=10] - The height of the map in tiles. Pass in `null` to leave as the
  94935. * default.
  94936. * @param {integer[][]} [data] - Instead of loading from the cache, you can also load directly from
  94937. * a 2D array of tile indexes. Pass in `null` for no data.
  94938. * @param {boolean} [insertNull=false] - Controls how empty tiles, tiles with an index of -1, in the
  94939. * map data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  94940. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  94941. * the tile data doesn't need to change then setting this value to `true` will help with memory
  94942. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  94943. * the default value set.
  94944. *
  94945. * @return {Phaser.Tilemaps.Tilemap}
  94946. */
  94947. GameObjectFactory.register('tilemap', function (key, tileWidth, tileHeight, width, height, data, insertNull)
  94948. {
  94949. // Allow users to specify null to indicate that they want the default value, since null is
  94950. // shorter & more legible than undefined. Convert null to undefined to allow ParseToTilemap
  94951. // defaults to take effect.
  94952. if (key === null) { key = undefined; }
  94953. if (tileWidth === null) { tileWidth = undefined; }
  94954. if (tileHeight === null) { tileHeight = undefined; }
  94955. if (width === null) { width = undefined; }
  94956. if (height === null) { height = undefined; }
  94957. return ParseToTilemap(this.scene, key, tileWidth, tileHeight, width, height, data, insertNull);
  94958. });
  94959. // When registering a factory function 'this' refers to the GameObjectFactory context.
  94960. //
  94961. // There are several properties available to use:
  94962. //
  94963. // this.scene - a reference to the Scene that owns the GameObjectFactory
  94964. // this.displayList - a reference to the Display List the Scene owns
  94965. // this.updateList - a reference to the Update List the Scene owns
  94966. /***/ }),
  94967. /* 482 */
  94968. /***/ (function(module, exports, __webpack_require__) {
  94969. /**
  94970. * @author Richard Davey <rich@photonstorm.com>
  94971. * @copyright 2019 Photon Storm Ltd.
  94972. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94973. */
  94974. var GameObjectCreator = __webpack_require__(14);
  94975. var ParseToTilemap = __webpack_require__(144);
  94976. /**
  94977. * @typedef {object} TilemapConfig
  94978. *
  94979. * @property {string} [key] - The key in the Phaser cache that corresponds to the loaded tilemap data.
  94980. * @property {integer[][]} [data] - Instead of loading from the cache, you can also load directly from a 2D array of tile indexes.
  94981. * @property {integer} [tileWidth=32] - The width of a tile in pixels.
  94982. * @property {integer} [tileHeight=32] - The height of a tile in pixels.
  94983. * @property {integer} [width=10] - The width of the map in tiles.
  94984. * @property {integer} [height=10] - The height of the map in tiles.
  94985. * @property {boolean} [insertNull=false] - Controls how empty tiles, tiles with an index of -1,
  94986. * in the map data are handled. If `true`, empty locations will get a value of `null`. If `false`,
  94987. * empty location will get a Tile object with an index of -1. If you've a large sparsely populated
  94988. * map and the tile data doesn't need to change then setting this value to `true` will help with
  94989. * memory consumption. However if your map is small or you need to update the tiles dynamically,
  94990. * then leave the default value set.
  94991. */
  94992. /**
  94993. * Creates a Tilemap from the given key or data, or creates a blank Tilemap if no key/data provided.
  94994. * When loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing
  94995. * from a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map
  94996. * data. For an empty map, you should specify tileWidth, tileHeight, width & height.
  94997. *
  94998. * @method Phaser.GameObjects.GameObjectCreator#tilemap
  94999. * @since 3.0.0
  95000. *
  95001. * @param {TilemapConfig} [config] - The config options for the Tilemap.
  95002. *
  95003. * @return {Phaser.Tilemaps.Tilemap}
  95004. */
  95005. GameObjectCreator.register('tilemap', function (config)
  95006. {
  95007. // Defaults are applied in ParseToTilemap
  95008. var c = (config !== undefined) ? config : {};
  95009. return ParseToTilemap(
  95010. this.scene,
  95011. c.key,
  95012. c.tileWidth,
  95013. c.tileHeight,
  95014. c.width,
  95015. c.height,
  95016. c.data,
  95017. c.insertNull
  95018. );
  95019. });
  95020. /***/ }),
  95021. /* 483 */
  95022. /***/ (function(module, exports) {
  95023. /**
  95024. * @author Richard Davey <rich@photonstorm.com>
  95025. * @copyright 2019 Photon Storm Ltd.
  95026. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95027. */
  95028. /**
  95029. * Renders this Game Object with the Canvas Renderer to the given Camera.
  95030. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  95031. * This method should not be called directly. It is a utility function of the Render module.
  95032. *
  95033. * @method Phaser.Tilemaps.StaticTilemapLayer#renderCanvas
  95034. * @since 3.0.0
  95035. * @private
  95036. *
  95037. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  95038. * @param {Phaser.Tilemaps.StaticTilemapLayer} src - The Game Object being rendered in this call.
  95039. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  95040. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  95041. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  95042. */
  95043. var StaticTilemapLayerCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  95044. {
  95045. src.cull(camera);
  95046. var renderTiles = src.culledTiles;
  95047. var tileCount = renderTiles.length;
  95048. if (tileCount === 0)
  95049. {
  95050. return;
  95051. }
  95052. var camMatrix = renderer._tempMatrix1;
  95053. var layerMatrix = renderer._tempMatrix2;
  95054. var calcMatrix = renderer._tempMatrix3;
  95055. layerMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  95056. camMatrix.copyFrom(camera.matrix);
  95057. var ctx = renderer.currentContext;
  95058. var gidMap = src.gidMap;
  95059. ctx.save();
  95060. if (parentMatrix)
  95061. {
  95062. // Multiply the camera by the parent matrix
  95063. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  95064. // Undo the camera scroll
  95065. layerMatrix.e = src.x;
  95066. layerMatrix.f = src.y;
  95067. camMatrix.multiply(layerMatrix, calcMatrix);
  95068. calcMatrix.copyToContext(ctx);
  95069. }
  95070. else
  95071. {
  95072. // Undo the camera scroll
  95073. layerMatrix.e -= camera.scrollX * src.scrollFactorX;
  95074. layerMatrix.f -= camera.scrollY * src.scrollFactorY;
  95075. layerMatrix.copyToContext(ctx);
  95076. }
  95077. var alpha = camera.alpha * src.alpha;
  95078. ctx.globalAlpha = camera.alpha * src.alpha;
  95079. for (var i = 0; i < tileCount; i++)
  95080. {
  95081. var tile = renderTiles[i];
  95082. var tileset = gidMap[tile.index];
  95083. if (!tileset)
  95084. {
  95085. continue;
  95086. }
  95087. var image = tileset.image.getSourceImage();
  95088. var tileTexCoords = tileset.getTileTextureCoordinates(tile.index);
  95089. if (tileTexCoords)
  95090. {
  95091. var tileWidth = tileset.tileWidth;
  95092. var tileHeight = tileset.tileHeight;
  95093. var halfWidth = tileWidth / 2;
  95094. var halfHeight = tileHeight / 2;
  95095. ctx.save();
  95096. ctx.translate(tile.pixelX + halfWidth, tile.pixelY + halfHeight);
  95097. if (tile.rotation !== 0)
  95098. {
  95099. ctx.rotate(tile.rotation);
  95100. }
  95101. if (tile.flipX || tile.flipY)
  95102. {
  95103. ctx.scale((tile.flipX) ? -1 : 1, (tile.flipY) ? -1 : 1);
  95104. }
  95105. ctx.globalAlpha = alpha * tile.alpha;
  95106. ctx.drawImage(
  95107. image,
  95108. tileTexCoords.x, tileTexCoords.y,
  95109. tileWidth, tileHeight,
  95110. -halfWidth, -halfHeight,
  95111. tileWidth, tileHeight
  95112. );
  95113. ctx.restore();
  95114. }
  95115. }
  95116. ctx.restore();
  95117. };
  95118. module.exports = StaticTilemapLayerCanvasRenderer;
  95119. /***/ }),
  95120. /* 484 */
  95121. /***/ (function(module, exports) {
  95122. /**
  95123. * @author Richard Davey <rich@photonstorm.com>
  95124. * @copyright 2019 Photon Storm Ltd.
  95125. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95126. */
  95127. /**
  95128. * Renders this Game Object with the WebGL Renderer to the given Camera.
  95129. *
  95130. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  95131. * This method should not be called directly. It is a utility function of the Render module.
  95132. *
  95133. * A Static Tilemap Layer renders immediately and does not use any batching.
  95134. *
  95135. * @method Phaser.Tilemaps.StaticTilemapLayer#renderWebGL
  95136. * @since 3.0.0
  95137. * @private
  95138. *
  95139. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  95140. * @param {Phaser.Tilemaps.StaticTilemapLayer} src - The Game Object being rendered in this call.
  95141. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  95142. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  95143. */
  95144. var StaticTilemapLayerWebGLRenderer = function (renderer, src, interpolationPercentage, camera)
  95145. {
  95146. var tilesets = src.tileset;
  95147. var pipeline = src.pipeline;
  95148. var pipelineVertexBuffer = pipeline.vertexBuffer;
  95149. renderer.setPipeline(pipeline);
  95150. pipeline.modelIdentity();
  95151. pipeline.modelTranslate(src.x - (camera.scrollX * src.scrollFactorX), src.y - (camera.scrollY * src.scrollFactorY), 0);
  95152. pipeline.modelScale(src.scaleX, src.scaleY, 1);
  95153. pipeline.viewLoad2D(camera.matrix.matrix);
  95154. for (var i = 0; i < tilesets.length; i++)
  95155. {
  95156. src.upload(camera, i);
  95157. if (src.vertexCount[i] > 0)
  95158. {
  95159. if (renderer.currentPipeline && renderer.currentPipeline.vertexCount > 0)
  95160. {
  95161. renderer.flush();
  95162. }
  95163. pipeline.vertexBuffer = src.vertexBuffer[i];
  95164. renderer.setPipeline(pipeline);
  95165. renderer.setTexture2D(tilesets[i].glTexture, 0);
  95166. renderer.gl.drawArrays(pipeline.topology, 0, src.vertexCount[i]);
  95167. }
  95168. }
  95169. // Restore the pipeline
  95170. pipeline.vertexBuffer = pipelineVertexBuffer;
  95171. pipeline.viewIdentity();
  95172. pipeline.modelIdentity();
  95173. };
  95174. module.exports = StaticTilemapLayerWebGLRenderer;
  95175. /***/ }),
  95176. /* 485 */
  95177. /***/ (function(module, exports, __webpack_require__) {
  95178. /**
  95179. * @author Richard Davey <rich@photonstorm.com>
  95180. * @copyright 2019 Photon Storm Ltd.
  95181. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95182. */
  95183. var renderWebGL = __webpack_require__(1);
  95184. var renderCanvas = __webpack_require__(1);
  95185. if (true)
  95186. {
  95187. renderWebGL = __webpack_require__(484);
  95188. }
  95189. if (true)
  95190. {
  95191. renderCanvas = __webpack_require__(483);
  95192. }
  95193. module.exports = {
  95194. renderWebGL: renderWebGL,
  95195. renderCanvas: renderCanvas
  95196. };
  95197. /***/ }),
  95198. /* 486 */
  95199. /***/ (function(module, exports) {
  95200. /**
  95201. * @author Richard Davey <rich@photonstorm.com>
  95202. * @copyright 2019 Photon Storm Ltd.
  95203. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95204. */
  95205. /**
  95206. * Renders this Game Object with the Canvas Renderer to the given Camera.
  95207. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  95208. * This method should not be called directly. It is a utility function of the Render module.
  95209. *
  95210. * @method Phaser.Tilemaps.DynamicTilemapLayer#renderCanvas
  95211. * @since 3.0.0
  95212. * @private
  95213. *
  95214. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  95215. * @param {Phaser.Tilemaps.DynamicTilemapLayer} src - The Game Object being rendered in this call.
  95216. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  95217. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  95218. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  95219. */
  95220. var DynamicTilemapLayerCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  95221. {
  95222. src.cull(camera);
  95223. var renderTiles = src.culledTiles;
  95224. var tileCount = renderTiles.length;
  95225. if (tileCount === 0)
  95226. {
  95227. return;
  95228. }
  95229. var camMatrix = renderer._tempMatrix1;
  95230. var layerMatrix = renderer._tempMatrix2;
  95231. var calcMatrix = renderer._tempMatrix3;
  95232. layerMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  95233. camMatrix.copyFrom(camera.matrix);
  95234. var ctx = renderer.currentContext;
  95235. var gidMap = src.gidMap;
  95236. ctx.save();
  95237. if (parentMatrix)
  95238. {
  95239. // Multiply the camera by the parent matrix
  95240. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  95241. // Undo the camera scroll
  95242. layerMatrix.e = src.x;
  95243. layerMatrix.f = src.y;
  95244. // Multiply by the Sprite matrix, store result in calcMatrix
  95245. camMatrix.multiply(layerMatrix, calcMatrix);
  95246. calcMatrix.copyToContext(ctx);
  95247. }
  95248. else
  95249. {
  95250. layerMatrix.e -= camera.scrollX * src.scrollFactorX;
  95251. layerMatrix.f -= camera.scrollY * src.scrollFactorY;
  95252. layerMatrix.copyToContext(ctx);
  95253. }
  95254. var alpha = camera.alpha * src.alpha;
  95255. for (var i = 0; i < tileCount; i++)
  95256. {
  95257. var tile = renderTiles[i];
  95258. var tileset = gidMap[tile.index];
  95259. if (!tileset)
  95260. {
  95261. continue;
  95262. }
  95263. var image = tileset.image.getSourceImage();
  95264. var tileTexCoords = tileset.getTileTextureCoordinates(tile.index);
  95265. if (tileTexCoords)
  95266. {
  95267. var halfWidth = tile.width / 2;
  95268. var halfHeight = tile.height / 2;
  95269. ctx.save();
  95270. ctx.translate(tile.pixelX + halfWidth, tile.pixelY + halfHeight);
  95271. if (tile.rotation !== 0)
  95272. {
  95273. ctx.rotate(tile.rotation);
  95274. }
  95275. if (tile.flipX || tile.flipY)
  95276. {
  95277. ctx.scale((tile.flipX) ? -1 : 1, (tile.flipY) ? -1 : 1);
  95278. }
  95279. ctx.globalAlpha = alpha * tile.alpha;
  95280. ctx.drawImage(
  95281. image,
  95282. tileTexCoords.x, tileTexCoords.y,
  95283. tile.width, tile.height,
  95284. -halfWidth, -halfHeight,
  95285. tile.width, tile.height
  95286. );
  95287. ctx.restore();
  95288. }
  95289. }
  95290. ctx.restore();
  95291. };
  95292. module.exports = DynamicTilemapLayerCanvasRenderer;
  95293. /***/ }),
  95294. /* 487 */
  95295. /***/ (function(module, exports, __webpack_require__) {
  95296. /**
  95297. * @author Richard Davey <rich@photonstorm.com>
  95298. * @copyright 2019 Photon Storm Ltd.
  95299. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95300. */
  95301. var Utils = __webpack_require__(9);
  95302. /**
  95303. * Renders this Game Object with the WebGL Renderer to the given Camera.
  95304. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  95305. * This method should not be called directly. It is a utility function of the Render module.
  95306. *
  95307. * @method Phaser.Tilemaps.DynamicTilemapLayer#renderWebGL
  95308. * @since 3.0.0
  95309. * @private
  95310. *
  95311. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  95312. * @param {Phaser.Tilemaps.DynamicTilemapLayer} src - The Game Object being rendered in this call.
  95313. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  95314. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  95315. */
  95316. var DynamicTilemapLayerWebGLRenderer = function (renderer, src, interpolationPercentage, camera)
  95317. {
  95318. src.cull(camera);
  95319. var renderTiles = src.culledTiles;
  95320. var tileCount = renderTiles.length;
  95321. var alpha = camera.alpha * src.alpha;
  95322. if (tileCount === 0 || alpha <= 0)
  95323. {
  95324. return;
  95325. }
  95326. var gidMap = src.gidMap;
  95327. var pipeline = src.pipeline;
  95328. var getTint = Utils.getTintAppendFloatAlpha;
  95329. var scrollFactorX = src.scrollFactorX;
  95330. var scrollFactorY = src.scrollFactorY;
  95331. var x = src.x;
  95332. var y = src.y;
  95333. var sx = src.scaleX;
  95334. var sy = src.scaleY;
  95335. var tilesets = src.tileset;
  95336. // Loop through each tileset in this layer, drawing just the tiles that are in that set each time
  95337. // Doing it this way around allows us to batch tiles using the same tileset
  95338. for (var c = 0; c < tilesets.length; c++)
  95339. {
  95340. var currentSet = tilesets[c];
  95341. var texture = currentSet.glTexture;
  95342. for (var i = 0; i < tileCount; i++)
  95343. {
  95344. var tile = renderTiles[i];
  95345. var tileset = gidMap[tile.index];
  95346. if (tileset !== currentSet)
  95347. {
  95348. // Skip tiles that aren't in this set
  95349. continue;
  95350. }
  95351. var tileTexCoords = tileset.getTileTextureCoordinates(tile.index);
  95352. if (tileTexCoords === null)
  95353. {
  95354. continue;
  95355. }
  95356. var frameWidth = tile.width;
  95357. var frameHeight = tile.height;
  95358. var frameX = tileTexCoords.x;
  95359. var frameY = tileTexCoords.y;
  95360. var tw = tile.width * 0.5;
  95361. var th = tile.height * 0.5;
  95362. var tint = getTint(tile.tint, alpha * tile.alpha);
  95363. pipeline.batchTexture(
  95364. src,
  95365. texture,
  95366. texture.width, texture.height,
  95367. x + ((tw + tile.pixelX) * sx), y + ((th + tile.pixelY) * sy),
  95368. tile.width, tile.height,
  95369. sx, sy,
  95370. tile.rotation,
  95371. tile.flipX, tile.flipY,
  95372. scrollFactorX, scrollFactorY,
  95373. tw, th,
  95374. frameX, frameY, frameWidth, frameHeight,
  95375. tint, tint, tint, tint, false,
  95376. 0, 0,
  95377. camera,
  95378. null,
  95379. true
  95380. );
  95381. }
  95382. }
  95383. };
  95384. module.exports = DynamicTilemapLayerWebGLRenderer;
  95385. /***/ }),
  95386. /* 488 */
  95387. /***/ (function(module, exports, __webpack_require__) {
  95388. /**
  95389. * @author Richard Davey <rich@photonstorm.com>
  95390. * @copyright 2019 Photon Storm Ltd.
  95391. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95392. */
  95393. var renderWebGL = __webpack_require__(1);
  95394. var renderCanvas = __webpack_require__(1);
  95395. if (true)
  95396. {
  95397. renderWebGL = __webpack_require__(487);
  95398. }
  95399. if (true)
  95400. {
  95401. renderCanvas = __webpack_require__(486);
  95402. }
  95403. module.exports = {
  95404. renderWebGL: renderWebGL,
  95405. renderCanvas: renderCanvas
  95406. };
  95407. /***/ }),
  95408. /* 489 */
  95409. /***/ (function(module, exports, __webpack_require__) {
  95410. /**
  95411. * @author Richard Davey <rich@photonstorm.com>
  95412. * @copyright 2019 Photon Storm Ltd.
  95413. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95414. */
  95415. var Tileset = __webpack_require__(106);
  95416. /**
  95417. * [description]
  95418. *
  95419. * @function Phaser.Tilemaps.Parsers.Impact.ParseTilesets
  95420. * @since 3.0.0
  95421. *
  95422. * @param {object} json - [description]
  95423. *
  95424. * @return {array} [description]
  95425. */
  95426. var ParseTilesets = function (json)
  95427. {
  95428. var tilesets = [];
  95429. var tilesetsNames = [];
  95430. for (var i = 0; i < json.layer.length; i++)
  95431. {
  95432. var layer = json.layer[i];
  95433. // A relative filepath to the source image (within Weltmeister) is used for the name
  95434. var tilesetName = layer.tilesetName;
  95435. // Only add unique tilesets that have a valid name. Collision layers will have a blank name.
  95436. if (tilesetName !== '' && tilesetsNames.indexOf(tilesetName) === -1)
  95437. {
  95438. tilesetsNames.push(tilesetName);
  95439. // Tiles are stored with an ID relative to the tileset, rather than a globally unique ID
  95440. // across all tilesets. Also, tilesets in Weltmeister have no margin or padding.
  95441. tilesets.push(new Tileset(tilesetName, 0, layer.tilesize, layer.tilesize, 0, 0));
  95442. }
  95443. }
  95444. return tilesets;
  95445. };
  95446. module.exports = ParseTilesets;
  95447. /***/ }),
  95448. /* 490 */
  95449. /***/ (function(module, exports, __webpack_require__) {
  95450. /**
  95451. * @author Richard Davey <rich@photonstorm.com>
  95452. * @copyright 2019 Photon Storm Ltd.
  95453. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95454. */
  95455. var LayerData = __webpack_require__(84);
  95456. var Tile = __webpack_require__(61);
  95457. /**
  95458. * [description]
  95459. *
  95460. * @function Phaser.Tilemaps.Parsers.Impact.ParseTileLayers
  95461. * @since 3.0.0
  95462. *
  95463. * @param {object} json - [description]
  95464. * @param {boolean} insertNull - [description]
  95465. *
  95466. * @return {array} [description]
  95467. */
  95468. var ParseTileLayers = function (json, insertNull)
  95469. {
  95470. var tileLayers = [];
  95471. for (var i = 0; i < json.layer.length; i++)
  95472. {
  95473. var layer = json.layer[i];
  95474. var layerData = new LayerData({
  95475. name: layer.name,
  95476. width: layer.width,
  95477. height: layer.height,
  95478. tileWidth: layer.tilesize,
  95479. tileHeight: layer.tilesize,
  95480. visible: layer.visible === 1
  95481. });
  95482. var row = [];
  95483. var tileGrid = [];
  95484. // Loop through the data field in the JSON. This is a 2D array containing the tile indexes,
  95485. // one after the other. The indexes are relative to the tileset that contains the tile.
  95486. for (var y = 0; y < layer.data.length; y++)
  95487. {
  95488. for (var x = 0; x < layer.data[y].length; x++)
  95489. {
  95490. // In Weltmeister, 0 = no tile, but the Tilemap API expects -1 = no tile.
  95491. var index = layer.data[y][x] - 1;
  95492. var tile;
  95493. if (index > -1)
  95494. {
  95495. tile = new Tile(layerData, index, x, y, layer.tilesize, layer.tilesize);
  95496. }
  95497. else
  95498. {
  95499. tile = insertNull
  95500. ? null
  95501. : new Tile(layerData, -1, x, y, layer.tilesize, layer.tilesize);
  95502. }
  95503. row.push(tile);
  95504. }
  95505. tileGrid.push(row);
  95506. row = [];
  95507. }
  95508. layerData.data = tileGrid;
  95509. tileLayers.push(layerData);
  95510. }
  95511. return tileLayers;
  95512. };
  95513. module.exports = ParseTileLayers;
  95514. /***/ }),
  95515. /* 491 */
  95516. /***/ (function(module, exports, __webpack_require__) {
  95517. /**
  95518. * @author Richard Davey <rich@photonstorm.com>
  95519. * @copyright 2019 Photon Storm Ltd.
  95520. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95521. */
  95522. var Extend = __webpack_require__(19);
  95523. /**
  95524. * Copy properties from tileset to tiles.
  95525. *
  95526. * @function Phaser.Tilemaps.Parsers.Tiled.AssignTileProperties
  95527. * @since 3.0.0
  95528. *
  95529. * @param {Phaser.Tilemaps.MapData} mapData - [description]
  95530. */
  95531. var AssignTileProperties = function (mapData)
  95532. {
  95533. var layerData;
  95534. var tile;
  95535. var sid;
  95536. var set;
  95537. var row;
  95538. // go through each of the map data layers
  95539. for (var i = 0; i < mapData.layers.length; i++)
  95540. {
  95541. layerData = mapData.layers[i];
  95542. set = null;
  95543. // rows of tiles
  95544. for (var j = 0; j < layerData.data.length; j++)
  95545. {
  95546. row = layerData.data[j];
  95547. // individual tiles
  95548. for (var k = 0; k < row.length; k++)
  95549. {
  95550. tile = row[k];
  95551. if (tile === null || tile.index < 0)
  95552. {
  95553. continue;
  95554. }
  95555. // find the relevant tileset
  95556. sid = mapData.tiles[tile.index][2];
  95557. set = mapData.tilesets[sid];
  95558. // Ensure that a tile's size matches its tileset
  95559. tile.width = set.tileWidth;
  95560. tile.height = set.tileHeight;
  95561. // if that tile type has any properties, add them to the tile object
  95562. if (set.tileProperties && set.tileProperties[tile.index - set.firstgid])
  95563. {
  95564. tile.properties = Extend(
  95565. tile.properties, set.tileProperties[tile.index - set.firstgid]
  95566. );
  95567. }
  95568. }
  95569. }
  95570. }
  95571. };
  95572. module.exports = AssignTileProperties;
  95573. /***/ }),
  95574. /* 492 */
  95575. /***/ (function(module, exports) {
  95576. /**
  95577. * @author Richard Davey <rich@photonstorm.com>
  95578. * @copyright 2019 Photon Storm Ltd.
  95579. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95580. */
  95581. /**
  95582. * Master list of tiles -> x, y, index in tileset.
  95583. *
  95584. * @function Phaser.Tilemaps.Parsers.Tiled.BuildTilesetIndex
  95585. * @since 3.0.0
  95586. *
  95587. * @param {Phaser.Tilemaps.MapData} mapData - [description]
  95588. *
  95589. * @return {array} [description]
  95590. */
  95591. var BuildTilesetIndex = function (mapData)
  95592. {
  95593. var tiles = [];
  95594. for (var i = 0; i < mapData.tilesets.length; i++)
  95595. {
  95596. var set = mapData.tilesets[i];
  95597. var x = set.tileMargin;
  95598. var y = set.tileMargin;
  95599. var count = 0;
  95600. var countX = 0;
  95601. var countY = 0;
  95602. for (var t = set.firstgid; t < set.firstgid + set.total; t++)
  95603. {
  95604. // Can add extra properties here as needed
  95605. tiles[t] = [ x, y, i ];
  95606. x += set.tileWidth + set.tileSpacing;
  95607. count++;
  95608. if (count === set.total)
  95609. {
  95610. break;
  95611. }
  95612. countX++;
  95613. if (countX === set.columns)
  95614. {
  95615. x = set.tileMargin;
  95616. y += set.tileHeight + set.tileSpacing;
  95617. countX = 0;
  95618. countY++;
  95619. if (countY === set.rows)
  95620. {
  95621. break;
  95622. }
  95623. }
  95624. }
  95625. }
  95626. return tiles;
  95627. };
  95628. module.exports = BuildTilesetIndex;
  95629. /***/ }),
  95630. /* 493 */
  95631. /***/ (function(module, exports, __webpack_require__) {
  95632. /**
  95633. * @author Richard Davey <rich@photonstorm.com>
  95634. * @copyright 2019 Photon Storm Ltd.
  95635. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95636. */
  95637. var GetFastValue = __webpack_require__(2);
  95638. var ParseObject = __webpack_require__(228);
  95639. var ObjectLayer = __webpack_require__(227);
  95640. /**
  95641. * Parses a Tiled JSON object into an array of ObjectLayer objects.
  95642. *
  95643. * @function Phaser.Tilemaps.Parsers.Tiled.ParseObjectLayers
  95644. * @since 3.0.0
  95645. *
  95646. * @param {object} json - The Tiled JSON object.
  95647. *
  95648. * @return {array} An array of all object layers in the tilemap as `ObjectLayer`s.
  95649. */
  95650. var ParseObjectLayers = function (json)
  95651. {
  95652. var objectLayers = [];
  95653. for (var i = 0; i < json.layers.length; i++)
  95654. {
  95655. if (json.layers[i].type !== 'objectgroup')
  95656. {
  95657. continue;
  95658. }
  95659. var curo = json.layers[i];
  95660. var offsetX = GetFastValue(curo, 'offsetx', 0);
  95661. var offsetY = GetFastValue(curo, 'offsety', 0);
  95662. var objects = [];
  95663. for (var j = 0; j < curo.objects.length; j++)
  95664. {
  95665. var parsedObject = ParseObject(curo.objects[j], offsetX, offsetY);
  95666. objects.push(parsedObject);
  95667. }
  95668. var objectLayer = new ObjectLayer(curo);
  95669. objectLayer.objects = objects;
  95670. objectLayers.push(objectLayer);
  95671. }
  95672. return objectLayers;
  95673. };
  95674. module.exports = ParseObjectLayers;
  95675. /***/ }),
  95676. /* 494 */
  95677. /***/ (function(module, exports, __webpack_require__) {
  95678. /**
  95679. * @author Richard Davey <rich@photonstorm.com>
  95680. * @copyright 2019 Photon Storm Ltd.
  95681. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95682. */
  95683. var HasValue = __webpack_require__(91);
  95684. /**
  95685. * Returns a new object that only contains the `keys` that were found on the object provided. If no `keys` are found, an empty object is returned.
  95686. *
  95687. * @function Phaser.Tilemaps.Parsers.Tiled.Pick
  95688. * @since 3.0.0
  95689. *
  95690. * @param {object} object - The object to pick the provided keys from.
  95691. * @param {array} keys - An array of properties to retrieve from the provided object.
  95692. *
  95693. * @return {object} A new object that only contains the `keys` that were found on the provided object. If no `keys` were found, an empty object will be returned.
  95694. */
  95695. var Pick = function (object, keys)
  95696. {
  95697. var obj = {};
  95698. for (var i = 0; i < keys.length; i++)
  95699. {
  95700. var key = keys[i];
  95701. if (HasValue(object, key))
  95702. {
  95703. obj[key] = object[key];
  95704. }
  95705. }
  95706. return obj;
  95707. };
  95708. module.exports = Pick;
  95709. /***/ }),
  95710. /* 495 */
  95711. /***/ (function(module, exports, __webpack_require__) {
  95712. /**
  95713. * @author Richard Davey <rich@photonstorm.com>
  95714. * @copyright 2019 Photon Storm Ltd.
  95715. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95716. */
  95717. var Tileset = __webpack_require__(106);
  95718. var ImageCollection = __webpack_require__(229);
  95719. var ParseObject = __webpack_require__(228);
  95720. /**
  95721. * Tilesets & Image Collections
  95722. *
  95723. * @function Phaser.Tilemaps.Parsers.Tiled.ParseTilesets
  95724. * @since 3.0.0
  95725. *
  95726. * @param {object} json - [description]
  95727. *
  95728. * @return {object} [description]
  95729. */
  95730. var ParseTilesets = function (json)
  95731. {
  95732. var tilesets = [];
  95733. var imageCollections = [];
  95734. var lastSet = null;
  95735. var stringID;
  95736. for (var i = 0; i < json.tilesets.length; i++)
  95737. {
  95738. // name, firstgid, width, height, margin, spacing, properties
  95739. var set = json.tilesets[i];
  95740. if (set.source)
  95741. {
  95742. console.warn('Phaser can\'t load external tilesets. Use the Embed Tileset button and then export the map again.');
  95743. }
  95744. else if (set.image)
  95745. {
  95746. var newSet = new Tileset(set.name, set.firstgid, set.tilewidth, set.tileheight, set.margin, set.spacing);
  95747. if (json.version > 1)
  95748. {
  95749. // Tiled 1.2+
  95750. if (Array.isArray(set.tiles))
  95751. {
  95752. var tiles = {};
  95753. var props = {};
  95754. for (var t = 0; t < set.tiles.length; t++)
  95755. {
  95756. var tile = set.tiles[t];
  95757. // Convert tileproperties
  95758. if (tile.properties)
  95759. {
  95760. var newPropData = {};
  95761. tile.properties.forEach(function (propData)
  95762. {
  95763. newPropData[propData['name']] = propData['value'];
  95764. });
  95765. props[tile.id] = newPropData;
  95766. }
  95767. // Convert objectgroup
  95768. if (tile.objectgroup)
  95769. {
  95770. tiles[tile.id] = { objectgroup: tile.objectgroup };
  95771. if (tile.objectgroup.objects)
  95772. {
  95773. var parsedObjects2 = tile.objectgroup.objects.map(
  95774. function (obj) { return ParseObject(obj); }
  95775. );
  95776. tiles[tile.id].objectgroup.objects = parsedObjects2;
  95777. }
  95778. }
  95779. // Copy animation data
  95780. if (tile.animation)
  95781. {
  95782. if (tiles.hasOwnProperty(tile.id))
  95783. {
  95784. tiles[tile.id].animation = tile.animation;
  95785. }
  95786. else
  95787. {
  95788. tiles[tile.id] = { animation: tile.animation };
  95789. }
  95790. }
  95791. }
  95792. newSet.tileData = tiles;
  95793. newSet.tileProperties = props;
  95794. }
  95795. }
  95796. else
  95797. {
  95798. // Tiled 1
  95799. // Properties stored per-tile in object with string indexes starting at "0"
  95800. if (set.tileproperties)
  95801. {
  95802. newSet.tileProperties = set.tileproperties;
  95803. }
  95804. // Object & terrain shapes stored per-tile in object with string indexes starting at "0"
  95805. if (set.tiles)
  95806. {
  95807. newSet.tileData = set.tiles;
  95808. // Parse the objects into Phaser format to match handling of other Tiled objects
  95809. for (stringID in newSet.tileData)
  95810. {
  95811. var objectGroup = newSet.tileData[stringID].objectgroup;
  95812. if (objectGroup && objectGroup.objects)
  95813. {
  95814. var parsedObjects1 = objectGroup.objects.map(
  95815. function (obj) { return ParseObject(obj); }
  95816. );
  95817. newSet.tileData[stringID].objectgroup.objects = parsedObjects1;
  95818. }
  95819. }
  95820. }
  95821. }
  95822. // For a normal sliced tileset the row/count/size information is computed when updated.
  95823. // This is done (again) after the image is set.
  95824. newSet.updateTileData(set.imagewidth, set.imageheight);
  95825. tilesets.push(newSet);
  95826. }
  95827. else
  95828. {
  95829. var newCollection = new ImageCollection(set.name, set.firstgid, set.tilewidth,
  95830. set.tileheight, set.margin, set.spacing, set.properties);
  95831. for (stringID in set.tiles)
  95832. {
  95833. var image = set.tiles[stringID].image;
  95834. var gid = set.firstgid + parseInt(stringID, 10);
  95835. newCollection.addImage(gid, image);
  95836. }
  95837. imageCollections.push(newCollection);
  95838. }
  95839. // We've got a new Tileset, so set the lastgid into the previous one
  95840. if (lastSet)
  95841. {
  95842. lastSet.lastgid = set.firstgid - 1;
  95843. }
  95844. lastSet = set;
  95845. }
  95846. return { tilesets: tilesets, imageCollections: imageCollections };
  95847. };
  95848. module.exports = ParseTilesets;
  95849. /***/ }),
  95850. /* 496 */
  95851. /***/ (function(module, exports, __webpack_require__) {
  95852. /**
  95853. * @author Richard Davey <rich@photonstorm.com>
  95854. * @copyright 2019 Photon Storm Ltd.
  95855. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95856. */
  95857. var GetFastValue = __webpack_require__(2);
  95858. /**
  95859. * [description]
  95860. *
  95861. * @function Phaser.Tilemaps.Parsers.Tiled.ParseImageLayers
  95862. * @since 3.0.0
  95863. *
  95864. * @param {object} json - [description]
  95865. *
  95866. * @return {array} [description]
  95867. */
  95868. var ParseImageLayers = function (json)
  95869. {
  95870. var images = [];
  95871. for (var i = 0; i < json.layers.length; i++)
  95872. {
  95873. if (json.layers[i].type !== 'imagelayer')
  95874. {
  95875. continue;
  95876. }
  95877. var curi = json.layers[i];
  95878. images.push({
  95879. name: curi.name,
  95880. image: curi.image,
  95881. x: GetFastValue(curi, 'offsetx', 0) + curi.x,
  95882. y: GetFastValue(curi, 'offsety', 0) + curi.y,
  95883. alpha: curi.opacity,
  95884. visible: curi.visible,
  95885. properties: GetFastValue(curi, 'properties', {})
  95886. });
  95887. }
  95888. return images;
  95889. };
  95890. module.exports = ParseImageLayers;
  95891. /***/ }),
  95892. /* 497 */
  95893. /***/ (function(module, exports) {
  95894. /**
  95895. * @author Richard Davey <rich@photonstorm.com>
  95896. * @copyright 2019 Photon Storm Ltd.
  95897. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95898. */
  95899. /**
  95900. * Decode base-64 encoded data, for example as exported by Tiled.
  95901. *
  95902. * @function Phaser.Tilemaps.Parsers.Tiled.Base64Decode
  95903. * @since 3.0.0
  95904. *
  95905. * @param {object} data - Base-64 encoded data to decode.
  95906. *
  95907. * @return {array} Array containing the decoded bytes.
  95908. */
  95909. var Base64Decode = function (data)
  95910. {
  95911. var binaryString = window.atob(data);
  95912. var len = binaryString.length;
  95913. var bytes = new Array(len / 4);
  95914. // Interpret binaryString as an array of bytes representing little-endian encoded uint32 values.
  95915. for (var i = 0; i < len; i += 4)
  95916. {
  95917. bytes[i / 4] = (
  95918. binaryString.charCodeAt(i) |
  95919. binaryString.charCodeAt(i + 1) << 8 |
  95920. binaryString.charCodeAt(i + 2) << 16 |
  95921. binaryString.charCodeAt(i + 3) << 24
  95922. ) >>> 0;
  95923. }
  95924. return bytes;
  95925. };
  95926. module.exports = Base64Decode;
  95927. /***/ }),
  95928. /* 498 */
  95929. /***/ (function(module, exports, __webpack_require__) {
  95930. /**
  95931. * @author Richard Davey <rich@photonstorm.com>
  95932. * @copyright 2019 Photon Storm Ltd.
  95933. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95934. */
  95935. var Base64Decode = __webpack_require__(497);
  95936. var GetFastValue = __webpack_require__(2);
  95937. var LayerData = __webpack_require__(84);
  95938. var ParseGID = __webpack_require__(230);
  95939. var Tile = __webpack_require__(61);
  95940. /**
  95941. * [description]
  95942. *
  95943. * @function Phaser.Tilemaps.Parsers.Tiled.ParseTileLayers
  95944. * @since 3.0.0
  95945. *
  95946. * @param {object} json - [description]
  95947. * @param {boolean} insertNull - [description]
  95948. *
  95949. * @return {array} [description]
  95950. */
  95951. var ParseTileLayers = function (json, insertNull)
  95952. {
  95953. var tileLayers = [];
  95954. for (var i = 0; i < json.layers.length; i++)
  95955. {
  95956. if (json.layers[i].type !== 'tilelayer')
  95957. {
  95958. continue;
  95959. }
  95960. var curl = json.layers[i];
  95961. // Base64 decode data if necessary. NOTE: uncompressed base64 only.
  95962. if (curl.compression)
  95963. {
  95964. console.warn(
  95965. 'TilemapParser.parseTiledJSON - Layer compression is unsupported, skipping layer \''
  95966. + curl.name + '\''
  95967. );
  95968. continue;
  95969. }
  95970. else if (curl.encoding && curl.encoding === 'base64')
  95971. {
  95972. curl.data = Base64Decode(curl.data);
  95973. delete curl.encoding; // Allow the same map to be parsed multiple times
  95974. }
  95975. var layerData = new LayerData({
  95976. name: curl.name,
  95977. x: GetFastValue(curl, 'offsetx', 0) + curl.x,
  95978. y: GetFastValue(curl, 'offsety', 0) + curl.y,
  95979. width: curl.width,
  95980. height: curl.height,
  95981. tileWidth: json.tilewidth,
  95982. tileHeight: json.tileheight,
  95983. alpha: curl.opacity,
  95984. visible: curl.visible,
  95985. properties: GetFastValue(curl, 'properties', {})
  95986. });
  95987. var x = 0;
  95988. var row = [];
  95989. var output = [];
  95990. // Loop through the data field in the JSON.
  95991. // This is an array containing the tile indexes, one after the other. -1 = no tile,
  95992. // everything else = the tile index (starting at 1 for Tiled, 0 for CSV) If the map
  95993. // contains multiple tilesets then the indexes are relative to that which the set starts
  95994. // from. Need to set which tileset in the cache = which tileset in the JSON, if you do this
  95995. // manually it means you can use the same map data but a new tileset.
  95996. for (var t = 0, len = curl.data.length; t < len; t++)
  95997. {
  95998. var gidInfo = ParseGID(curl.data[t]);
  95999. // index, x, y, width, height
  96000. if (gidInfo.gid > 0)
  96001. {
  96002. var tile = new Tile(layerData, gidInfo.gid, x, output.length, json.tilewidth,
  96003. json.tileheight);
  96004. // Turning Tiled's FlippedHorizontal, FlippedVertical and FlippedAntiDiagonal
  96005. // propeties into flipX, flipY and rotation
  96006. tile.rotation = gidInfo.rotation;
  96007. tile.flipX = gidInfo.flipped;
  96008. row.push(tile);
  96009. }
  96010. else
  96011. {
  96012. var blankTile = insertNull
  96013. ? null
  96014. : new Tile(layerData, -1, x, output.length, json.tilewidth, json.tileheight);
  96015. row.push(blankTile);
  96016. }
  96017. x++;
  96018. if (x === curl.width)
  96019. {
  96020. output.push(row);
  96021. x = 0;
  96022. row = [];
  96023. }
  96024. }
  96025. layerData.data = output;
  96026. tileLayers.push(layerData);
  96027. }
  96028. return tileLayers;
  96029. };
  96030. module.exports = ParseTileLayers;
  96031. /***/ }),
  96032. /* 499 */
  96033. /***/ (function(module, exports, __webpack_require__) {
  96034. /**
  96035. * @author Richard Davey <rich@photonstorm.com>
  96036. * @copyright 2019 Photon Storm Ltd.
  96037. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96038. */
  96039. /**
  96040. * @namespace Phaser.Tilemaps.Parsers
  96041. */
  96042. module.exports = {
  96043. Parse: __webpack_require__(233),
  96044. Parse2DArray: __webpack_require__(145),
  96045. ParseCSV: __webpack_require__(232),
  96046. Impact: __webpack_require__(226),
  96047. Tiled: __webpack_require__(231)
  96048. };
  96049. /***/ }),
  96050. /* 500 */
  96051. /***/ (function(module, exports, __webpack_require__) {
  96052. /**
  96053. * @author Richard Davey <rich@photonstorm.com>
  96054. * @copyright 2019 Photon Storm Ltd.
  96055. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96056. */
  96057. var WorldToTileX = __webpack_require__(54);
  96058. var WorldToTileY = __webpack_require__(53);
  96059. var Vector2 = __webpack_require__(3);
  96060. /**
  96061. * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the
  96062. * layer's position, scale and scroll. This will return a new Vector2 object or update the given
  96063. * `point` object.
  96064. *
  96065. * @function Phaser.Tilemaps.Components.WorldToTileXY
  96066. * @private
  96067. * @since 3.0.0
  96068. *
  96069. * @param {number} worldX - The x coordinate to be converted, in pixels, not tiles.
  96070. * @param {number} worldY - The y coordinate to be converted, in pixels, not tiles.
  96071. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the nearest integer.
  96072. * @param {Phaser.Math.Vector2} [point] - A Vector2 to store the coordinates in. If not given a new Vector2 is created.
  96073. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  96074. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96075. *
  96076. * @return {Phaser.Math.Vector2} The XY location in tile units.
  96077. */
  96078. var WorldToTileXY = function (worldX, worldY, snapToFloor, point, camera, layer)
  96079. {
  96080. if (point === undefined) { point = new Vector2(0, 0); }
  96081. point.x = WorldToTileX(worldX, snapToFloor, camera, layer);
  96082. point.y = WorldToTileY(worldY, snapToFloor, camera, layer);
  96083. return point;
  96084. };
  96085. module.exports = WorldToTileXY;
  96086. /***/ }),
  96087. /* 501 */
  96088. /***/ (function(module, exports, __webpack_require__) {
  96089. /**
  96090. * @author Richard Davey <rich@photonstorm.com>
  96091. * @copyright 2019 Photon Storm Ltd.
  96092. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96093. */
  96094. var GetTilesWithin = __webpack_require__(21);
  96095. /**
  96096. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  96097. * specified layer. Each tile will receive a new index. New indexes are drawn from the given
  96098. * weightedIndexes array. An example weighted array:
  96099. *
  96100. * [
  96101. * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8
  96102. * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8
  96103. * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8
  96104. * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8
  96105. * ]
  96106. *
  96107. * The probability of any index being choose is (the index's weight) / (sum of all weights). This
  96108. * method only modifies tile indexes and does not change collision information.
  96109. *
  96110. * @function Phaser.Tilemaps.Components.WeightedRandomize
  96111. * @private
  96112. * @since 3.0.0
  96113. *
  96114. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  96115. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  96116. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  96117. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  96118. * @param {object[]} [weightedIndexes] - An array of objects to randomly draw from during
  96119. * randomization. They should be in the form: { index: 0, weight: 4 } or
  96120. * { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes.
  96121. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96122. */
  96123. var WeightedRandomize = function (tileX, tileY, width, height, weightedIndexes, layer)
  96124. {
  96125. if (weightedIndexes === undefined) { return; }
  96126. var i;
  96127. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  96128. var weightTotal = 0;
  96129. for (i = 0; i < weightedIndexes.length; i++)
  96130. {
  96131. weightTotal += weightedIndexes[i].weight;
  96132. }
  96133. if (weightTotal <= 0) { return; }
  96134. for (i = 0; i < tiles.length; i++)
  96135. {
  96136. var rand = Math.random() * weightTotal;
  96137. var sum = 0;
  96138. var randomIndex = -1;
  96139. for (var j = 0; j < weightedIndexes.length; j++)
  96140. {
  96141. sum += weightedIndexes[j].weight;
  96142. if (rand <= sum)
  96143. {
  96144. var chosen = weightedIndexes[j].index;
  96145. randomIndex = Array.isArray(chosen)
  96146. ? chosen[Math.floor(Math.random() * chosen.length)]
  96147. : chosen;
  96148. break;
  96149. }
  96150. }
  96151. tiles[i].index = randomIndex;
  96152. }
  96153. };
  96154. module.exports = WeightedRandomize;
  96155. /***/ }),
  96156. /* 502 */
  96157. /***/ (function(module, exports, __webpack_require__) {
  96158. /**
  96159. * @author Richard Davey <rich@photonstorm.com>
  96160. * @copyright 2019 Photon Storm Ltd.
  96161. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96162. */
  96163. var TileToWorldX = __webpack_require__(108);
  96164. var TileToWorldY = __webpack_require__(107);
  96165. var Vector2 = __webpack_require__(3);
  96166. /**
  96167. * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the
  96168. * layer's position, scale and scroll. This will return a new Vector2 object or update the given
  96169. * `point` object.
  96170. *
  96171. * @function Phaser.Tilemaps.Components.TileToWorldXY
  96172. * @private
  96173. * @since 3.0.0
  96174. *
  96175. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  96176. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  96177. * @param {Phaser.Math.Vector2} [point] - A Vector2 to store the coordinates in. If not given a new Vector2 is created.
  96178. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  96179. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96180. *
  96181. * @return {Phaser.Math.Vector2} The XY location in world coordinates.
  96182. */
  96183. var TileToWorldXY = function (tileX, tileY, point, camera, layer)
  96184. {
  96185. if (point === undefined) { point = new Vector2(0, 0); }
  96186. point.x = TileToWorldX(tileX, camera, layer);
  96187. point.y = TileToWorldY(tileY, camera, layer);
  96188. return point;
  96189. };
  96190. module.exports = TileToWorldXY;
  96191. /***/ }),
  96192. /* 503 */
  96193. /***/ (function(module, exports, __webpack_require__) {
  96194. /**
  96195. * @author Richard Davey <rich@photonstorm.com>
  96196. * @copyright 2019 Photon Storm Ltd.
  96197. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96198. */
  96199. var GetTilesWithin = __webpack_require__(21);
  96200. /**
  96201. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  96202. * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision
  96203. * information.
  96204. *
  96205. * @function Phaser.Tilemaps.Components.SwapByIndex
  96206. * @private
  96207. * @since 3.0.0
  96208. *
  96209. * @param {integer} tileA - First tile index.
  96210. * @param {integer} tileB - Second tile index.
  96211. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  96212. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  96213. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  96214. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  96215. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96216. */
  96217. var SwapByIndex = function (indexA, indexB, tileX, tileY, width, height, layer)
  96218. {
  96219. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  96220. for (var i = 0; i < tiles.length; i++)
  96221. {
  96222. if (tiles[i])
  96223. {
  96224. if (tiles[i].index === indexA)
  96225. {
  96226. tiles[i].index = indexB;
  96227. }
  96228. else if (tiles[i].index === indexB)
  96229. {
  96230. tiles[i].index = indexA;
  96231. }
  96232. }
  96233. }
  96234. };
  96235. module.exports = SwapByIndex;
  96236. /***/ }),
  96237. /* 504 */
  96238. /***/ (function(module, exports, __webpack_require__) {
  96239. /**
  96240. * @author Richard Davey <rich@photonstorm.com>
  96241. * @copyright 2019 Photon Storm Ltd.
  96242. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96243. */
  96244. var GetTilesWithin = __webpack_require__(21);
  96245. var ShuffleArray = __webpack_require__(132);
  96246. /**
  96247. * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given
  96248. * layer. It will only randomize the tiles in that area, so if they're all the same nothing will
  96249. * appear to have changed! This method only modifies tile indexes and does not change collision
  96250. * information.
  96251. *
  96252. * @function Phaser.Tilemaps.Components.Shuffle
  96253. * @private
  96254. * @since 3.0.0
  96255. *
  96256. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  96257. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  96258. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  96259. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  96260. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96261. */
  96262. var Shuffle = function (tileX, tileY, width, height, layer)
  96263. {
  96264. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  96265. var indexes = tiles.map(function (tile) { return tile.index; });
  96266. ShuffleArray(indexes);
  96267. for (var i = 0; i < tiles.length; i++)
  96268. {
  96269. tiles[i].index = indexes[i];
  96270. }
  96271. };
  96272. module.exports = Shuffle;
  96273. /***/ }),
  96274. /* 505 */
  96275. /***/ (function(module, exports, __webpack_require__) {
  96276. /**
  96277. * @author Richard Davey <rich@photonstorm.com>
  96278. * @copyright 2019 Photon Storm Ltd.
  96279. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96280. */
  96281. var GetTilesWithin = __webpack_require__(21);
  96282. /**
  96283. * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer.
  96284. * If a callback is already set for the tile index it will be replaced. Set the callback to null to
  96285. * remove it.
  96286. *
  96287. * @function Phaser.Tilemaps.Components.SetTileLocationCallback
  96288. * @private
  96289. * @since 3.0.0
  96290. *
  96291. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  96292. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  96293. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  96294. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  96295. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  96296. * @param {object} callbackContext - The context under which the callback is called.
  96297. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96298. */
  96299. var SetTileLocationCallback = function (tileX, tileY, width, height, callback, callbackContext, layer)
  96300. {
  96301. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  96302. for (var i = 0; i < tiles.length; i++)
  96303. {
  96304. tiles[i].setCollisionCallback(callback, callbackContext);
  96305. }
  96306. };
  96307. module.exports = SetTileLocationCallback;
  96308. /***/ }),
  96309. /* 506 */
  96310. /***/ (function(module, exports) {
  96311. /**
  96312. * @author Richard Davey <rich@photonstorm.com>
  96313. * @copyright 2019 Photon Storm Ltd.
  96314. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96315. */
  96316. /**
  96317. * Sets a global collision callback for the given tile index within the layer. This will affect all
  96318. * tiles on this layer that have the same index. If a callback is already set for the tile index it
  96319. * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile
  96320. * at a specific location on the map then see setTileLocationCallback.
  96321. *
  96322. * @function Phaser.Tilemaps.Components.SetTileIndexCallback
  96323. * @private
  96324. * @since 3.0.0
  96325. *
  96326. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes to have a collision callback set for.
  96327. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  96328. * @param {object} callbackContext - The context under which the callback is called.
  96329. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96330. */
  96331. var SetTileIndexCallback = function (indexes, callback, callbackContext, layer)
  96332. {
  96333. if (typeof indexes === 'number')
  96334. {
  96335. layer.callbacks[indexes] = (callback !== null)
  96336. ? { callback: callback, callbackContext: callbackContext }
  96337. : undefined;
  96338. }
  96339. else
  96340. {
  96341. for (var i = 0, len = indexes.length; i < len; i++)
  96342. {
  96343. layer.callbacks[indexes[i]] = (callback !== null)
  96344. ? { callback: callback, callbackContext: callbackContext }
  96345. : undefined;
  96346. }
  96347. }
  96348. };
  96349. module.exports = SetTileIndexCallback;
  96350. /***/ }),
  96351. /* 507 */
  96352. /***/ (function(module, exports, __webpack_require__) {
  96353. /**
  96354. * @author Richard Davey <rich@photonstorm.com>
  96355. * @copyright 2019 Photon Storm Ltd.
  96356. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96357. */
  96358. var SetTileCollision = __webpack_require__(62);
  96359. var CalculateFacesWithin = __webpack_require__(37);
  96360. /**
  96361. * Sets collision on the tiles within a layer by checking each tile's collision group data
  96362. * (typically defined in Tiled within the tileset collision editor). If any objects are found within
  96363. * a tile's collision group, the tile's colliding information will be set. The `collides` parameter
  96364. * controls if collision will be enabled (true) or disabled (false).
  96365. *
  96366. * @function Phaser.Tilemaps.Components.SetCollisionFromCollisionGroup
  96367. * @private
  96368. * @since 3.0.0
  96369. *
  96370. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  96371. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  96372. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96373. */
  96374. var SetCollisionFromCollisionGroup = function (collides, recalculateFaces, layer)
  96375. {
  96376. if (collides === undefined) { collides = true; }
  96377. if (recalculateFaces === undefined) { recalculateFaces = true; }
  96378. for (var ty = 0; ty < layer.height; ty++)
  96379. {
  96380. for (var tx = 0; tx < layer.width; tx++)
  96381. {
  96382. var tile = layer.data[ty][tx];
  96383. if (!tile) { continue; }
  96384. var collisionGroup = tile.getCollisionGroup();
  96385. // It's possible in Tiled to have a collision group without any shapes, e.g. create a
  96386. // shape and then delete the shape.
  96387. if (collisionGroup && collisionGroup.objects && collisionGroup.objects.length > 0)
  96388. {
  96389. SetTileCollision(tile, collides);
  96390. }
  96391. }
  96392. }
  96393. if (recalculateFaces)
  96394. {
  96395. CalculateFacesWithin(0, 0, layer.width, layer.height, layer);
  96396. }
  96397. };
  96398. module.exports = SetCollisionFromCollisionGroup;
  96399. /***/ }),
  96400. /* 508 */
  96401. /***/ (function(module, exports, __webpack_require__) {
  96402. /**
  96403. * @author Richard Davey <rich@photonstorm.com>
  96404. * @copyright 2019 Photon Storm Ltd.
  96405. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96406. */
  96407. var SetTileCollision = __webpack_require__(62);
  96408. var CalculateFacesWithin = __webpack_require__(37);
  96409. var HasValue = __webpack_require__(91);
  96410. /**
  96411. * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property
  96412. * that matches the given properties object, its collision flag will be set. The `collides`
  96413. * parameter controls if collision will be enabled (true) or disabled (false). Passing in
  96414. * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that
  96415. * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can
  96416. * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a
  96417. * "types" property that matches any of those values, its collision flag will be updated.
  96418. *
  96419. * @function Phaser.Tilemaps.Components.SetCollisionByProperty
  96420. * @private
  96421. * @since 3.0.0
  96422. *
  96423. * @param {object} properties - An object with tile properties and corresponding values that should be checked.
  96424. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  96425. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  96426. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96427. */
  96428. var SetCollisionByProperty = function (properties, collides, recalculateFaces, layer)
  96429. {
  96430. if (collides === undefined) { collides = true; }
  96431. if (recalculateFaces === undefined) { recalculateFaces = true; }
  96432. for (var ty = 0; ty < layer.height; ty++)
  96433. {
  96434. for (var tx = 0; tx < layer.width; tx++)
  96435. {
  96436. var tile = layer.data[ty][tx];
  96437. if (!tile) { continue; }
  96438. for (var property in properties)
  96439. {
  96440. if (!HasValue(tile.properties, property)) { continue; }
  96441. var values = properties[property];
  96442. if (!Array.isArray(values))
  96443. {
  96444. values = [ values ];
  96445. }
  96446. for (var i = 0; i < values.length; i++)
  96447. {
  96448. if (tile.properties[property] === values[i])
  96449. {
  96450. SetTileCollision(tile, collides);
  96451. }
  96452. }
  96453. }
  96454. }
  96455. }
  96456. if (recalculateFaces)
  96457. {
  96458. CalculateFacesWithin(0, 0, layer.width, layer.height, layer);
  96459. }
  96460. };
  96461. module.exports = SetCollisionByProperty;
  96462. /***/ }),
  96463. /* 509 */
  96464. /***/ (function(module, exports, __webpack_require__) {
  96465. /**
  96466. * @author Richard Davey <rich@photonstorm.com>
  96467. * @copyright 2019 Photon Storm Ltd.
  96468. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96469. */
  96470. var SetTileCollision = __webpack_require__(62);
  96471. var CalculateFacesWithin = __webpack_require__(37);
  96472. var SetLayerCollisionIndex = __webpack_require__(146);
  96473. /**
  96474. * Sets collision on all tiles in the given layer, except for tiles that have an index specified in
  96475. * the given array. The `collides` parameter controls if collision will be enabled (true) or
  96476. * disabled (false).
  96477. *
  96478. * @function Phaser.Tilemaps.Components.SetCollisionByExclusion
  96479. * @private
  96480. * @since 3.0.0
  96481. *
  96482. * @param {integer[]} indexes - An array of the tile indexes to not be counted for collision.
  96483. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  96484. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  96485. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96486. */
  96487. var SetCollisionByExclusion = function (indexes, collides, recalculateFaces, layer)
  96488. {
  96489. if (collides === undefined) { collides = true; }
  96490. if (recalculateFaces === undefined) { recalculateFaces = true; }
  96491. if (!Array.isArray(indexes)) { indexes = [ indexes ]; }
  96492. // Note: this only updates layer.collideIndexes for tile indexes found currently in the layer
  96493. for (var ty = 0; ty < layer.height; ty++)
  96494. {
  96495. for (var tx = 0; tx < layer.width; tx++)
  96496. {
  96497. var tile = layer.data[ty][tx];
  96498. if (tile && indexes.indexOf(tile.index) === -1)
  96499. {
  96500. SetTileCollision(tile, collides);
  96501. SetLayerCollisionIndex(tile.index, collides, layer);
  96502. }
  96503. }
  96504. }
  96505. if (recalculateFaces)
  96506. {
  96507. CalculateFacesWithin(0, 0, layer.width, layer.height, layer);
  96508. }
  96509. };
  96510. module.exports = SetCollisionByExclusion;
  96511. /***/ }),
  96512. /* 510 */
  96513. /***/ (function(module, exports, __webpack_require__) {
  96514. /**
  96515. * @author Richard Davey <rich@photonstorm.com>
  96516. * @copyright 2019 Photon Storm Ltd.
  96517. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96518. */
  96519. var SetTileCollision = __webpack_require__(62);
  96520. var CalculateFacesWithin = __webpack_require__(37);
  96521. var SetLayerCollisionIndex = __webpack_require__(146);
  96522. /**
  96523. * Sets collision on a range of tiles in a layer whose index is between the specified `start` and
  96524. * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set
  96525. * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be
  96526. * enabled (true) or disabled (false).
  96527. *
  96528. * @function Phaser.Tilemaps.Components.SetCollisionBetween
  96529. * @private
  96530. * @since 3.0.0
  96531. *
  96532. * @param {integer} start - The first index of the tile to be set for collision.
  96533. * @param {integer} stop - The last index of the tile to be set for collision.
  96534. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  96535. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  96536. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96537. */
  96538. var SetCollisionBetween = function (start, stop, collides, recalculateFaces, layer)
  96539. {
  96540. if (collides === undefined) { collides = true; }
  96541. if (recalculateFaces === undefined) { recalculateFaces = true; }
  96542. if (start > stop) { return; }
  96543. // Update the array of colliding indexes
  96544. for (var index = start; index <= stop; index++)
  96545. {
  96546. SetLayerCollisionIndex(index, collides, layer);
  96547. }
  96548. // Update the tiles
  96549. for (var ty = 0; ty < layer.height; ty++)
  96550. {
  96551. for (var tx = 0; tx < layer.width; tx++)
  96552. {
  96553. var tile = layer.data[ty][tx];
  96554. if (tile)
  96555. {
  96556. if (tile.index >= start && tile.index <= stop)
  96557. {
  96558. SetTileCollision(tile, collides);
  96559. }
  96560. }
  96561. }
  96562. }
  96563. if (recalculateFaces)
  96564. {
  96565. CalculateFacesWithin(0, 0, layer.width, layer.height, layer);
  96566. }
  96567. };
  96568. module.exports = SetCollisionBetween;
  96569. /***/ }),
  96570. /* 511 */
  96571. /***/ (function(module, exports, __webpack_require__) {
  96572. /**
  96573. * @author Richard Davey <rich@photonstorm.com>
  96574. * @copyright 2019 Photon Storm Ltd.
  96575. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96576. */
  96577. var SetTileCollision = __webpack_require__(62);
  96578. var CalculateFacesWithin = __webpack_require__(37);
  96579. var SetLayerCollisionIndex = __webpack_require__(146);
  96580. /**
  96581. * Sets collision on the given tile or tiles within a layer by index. You can pass in either a
  96582. * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if
  96583. * collision will be enabled (true) or disabled (false).
  96584. *
  96585. * @function Phaser.Tilemaps.Components.SetCollision
  96586. * @private
  96587. * @since 3.0.0
  96588. *
  96589. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes.
  96590. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear collision.
  96591. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the update.
  96592. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96593. */
  96594. var SetCollision = function (indexes, collides, recalculateFaces, layer)
  96595. {
  96596. if (collides === undefined) { collides = true; }
  96597. if (recalculateFaces === undefined) { recalculateFaces = true; }
  96598. if (!Array.isArray(indexes)) { indexes = [ indexes ]; }
  96599. // Update the array of colliding indexes
  96600. for (var i = 0; i < indexes.length; i++)
  96601. {
  96602. SetLayerCollisionIndex(indexes[i], collides, layer);
  96603. }
  96604. // Update the tiles
  96605. for (var ty = 0; ty < layer.height; ty++)
  96606. {
  96607. for (var tx = 0; tx < layer.width; tx++)
  96608. {
  96609. var tile = layer.data[ty][tx];
  96610. if (tile && indexes.indexOf(tile.index) !== -1)
  96611. {
  96612. SetTileCollision(tile, collides);
  96613. }
  96614. }
  96615. }
  96616. if (recalculateFaces)
  96617. {
  96618. CalculateFacesWithin(0, 0, layer.width, layer.height, layer);
  96619. }
  96620. };
  96621. module.exports = SetCollision;
  96622. /***/ }),
  96623. /* 512 */
  96624. /***/ (function(module, exports, __webpack_require__) {
  96625. /**
  96626. * @author Richard Davey <rich@photonstorm.com>
  96627. * @copyright 2019 Photon Storm Ltd.
  96628. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96629. */
  96630. var GetTilesWithin = __webpack_require__(21);
  96631. var Color = __webpack_require__(354);
  96632. var defaultTileColor = new Color(105, 210, 231, 150);
  96633. var defaultCollidingTileColor = new Color(243, 134, 48, 200);
  96634. var defaultFaceColor = new Color(40, 39, 37, 150);
  96635. /**
  96636. * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to
  96637. * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles
  96638. * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation
  96639. * wherever you want on the screen.
  96640. *
  96641. * @function Phaser.Tilemaps.Components.RenderDebug
  96642. * @private
  96643. * @since 3.0.0
  96644. *
  96645. * @param {Phaser.GameObjects.Graphics} graphics - The target Graphics object to draw upon.
  96646. * @param {object} styleConfig - An object specifying the colors to use for the debug drawing.
  96647. * @param {?Phaser.Display.Color} [styleConfig.tileColor=blue] - Color to use for drawing a filled rectangle at
  96648. * non-colliding tile locations. If set to null, non-colliding tiles will not be drawn.
  96649. * @param {?Phaser.Display.Color} [styleConfig.collidingTileColor=orange] - Color to use for drawing a filled
  96650. * rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn.
  96651. * @param {?Phaser.Display.Color} [styleConfig.faceColor=grey] - Color to use for drawing a line at interesting
  96652. * tile faces. If set to null, interesting tile faces will not be drawn.
  96653. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96654. */
  96655. var RenderDebug = function (graphics, styleConfig, layer)
  96656. {
  96657. if (styleConfig === undefined) { styleConfig = {}; }
  96658. // Default colors without needlessly creating Color objects
  96659. var tileColor = (styleConfig.tileColor !== undefined) ? styleConfig.tileColor : defaultTileColor;
  96660. var collidingTileColor = (styleConfig.collidingTileColor !== undefined) ? styleConfig.collidingTileColor : defaultCollidingTileColor;
  96661. var faceColor = (styleConfig.faceColor !== undefined) ? styleConfig.faceColor : defaultFaceColor;
  96662. var tiles = GetTilesWithin(0, 0, layer.width, layer.height, null, layer);
  96663. graphics.translate(layer.tilemapLayer.x, layer.tilemapLayer.y);
  96664. graphics.scale(layer.tilemapLayer.scaleX, layer.tilemapLayer.scaleY);
  96665. for (var i = 0; i < tiles.length; i++)
  96666. {
  96667. var tile = tiles[i];
  96668. var tw = tile.width;
  96669. var th = tile.height;
  96670. var x = tile.pixelX;
  96671. var y = tile.pixelY;
  96672. var color = tile.collides ? collidingTileColor : tileColor;
  96673. if (color !== null)
  96674. {
  96675. graphics.fillStyle(color.color, color.alpha / 255);
  96676. graphics.fillRect(x, y, tw, th);
  96677. }
  96678. // Inset the face line to prevent neighboring tile's lines from overlapping
  96679. x += 1;
  96680. y += 1;
  96681. tw -= 2;
  96682. th -= 2;
  96683. if (faceColor !== null)
  96684. {
  96685. graphics.lineStyle(1, faceColor.color, faceColor.alpha / 255);
  96686. if (tile.faceTop) { graphics.lineBetween(x, y, x + tw, y); }
  96687. if (tile.faceRight) { graphics.lineBetween(x + tw, y, x + tw, y + th); }
  96688. if (tile.faceBottom) { graphics.lineBetween(x, y + th, x + tw, y + th); }
  96689. if (tile.faceLeft) { graphics.lineBetween(x, y, x, y + th); }
  96690. }
  96691. }
  96692. };
  96693. module.exports = RenderDebug;
  96694. /***/ }),
  96695. /* 513 */
  96696. /***/ (function(module, exports, __webpack_require__) {
  96697. /**
  96698. * @author Richard Davey <rich@photonstorm.com>
  96699. * @copyright 2019 Photon Storm Ltd.
  96700. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96701. */
  96702. var RemoveTileAt = __webpack_require__(234);
  96703. var WorldToTileX = __webpack_require__(54);
  96704. var WorldToTileY = __webpack_require__(53);
  96705. /**
  96706. * Removes the tile at the given world coordinates in the specified layer and updates the layer's
  96707. * collision information.
  96708. *
  96709. * @function Phaser.Tilemaps.Components.RemoveTileAtWorldXY
  96710. * @private
  96711. * @since 3.0.0
  96712. *
  96713. * @param {number} worldX - The x coordinate, in pixels.
  96714. * @param {number} worldY - The y coordinate, in pixels.
  96715. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1.
  96716. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  96717. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  96718. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96719. *
  96720. * @return {Phaser.Tilemaps.Tile} The Tile object that was removed.
  96721. */
  96722. var RemoveTileAtWorldXY = function (worldX, worldY, replaceWithNull, recalculateFaces, camera, layer)
  96723. {
  96724. var tileX = WorldToTileX(worldX, true, camera, layer);
  96725. var tileY = WorldToTileY(worldY, true, camera, layer);
  96726. return RemoveTileAt(tileX, tileY, replaceWithNull, recalculateFaces, layer);
  96727. };
  96728. module.exports = RemoveTileAtWorldXY;
  96729. /***/ }),
  96730. /* 514 */
  96731. /***/ (function(module, exports, __webpack_require__) {
  96732. /**
  96733. * @author Richard Davey <rich@photonstorm.com>
  96734. * @copyright 2019 Photon Storm Ltd.
  96735. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96736. */
  96737. var GetTilesWithin = __webpack_require__(21);
  96738. var GetRandom = __webpack_require__(172);
  96739. /**
  96740. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  96741. * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then
  96742. * those will be used for randomly assigning new tile indexes. If an array is not provided, the
  96743. * indexes found within the region (excluding -1) will be used for randomly assigning new tile
  96744. * indexes. This method only modifies tile indexes and does not change collision information.
  96745. *
  96746. * @function Phaser.Tilemaps.Components.Randomize
  96747. * @private
  96748. * @since 3.0.0
  96749. *
  96750. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area.
  96751. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area.
  96752. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  96753. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  96754. * @param {integer[]} [indexes] - An array of indexes to randomly draw from during randomization.
  96755. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96756. */
  96757. var Randomize = function (tileX, tileY, width, height, indexes, layer)
  96758. {
  96759. var i;
  96760. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  96761. // If no indicies are given, then find all the unique indexes within the specified region
  96762. if (indexes === undefined)
  96763. {
  96764. indexes = [];
  96765. for (i = 0; i < tiles.length; i++)
  96766. {
  96767. if (indexes.indexOf(tiles[i].index) === -1)
  96768. {
  96769. indexes.push(tiles[i].index);
  96770. }
  96771. }
  96772. }
  96773. for (i = 0; i < tiles.length; i++)
  96774. {
  96775. tiles[i].index = GetRandom(indexes);
  96776. }
  96777. };
  96778. module.exports = Randomize;
  96779. /***/ }),
  96780. /* 515 */
  96781. /***/ (function(module, exports, __webpack_require__) {
  96782. /**
  96783. * @author Richard Davey <rich@photonstorm.com>
  96784. * @copyright 2019 Photon Storm Ltd.
  96785. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96786. */
  96787. var CalculateFacesWithin = __webpack_require__(37);
  96788. var PutTileAt = __webpack_require__(147);
  96789. /**
  96790. * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified
  96791. * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile,
  96792. * all attributes will be copied over to the specified location. If you pass in an index, only the
  96793. * index at the specified location will be changed. Collision information will be recalculated
  96794. * within the region tiles were changed.
  96795. *
  96796. * @function Phaser.Tilemaps.Components.PutTilesAt
  96797. * @private
  96798. * @since 3.0.0
  96799. *
  96800. * @param {(integer[]|integer[][]|Phaser.Tilemaps.Tile[]|Phaser.Tilemaps.Tile[][])} tile - A row (array) or grid (2D array) of Tiles or tile indexes to place.
  96801. * @param {integer} tileX - The x coordinate, in tiles, not pixels.
  96802. * @param {integer} tileY - The y coordinate, in tiles, not pixels.
  96803. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  96804. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96805. */
  96806. var PutTilesAt = function (tilesArray, tileX, tileY, recalculateFaces, layer)
  96807. {
  96808. if (!Array.isArray(tilesArray)) { return null; }
  96809. if (recalculateFaces === undefined) { recalculateFaces = true; }
  96810. // Force the input array to be a 2D array
  96811. if (!Array.isArray(tilesArray[0]))
  96812. {
  96813. tilesArray = [ tilesArray ];
  96814. }
  96815. var height = tilesArray.length;
  96816. var width = tilesArray[0].length;
  96817. for (var ty = 0; ty < height; ty++)
  96818. {
  96819. for (var tx = 0; tx < width; tx++)
  96820. {
  96821. var tile = tilesArray[ty][tx];
  96822. PutTileAt(tile, tileX + tx, tileY + ty, false, layer);
  96823. }
  96824. }
  96825. if (recalculateFaces)
  96826. {
  96827. // Recalculate the faces within the destination area and neighboring tiles
  96828. CalculateFacesWithin(tileX - 1, tileY - 1, width + 2, height + 2, layer);
  96829. }
  96830. };
  96831. module.exports = PutTilesAt;
  96832. /***/ }),
  96833. /* 516 */
  96834. /***/ (function(module, exports, __webpack_require__) {
  96835. /**
  96836. * @author Richard Davey <rich@photonstorm.com>
  96837. * @copyright 2019 Photon Storm Ltd.
  96838. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96839. */
  96840. var PutTileAt = __webpack_require__(147);
  96841. var WorldToTileX = __webpack_require__(54);
  96842. var WorldToTileY = __webpack_require__(53);
  96843. /**
  96844. * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either
  96845. * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the
  96846. * specified location. If you pass in an index, only the index at the specified location will be
  96847. * changed. Collision information will be recalculated at the specified location.
  96848. *
  96849. * @function Phaser.Tilemaps.Components.PutTileAtWorldXY
  96850. * @private
  96851. * @since 3.0.0
  96852. *
  96853. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  96854. * @param {number} worldX - The x coordinate, in pixels.
  96855. * @param {number} worldY - The y coordinate, in pixels.
  96856. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  96857. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  96858. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96859. *
  96860. * @return {Phaser.Tilemaps.Tile} The Tile object that was created or added to this map.
  96861. */
  96862. var PutTileAtWorldXY = function (tile, worldX, worldY, recalculateFaces, camera, layer)
  96863. {
  96864. var tileX = WorldToTileX(worldX, true, camera, layer);
  96865. var tileY = WorldToTileY(worldY, true, camera, layer);
  96866. return PutTileAt(tile, tileX, tileY, recalculateFaces, layer);
  96867. };
  96868. module.exports = PutTileAtWorldXY;
  96869. /***/ }),
  96870. /* 517 */
  96871. /***/ (function(module, exports, __webpack_require__) {
  96872. /**
  96873. * @author Richard Davey <rich@photonstorm.com>
  96874. * @copyright 2019 Photon Storm Ltd.
  96875. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96876. */
  96877. var HasTileAt = __webpack_require__(235);
  96878. var WorldToTileX = __webpack_require__(54);
  96879. var WorldToTileY = __webpack_require__(53);
  96880. /**
  96881. * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns
  96882. * false if there is no tile or if the tile at that location has an index of -1.
  96883. *
  96884. * @function Phaser.Tilemaps.Components.HasTileAtWorldXY
  96885. * @private
  96886. * @since 3.0.0
  96887. *
  96888. * @param {number} worldX - The X coordinate of the world position.
  96889. * @param {number} worldY - The Y coordinate of the world position.
  96890. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when factoring in which tiles to return.
  96891. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96892. *
  96893. * @return {?boolean} Returns a boolean, or null if the layer given was invalid.
  96894. */
  96895. var HasTileAtWorldXY = function (worldX, worldY, camera, layer)
  96896. {
  96897. var tileX = WorldToTileX(worldX, true, camera, layer);
  96898. var tileY = WorldToTileY(worldY, true, camera, layer);
  96899. return HasTileAt(tileX, tileY, layer);
  96900. };
  96901. module.exports = HasTileAtWorldXY;
  96902. /***/ }),
  96903. /* 518 */
  96904. /***/ (function(module, exports, __webpack_require__) {
  96905. /**
  96906. * @author Richard Davey <rich@photonstorm.com>
  96907. * @copyright 2019 Photon Storm Ltd.
  96908. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96909. */
  96910. var GetTilesWithin = __webpack_require__(21);
  96911. var WorldToTileX = __webpack_require__(54);
  96912. var WorldToTileY = __webpack_require__(53);
  96913. /**
  96914. * Gets the tiles in the given rectangular area (in world coordinates) of the layer.
  96915. *
  96916. * @function Phaser.Tilemaps.Components.GetTilesWithinWorldXY
  96917. * @private
  96918. * @since 3.0.0
  96919. *
  96920. * @param {number} worldX - The world x coordinate for the top-left of the area.
  96921. * @param {number} worldY - The world y coordinate for the top-left of the area.
  96922. * @param {number} width - The width of the area.
  96923. * @param {number} height - The height of the area.
  96924. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  96925. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have -1 for an index.
  96926. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on at least one side.
  96927. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that have at least one interesting face.
  96928. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when factoring in which tiles to return.
  96929. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96930. *
  96931. * @return {Phaser.Tilemaps.Tile[]} Array of Tile objects.
  96932. */
  96933. var GetTilesWithinWorldXY = function (worldX, worldY, width, height, filteringOptions, camera, layer)
  96934. {
  96935. // Top left corner of the rect, rounded down to include partial tiles
  96936. var xStart = WorldToTileX(worldX, true, camera, layer);
  96937. var yStart = WorldToTileY(worldY, true, camera, layer);
  96938. // Bottom right corner of the rect, rounded up to include partial tiles
  96939. var xEnd = Math.ceil(WorldToTileX(worldX + width, false, camera, layer));
  96940. var yEnd = Math.ceil(WorldToTileY(worldY + height, false, camera, layer));
  96941. return GetTilesWithin(xStart, yStart, xEnd - xStart, yEnd - yStart, filteringOptions, layer);
  96942. };
  96943. module.exports = GetTilesWithinWorldXY;
  96944. /***/ }),
  96945. /* 519 */
  96946. /***/ (function(module, exports, __webpack_require__) {
  96947. /**
  96948. * @author Richard Davey <rich@photonstorm.com>
  96949. * @copyright 2019 Photon Storm Ltd.
  96950. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96951. */
  96952. var Geom = __webpack_require__(279);
  96953. var GetTilesWithin = __webpack_require__(21);
  96954. var Intersects = __webpack_require__(278);
  96955. var NOOP = __webpack_require__(1);
  96956. var TileToWorldX = __webpack_require__(108);
  96957. var TileToWorldY = __webpack_require__(107);
  96958. var WorldToTileX = __webpack_require__(54);
  96959. var WorldToTileY = __webpack_require__(53);
  96960. var TriangleToRectangle = function (triangle, rect)
  96961. {
  96962. return Intersects.RectangleToTriangle(rect, triangle);
  96963. };
  96964. // Note: Could possibly be optimized by copying the shape and shifting it into tilemapLayer
  96965. // coordinates instead of shifting the tiles.
  96966. /**
  96967. * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle,
  96968. * Line, Rectangle or Triangle. The shape should be in world coordinates.
  96969. *
  96970. * @function Phaser.Tilemaps.Components.GetTilesWithinShape
  96971. * @private
  96972. * @since 3.0.0
  96973. *
  96974. * @param {(Phaser.Geom.Circle|Phaser.Geom.Line|Phaser.Geom.Rectangle|Phaser.Geom.Triangle)} shape - A shape in world (pixel) coordinates
  96975. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  96976. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have -1 for an index.
  96977. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on at least one side.
  96978. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that have at least one interesting face.
  96979. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  96980. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  96981. *
  96982. * @return {Phaser.Tilemaps.Tile[]} Array of Tile objects.
  96983. */
  96984. var GetTilesWithinShape = function (shape, filteringOptions, camera, layer)
  96985. {
  96986. if (shape === undefined) { return []; }
  96987. // intersectTest is a function with parameters: shape, rect
  96988. var intersectTest = NOOP;
  96989. if (shape instanceof Geom.Circle) { intersectTest = Intersects.CircleToRectangle; }
  96990. else if (shape instanceof Geom.Rectangle) { intersectTest = Intersects.RectangleToRectangle; }
  96991. else if (shape instanceof Geom.Triangle) { intersectTest = TriangleToRectangle; }
  96992. else if (shape instanceof Geom.Line) { intersectTest = Intersects.LineToRectangle; }
  96993. // Top left corner of the shapes's bounding box, rounded down to include partial tiles
  96994. var xStart = WorldToTileX(shape.left, true, camera, layer);
  96995. var yStart = WorldToTileY(shape.top, true, camera, layer);
  96996. // Bottom right corner of the shapes's bounding box, rounded up to include partial tiles
  96997. var xEnd = Math.ceil(WorldToTileX(shape.right, false, camera, layer));
  96998. var yEnd = Math.ceil(WorldToTileY(shape.bottom, false, camera, layer));
  96999. // Tiles within bounding rectangle of shape. Bounds are forced to be at least 1 x 1 tile in size
  97000. // to grab tiles for shapes that don't have a height or width (e.g. a horizontal line).
  97001. var width = Math.max(xEnd - xStart, 1);
  97002. var height = Math.max(yEnd - yStart, 1);
  97003. var tiles = GetTilesWithin(xStart, yStart, width, height, filteringOptions, layer);
  97004. var tileWidth = layer.tileWidth;
  97005. var tileHeight = layer.tileHeight;
  97006. if (layer.tilemapLayer)
  97007. {
  97008. tileWidth *= layer.tilemapLayer.scaleX;
  97009. tileHeight *= layer.tilemapLayer.scaleY;
  97010. }
  97011. var results = [];
  97012. var tileRect = new Geom.Rectangle(0, 0, tileWidth, tileHeight);
  97013. for (var i = 0; i < tiles.length; i++)
  97014. {
  97015. var tile = tiles[i];
  97016. tileRect.x = TileToWorldX(tile.x, camera, layer);
  97017. tileRect.y = TileToWorldY(tile.y, camera, layer);
  97018. if (intersectTest(shape, tileRect))
  97019. {
  97020. results.push(tile);
  97021. }
  97022. }
  97023. return results;
  97024. };
  97025. module.exports = GetTilesWithinShape;
  97026. /***/ }),
  97027. /* 520 */
  97028. /***/ (function(module, exports, __webpack_require__) {
  97029. /**
  97030. * @author Richard Davey <rich@photonstorm.com>
  97031. * @copyright 2019 Photon Storm Ltd.
  97032. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97033. */
  97034. var GetTileAt = __webpack_require__(109);
  97035. var WorldToTileX = __webpack_require__(54);
  97036. var WorldToTileY = __webpack_require__(53);
  97037. /**
  97038. * Gets a tile at the given world coordinates from the given layer.
  97039. *
  97040. * @function Phaser.Tilemaps.Components.GetTileAtWorldXY
  97041. * @private
  97042. * @since 3.0.0
  97043. *
  97044. * @param {number} worldX - X position to get the tile from (given in pixels)
  97045. * @param {number} worldY - Y position to get the tile from (given in pixels)
  97046. * @param {boolean} [nonNull=false] - If true, function won't return null for empty tiles, but a Tile object with an index of -1.
  97047. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when calculating the tile index from the world values.
  97048. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  97049. *
  97050. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates
  97051. * were invalid.
  97052. */
  97053. var GetTileAtWorldXY = function (worldX, worldY, nonNull, camera, layer)
  97054. {
  97055. var tileX = WorldToTileX(worldX, true, camera, layer);
  97056. var tileY = WorldToTileY(worldY, true, camera, layer);
  97057. return GetTileAt(tileX, tileY, nonNull, layer);
  97058. };
  97059. module.exports = GetTileAtWorldXY;
  97060. /***/ }),
  97061. /* 521 */
  97062. /***/ (function(module, exports, __webpack_require__) {
  97063. /**
  97064. * @author Richard Davey <rich@photonstorm.com>
  97065. * @copyright 2019 Photon Storm Ltd.
  97066. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97067. */
  97068. var GetTilesWithin = __webpack_require__(21);
  97069. /**
  97070. * @callback EachTileCallback
  97071. *
  97072. * @param {Phaser.Tilemaps.Tile} value - The Tile.
  97073. * @param {integer} index - The index of the tile.
  97074. * @param {Phaser.Tilemaps.Tile[]} array - An array of Tile objects.
  97075. */
  97076. /**
  97077. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  97078. * callback. Similar to Array.prototype.forEach in vanilla JS.
  97079. *
  97080. * @function Phaser.Tilemaps.Components.ForEachTile
  97081. * @private
  97082. * @since 3.0.0
  97083. *
  97084. * @param {EachTileCallback} callback - The callback. Each tile in the given area will be passed to this callback as the first and only parameter.
  97085. * @param {object} [context] - The context under which the callback should be run.
  97086. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to filter.
  97087. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area to filter.
  97088. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  97089. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  97090. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  97091. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have -1 for an index.
  97092. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on at least one side.
  97093. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that have at least one interesting face.
  97094. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  97095. */
  97096. var ForEachTile = function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  97097. {
  97098. var tiles = GetTilesWithin(tileX, tileY, width, height, filteringOptions, layer);
  97099. tiles.forEach(callback, context);
  97100. };
  97101. module.exports = ForEachTile;
  97102. /***/ }),
  97103. /* 522 */
  97104. /***/ (function(module, exports, __webpack_require__) {
  97105. /**
  97106. * @author Richard Davey <rich@photonstorm.com>
  97107. * @copyright 2019 Photon Storm Ltd.
  97108. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97109. */
  97110. var GetTilesWithin = __webpack_require__(21);
  97111. /**
  97112. * @callback FindTileCallback
  97113. *
  97114. * @param {Phaser.Tilemaps.Tile} value - The Tile.
  97115. * @param {integer} index - The index of the tile.
  97116. * @param {Phaser.Tilemaps.Tile[]} array - An array of Tile objects.
  97117. *
  97118. * @return {boolean} Return `true` if the callback should run, otherwise `false`.
  97119. */
  97120. /**
  97121. * Find the first tile in the given rectangular area (in tile coordinates) of the layer that
  97122. * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns
  97123. * true. Similar to Array.prototype.find in vanilla JS.
  97124. *
  97125. * @function Phaser.Tilemaps.Components.FindTile
  97126. * @private
  97127. * @since 3.0.0
  97128. *
  97129. * @param {FindTileCallback} callback - The callback. Each tile in the given area will be passed to this callback as the first and only parameter.
  97130. * @param {object} [context] - The context under which the callback should be run.
  97131. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to filter.
  97132. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area to filter.
  97133. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  97134. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  97135. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  97136. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have -1 for an index.
  97137. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on at least one side.
  97138. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that have at least one interesting face.
  97139. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  97140. *
  97141. * @return {?Phaser.Tilemaps.Tile} A Tile that matches the search, or null if no Tile found
  97142. */
  97143. var FindTile = function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  97144. {
  97145. var tiles = GetTilesWithin(tileX, tileY, width, height, filteringOptions, layer);
  97146. return tiles.find(callback, context) || null;
  97147. };
  97148. module.exports = FindTile;
  97149. /***/ }),
  97150. /* 523 */
  97151. /***/ (function(module, exports) {
  97152. /**
  97153. * @author Richard Davey <rich@photonstorm.com>
  97154. * @copyright 2019 Photon Storm Ltd.
  97155. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97156. */
  97157. /**
  97158. * Searches the entire map layer for the first tile matching the given index, then returns that Tile
  97159. * object. If no match is found, it returns null. The search starts from the top-left tile and
  97160. * continues horizontally until it hits the end of the row, then it drops down to the next column.
  97161. * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to
  97162. * the top-left.
  97163. *
  97164. * @function Phaser.Tilemaps.Components.FindByIndex
  97165. * @private
  97166. * @since 3.0.0
  97167. *
  97168. * @param {integer} index - The tile index value to search for.
  97169. * @param {integer} [skip=0] - The number of times to skip a matching tile before returning.
  97170. * @param {boolean} [reverse=false] - If true it will scan the layer in reverse, starting at the
  97171. * bottom-right. Otherwise it scans from the top-left.
  97172. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  97173. *
  97174. * @return {?Phaser.Tilemaps.Tile} The first (or n skipped) tile with the matching index.
  97175. */
  97176. var FindByIndex = function (findIndex, skip, reverse, layer)
  97177. {
  97178. if (skip === undefined) { skip = 0; }
  97179. if (reverse === undefined) { reverse = false; }
  97180. var count = 0;
  97181. var tx;
  97182. var ty;
  97183. var tile;
  97184. if (reverse)
  97185. {
  97186. for (ty = layer.height - 1; ty >= 0; ty--)
  97187. {
  97188. for (tx = layer.width - 1; tx >= 0; tx--)
  97189. {
  97190. tile = layer.data[ty][tx];
  97191. if (tile && tile.index === findIndex)
  97192. {
  97193. if (count === skip)
  97194. {
  97195. return tile;
  97196. }
  97197. else
  97198. {
  97199. count += 1;
  97200. }
  97201. }
  97202. }
  97203. }
  97204. }
  97205. else
  97206. {
  97207. for (ty = 0; ty < layer.height; ty++)
  97208. {
  97209. for (tx = 0; tx < layer.width; tx++)
  97210. {
  97211. tile = layer.data[ty][tx];
  97212. if (tile && tile.index === findIndex)
  97213. {
  97214. if (count === skip)
  97215. {
  97216. return tile;
  97217. }
  97218. else
  97219. {
  97220. count += 1;
  97221. }
  97222. }
  97223. }
  97224. }
  97225. }
  97226. return null;
  97227. };
  97228. module.exports = FindByIndex;
  97229. /***/ }),
  97230. /* 524 */
  97231. /***/ (function(module, exports, __webpack_require__) {
  97232. /**
  97233. * @author Richard Davey <rich@photonstorm.com>
  97234. * @copyright 2019 Photon Storm Ltd.
  97235. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97236. */
  97237. var GetTilesWithin = __webpack_require__(21);
  97238. /**
  97239. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  97240. * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns
  97241. * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS.
  97242. *
  97243. * @function Phaser.Tilemaps.Components.FilterTiles
  97244. * @private
  97245. * @since 3.0.0
  97246. *
  97247. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  97248. * callback as the first and only parameter. The callback should return true for tiles that pass the
  97249. * filter.
  97250. * @param {object} [context] - The context under which the callback should be run.
  97251. * @param {integer} [tileX=0] - The left most tile index (in tile coordinates) to use as the origin of the area to filter.
  97252. * @param {integer} [tileY=0] - The top most tile index (in tile coordinates) to use as the origin of the area to filter.
  97253. * @param {integer} [width=max width based on tileX] - How many tiles wide from the `tileX` index the area will be.
  97254. * @param {integer} [height=max height based on tileY] - How many tiles tall from the `tileY` index the area will be.
  97255. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  97256. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have -1 for an index.
  97257. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on at least one side.
  97258. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that have at least one interesting face.
  97259. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  97260. *
  97261. * @return {Phaser.Tilemaps.Tile[]} The filtered array of Tiles.
  97262. */
  97263. var FilterTiles = function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  97264. {
  97265. var tiles = GetTilesWithin(tileX, tileY, width, height, filteringOptions, layer);
  97266. return tiles.filter(callback, context);
  97267. };
  97268. module.exports = FilterTiles;
  97269. /***/ }),
  97270. /* 525 */
  97271. /***/ (function(module, exports, __webpack_require__) {
  97272. /**
  97273. * @author Richard Davey <rich@photonstorm.com>
  97274. * @copyright 2019 Photon Storm Ltd.
  97275. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97276. */
  97277. var GetTilesWithin = __webpack_require__(21);
  97278. var CalculateFacesWithin = __webpack_require__(37);
  97279. var SetTileCollision = __webpack_require__(62);
  97280. /**
  97281. * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the
  97282. * specified index. Tiles will be set to collide if the given index is a colliding index.
  97283. * Collision information in the region will be recalculated.
  97284. *
  97285. * @function Phaser.Tilemaps.Components.Fill
  97286. * @private
  97287. * @since 3.0.0
  97288. *
  97289. * @param {integer} index - The tile index to fill the area with.
  97290. * @param {integer} tileX - The left most tile index (in tile coordinates) to use as the origin of the area.
  97291. * @param {integer} tileY - The top most tile index (in tile coordinates) to use as the origin of the area.
  97292. * @param {integer} width - How many tiles wide from the `tileX` index the area will be.
  97293. * @param {integer} height - How many tiles tall from the `tileY` index the area will be.
  97294. * @param {boolean} recalculateFaces - `true` if the faces data should be recalculated.
  97295. * @param {Phaser.Tilemaps.LayerData} layer - The tile layer to use. If not given the current layer is used.
  97296. */
  97297. var Fill = function (index, tileX, tileY, width, height, recalculateFaces, layer)
  97298. {
  97299. var doesIndexCollide = (layer.collideIndexes.indexOf(index) !== -1);
  97300. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  97301. for (var i = 0; i < tiles.length; i++)
  97302. {
  97303. tiles[i].index = index;
  97304. SetTileCollision(tiles[i], doesIndexCollide);
  97305. }
  97306. if (recalculateFaces)
  97307. {
  97308. // Recalculate the faces within the area and neighboring tiles
  97309. CalculateFacesWithin(tileX - 1, tileY - 1, width + 2, height + 2, layer);
  97310. }
  97311. };
  97312. module.exports = Fill;
  97313. /***/ }),
  97314. /* 526 */
  97315. /***/ (function(module, exports, __webpack_require__) {
  97316. /**
  97317. * @author Richard Davey <rich@photonstorm.com>
  97318. * @copyright 2019 Photon Storm Ltd.
  97319. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97320. */
  97321. var SnapFloor = __webpack_require__(98);
  97322. var SnapCeil = __webpack_require__(375);
  97323. /**
  97324. * Returns the tiles in the given layer that are within the camera's viewport. This is used internally.
  97325. *
  97326. * @function Phaser.Tilemaps.Components.CullTiles
  97327. * @private
  97328. * @since 3.0.0
  97329. *
  97330. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  97331. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to run the cull check against.
  97332. * @param {array} [outputArray] - An optional array to store the Tile objects within.
  97333. *
  97334. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  97335. */
  97336. var CullTiles = function (layer, camera, outputArray, renderOrder)
  97337. {
  97338. if (outputArray === undefined) { outputArray = []; }
  97339. if (renderOrder === undefined) { renderOrder = 0; }
  97340. outputArray.length = 0;
  97341. var tilemap = layer.tilemapLayer.tilemap;
  97342. var tilemapLayer = layer.tilemapLayer;
  97343. var mapData = layer.data;
  97344. var mapWidth = layer.width;
  97345. var mapHeight = layer.height;
  97346. // We need to use the tile sizes defined for the map as a whole, not the layer,
  97347. // in order to calculate the bounds correctly. As different sized tiles may be
  97348. // placed on the grid and we cannot trust layer.baseTileWidth to give us the true size.
  97349. var tileW = Math.floor(tilemap.tileWidth * tilemapLayer.scaleX);
  97350. var tileH = Math.floor(tilemap.tileHeight * tilemapLayer.scaleY);
  97351. var drawLeft = 0;
  97352. var drawRight = mapWidth;
  97353. var drawTop = 0;
  97354. var drawBottom = mapHeight;
  97355. if (!tilemapLayer.skipCull && tilemapLayer.scrollFactorX === 1 && tilemapLayer.scrollFactorY === 1)
  97356. {
  97357. // Camera world view bounds, snapped for scaled tile size
  97358. // Cull Padding values are given in tiles, not pixels
  97359. var boundsLeft = SnapFloor(camera.worldView.x - tilemapLayer.x, tileW, 0, true) - tilemapLayer.cullPaddingX;
  97360. var boundsRight = SnapCeil(camera.worldView.right - tilemapLayer.x, tileW, 0, true) + tilemapLayer.cullPaddingX;
  97361. var boundsTop = SnapFloor(camera.worldView.y - tilemapLayer.y, tileH, 0, true) - tilemapLayer.cullPaddingY;
  97362. var boundsBottom = SnapCeil(camera.worldView.bottom - tilemapLayer.y, tileH, 0, true) + tilemapLayer.cullPaddingY;
  97363. drawLeft = Math.max(0, boundsLeft);
  97364. drawRight = Math.min(mapWidth, boundsRight);
  97365. drawTop = Math.max(0, boundsTop);
  97366. drawBottom = Math.min(mapHeight, boundsBottom);
  97367. }
  97368. var x;
  97369. var y;
  97370. var tile;
  97371. if (renderOrder === 0)
  97372. {
  97373. // right-down
  97374. for (y = drawTop; y < drawBottom; y++)
  97375. {
  97376. for (x = drawLeft; mapData[y] && x < drawRight; x++)
  97377. {
  97378. tile = mapData[y][x];
  97379. if (!tile || tile.index === -1 || !tile.visible || tile.alpha === 0)
  97380. {
  97381. continue;
  97382. }
  97383. outputArray.push(tile);
  97384. }
  97385. }
  97386. }
  97387. else if (renderOrder === 1)
  97388. {
  97389. // left-down
  97390. for (y = drawTop; y < drawBottom; y++)
  97391. {
  97392. for (x = drawRight; mapData[y] && x >= drawLeft; x--)
  97393. {
  97394. tile = mapData[y][x];
  97395. if (!tile || tile.index === -1 || !tile.visible || tile.alpha === 0)
  97396. {
  97397. continue;
  97398. }
  97399. outputArray.push(tile);
  97400. }
  97401. }
  97402. }
  97403. else if (renderOrder === 2)
  97404. {
  97405. // right-up
  97406. for (y = drawBottom; y >= drawTop; y--)
  97407. {
  97408. for (x = drawLeft; mapData[y] && x < drawRight; x++)
  97409. {
  97410. tile = mapData[y][x];
  97411. if (!tile || tile.index === -1 || !tile.visible || tile.alpha === 0)
  97412. {
  97413. continue;
  97414. }
  97415. outputArray.push(tile);
  97416. }
  97417. }
  97418. }
  97419. else if (renderOrder === 3)
  97420. {
  97421. // left-up
  97422. for (y = drawBottom; y >= drawTop; y--)
  97423. {
  97424. for (x = drawRight; mapData[y] && x >= drawLeft; x--)
  97425. {
  97426. tile = mapData[y][x];
  97427. if (!tile || tile.index === -1 || !tile.visible || tile.alpha === 0)
  97428. {
  97429. continue;
  97430. }
  97431. outputArray.push(tile);
  97432. }
  97433. }
  97434. }
  97435. tilemapLayer.tilesDrawn = outputArray.length;
  97436. tilemapLayer.tilesTotal = mapWidth * mapHeight;
  97437. return outputArray;
  97438. };
  97439. module.exports = CullTiles;
  97440. /***/ }),
  97441. /* 527 */
  97442. /***/ (function(module, exports, __webpack_require__) {
  97443. /**
  97444. * @author Richard Davey <rich@photonstorm.com>
  97445. * @copyright 2019 Photon Storm Ltd.
  97446. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97447. */
  97448. var TileToWorldX = __webpack_require__(108);
  97449. var TileToWorldY = __webpack_require__(107);
  97450. var GetTilesWithin = __webpack_require__(21);
  97451. var ReplaceByIndex = __webpack_require__(236);
  97452. /**
  97453. * Creates a Sprite for every object matching the given tile indexes in the layer. You can
  97454. * optionally specify if each tile will be replaced with a new tile after the Sprite has been
  97455. * created. This is useful if you want to lay down special tiles in a level that are converted to
  97456. * Sprites, but want to replace the tile itself with a floor tile or similar once converted.
  97457. *
  97458. * @function Phaser.Tilemaps.Components.CreateFromTiles
  97459. * @private
  97460. * @since 3.0.0
  97461. *
  97462. * @param {(integer|array)} indexes - The tile index, or array of indexes, to create Sprites from.
  97463. * @param {(integer|array)} replacements - The tile index, or array of indexes, to change a converted tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a one-to-one mapping with the indexes array.
  97464. * @param {SpriteConfig} spriteConfig - The config object to pass into the Sprite creator (i.e. scene.make.sprite).
  97465. * @param {Phaser.Scene} [scene=scene the map is within] - The Scene to create the Sprites within.
  97466. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when determining the world XY
  97467. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  97468. *
  97469. * @return {Phaser.GameObjects.Sprite[]} An array of the Sprites that were created.
  97470. */
  97471. var CreateFromTiles = function (indexes, replacements, spriteConfig, scene, camera, layer)
  97472. {
  97473. if (spriteConfig === undefined) { spriteConfig = {}; }
  97474. if (!Array.isArray(indexes)) { indexes = [ indexes ]; }
  97475. var tilemapLayer = layer.tilemapLayer;
  97476. if (scene === undefined) { scene = tilemapLayer.scene; }
  97477. if (camera === undefined) { camera = scene.cameras.main; }
  97478. var tiles = GetTilesWithin(0, 0, layer.width, layer.height, null, layer);
  97479. var sprites = [];
  97480. var i;
  97481. for (i = 0; i < tiles.length; i++)
  97482. {
  97483. var tile = tiles[i];
  97484. if (indexes.indexOf(tile.index) !== -1)
  97485. {
  97486. spriteConfig.x = TileToWorldX(tile.x, camera, layer);
  97487. spriteConfig.y = TileToWorldY(tile.y, camera, layer);
  97488. var sprite = scene.make.sprite(spriteConfig);
  97489. sprites.push(sprite);
  97490. }
  97491. }
  97492. if (typeof replacements === 'number')
  97493. {
  97494. // Assume 1 replacement for all types of tile given
  97495. for (i = 0; i < indexes.length; i++)
  97496. {
  97497. ReplaceByIndex(indexes[i], replacements, 0, 0, layer.width, layer.height, layer);
  97498. }
  97499. }
  97500. else if (Array.isArray(replacements))
  97501. {
  97502. // Assume 1 to 1 mapping with indexes array
  97503. for (i = 0; i < indexes.length; i++)
  97504. {
  97505. ReplaceByIndex(indexes[i], replacements[i], 0, 0, layer.width, layer.height, layer);
  97506. }
  97507. }
  97508. return sprites;
  97509. };
  97510. module.exports = CreateFromTiles;
  97511. /***/ }),
  97512. /* 528 */
  97513. /***/ (function(module, exports, __webpack_require__) {
  97514. /**
  97515. * @author Richard Davey <rich@photonstorm.com>
  97516. * @copyright 2019 Photon Storm Ltd.
  97517. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97518. */
  97519. var GetTilesWithin = __webpack_require__(21);
  97520. var CalculateFacesWithin = __webpack_require__(37);
  97521. /**
  97522. * Copies the tiles in the source rectangular area to a new destination (all specified in tile
  97523. * coordinates) within the layer. This copies all tile properties & recalculates collision
  97524. * information in the destination region.
  97525. *
  97526. * @function Phaser.Tilemaps.Components.Copy
  97527. * @private
  97528. * @since 3.0.0
  97529. *
  97530. * @param {integer} srcTileX - The x coordinate of the area to copy from, in tiles, not pixels.
  97531. * @param {integer} srcTileY - The y coordinate of the area to copy from, in tiles, not pixels.
  97532. * @param {integer} width - The width of the area to copy, in tiles, not pixels.
  97533. * @param {integer} height - The height of the area to copy, in tiles, not pixels.
  97534. * @param {integer} destTileX - The x coordinate of the area to copy to, in tiles, not pixels.
  97535. * @param {integer} destTileY - The y coordinate of the area to copy to, in tiles, not pixels.
  97536. * @param {boolean} [recalculateFaces=true] - `true` if the faces data should be recalculated.
  97537. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  97538. */
  97539. var Copy = function (srcTileX, srcTileY, width, height, destTileX, destTileY, recalculateFaces, layer)
  97540. {
  97541. if (srcTileX < 0) { srcTileX = 0; }
  97542. if (srcTileY < 0) { srcTileY = 0; }
  97543. if (recalculateFaces === undefined) { recalculateFaces = true; }
  97544. var srcTiles = GetTilesWithin(srcTileX, srcTileY, width, height, null, layer);
  97545. var offsetX = destTileX - srcTileX;
  97546. var offsetY = destTileY - srcTileY;
  97547. for (var i = 0; i < srcTiles.length; i++)
  97548. {
  97549. var tileX = srcTiles[i].x + offsetX;
  97550. var tileY = srcTiles[i].y + offsetY;
  97551. if (tileX >= 0 && tileX < layer.width && tileY >= 0 && tileY < layer.height)
  97552. {
  97553. if (layer.data[tileY][tileX])
  97554. {
  97555. layer.data[tileY][tileX].copy(srcTiles[i]);
  97556. }
  97557. }
  97558. }
  97559. if (recalculateFaces)
  97560. {
  97561. // Recalculate the faces within the destination area and neighboring tiles
  97562. CalculateFacesWithin(destTileX - 1, destTileY - 1, width + 2, height + 2, layer);
  97563. }
  97564. };
  97565. module.exports = Copy;
  97566. /***/ }),
  97567. /* 529 */
  97568. /***/ (function(module, exports, __webpack_require__) {
  97569. /**
  97570. * @author Richard Davey <rich@photonstorm.com>
  97571. * @copyright 2019 Photon Storm Ltd.
  97572. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97573. */
  97574. /**
  97575. * @namespace Phaser.Tilemaps
  97576. */
  97577. module.exports = {
  97578. Components: __webpack_require__(110),
  97579. Parsers: __webpack_require__(499),
  97580. Formats: __webpack_require__(31),
  97581. ImageCollection: __webpack_require__(229),
  97582. ParseToTilemap: __webpack_require__(144),
  97583. Tile: __webpack_require__(61),
  97584. Tilemap: __webpack_require__(225),
  97585. TilemapCreator: __webpack_require__(482),
  97586. TilemapFactory: __webpack_require__(481),
  97587. Tileset: __webpack_require__(106),
  97588. LayerData: __webpack_require__(84),
  97589. MapData: __webpack_require__(83),
  97590. ObjectLayer: __webpack_require__(227),
  97591. DynamicTilemapLayer: __webpack_require__(224),
  97592. StaticTilemapLayer: __webpack_require__(223)
  97593. };
  97594. /***/ }),
  97595. /* 530 */
  97596. /***/ (function(module, exports) {
  97597. /**
  97598. * @author Richard Davey <rich@photonstorm.com>
  97599. * @copyright 2019 Photon Storm Ltd.
  97600. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97601. */
  97602. /**
  97603. * Filter Types.
  97604. *
  97605. * @name Phaser.Textures.FilterMode
  97606. * @enum {integer}
  97607. * @memberof Phaser.Textures
  97608. * @readonly
  97609. * @since 3.0.0
  97610. */
  97611. var CONST = {
  97612. /**
  97613. * Linear filter type.
  97614. *
  97615. * @name Phaser.Textures.FilterMode.LINEAR
  97616. */
  97617. LINEAR: 0,
  97618. /**
  97619. * Nearest neighbor filter type.
  97620. *
  97621. * @name Phaser.Textures.FilterMode.NEAREST
  97622. */
  97623. NEAREST: 1
  97624. };
  97625. module.exports = CONST;
  97626. /***/ }),
  97627. /* 531 */
  97628. /***/ (function(module, exports, __webpack_require__) {
  97629. /**
  97630. * @author Richard Davey <rich@photonstorm.com>
  97631. * @copyright 2019 Photon Storm Ltd.
  97632. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97633. */
  97634. var Extend = __webpack_require__(19);
  97635. var FilterMode = __webpack_require__(530);
  97636. /**
  97637. * @namespace Phaser.Textures
  97638. */
  97639. /**
  97640. * Linear filter type.
  97641. *
  97642. * @name Phaser.Textures.LINEAR
  97643. * @constant
  97644. */
  97645. /**
  97646. * Nearest Neighbor filter type.
  97647. *
  97648. * @name Phaser.Textures.NEAREST
  97649. * @constant
  97650. */
  97651. var Textures = {
  97652. Events: __webpack_require__(126),
  97653. FilterMode: FilterMode,
  97654. Frame: __webpack_require__(121),
  97655. Parsers: __webpack_require__(319),
  97656. Texture: __webpack_require__(175),
  97657. TextureManager: __webpack_require__(321),
  97658. TextureSource: __webpack_require__(320)
  97659. };
  97660. Textures = Extend(false, Textures, FilterMode);
  97661. module.exports = Textures;
  97662. /***/ }),
  97663. /* 532 */
  97664. /***/ (function(module, exports, __webpack_require__) {
  97665. /**
  97666. * @author Richard Davey <rich@photonstorm.com>
  97667. * @copyright 2019 Photon Storm Ltd.
  97668. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97669. */
  97670. /**
  97671. * @namespace Phaser.Structs
  97672. */
  97673. module.exports = {
  97674. List: __webpack_require__(120),
  97675. Map: __webpack_require__(194),
  97676. ProcessQueue: __webpack_require__(244),
  97677. RTree: __webpack_require__(243),
  97678. Set: __webpack_require__(102),
  97679. Size: __webpack_require__(333)
  97680. };
  97681. /***/ }),
  97682. /* 533 */
  97683. /***/ (function(module, exports, __webpack_require__) {
  97684. /**
  97685. * @author Richard Davey <rich@photonstorm.com>
  97686. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  97687. * @copyright 2019 Photon Storm Ltd.
  97688. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97689. */
  97690. /**
  97691. * @namespace Phaser.Sound
  97692. */
  97693. /**
  97694. * Config object containing various sound settings.
  97695. *
  97696. * @typedef {object} SoundConfig
  97697. *
  97698. * @property {boolean} [mute=false] - Boolean indicating whether the sound should be muted or not.
  97699. * @property {number} [volume=1] - A value between 0 (silence) and 1 (full volume).
  97700. * @property {number} [rate=1] - Defines the speed at which the sound should be played.
  97701. * @property {number} [detune=0] - Represents detuning of sound in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  97702. * @property {number} [seek=0] - Position of playback for this sound, in seconds.
  97703. * @property {boolean} [loop=false] - Whether or not the sound or current sound marker should loop.
  97704. * @property {number} [delay=0] - Time, in seconds, that should elapse before the sound actually starts its playback.
  97705. */
  97706. /**
  97707. * Marked section of a sound represented by name, and optionally start time, duration, and config object.
  97708. *
  97709. * @typedef {object} SoundMarker
  97710. *
  97711. * @property {string} name - Unique identifier of a sound marker.
  97712. * @property {number} [start=0] - Sound position offset at witch playback should start.
  97713. * @property {number} [duration] - Playback duration of this marker.
  97714. * @property {SoundConfig} [config] - An optional config object containing default marker settings.
  97715. */
  97716. module.exports = {
  97717. SoundManagerCreator: __webpack_require__(328),
  97718. Events: __webpack_require__(69),
  97719. BaseSound: __webpack_require__(122),
  97720. BaseSoundManager: __webpack_require__(123),
  97721. WebAudioSound: __webpack_require__(322),
  97722. WebAudioSoundManager: __webpack_require__(323),
  97723. HTML5AudioSound: __webpack_require__(326),
  97724. HTML5AudioSoundManager: __webpack_require__(327),
  97725. NoAudioSound: __webpack_require__(324),
  97726. NoAudioSoundManager: __webpack_require__(325)
  97727. };
  97728. /***/ }),
  97729. /* 534 */
  97730. /***/ (function(module, exports, __webpack_require__) {
  97731. /**
  97732. * @author Richard Davey <rich@photonstorm.com>
  97733. * @copyright 2019 Photon Storm Ltd.
  97734. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97735. */
  97736. var Clamp = __webpack_require__(23);
  97737. var Class = __webpack_require__(0);
  97738. var Events = __webpack_require__(16);
  97739. var GetFastValue = __webpack_require__(2);
  97740. var PluginCache = __webpack_require__(17);
  97741. /**
  97742. * @classdesc
  97743. * A proxy class to the Global Scene Manager.
  97744. *
  97745. * @class ScenePlugin
  97746. * @memberof Phaser.Scenes
  97747. * @constructor
  97748. * @since 3.0.0
  97749. *
  97750. * @param {Phaser.Scene} scene - The Scene that this ScenePlugin belongs to.
  97751. */
  97752. var ScenePlugin = new Class({
  97753. initialize:
  97754. function ScenePlugin (scene)
  97755. {
  97756. /**
  97757. * The Scene that this ScenePlugin belongs to.
  97758. *
  97759. * @name Phaser.Scenes.ScenePlugin#scene
  97760. * @type {Phaser.Scene}
  97761. * @since 3.0.0
  97762. */
  97763. this.scene = scene;
  97764. /**
  97765. * The Scene Systems instance of the Scene that this ScenePlugin belongs to.
  97766. *
  97767. * @name Phaser.Scenes.ScenePlugin#systems
  97768. * @type {Phaser.Scenes.Systems}
  97769. * @since 3.0.0
  97770. */
  97771. this.systems = scene.sys;
  97772. /**
  97773. * The settings of the Scene this ScenePlugin belongs to.
  97774. *
  97775. * @name Phaser.Scenes.ScenePlugin#settings
  97776. * @type {Phaser.Scenes.Settings.Object}
  97777. * @since 3.0.0
  97778. */
  97779. this.settings = scene.sys.settings;
  97780. /**
  97781. * The key of the Scene this ScenePlugin belongs to.
  97782. *
  97783. * @name Phaser.Scenes.ScenePlugin#key
  97784. * @type {string}
  97785. * @since 3.0.0
  97786. */
  97787. this.key = scene.sys.settings.key;
  97788. /**
  97789. * The Game's SceneManager.
  97790. *
  97791. * @name Phaser.Scenes.ScenePlugin#manager
  97792. * @type {Phaser.Scenes.SceneManager}
  97793. * @since 3.0.0
  97794. */
  97795. this.manager = scene.sys.game.scene;
  97796. /**
  97797. * If this Scene is currently transitioning to another, this holds
  97798. * the current percentage of the transition progress, between 0 and 1.
  97799. *
  97800. * @name Phaser.Scenes.ScenePlugin#transitionProgress
  97801. * @type {number}
  97802. * @since 3.5.0
  97803. */
  97804. this.transitionProgress = 0;
  97805. /**
  97806. * Transition elapsed timer.
  97807. *
  97808. * @name Phaser.Scenes.ScenePlugin#_elapsed
  97809. * @type {integer}
  97810. * @private
  97811. * @since 3.5.0
  97812. */
  97813. this._elapsed = 0;
  97814. /**
  97815. * Transition elapsed timer.
  97816. *
  97817. * @name Phaser.Scenes.ScenePlugin#_target
  97818. * @type {?Phaser.Scenes.Scene}
  97819. * @private
  97820. * @since 3.5.0
  97821. */
  97822. this._target = null;
  97823. /**
  97824. * Transition duration.
  97825. *
  97826. * @name Phaser.Scenes.ScenePlugin#_duration
  97827. * @type {integer}
  97828. * @private
  97829. * @since 3.5.0
  97830. */
  97831. this._duration = 0;
  97832. /**
  97833. * Transition callback.
  97834. *
  97835. * @name Phaser.Scenes.ScenePlugin#_onUpdate
  97836. * @type {function}
  97837. * @private
  97838. * @since 3.5.0
  97839. */
  97840. this._onUpdate;
  97841. /**
  97842. * Transition callback scope.
  97843. *
  97844. * @name Phaser.Scenes.ScenePlugin#_onUpdateScope
  97845. * @type {object}
  97846. * @private
  97847. * @since 3.5.0
  97848. */
  97849. this._onUpdateScope;
  97850. /**
  97851. * Will this Scene sleep (true) after the transition, or stop (false)
  97852. *
  97853. * @name Phaser.Scenes.ScenePlugin#_willSleep
  97854. * @type {boolean}
  97855. * @private
  97856. * @since 3.5.0
  97857. */
  97858. this._willSleep = false;
  97859. /**
  97860. * Will this Scene be removed from the Scene Manager after the transition completes?
  97861. *
  97862. * @name Phaser.Scenes.ScenePlugin#_willRemove
  97863. * @type {boolean}
  97864. * @private
  97865. * @since 3.5.0
  97866. */
  97867. this._willRemove = false;
  97868. scene.sys.events.once(Events.BOOT, this.boot, this);
  97869. scene.sys.events.on(Events.START, this.pluginStart, this);
  97870. },
  97871. /**
  97872. * This method is called automatically, only once, when the Scene is first created.
  97873. * Do not invoke it directly.
  97874. *
  97875. * @method Phaser.Scenes.ScenePlugin#boot
  97876. * @private
  97877. * @since 3.0.0
  97878. */
  97879. boot: function ()
  97880. {
  97881. this.systems.events.once(Events.DESTROY, this.destroy, this);
  97882. },
  97883. /**
  97884. * This method is called automatically by the Scene when it is starting up.
  97885. * It is responsible for creating local systems, properties and listening for Scene events.
  97886. * Do not invoke it directly.
  97887. *
  97888. * @method Phaser.Scenes.ScenePlugin#pluginStart
  97889. * @private
  97890. * @since 3.5.0
  97891. */
  97892. pluginStart: function ()
  97893. {
  97894. this._target = null;
  97895. this.systems.events.once(Events.SHUTDOWN, this.shutdown, this);
  97896. },
  97897. /**
  97898. * Shutdown this Scene and run the given one.
  97899. *
  97900. * @method Phaser.Scenes.ScenePlugin#start
  97901. * @since 3.0.0
  97902. *
  97903. * @param {string} [key] - The Scene to start.
  97904. * @param {object} [data] - The Scene data.
  97905. *
  97906. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  97907. */
  97908. start: function (key, data)
  97909. {
  97910. if (key === undefined) { key = this.key; }
  97911. this.manager.queueOp('stop', this.key);
  97912. this.manager.queueOp('start', key, data);
  97913. return this;
  97914. },
  97915. /**
  97916. * Restarts this Scene.
  97917. *
  97918. * @method Phaser.Scenes.ScenePlugin#restart
  97919. * @since 3.4.0
  97920. *
  97921. * @param {object} [data] - The Scene data.
  97922. *
  97923. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  97924. */
  97925. restart: function (data)
  97926. {
  97927. var key = this.key;
  97928. this.manager.queueOp('stop', key);
  97929. this.manager.queueOp('start', key, data);
  97930. return this;
  97931. },
  97932. /**
  97933. * @typedef {object} SceneTransitionConfig
  97934. *
  97935. * @property {string} target - The Scene key to transition to.
  97936. * @property {integer} [duration=1000] - The duration, in ms, for the transition to last.
  97937. * @property {boolean} [sleep=false] - Will the Scene responsible for the transition be sent to sleep on completion (`true`), or stopped? (`false`)
  97938. * @property {boolean} [allowInput=false] - Will the Scenes Input system be able to process events while it is transitioning in or out?
  97939. * @property {boolean} [moveAbove] - Move the target Scene to be above this one before the transition starts.
  97940. * @property {boolean} [moveBelow] - Move the target Scene to be below this one before the transition starts.
  97941. * @property {function} [onUpdate] - This callback is invoked every frame for the duration of the transition.
  97942. * @property {any} [onUpdateScope] - The context in which the callback is invoked.
  97943. * @property {any} [data] - An object containing any data you wish to be passed to the target Scenes init / create methods.
  97944. */
  97945. /**
  97946. * This will start a transition from the current Scene to the target Scene given.
  97947. *
  97948. * The transition will last for the duration specified in milliseconds.
  97949. *
  97950. * You can have the target Scene moved above or below this one in the display list.
  97951. *
  97952. * You can specify an update callback. This callback will be invoked _every frame_ for the duration
  97953. * of the transition.
  97954. *
  97955. * This Scene can either be sent to sleep at the end of the transition, or stopped. The default is to stop.
  97956. *
  97957. * There are also 5 transition related events: This scene will emit the event `transitionout` when
  97958. * the transition begins, which is typically the frame after calling this method.
  97959. *
  97960. * The target Scene will emit the event `transitioninit` when that Scene's `init` method is called.
  97961. * It will then emit the event `transitionstart` when its `create` method is called.
  97962. * If the Scene was sleeping and has been woken up, it will emit the event `transitionwake` instead of these two,
  97963. * as the Scenes `init` and `create` methods are not invoked when a Scene wakes up.
  97964. *
  97965. * When the duration of the transition has elapsed it will emit the event `transitioncomplete`.
  97966. * These events are cleared of all listeners when the Scene shuts down, but not if it is sent to sleep.
  97967. *
  97968. * It's important to understand that the duration of the transition begins the moment you call this method.
  97969. * If the Scene you are transitioning to includes delayed processes, such as waiting for files to load, the
  97970. * time still counts down even while that is happening. If the game itself pauses, or something else causes
  97971. * this Scenes update loop to stop, then the transition will also pause for that duration. There are
  97972. * checks in place to prevent you accidentally stopping a transitioning Scene but if you've got code to
  97973. * override this understand that until the target Scene completes it might never be unlocked for input events.
  97974. *
  97975. * @method Phaser.Scenes.ScenePlugin#transition
  97976. * @fires Phaser.Scenes.Events#TRANSITION_OUT
  97977. * @since 3.5.0
  97978. *
  97979. * @param {SceneTransitionConfig} config - The transition configuration object.
  97980. *
  97981. * @return {boolean} `true` is the transition was started, otherwise `false`.
  97982. */
  97983. transition: function (config)
  97984. {
  97985. if (config === undefined) { config = {}; }
  97986. var key = GetFastValue(config, 'target', false);
  97987. var target = this.manager.getScene(key);
  97988. if (!key || !this.checkValidTransition(target))
  97989. {
  97990. return false;
  97991. }
  97992. var duration = GetFastValue(config, 'duration', 1000);
  97993. this._elapsed = 0;
  97994. this._target = target;
  97995. this._duration = duration;
  97996. this._willSleep = GetFastValue(config, 'sleep', false);
  97997. this._willRemove = GetFastValue(config, 'remove', false);
  97998. var callback = GetFastValue(config, 'onUpdate', null);
  97999. if (callback)
  98000. {
  98001. this._onUpdate = callback;
  98002. this._onUpdateScope = GetFastValue(config, 'onUpdateScope', this.scene);
  98003. }
  98004. var allowInput = GetFastValue(config, 'allowInput', false);
  98005. this.settings.transitionAllowInput = allowInput;
  98006. var targetSettings = target.sys.settings;
  98007. targetSettings.isTransition = true;
  98008. targetSettings.transitionFrom = this.scene;
  98009. targetSettings.transitionDuration = duration;
  98010. targetSettings.transitionAllowInput = allowInput;
  98011. if (GetFastValue(config, 'moveAbove', false))
  98012. {
  98013. this.manager.moveAbove(this.key, key);
  98014. }
  98015. else if (GetFastValue(config, 'moveBelow', false))
  98016. {
  98017. this.manager.moveBelow(this.key, key);
  98018. }
  98019. if (target.sys.isSleeping())
  98020. {
  98021. target.sys.wake();
  98022. }
  98023. else
  98024. {
  98025. this.manager.start(key, GetFastValue(config, 'data'));
  98026. }
  98027. this.systems.events.emit(Events.TRANSITION_OUT, target, duration);
  98028. this.systems.events.on(Events.UPDATE, this.step, this);
  98029. return true;
  98030. },
  98031. /**
  98032. * Checks to see if this Scene can transition to the target Scene or not.
  98033. *
  98034. * @method Phaser.Scenes.ScenePlugin#checkValidTransition
  98035. * @private
  98036. * @since 3.5.0
  98037. *
  98038. * @param {Phaser.Scene} target - The Scene to test against.
  98039. *
  98040. * @return {boolean} `true` if this Scene can transition, otherwise `false`.
  98041. */
  98042. checkValidTransition: function (target)
  98043. {
  98044. // Not a valid target if it doesn't exist, isn't active or is already transitioning in or out
  98045. if (!target || target.sys.isActive() || target.sys.isTransitioning() || target === this.scene || this.systems.isTransitioning())
  98046. {
  98047. return false;
  98048. }
  98049. return true;
  98050. },
  98051. /**
  98052. * A single game step. This is only called if the parent Scene is transitioning
  98053. * out to another Scene.
  98054. *
  98055. * @method Phaser.Scenes.ScenePlugin#step
  98056. * @private
  98057. * @since 3.5.0
  98058. *
  98059. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  98060. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  98061. */
  98062. step: function (time, delta)
  98063. {
  98064. this._elapsed += delta;
  98065. this.transitionProgress = Clamp(this._elapsed / this._duration, 0, 1);
  98066. if (this._onUpdate)
  98067. {
  98068. this._onUpdate.call(this._onUpdateScope, this.transitionProgress);
  98069. }
  98070. if (this._elapsed >= this._duration)
  98071. {
  98072. this.transitionComplete();
  98073. }
  98074. },
  98075. /**
  98076. * Called by `step` when the transition out of this scene to another is over.
  98077. *
  98078. * @method Phaser.Scenes.ScenePlugin#transitionComplete
  98079. * @private
  98080. * @fires Phaser.Scenes.Events#TRANSITION_COMPLETE
  98081. * @since 3.5.0
  98082. */
  98083. transitionComplete: function ()
  98084. {
  98085. var targetSys = this._target.sys;
  98086. var targetSettings = this._target.sys.settings;
  98087. // Stop the step
  98088. this.systems.events.off(Events.UPDATE, this.step, this);
  98089. // Notify target scene
  98090. targetSys.events.emit(Events.TRANSITION_COMPLETE, this.scene);
  98091. // Clear target scene settings
  98092. targetSettings.isTransition = false;
  98093. targetSettings.transitionFrom = null;
  98094. // Clear local settings
  98095. this._duration = 0;
  98096. this._target = null;
  98097. this._onUpdate = null;
  98098. this._onUpdateScope = null;
  98099. // Now everything is clear we can handle what happens to this Scene
  98100. if (this._willRemove)
  98101. {
  98102. this.manager.remove(this.key);
  98103. }
  98104. else if (this._willSleep)
  98105. {
  98106. this.systems.sleep();
  98107. }
  98108. else
  98109. {
  98110. this.manager.stop(this.key);
  98111. }
  98112. },
  98113. /**
  98114. * Add the Scene into the Scene Manager and start it if 'autoStart' is true or the Scene config 'active' property is set.
  98115. *
  98116. * @method Phaser.Scenes.ScenePlugin#add
  98117. * @since 3.0.0
  98118. *
  98119. * @param {string} key - The Scene key.
  98120. * @param {(Phaser.Scene|Phaser.Scenes.Settings.Config|function)} sceneConfig - The config for the Scene.
  98121. * @param {boolean} autoStart - Whether to start the Scene after it's added.
  98122. * @param {object} [data] - Optional data object. This will be set as Scene.settings.data and passed to `Scene.init`.
  98123. *
  98124. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98125. */
  98126. add: function (key, sceneConfig, autoStart, data)
  98127. {
  98128. this.manager.add(key, sceneConfig, autoStart, data);
  98129. return this;
  98130. },
  98131. /**
  98132. * Launch the given Scene and run it in parallel with this one.
  98133. *
  98134. * @method Phaser.Scenes.ScenePlugin#launch
  98135. * @since 3.0.0
  98136. *
  98137. * @param {string} key - The Scene to launch.
  98138. * @param {object} [data] - The Scene data.
  98139. *
  98140. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98141. */
  98142. launch: function (key, data)
  98143. {
  98144. if (key && key !== this.key)
  98145. {
  98146. this.manager.queueOp('start', key, data);
  98147. }
  98148. return this;
  98149. },
  98150. /**
  98151. * Runs the given Scene, but does not change the state of this Scene.
  98152. *
  98153. * If the given Scene is paused, it will resume it. If sleeping, it will wake it.
  98154. * If not running at all, it will be started.
  98155. *
  98156. * Use this if you wish to open a modal Scene by calling `pause` on the current
  98157. * Scene, then `run` on the modal Scene.
  98158. *
  98159. * @method Phaser.Scenes.ScenePlugin#run
  98160. * @since 3.10.0
  98161. *
  98162. * @param {string} key - The Scene to run.
  98163. * @param {object} [data] - A data object that will be passed to the Scene and emitted in its ready, wake, or resume events.
  98164. *
  98165. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98166. */
  98167. run: function (key, data)
  98168. {
  98169. if (key && key !== this.key)
  98170. {
  98171. this.manager.queueOp('run', key, data);
  98172. }
  98173. return this;
  98174. },
  98175. /**
  98176. * Pause the Scene - this stops the update step from happening but it still renders.
  98177. *
  98178. * @method Phaser.Scenes.ScenePlugin#pause
  98179. * @since 3.0.0
  98180. *
  98181. * @param {string} [key] - The Scene to pause.
  98182. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted in its pause event.
  98183. *
  98184. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98185. */
  98186. pause: function (key, data)
  98187. {
  98188. if (key === undefined) { key = this.key; }
  98189. this.manager.queueOp('pause', key, data);
  98190. return this;
  98191. },
  98192. /**
  98193. * Resume the Scene - starts the update loop again.
  98194. *
  98195. * @method Phaser.Scenes.ScenePlugin#resume
  98196. * @since 3.0.0
  98197. *
  98198. * @param {string} [key] - The Scene to resume.
  98199. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted in its resume event.
  98200. *
  98201. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98202. */
  98203. resume: function (key, data)
  98204. {
  98205. if (key === undefined) { key = this.key; }
  98206. this.manager.queueOp('resume', key, data);
  98207. return this;
  98208. },
  98209. /**
  98210. * Makes the Scene sleep (no update, no render) but doesn't shutdown.
  98211. *
  98212. * @method Phaser.Scenes.ScenePlugin#sleep
  98213. * @since 3.0.0
  98214. *
  98215. * @param {string} [key] - The Scene to put to sleep.
  98216. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted in its sleep event.
  98217. *
  98218. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98219. */
  98220. sleep: function (key, data)
  98221. {
  98222. if (key === undefined) { key = this.key; }
  98223. this.manager.queueOp('sleep', key, data);
  98224. return this;
  98225. },
  98226. /**
  98227. * Makes the Scene wake-up (starts update and render)
  98228. *
  98229. * @method Phaser.Scenes.ScenePlugin#wake
  98230. * @since 3.0.0
  98231. *
  98232. * @param {string} [key] - The Scene to wake up.
  98233. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted in its wake event.
  98234. *
  98235. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98236. */
  98237. wake: function (key, data)
  98238. {
  98239. if (key === undefined) { key = this.key; }
  98240. this.manager.queueOp('wake', key, data);
  98241. return this;
  98242. },
  98243. /**
  98244. * Makes this Scene sleep then starts the Scene given.
  98245. *
  98246. * @method Phaser.Scenes.ScenePlugin#switch
  98247. * @since 3.0.0
  98248. *
  98249. * @param {string} key - The Scene to start.
  98250. *
  98251. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98252. */
  98253. switch: function (key)
  98254. {
  98255. if (key !== this.key)
  98256. {
  98257. this.manager.queueOp('switch', this.key, key);
  98258. }
  98259. return this;
  98260. },
  98261. /**
  98262. * Shutdown the Scene, clearing display list, timers, etc.
  98263. *
  98264. * @method Phaser.Scenes.ScenePlugin#stop
  98265. * @since 3.0.0
  98266. *
  98267. * @param {string} [key] - The Scene to stop.
  98268. *
  98269. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98270. */
  98271. stop: function (key)
  98272. {
  98273. if (key === undefined) { key = this.key; }
  98274. this.manager.queueOp('stop', key);
  98275. return this;
  98276. },
  98277. /**
  98278. * Sets the active state of the given Scene.
  98279. *
  98280. * @method Phaser.Scenes.ScenePlugin#setActive
  98281. * @since 3.0.0
  98282. *
  98283. * @param {boolean} value - If `true` the Scene will be resumed. If `false` it will be paused.
  98284. * @param {string} [key] - The Scene to set the active state of.
  98285. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted with its events.
  98286. *
  98287. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98288. */
  98289. setActive: function (value, key, data)
  98290. {
  98291. if (key === undefined) { key = this.key; }
  98292. var scene = this.manager.getScene(key);
  98293. if (scene)
  98294. {
  98295. scene.sys.setActive(value, data);
  98296. }
  98297. return this;
  98298. },
  98299. /**
  98300. * Sets the visible state of the given Scene.
  98301. *
  98302. * @method Phaser.Scenes.ScenePlugin#setVisible
  98303. * @since 3.0.0
  98304. *
  98305. * @param {boolean} value - The visible value.
  98306. * @param {string} [key] - The Scene to set the visible state for.
  98307. *
  98308. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98309. */
  98310. setVisible: function (value, key)
  98311. {
  98312. if (key === undefined) { key = this.key; }
  98313. var scene = this.manager.getScene(key);
  98314. if (scene)
  98315. {
  98316. scene.sys.setVisible(value);
  98317. }
  98318. return this;
  98319. },
  98320. /**
  98321. * Checks if the given Scene is sleeping or not?
  98322. *
  98323. * @method Phaser.Scenes.ScenePlugin#isSleeping
  98324. * @since 3.0.0
  98325. *
  98326. * @param {string} [key] - The Scene to check.
  98327. *
  98328. * @return {boolean} Whether the Scene is sleeping.
  98329. */
  98330. isSleeping: function (key)
  98331. {
  98332. if (key === undefined) { key = this.key; }
  98333. return this.manager.isSleeping(key);
  98334. },
  98335. /**
  98336. * Checks if the given Scene is active or not?
  98337. *
  98338. * @method Phaser.Scenes.ScenePlugin#isActive
  98339. * @since 3.0.0
  98340. *
  98341. * @param {string} [key] - The Scene to check.
  98342. *
  98343. * @return {boolean} Whether the Scene is active.
  98344. */
  98345. isActive: function (key)
  98346. {
  98347. if (key === undefined) { key = this.key; }
  98348. return this.manager.isActive(key);
  98349. },
  98350. /**
  98351. * Checks if the given Scene is visible or not?
  98352. *
  98353. * @method Phaser.Scenes.ScenePlugin#isVisible
  98354. * @since 3.0.0
  98355. *
  98356. * @param {string} [key] - The Scene to check.
  98357. *
  98358. * @return {boolean} Whether the Scene is visible.
  98359. */
  98360. isVisible: function (key)
  98361. {
  98362. if (key === undefined) { key = this.key; }
  98363. return this.manager.isVisible(key);
  98364. },
  98365. /**
  98366. * Swaps the position of two scenes in the Scenes list.
  98367. *
  98368. * This controls the order in which they are rendered and updated.
  98369. *
  98370. * @method Phaser.Scenes.ScenePlugin#swapPosition
  98371. * @since 3.2.0
  98372. *
  98373. * @param {string} keyA - The first Scene to swap.
  98374. * @param {string} [keyB] - The second Scene to swap. If none is given it defaults to this Scene.
  98375. *
  98376. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98377. */
  98378. swapPosition: function (keyA, keyB)
  98379. {
  98380. if (keyB === undefined) { keyB = this.key; }
  98381. if (keyA !== keyB)
  98382. {
  98383. this.manager.swapPosition(keyA, keyB);
  98384. }
  98385. return this;
  98386. },
  98387. /**
  98388. * Swaps the position of two scenes in the Scenes list, so that Scene B is directly above Scene A.
  98389. *
  98390. * This controls the order in which they are rendered and updated.
  98391. *
  98392. * @method Phaser.Scenes.ScenePlugin#moveAbove
  98393. * @since 3.2.0
  98394. *
  98395. * @param {string} keyA - The Scene that Scene B will be moved to be above.
  98396. * @param {string} [keyB] - The Scene to be moved. If none is given it defaults to this Scene.
  98397. *
  98398. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98399. */
  98400. moveAbove: function (keyA, keyB)
  98401. {
  98402. if (keyB === undefined) { keyB = this.key; }
  98403. if (keyA !== keyB)
  98404. {
  98405. this.manager.moveAbove(keyA, keyB);
  98406. }
  98407. return this;
  98408. },
  98409. /**
  98410. * Swaps the position of two scenes in the Scenes list, so that Scene B is directly below Scene A.
  98411. *
  98412. * This controls the order in which they are rendered and updated.
  98413. *
  98414. * @method Phaser.Scenes.ScenePlugin#moveBelow
  98415. * @since 3.2.0
  98416. *
  98417. * @param {string} keyA - The Scene that Scene B will be moved to be below.
  98418. * @param {string} [keyB] - The Scene to be moved. If none is given it defaults to this Scene.
  98419. *
  98420. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98421. */
  98422. moveBelow: function (keyA, keyB)
  98423. {
  98424. if (keyB === undefined) { keyB = this.key; }
  98425. if (keyA !== keyB)
  98426. {
  98427. this.manager.moveBelow(keyA, keyB);
  98428. }
  98429. return this;
  98430. },
  98431. /**
  98432. * Removes a Scene from the SceneManager.
  98433. *
  98434. * The Scene is removed from the local scenes array, it's key is cleared from the keys
  98435. * cache and Scene.Systems.destroy is then called on it.
  98436. *
  98437. * If the SceneManager is processing the Scenes when this method is called it wil
  98438. * queue the operation for the next update sequence.
  98439. *
  98440. * @method Phaser.Scenes.ScenePlugin#remove
  98441. * @since 3.2.0
  98442. *
  98443. * @param {(string|Phaser.Scene)} [key] - The Scene to be removed.
  98444. *
  98445. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  98446. */
  98447. remove: function (key)
  98448. {
  98449. if (key === undefined) { key = this.key; }
  98450. this.manager.remove(key);
  98451. return this;
  98452. },
  98453. /**
  98454. * Moves a Scene up one position in the Scenes list.
  98455. *
  98456. * @method Phaser.Scenes.ScenePlugin#moveUp
  98457. * @since 3.0.0
  98458. *
  98459. * @param {string} [key] - The Scene to move.
  98460. *
  98461. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98462. */
  98463. moveUp: function (key)
  98464. {
  98465. if (key === undefined) { key = this.key; }
  98466. this.manager.moveUp(key);
  98467. return this;
  98468. },
  98469. /**
  98470. * Moves a Scene down one position in the Scenes list.
  98471. *
  98472. * @method Phaser.Scenes.ScenePlugin#moveDown
  98473. * @since 3.0.0
  98474. *
  98475. * @param {string} [key] - The Scene to move.
  98476. *
  98477. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98478. */
  98479. moveDown: function (key)
  98480. {
  98481. if (key === undefined) { key = this.key; }
  98482. this.manager.moveDown(key);
  98483. return this;
  98484. },
  98485. /**
  98486. * Brings a Scene to the top of the Scenes list.
  98487. *
  98488. * This means it will render above all other Scenes.
  98489. *
  98490. * @method Phaser.Scenes.ScenePlugin#bringToTop
  98491. * @since 3.0.0
  98492. *
  98493. * @param {string} [key] - The Scene to move.
  98494. *
  98495. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98496. */
  98497. bringToTop: function (key)
  98498. {
  98499. if (key === undefined) { key = this.key; }
  98500. this.manager.bringToTop(key);
  98501. return this;
  98502. },
  98503. /**
  98504. * Sends a Scene to the back of the Scenes list.
  98505. *
  98506. * This means it will render below all other Scenes.
  98507. *
  98508. * @method Phaser.Scenes.ScenePlugin#sendToBack
  98509. * @since 3.0.0
  98510. *
  98511. * @param {string} [key] - The Scene to move.
  98512. *
  98513. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  98514. */
  98515. sendToBack: function (key)
  98516. {
  98517. if (key === undefined) { key = this.key; }
  98518. this.manager.sendToBack(key);
  98519. return this;
  98520. },
  98521. /**
  98522. * Retrieve a Scene.
  98523. *
  98524. * @method Phaser.Scenes.ScenePlugin#get
  98525. * @since 3.0.0
  98526. *
  98527. * @param {string} key - The Scene to retrieve.
  98528. *
  98529. * @return {Phaser.Scene} The Scene.
  98530. */
  98531. get: function (key)
  98532. {
  98533. return this.manager.getScene(key);
  98534. },
  98535. /**
  98536. * Retrieves the numeric index of a Scene in the Scenes list.
  98537. *
  98538. * @method Phaser.Scenes.ScenePlugin#getIndex
  98539. * @since 3.7.0
  98540. *
  98541. * @param {(string|Phaser.Scene)} [key] - The Scene to get the index of.
  98542. *
  98543. * @return {integer} The index of the Scene.
  98544. */
  98545. getIndex: function (key)
  98546. {
  98547. if (key === undefined) { key = this.key; }
  98548. return this.manager.getIndex(key);
  98549. },
  98550. /**
  98551. * The Scene that owns this plugin is shutting down.
  98552. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  98553. *
  98554. * @method Phaser.Scenes.ScenePlugin#shutdown
  98555. * @private
  98556. * @since 3.0.0
  98557. */
  98558. shutdown: function ()
  98559. {
  98560. var eventEmitter = this.systems.events;
  98561. eventEmitter.off(Events.SHUTDOWN, this.shutdown, this);
  98562. eventEmitter.off(Events.POST_UPDATE, this.step, this);
  98563. eventEmitter.off(Events.TRANSITION_OUT);
  98564. },
  98565. /**
  98566. * The Scene that owns this plugin is being destroyed.
  98567. * We need to shutdown and then kill off all external references.
  98568. *
  98569. * @method Phaser.Scenes.ScenePlugin#destroy
  98570. * @private
  98571. * @since 3.0.0
  98572. */
  98573. destroy: function ()
  98574. {
  98575. this.shutdown();
  98576. this.scene.sys.events.off(Events.START, this.start, this);
  98577. this.scene = null;
  98578. this.systems = null;
  98579. this.settings = null;
  98580. this.manager = null;
  98581. }
  98582. });
  98583. PluginCache.register('ScenePlugin', ScenePlugin, 'scenePlugin');
  98584. module.exports = ScenePlugin;
  98585. /***/ }),
  98586. /* 535 */
  98587. /***/ (function(module, exports, __webpack_require__) {
  98588. /**
  98589. * @author Richard Davey <rich@photonstorm.com>
  98590. * @copyright 2019 Photon Storm Ltd.
  98591. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98592. */
  98593. var CONST = __webpack_require__(124);
  98594. var Extend = __webpack_require__(19);
  98595. /**
  98596. * @namespace Phaser.Scenes
  98597. */
  98598. var Scene = {
  98599. Events: __webpack_require__(16),
  98600. SceneManager: __webpack_require__(332),
  98601. ScenePlugin: __webpack_require__(534),
  98602. Settings: __webpack_require__(329),
  98603. Systems: __webpack_require__(176)
  98604. };
  98605. // Merge in the consts
  98606. Scene = Extend(false, Scene, CONST);
  98607. module.exports = Scene;
  98608. /***/ }),
  98609. /* 536 */
  98610. /***/ (function(module, exports, __webpack_require__) {
  98611. /**
  98612. * @author Richard Davey <rich@photonstorm.com>
  98613. * @copyright 2019 Photon Storm Ltd.
  98614. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98615. */
  98616. var Extend = __webpack_require__(19);
  98617. var CONST = __webpack_require__(178);
  98618. /**
  98619. * @namespace Phaser.Scale
  98620. *
  98621. * @borrows Phaser.Scale.Center.NO_CENTER as NO_CENTER
  98622. * @borrows Phaser.Scale.Center.CENTER_BOTH as CENTER_BOTH
  98623. * @borrows Phaser.Scale.Center.CENTER_HORIZONTALLY as CENTER_HORIZONTALLY
  98624. * @borrows Phaser.Scale.Center.CENTER_VERTICALLY as CENTER_VERTICALLY
  98625. *
  98626. * @borrows Phaser.Scale.Orientation.LANDSCAPE as LANDSCAPE
  98627. * @borrows Phaser.Scale.Orientation.PORTRAIT as PORTRAIT
  98628. *
  98629. * @borrows Phaser.Scale.ScaleModes.NONE as NONE
  98630. * @borrows Phaser.Scale.ScaleModes.WIDTH_CONTROLS_HEIGHT as WIDTH_CONTROLS_HEIGHT
  98631. * @borrows Phaser.Scale.ScaleModes.HEIGHT_CONTROLS_WIDTH as HEIGHT_CONTROLS_WIDTH
  98632. * @borrows Phaser.Scale.ScaleModes.FIT as FIT
  98633. * @borrows Phaser.Scale.ScaleModes.ENVELOP as ENVELOP
  98634. * @borrows Phaser.Scale.ScaleModes.RESIZE as RESIZE
  98635. *
  98636. * @borrows Phaser.Scale.Zoom.NO_ZOOM as NO_ZOOM
  98637. * @borrows Phaser.Scale.Zoom.ZOOM_2X as ZOOM_2X
  98638. * @borrows Phaser.Scale.Zoom.ZOOM_4X as ZOOM_4X
  98639. * @borrows Phaser.Scale.Zoom.MAX_ZOOM as MAX_ZOOM
  98640. */
  98641. var Scale = {
  98642. Center: __webpack_require__(349),
  98643. Events: __webpack_require__(334),
  98644. Orientation: __webpack_require__(348),
  98645. ScaleManager: __webpack_require__(335),
  98646. ScaleModes: __webpack_require__(347),
  98647. Zoom: __webpack_require__(346)
  98648. };
  98649. Scale = Extend(false, Scale, CONST.CENTER);
  98650. Scale = Extend(false, Scale, CONST.ORIENTATION);
  98651. Scale = Extend(false, Scale, CONST.SCALE_MODE);
  98652. Scale = Extend(false, Scale, CONST.ZOOM);
  98653. module.exports = Scale;
  98654. /***/ }),
  98655. /* 537 */
  98656. /***/ (function(module, exports, __webpack_require__) {
  98657. /**
  98658. * @author Richard Davey <rich@photonstorm.com>
  98659. * @copyright 2019 Photon Storm Ltd.
  98660. * @license {@link https://github.com/photonstorm/phaser3-plugin-template/blob/master/LICENSE|MIT License}
  98661. */
  98662. var BasePlugin = __webpack_require__(237);
  98663. var Class = __webpack_require__(0);
  98664. var SceneEvents = __webpack_require__(16);
  98665. /**
  98666. * @classdesc
  98667. * A Scene Level Plugin is installed into every Scene and belongs to that Scene.
  98668. * It can listen for Scene events and respond to them.
  98669. * It can map itself to a Scene property, or into the Scene Systems, or both.
  98670. *
  98671. * @class ScenePlugin
  98672. * @memberof Phaser.Plugins
  98673. * @extends Phaser.Plugins.BasePlugin
  98674. * @constructor
  98675. * @since 3.8.0
  98676. *
  98677. * @param {Phaser.Scene} scene - A reference to the Scene that has installed this plugin.
  98678. * @param {Phaser.Plugins.PluginManager} pluginManager - A reference to the Plugin Manager.
  98679. */
  98680. var ScenePlugin = new Class({
  98681. Extends: BasePlugin,
  98682. initialize:
  98683. function ScenePlugin (scene, pluginManager)
  98684. {
  98685. BasePlugin.call(this, pluginManager);
  98686. this.scene = scene;
  98687. this.systems = scene.sys;
  98688. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  98689. },
  98690. /**
  98691. * This method is called when the Scene boots. It is only ever called once.
  98692. *
  98693. * By this point the plugin properties `scene` and `systems` will have already been set.
  98694. *
  98695. * In here you can listen for Scene events and set-up whatever you need for this plugin to run.
  98696. * Here are the Scene events you can listen to:
  98697. *
  98698. * start
  98699. * ready
  98700. * preupdate
  98701. * update
  98702. * postupdate
  98703. * resize
  98704. * pause
  98705. * resume
  98706. * sleep
  98707. * wake
  98708. * transitioninit
  98709. * transitionstart
  98710. * transitioncomplete
  98711. * transitionout
  98712. * shutdown
  98713. * destroy
  98714. *
  98715. * At the very least you should offer a destroy handler for when the Scene closes down, i.e:
  98716. *
  98717. * ```javascript
  98718. * var eventEmitter = this.systems.events;
  98719. * eventEmitter.once('destroy', this.sceneDestroy, this);
  98720. * ```
  98721. *
  98722. * @method Phaser.Plugins.ScenePlugin#boot
  98723. * @since 3.8.0
  98724. */
  98725. boot: function ()
  98726. {
  98727. }
  98728. });
  98729. module.exports = ScenePlugin;
  98730. /***/ }),
  98731. /* 538 */
  98732. /***/ (function(module, exports, __webpack_require__) {
  98733. /**
  98734. * @author Richard Davey <rich@photonstorm.com>
  98735. * @copyright 2019 Photon Storm Ltd.
  98736. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98737. */
  98738. /**
  98739. * @namespace Phaser.Plugins
  98740. */
  98741. module.exports = {
  98742. BasePlugin: __webpack_require__(237),
  98743. DefaultPlugins: __webpack_require__(181),
  98744. PluginCache: __webpack_require__(17),
  98745. PluginManager: __webpack_require__(336),
  98746. ScenePlugin: __webpack_require__(537)
  98747. };
  98748. /***/ }),
  98749. /* 539 */
  98750. /***/ (function(module, exports, __webpack_require__) {
  98751. /**
  98752. * The `Matter.World` module contains methods for creating and manipulating the world composite.
  98753. * A `Matter.World` is a `Matter.Composite` body, which is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`.
  98754. * A `Matter.World` has a few additional properties including `gravity` and `bounds`.
  98755. * It is important to use the functions in the `Matter.Composite` module to modify the world composite, rather than directly modifying its properties.
  98756. * There are also a few methods here that alias those in `Matter.Composite` for easier readability.
  98757. *
  98758. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  98759. *
  98760. * @class World
  98761. * @extends Composite
  98762. */
  98763. var World = {};
  98764. module.exports = World;
  98765. var Composite = __webpack_require__(149);
  98766. var Constraint = __webpack_require__(209);
  98767. var Common = __webpack_require__(36);
  98768. (function() {
  98769. /**
  98770. * Creates a new world composite. The options parameter is an object that specifies any properties you wish to override the defaults.
  98771. * See the properties section below for detailed information on what you can pass via the `options` object.
  98772. * @method create
  98773. * @constructor
  98774. * @param {} options
  98775. * @return {world} A new world
  98776. */
  98777. World.create = function(options) {
  98778. var composite = Composite.create();
  98779. var defaults = {
  98780. label: 'World',
  98781. gravity: {
  98782. x: 0,
  98783. y: 1,
  98784. scale: 0.001
  98785. },
  98786. bounds: {
  98787. min: { x: -Infinity, y: -Infinity },
  98788. max: { x: Infinity, y: Infinity }
  98789. }
  98790. };
  98791. return Common.extend(composite, defaults, options);
  98792. };
  98793. /*
  98794. *
  98795. * Properties Documentation
  98796. *
  98797. */
  98798. /**
  98799. * The gravity to apply on the world.
  98800. *
  98801. * @property gravity
  98802. * @type object
  98803. */
  98804. /**
  98805. * The gravity x component.
  98806. *
  98807. * @property gravity.x
  98808. * @type object
  98809. * @default 0
  98810. */
  98811. /**
  98812. * The gravity y component.
  98813. *
  98814. * @property gravity.y
  98815. * @type object
  98816. * @default 1
  98817. */
  98818. /**
  98819. * The gravity scale factor.
  98820. *
  98821. * @property gravity.scale
  98822. * @type object
  98823. * @default 0.001
  98824. */
  98825. /**
  98826. * A `Bounds` object that defines the world bounds for collision detection.
  98827. *
  98828. * @property bounds
  98829. * @type bounds
  98830. * @default { min: { x: -Infinity, y: -Infinity }, max: { x: Infinity, y: Infinity } }
  98831. */
  98832. // World is a Composite body
  98833. // see src/module/Outro.js for these aliases:
  98834. /**
  98835. * An alias for Composite.add
  98836. * @method add
  98837. * @param {world} world
  98838. * @param {} object
  98839. * @return {composite} The original world with the objects added
  98840. */
  98841. /**
  98842. * An alias for Composite.remove
  98843. * @method remove
  98844. * @param {world} world
  98845. * @param {} object
  98846. * @param {boolean} [deep=false]
  98847. * @return {composite} The original world with the objects removed
  98848. */
  98849. /**
  98850. * An alias for Composite.clear
  98851. * @method clear
  98852. * @param {world} world
  98853. * @param {boolean} keepStatic
  98854. */
  98855. /**
  98856. * An alias for Composite.addComposite
  98857. * @method addComposite
  98858. * @param {world} world
  98859. * @param {composite} composite
  98860. * @return {world} The original world with the objects from composite added
  98861. */
  98862. /**
  98863. * An alias for Composite.addBody
  98864. * @method addBody
  98865. * @param {world} world
  98866. * @param {body} body
  98867. * @return {world} The original world with the body added
  98868. */
  98869. /**
  98870. * An alias for Composite.addConstraint
  98871. * @method addConstraint
  98872. * @param {world} world
  98873. * @param {constraint} constraint
  98874. * @return {world} The original world with the constraint added
  98875. */
  98876. })();
  98877. /***/ }),
  98878. /* 540 */
  98879. /***/ (function(module, exports, __webpack_require__) {
  98880. /**
  98881. * The `Matter.Plugin` module contains functions for registering and installing plugins on modules.
  98882. *
  98883. * @class Plugin
  98884. */
  98885. var Plugin = {};
  98886. module.exports = Plugin;
  98887. var Common = __webpack_require__(36);
  98888. (function() {
  98889. Plugin._registry = {};
  98890. /**
  98891. * Registers a plugin object so it can be resolved later by name.
  98892. * @method register
  98893. * @param plugin {} The plugin to register.
  98894. * @return {object} The plugin.
  98895. */
  98896. Plugin.register = function(plugin) {
  98897. if (!Plugin.isPlugin(plugin)) {
  98898. Common.warn('Plugin.register:', Plugin.toString(plugin), 'does not implement all required fields.');
  98899. }
  98900. if (plugin.name in Plugin._registry) {
  98901. var registered = Plugin._registry[plugin.name],
  98902. pluginVersion = Plugin.versionParse(plugin.version).number,
  98903. registeredVersion = Plugin.versionParse(registered.version).number;
  98904. if (pluginVersion > registeredVersion) {
  98905. Common.warn('Plugin.register:', Plugin.toString(registered), 'was upgraded to', Plugin.toString(plugin));
  98906. Plugin._registry[plugin.name] = plugin;
  98907. } else if (pluginVersion < registeredVersion) {
  98908. Common.warn('Plugin.register:', Plugin.toString(registered), 'can not be downgraded to', Plugin.toString(plugin));
  98909. } else if (plugin !== registered) {
  98910. Common.warn('Plugin.register:', Plugin.toString(plugin), 'is already registered to different plugin object');
  98911. }
  98912. } else {
  98913. Plugin._registry[plugin.name] = plugin;
  98914. }
  98915. return plugin;
  98916. };
  98917. /**
  98918. * Resolves a dependency to a plugin object from the registry if it exists.
  98919. * The `dependency` may contain a version, but only the name matters when resolving.
  98920. * @method resolve
  98921. * @param dependency {string} The dependency.
  98922. * @return {object} The plugin if resolved, otherwise `undefined`.
  98923. */
  98924. Plugin.resolve = function(dependency) {
  98925. return Plugin._registry[Plugin.dependencyParse(dependency).name];
  98926. };
  98927. /**
  98928. * Returns a pretty printed plugin name and version.
  98929. * @method toString
  98930. * @param plugin {} The plugin.
  98931. * @return {string} Pretty printed plugin name and version.
  98932. */
  98933. Plugin.toString = function(plugin) {
  98934. return typeof plugin === 'string' ? plugin : (plugin.name || 'anonymous') + '@' + (plugin.version || plugin.range || '0.0.0');
  98935. };
  98936. /**
  98937. * Returns `true` if the object meets the minimum standard to be considered a plugin.
  98938. * This means it must define the following properties:
  98939. * - `name`
  98940. * - `version`
  98941. * - `install`
  98942. * @method isPlugin
  98943. * @param obj {} The obj to test.
  98944. * @return {boolean} `true` if the object can be considered a plugin otherwise `false`.
  98945. */
  98946. Plugin.isPlugin = function(obj) {
  98947. return obj && obj.name && obj.version && obj.install;
  98948. };
  98949. /**
  98950. * Returns `true` if a plugin with the given `name` been installed on `module`.
  98951. * @method isUsed
  98952. * @param module {} The module.
  98953. * @param name {string} The plugin name.
  98954. * @return {boolean} `true` if a plugin with the given `name` been installed on `module`, otherwise `false`.
  98955. */
  98956. Plugin.isUsed = function(module, name) {
  98957. return module.used.indexOf(name) > -1;
  98958. };
  98959. /**
  98960. * Returns `true` if `plugin.for` is applicable to `module` by comparing against `module.name` and `module.version`.
  98961. * If `plugin.for` is not specified then it is assumed to be applicable.
  98962. * The value of `plugin.for` is a string of the format `'module-name'` or `'module-name@version'`.
  98963. * @method isFor
  98964. * @param plugin {} The plugin.
  98965. * @param module {} The module.
  98966. * @return {boolean} `true` if `plugin.for` is applicable to `module`, otherwise `false`.
  98967. */
  98968. Plugin.isFor = function(plugin, module) {
  98969. var parsed = plugin.for && Plugin.dependencyParse(plugin.for);
  98970. return !plugin.for || (module.name === parsed.name && Plugin.versionSatisfies(module.version, parsed.range));
  98971. };
  98972. /**
  98973. * Installs the plugins by calling `plugin.install` on each plugin specified in `plugins` if passed, otherwise `module.uses`.
  98974. * For installing plugins on `Matter` see the convenience function `Matter.use`.
  98975. * Plugins may be specified either by their name or a reference to the plugin object.
  98976. * Plugins themselves may specify further dependencies, but each plugin is installed only once.
  98977. * Order is important, a topological sort is performed to find the best resulting order of installation.
  98978. * This sorting attempts to satisfy every dependency's requested ordering, but may not be exact in all cases.
  98979. * This function logs the resulting status of each dependency in the console, along with any warnings.
  98980. * - A green tick ✅ indicates a dependency was resolved and installed.
  98981. * - An orange diamond 🔶 indicates a dependency was resolved but a warning was thrown for it or one if its dependencies.
  98982. * - A red cross ❌ indicates a dependency could not be resolved.
  98983. * Avoid calling this function multiple times on the same module unless you intend to manually control installation order.
  98984. * @method use
  98985. * @param module {} The module install plugins on.
  98986. * @param [plugins=module.uses] {} The plugins to install on module (optional, defaults to `module.uses`).
  98987. */
  98988. Plugin.use = function(module, plugins) {
  98989. module.uses = (module.uses || []).concat(plugins || []);
  98990. if (module.uses.length === 0) {
  98991. Common.warn('Plugin.use:', Plugin.toString(module), 'does not specify any dependencies to install.');
  98992. return;
  98993. }
  98994. var dependencies = Plugin.dependencies(module),
  98995. sortedDependencies = Common.topologicalSort(dependencies),
  98996. status = [];
  98997. for (var i = 0; i < sortedDependencies.length; i += 1) {
  98998. if (sortedDependencies[i] === module.name) {
  98999. continue;
  99000. }
  99001. var plugin = Plugin.resolve(sortedDependencies[i]);
  99002. if (!plugin) {
  99003. status.push('❌ ' + sortedDependencies[i]);
  99004. continue;
  99005. }
  99006. if (Plugin.isUsed(module, plugin.name)) {
  99007. continue;
  99008. }
  99009. if (!Plugin.isFor(plugin, module)) {
  99010. Common.warn('Plugin.use:', Plugin.toString(plugin), 'is for', plugin.for, 'but installed on', Plugin.toString(module) + '.');
  99011. plugin._warned = true;
  99012. }
  99013. if (plugin.install) {
  99014. plugin.install(module);
  99015. } else {
  99016. Common.warn('Plugin.use:', Plugin.toString(plugin), 'does not specify an install function.');
  99017. plugin._warned = true;
  99018. }
  99019. if (plugin._warned) {
  99020. status.push('🔶 ' + Plugin.toString(plugin));
  99021. delete plugin._warned;
  99022. } else {
  99023. status.push('✅ ' + Plugin.toString(plugin));
  99024. }
  99025. module.used.push(plugin.name);
  99026. }
  99027. if (status.length > 0 && !plugin.silent) {
  99028. Common.info(status.join(' '));
  99029. }
  99030. };
  99031. /**
  99032. * Recursively finds all of a module's dependencies and returns a flat dependency graph.
  99033. * @method dependencies
  99034. * @param module {} The module.
  99035. * @return {object} A dependency graph.
  99036. */
  99037. Plugin.dependencies = function(module, tracked) {
  99038. var parsedBase = Plugin.dependencyParse(module),
  99039. name = parsedBase.name;
  99040. tracked = tracked || {};
  99041. if (name in tracked) {
  99042. return;
  99043. }
  99044. module = Plugin.resolve(module) || module;
  99045. tracked[name] = Common.map(module.uses || [], function(dependency) {
  99046. if (Plugin.isPlugin(dependency)) {
  99047. Plugin.register(dependency);
  99048. }
  99049. var parsed = Plugin.dependencyParse(dependency),
  99050. resolved = Plugin.resolve(dependency);
  99051. if (resolved && !Plugin.versionSatisfies(resolved.version, parsed.range)) {
  99052. Common.warn(
  99053. 'Plugin.dependencies:', Plugin.toString(resolved), 'does not satisfy',
  99054. Plugin.toString(parsed), 'used by', Plugin.toString(parsedBase) + '.'
  99055. );
  99056. resolved._warned = true;
  99057. module._warned = true;
  99058. } else if (!resolved) {
  99059. Common.warn(
  99060. 'Plugin.dependencies:', Plugin.toString(dependency), 'used by',
  99061. Plugin.toString(parsedBase), 'could not be resolved.'
  99062. );
  99063. module._warned = true;
  99064. }
  99065. return parsed.name;
  99066. });
  99067. for (var i = 0; i < tracked[name].length; i += 1) {
  99068. Plugin.dependencies(tracked[name][i], tracked);
  99069. }
  99070. return tracked;
  99071. };
  99072. /**
  99073. * Parses a dependency string into its components.
  99074. * The `dependency` is a string of the format `'module-name'` or `'module-name@version'`.
  99075. * See documentation for `Plugin.versionParse` for a description of the format.
  99076. * This function can also handle dependencies that are already resolved (e.g. a module object).
  99077. * @method dependencyParse
  99078. * @param dependency {string} The dependency of the format `'module-name'` or `'module-name@version'`.
  99079. * @return {object} The dependency parsed into its components.
  99080. */
  99081. Plugin.dependencyParse = function(dependency) {
  99082. if (Common.isString(dependency)) {
  99083. var pattern = /^[\w-]+(@(\*|[\^~]?\d+\.\d+\.\d+(-[0-9A-Za-z-]+)?))?$/;
  99084. if (!pattern.test(dependency)) {
  99085. Common.warn('Plugin.dependencyParse:', dependency, 'is not a valid dependency string.');
  99086. }
  99087. return {
  99088. name: dependency.split('@')[0],
  99089. range: dependency.split('@')[1] || '*'
  99090. };
  99091. }
  99092. return {
  99093. name: dependency.name,
  99094. range: dependency.range || dependency.version
  99095. };
  99096. };
  99097. /**
  99098. * Parses a version string into its components.
  99099. * Versions are strictly of the format `x.y.z` (as in [semver](http://semver.org/)).
  99100. * Versions may optionally have a prerelease tag in the format `x.y.z-alpha`.
  99101. * Ranges are a strict subset of [npm ranges](https://docs.npmjs.com/misc/semver#advanced-range-syntax).
  99102. * Only the following range types are supported:
  99103. * - Tilde ranges e.g. `~1.2.3`
  99104. * - Caret ranges e.g. `^1.2.3`
  99105. * - Exact version e.g. `1.2.3`
  99106. * - Any version `*`
  99107. * @method versionParse
  99108. * @param range {string} The version string.
  99109. * @return {object} The version range parsed into its components.
  99110. */
  99111. Plugin.versionParse = function(range) {
  99112. var pattern = /^\*|[\^~]?\d+\.\d+\.\d+(-[0-9A-Za-z-]+)?$/;
  99113. if (!pattern.test(range)) {
  99114. Common.warn('Plugin.versionParse:', range, 'is not a valid version or range.');
  99115. }
  99116. var identifiers = range.split('-');
  99117. range = identifiers[0];
  99118. var isRange = isNaN(Number(range[0])),
  99119. version = isRange ? range.substr(1) : range,
  99120. parts = Common.map(version.split('.'), function(part) {
  99121. return Number(part);
  99122. });
  99123. return {
  99124. isRange: isRange,
  99125. version: version,
  99126. range: range,
  99127. operator: isRange ? range[0] : '',
  99128. parts: parts,
  99129. prerelease: identifiers[1],
  99130. number: parts[0] * 1e8 + parts[1] * 1e4 + parts[2]
  99131. };
  99132. };
  99133. /**
  99134. * Returns `true` if `version` satisfies the given `range`.
  99135. * See documentation for `Plugin.versionParse` for a description of the format.
  99136. * If a version or range is not specified, then any version (`*`) is assumed to satisfy.
  99137. * @method versionSatisfies
  99138. * @param version {string} The version string.
  99139. * @param range {string} The range string.
  99140. * @return {boolean} `true` if `version` satisfies `range`, otherwise `false`.
  99141. */
  99142. Plugin.versionSatisfies = function(version, range) {
  99143. range = range || '*';
  99144. var rangeParsed = Plugin.versionParse(range),
  99145. rangeParts = rangeParsed.parts,
  99146. versionParsed = Plugin.versionParse(version),
  99147. versionParts = versionParsed.parts;
  99148. if (rangeParsed.isRange) {
  99149. if (rangeParsed.operator === '*' || version === '*') {
  99150. return true;
  99151. }
  99152. if (rangeParsed.operator === '~') {
  99153. return versionParts[0] === rangeParts[0] && versionParts[1] === rangeParts[1] && versionParts[2] >= rangeParts[2];
  99154. }
  99155. if (rangeParsed.operator === '^') {
  99156. if (rangeParts[0] > 0) {
  99157. return versionParts[0] === rangeParts[0] && versionParsed.number >= rangeParsed.number;
  99158. }
  99159. if (rangeParts[1] > 0) {
  99160. return versionParts[1] === rangeParts[1] && versionParts[2] >= rangeParts[2];
  99161. }
  99162. return versionParts[2] === rangeParts[2];
  99163. }
  99164. }
  99165. return version === range || version === '*';
  99166. };
  99167. })();
  99168. /***/ }),
  99169. /* 541 */
  99170. /***/ (function(module, exports, __webpack_require__) {
  99171. /**
  99172. * @author Richard Davey <rich@photonstorm.com>
  99173. * @copyright 2019 Photon Storm Ltd.
  99174. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99175. */
  99176. var Matter = __webpack_require__(1286);
  99177. Matter.Body = __webpack_require__(72);
  99178. Matter.Composite = __webpack_require__(149);
  99179. Matter.World = __webpack_require__(539);
  99180. Matter.Detector = __webpack_require__(543);
  99181. Matter.Grid = __webpack_require__(1285);
  99182. Matter.Pairs = __webpack_require__(1284);
  99183. Matter.Pair = __webpack_require__(451);
  99184. Matter.Query = __webpack_require__(1310);
  99185. Matter.Resolver = __webpack_require__(1283);
  99186. Matter.SAT = __webpack_require__(542);
  99187. Matter.Constraint = __webpack_require__(209);
  99188. Matter.Common = __webpack_require__(36);
  99189. Matter.Engine = __webpack_require__(1282);
  99190. Matter.Events = __webpack_require__(210);
  99191. Matter.Sleeping = __webpack_require__(238);
  99192. Matter.Plugin = __webpack_require__(540);
  99193. Matter.Bodies = __webpack_require__(138);
  99194. Matter.Composites = __webpack_require__(1289);
  99195. Matter.Axes = __webpack_require__(546);
  99196. Matter.Bounds = __webpack_require__(86);
  99197. Matter.Svg = __webpack_require__(1308);
  99198. Matter.Vector = __webpack_require__(87);
  99199. Matter.Vertices = __webpack_require__(82);
  99200. // aliases
  99201. Matter.World.add = Matter.Composite.add;
  99202. Matter.World.remove = Matter.Composite.remove;
  99203. Matter.World.addComposite = Matter.Composite.addComposite;
  99204. Matter.World.addBody = Matter.Composite.addBody;
  99205. Matter.World.addConstraint = Matter.Composite.addConstraint;
  99206. Matter.World.clear = Matter.Composite.clear;
  99207. module.exports = Matter;
  99208. /***/ }),
  99209. /* 542 */
  99210. /***/ (function(module, exports, __webpack_require__) {
  99211. /**
  99212. * The `Matter.SAT` module contains methods for detecting collisions using the Separating Axis Theorem.
  99213. *
  99214. * @class SAT
  99215. */
  99216. // TODO: true circles and curves
  99217. var SAT = {};
  99218. module.exports = SAT;
  99219. var Vertices = __webpack_require__(82);
  99220. var Vector = __webpack_require__(87);
  99221. (function() {
  99222. /**
  99223. * Detect collision between two bodies using the Separating Axis Theorem.
  99224. * @method collides
  99225. * @param {body} bodyA
  99226. * @param {body} bodyB
  99227. * @param {collision} previousCollision
  99228. * @return {collision} collision
  99229. */
  99230. SAT.collides = function(bodyA, bodyB, previousCollision) {
  99231. var overlapAB,
  99232. overlapBA,
  99233. minOverlap,
  99234. collision,
  99235. canReusePrevCol = false;
  99236. if (previousCollision) {
  99237. // estimate total motion
  99238. var parentA = bodyA.parent,
  99239. parentB = bodyB.parent,
  99240. motion = parentA.speed * parentA.speed + parentA.angularSpeed * parentA.angularSpeed
  99241. + parentB.speed * parentB.speed + parentB.angularSpeed * parentB.angularSpeed;
  99242. // we may be able to (partially) reuse collision result
  99243. // but only safe if collision was resting
  99244. canReusePrevCol = previousCollision && previousCollision.collided && motion < 0.2;
  99245. // reuse collision object
  99246. collision = previousCollision;
  99247. } else {
  99248. collision = { collided: false, bodyA: bodyA, bodyB: bodyB };
  99249. }
  99250. if (previousCollision && canReusePrevCol) {
  99251. // if we can reuse the collision result
  99252. // we only need to test the previously found axis
  99253. var axisBodyA = collision.axisBody,
  99254. axisBodyB = axisBodyA === bodyA ? bodyB : bodyA,
  99255. axes = [axisBodyA.axes[previousCollision.axisNumber]];
  99256. minOverlap = SAT._overlapAxes(axisBodyA.vertices, axisBodyB.vertices, axes);
  99257. collision.reused = true;
  99258. if (minOverlap.overlap <= 0) {
  99259. collision.collided = false;
  99260. return collision;
  99261. }
  99262. } else {
  99263. // if we can't reuse a result, perform a full SAT test
  99264. overlapAB = SAT._overlapAxes(bodyA.vertices, bodyB.vertices, bodyA.axes);
  99265. if (overlapAB.overlap <= 0) {
  99266. collision.collided = false;
  99267. return collision;
  99268. }
  99269. overlapBA = SAT._overlapAxes(bodyB.vertices, bodyA.vertices, bodyB.axes);
  99270. if (overlapBA.overlap <= 0) {
  99271. collision.collided = false;
  99272. return collision;
  99273. }
  99274. if (overlapAB.overlap < overlapBA.overlap) {
  99275. minOverlap = overlapAB;
  99276. collision.axisBody = bodyA;
  99277. } else {
  99278. minOverlap = overlapBA;
  99279. collision.axisBody = bodyB;
  99280. }
  99281. // important for reuse later
  99282. collision.axisNumber = minOverlap.axisNumber;
  99283. }
  99284. collision.bodyA = bodyA.id < bodyB.id ? bodyA : bodyB;
  99285. collision.bodyB = bodyA.id < bodyB.id ? bodyB : bodyA;
  99286. collision.collided = true;
  99287. collision.depth = minOverlap.overlap;
  99288. collision.parentA = collision.bodyA.parent;
  99289. collision.parentB = collision.bodyB.parent;
  99290. bodyA = collision.bodyA;
  99291. bodyB = collision.bodyB;
  99292. // ensure normal is facing away from bodyA
  99293. if (Vector.dot(minOverlap.axis, Vector.sub(bodyB.position, bodyA.position)) < 0) {
  99294. collision.normal = {
  99295. x: minOverlap.axis.x,
  99296. y: minOverlap.axis.y
  99297. };
  99298. } else {
  99299. collision.normal = {
  99300. x: -minOverlap.axis.x,
  99301. y: -minOverlap.axis.y
  99302. };
  99303. }
  99304. collision.tangent = Vector.perp(collision.normal);
  99305. collision.penetration = collision.penetration || {};
  99306. collision.penetration.x = collision.normal.x * collision.depth;
  99307. collision.penetration.y = collision.normal.y * collision.depth;
  99308. // find support points, there is always either exactly one or two
  99309. var verticesB = SAT._findSupports(bodyA, bodyB, collision.normal),
  99310. supports = [];
  99311. // find the supports from bodyB that are inside bodyA
  99312. if (Vertices.contains(bodyA.vertices, verticesB[0]))
  99313. supports.push(verticesB[0]);
  99314. if (Vertices.contains(bodyA.vertices, verticesB[1]))
  99315. supports.push(verticesB[1]);
  99316. // find the supports from bodyA that are inside bodyB
  99317. if (supports.length < 2) {
  99318. var verticesA = SAT._findSupports(bodyB, bodyA, Vector.neg(collision.normal));
  99319. if (Vertices.contains(bodyB.vertices, verticesA[0]))
  99320. supports.push(verticesA[0]);
  99321. if (supports.length < 2 && Vertices.contains(bodyB.vertices, verticesA[1]))
  99322. supports.push(verticesA[1]);
  99323. }
  99324. // account for the edge case of overlapping but no vertex containment
  99325. if (supports.length < 1)
  99326. supports = [verticesB[0]];
  99327. collision.supports = supports;
  99328. return collision;
  99329. };
  99330. /**
  99331. * Find the overlap between two sets of vertices.
  99332. * @method _overlapAxes
  99333. * @private
  99334. * @param {} verticesA
  99335. * @param {} verticesB
  99336. * @param {} axes
  99337. * @return result
  99338. */
  99339. SAT._overlapAxes = function(verticesA, verticesB, axes) {
  99340. var projectionA = Vector._temp[0],
  99341. projectionB = Vector._temp[1],
  99342. result = { overlap: Number.MAX_VALUE },
  99343. overlap,
  99344. axis;
  99345. for (var i = 0; i < axes.length; i++) {
  99346. axis = axes[i];
  99347. SAT._projectToAxis(projectionA, verticesA, axis);
  99348. SAT._projectToAxis(projectionB, verticesB, axis);
  99349. overlap = Math.min(projectionA.max - projectionB.min, projectionB.max - projectionA.min);
  99350. if (overlap <= 0) {
  99351. result.overlap = overlap;
  99352. return result;
  99353. }
  99354. if (overlap < result.overlap) {
  99355. result.overlap = overlap;
  99356. result.axis = axis;
  99357. result.axisNumber = i;
  99358. }
  99359. }
  99360. return result;
  99361. };
  99362. /**
  99363. * Projects vertices on an axis and returns an interval.
  99364. * @method _projectToAxis
  99365. * @private
  99366. * @param {} projection
  99367. * @param {} vertices
  99368. * @param {} axis
  99369. */
  99370. SAT._projectToAxis = function(projection, vertices, axis) {
  99371. var min = Vector.dot(vertices[0], axis),
  99372. max = min;
  99373. for (var i = 1; i < vertices.length; i += 1) {
  99374. var dot = Vector.dot(vertices[i], axis);
  99375. if (dot > max) {
  99376. max = dot;
  99377. } else if (dot < min) {
  99378. min = dot;
  99379. }
  99380. }
  99381. projection.min = min;
  99382. projection.max = max;
  99383. };
  99384. /**
  99385. * Finds supporting vertices given two bodies along a given direction using hill-climbing.
  99386. * @method _findSupports
  99387. * @private
  99388. * @param {} bodyA
  99389. * @param {} bodyB
  99390. * @param {} normal
  99391. * @return [vector]
  99392. */
  99393. SAT._findSupports = function(bodyA, bodyB, normal) {
  99394. var nearestDistance = Number.MAX_VALUE,
  99395. vertexToBody = Vector._temp[0],
  99396. vertices = bodyB.vertices,
  99397. bodyAPosition = bodyA.position,
  99398. distance,
  99399. vertex,
  99400. vertexA,
  99401. vertexB;
  99402. // find closest vertex on bodyB
  99403. for (var i = 0; i < vertices.length; i++) {
  99404. vertex = vertices[i];
  99405. vertexToBody.x = vertex.x - bodyAPosition.x;
  99406. vertexToBody.y = vertex.y - bodyAPosition.y;
  99407. distance = -Vector.dot(normal, vertexToBody);
  99408. if (distance < nearestDistance) {
  99409. nearestDistance = distance;
  99410. vertexA = vertex;
  99411. }
  99412. }
  99413. // find next closest vertex using the two connected to it
  99414. var prevIndex = vertexA.index - 1 >= 0 ? vertexA.index - 1 : vertices.length - 1;
  99415. vertex = vertices[prevIndex];
  99416. vertexToBody.x = vertex.x - bodyAPosition.x;
  99417. vertexToBody.y = vertex.y - bodyAPosition.y;
  99418. nearestDistance = -Vector.dot(normal, vertexToBody);
  99419. vertexB = vertex;
  99420. var nextIndex = (vertexA.index + 1) % vertices.length;
  99421. vertex = vertices[nextIndex];
  99422. vertexToBody.x = vertex.x - bodyAPosition.x;
  99423. vertexToBody.y = vertex.y - bodyAPosition.y;
  99424. distance = -Vector.dot(normal, vertexToBody);
  99425. if (distance < nearestDistance) {
  99426. vertexB = vertex;
  99427. }
  99428. return [vertexA, vertexB];
  99429. };
  99430. })();
  99431. /***/ }),
  99432. /* 543 */
  99433. /***/ (function(module, exports, __webpack_require__) {
  99434. /**
  99435. * The `Matter.Detector` module contains methods for detecting collisions given a set of pairs.
  99436. *
  99437. * @class Detector
  99438. */
  99439. // TODO: speculative contacts
  99440. var Detector = {};
  99441. module.exports = Detector;
  99442. var SAT = __webpack_require__(542);
  99443. var Pair = __webpack_require__(451);
  99444. var Bounds = __webpack_require__(86);
  99445. (function() {
  99446. /**
  99447. * Finds all collisions given a list of pairs.
  99448. * @method collisions
  99449. * @param {pair[]} broadphasePairs
  99450. * @param {engine} engine
  99451. * @return {array} collisions
  99452. */
  99453. Detector.collisions = function(broadphasePairs, engine) {
  99454. var collisions = [],
  99455. pairsTable = engine.pairs.table;
  99456. // @if DEBUG
  99457. var metrics = engine.metrics;
  99458. // @endif
  99459. for (var i = 0; i < broadphasePairs.length; i++) {
  99460. var bodyA = broadphasePairs[i][0],
  99461. bodyB = broadphasePairs[i][1];
  99462. if ((bodyA.isStatic || bodyA.isSleeping) && (bodyB.isStatic || bodyB.isSleeping))
  99463. continue;
  99464. if (!Detector.canCollide(bodyA.collisionFilter, bodyB.collisionFilter))
  99465. continue;
  99466. // @if DEBUG
  99467. metrics.midphaseTests += 1;
  99468. // @endif
  99469. // mid phase
  99470. if (Bounds.overlaps(bodyA.bounds, bodyB.bounds)) {
  99471. for (var j = bodyA.parts.length > 1 ? 1 : 0; j < bodyA.parts.length; j++) {
  99472. var partA = bodyA.parts[j];
  99473. for (var k = bodyB.parts.length > 1 ? 1 : 0; k < bodyB.parts.length; k++) {
  99474. var partB = bodyB.parts[k];
  99475. if ((partA === bodyA && partB === bodyB) || Bounds.overlaps(partA.bounds, partB.bounds)) {
  99476. // find a previous collision we could reuse
  99477. var pairId = Pair.id(partA, partB),
  99478. pair = pairsTable[pairId],
  99479. previousCollision;
  99480. if (pair && pair.isActive) {
  99481. previousCollision = pair.collision;
  99482. } else {
  99483. previousCollision = null;
  99484. }
  99485. // narrow phase
  99486. var collision = SAT.collides(partA, partB, previousCollision);
  99487. // @if DEBUG
  99488. metrics.narrowphaseTests += 1;
  99489. if (collision.reused)
  99490. metrics.narrowReuseCount += 1;
  99491. // @endif
  99492. if (collision.collided) {
  99493. collisions.push(collision);
  99494. // @if DEBUG
  99495. metrics.narrowDetections += 1;
  99496. // @endif
  99497. }
  99498. }
  99499. }
  99500. }
  99501. }
  99502. }
  99503. return collisions;
  99504. };
  99505. /**
  99506. * Returns `true` if both supplied collision filters will allow a collision to occur.
  99507. * See `body.collisionFilter` for more information.
  99508. * @method canCollide
  99509. * @param {} filterA
  99510. * @param {} filterB
  99511. * @return {bool} `true` if collision can occur
  99512. */
  99513. Detector.canCollide = function(filterA, filterB) {
  99514. if (filterA.group === filterB.group && filterA.group !== 0)
  99515. return filterA.group > 0;
  99516. return (filterA.mask & filterB.category) !== 0 && (filterB.mask & filterA.category) !== 0;
  99517. };
  99518. })();
  99519. /***/ }),
  99520. /* 544 */
  99521. /***/ (function(module, exports, __webpack_require__) {
  99522. /**
  99523. * @author Richard Davey <rich@photonstorm.com>
  99524. * @copyright 2019 Photon Storm Ltd.
  99525. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99526. */
  99527. var Bodies = __webpack_require__(138);
  99528. var Body = __webpack_require__(72);
  99529. var Class = __webpack_require__(0);
  99530. var Components = __webpack_require__(452);
  99531. var GetFastValue = __webpack_require__(2);
  99532. var HasValue = __webpack_require__(91);
  99533. var Vertices = __webpack_require__(82);
  99534. /**
  99535. * @typedef {object} MatterTileOptions
  99536. *
  99537. * @property {MatterJS.Body} [body=null] - An existing Matter body to be used instead of creating a new one.
  99538. * @property {boolean} [isStatic=true] - Whether or not the newly created body should be made static. This defaults to true since typically tiles should not be moved.
  99539. * @property {boolean} [addToWorld=true] - Whether or not to add the newly created body (or existing body if options.body is used) to the Matter world.
  99540. */
  99541. /**
  99542. * @classdesc
  99543. * A wrapper around a Tile that provides access to a corresponding Matter body. A tile can only
  99544. * have one Matter body associated with it. You can either pass in an existing Matter body for
  99545. * the tile or allow the constructor to create the corresponding body for you. If the Tile has a
  99546. * collision group (defined in Tiled), those shapes will be used to create the body. If not, the
  99547. * tile's rectangle bounding box will be used.
  99548. *
  99549. * The corresponding body will be accessible on the Tile itself via Tile.physics.matterBody.
  99550. *
  99551. * Note: not all Tiled collision shapes are supported. See
  99552. * Phaser.Physics.Matter.TileBody#setFromTileCollision for more information.
  99553. *
  99554. * @class TileBody
  99555. * @memberof Phaser.Physics.Matter
  99556. * @constructor
  99557. * @since 3.0.0
  99558. *
  99559. * @extends Phaser.Physics.Matter.Components.Bounce
  99560. * @extends Phaser.Physics.Matter.Components.Collision
  99561. * @extends Phaser.Physics.Matter.Components.Friction
  99562. * @extends Phaser.Physics.Matter.Components.Gravity
  99563. * @extends Phaser.Physics.Matter.Components.Mass
  99564. * @extends Phaser.Physics.Matter.Components.Sensor
  99565. * @extends Phaser.Physics.Matter.Components.Sleep
  99566. * @extends Phaser.Physics.Matter.Components.Static
  99567. *
  99568. * @param {Phaser.Physics.Matter.World} world - [description]
  99569. * @param {Phaser.Tilemaps.Tile} tile - The target tile that should have a Matter body.
  99570. * @param {MatterTileOptions} [options] - Options to be used when creating the Matter body.
  99571. */
  99572. var MatterTileBody = new Class({
  99573. Mixins: [
  99574. Components.Bounce,
  99575. Components.Collision,
  99576. Components.Friction,
  99577. Components.Gravity,
  99578. Components.Mass,
  99579. Components.Sensor,
  99580. Components.Sleep,
  99581. Components.Static
  99582. ],
  99583. initialize:
  99584. function MatterTileBody (world, tile, options)
  99585. {
  99586. /**
  99587. * The tile object the body is associated with.
  99588. *
  99589. * @name Phaser.Physics.Matter.TileBody#tile
  99590. * @type {Phaser.Tilemaps.Tile}
  99591. * @since 3.0.0
  99592. */
  99593. this.tile = tile;
  99594. /**
  99595. * The Matter world the body exists within.
  99596. *
  99597. * @name Phaser.Physics.Matter.TileBody#world
  99598. * @type {Phaser.Physics.Matter.World}
  99599. * @since 3.0.0
  99600. */
  99601. this.world = world;
  99602. // Install a reference to 'this' on the tile and ensure there can only be one matter body
  99603. // associated with the tile
  99604. if (tile.physics.matterBody)
  99605. {
  99606. tile.physics.matterBody.destroy();
  99607. }
  99608. tile.physics.matterBody = this;
  99609. // Set the body either from an existing body (if provided), the shapes in the tileset
  99610. // collision layer (if it exists) or a rectangle matching the tile.
  99611. var body = GetFastValue(options, 'body', null);
  99612. var addToWorld = GetFastValue(options, 'addToWorld', true);
  99613. if (!body)
  99614. {
  99615. var collisionGroup = tile.getCollisionGroup();
  99616. var collisionObjects = GetFastValue(collisionGroup, 'objects', []);
  99617. if (collisionObjects.length > 0)
  99618. {
  99619. this.setFromTileCollision(options);
  99620. }
  99621. else
  99622. {
  99623. this.setFromTileRectangle(options);
  99624. }
  99625. }
  99626. else
  99627. {
  99628. this.setBody(body, addToWorld);
  99629. }
  99630. },
  99631. /**
  99632. * @typedef {object} MatterBodyTileOptions
  99633. *
  99634. * @property {boolean} [isStatic=true] - Whether or not the newly created body should be made static. This defaults to true since typically tiles should not be moved.
  99635. * @property {boolean} [addToWorld=true] - Whether or not to add the newly created body (or existing body if options.body is used) to the Matter world.
  99636. */
  99637. /**
  99638. * Sets the current body to a rectangle that matches the bounds of the tile.
  99639. *
  99640. * @method Phaser.Physics.Matter.TileBody#setFromTileRectangle
  99641. * @since 3.0.0
  99642. *
  99643. * @param {MatterBodyTileOptions} [options] - Options to be used when creating the Matter body. See MatterJS.Body for a list of what Matter accepts.
  99644. *
  99645. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  99646. */
  99647. setFromTileRectangle: function (options)
  99648. {
  99649. if (options === undefined) { options = {}; }
  99650. if (!HasValue(options, 'isStatic')) { options.isStatic = true; }
  99651. if (!HasValue(options, 'addToWorld')) { options.addToWorld = true; }
  99652. var bounds = this.tile.getBounds();
  99653. var cx = bounds.x + (bounds.width / 2);
  99654. var cy = bounds.y + (bounds.height / 2);
  99655. var body = Bodies.rectangle(cx, cy, bounds.width, bounds.height, options);
  99656. this.setBody(body, options.addToWorld);
  99657. return this;
  99658. },
  99659. /**
  99660. * Sets the current body from the collision group associated with the Tile. This is typically
  99661. * set up in Tiled's collision editor.
  99662. *
  99663. * Note: Matter doesn't support all shapes from Tiled. Rectangles and polygons are directly
  99664. * supported. Ellipses are converted into circle bodies. Polylines are treated as if they are
  99665. * closed polygons. If a tile has multiple shapes, a multi-part body will be created. Concave
  99666. * shapes are supported if poly-decomp library is included. Decomposition is not guaranteed to
  99667. * work for complex shapes (e.g. holes), so it's often best to manually decompose a concave
  99668. * polygon into multiple convex polygons yourself.
  99669. *
  99670. * @method Phaser.Physics.Matter.TileBody#setFromTileCollision
  99671. * @since 3.0.0
  99672. *
  99673. * @param {MatterBodyTileOptions} [options] - Options to be used when creating the Matter body. See MatterJS.Body for a list of what Matter accepts.
  99674. *
  99675. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  99676. */
  99677. setFromTileCollision: function (options)
  99678. {
  99679. if (options === undefined) { options = {}; }
  99680. if (!HasValue(options, 'isStatic')) { options.isStatic = true; }
  99681. if (!HasValue(options, 'addToWorld')) { options.addToWorld = true; }
  99682. var sx = this.tile.tilemapLayer.scaleX;
  99683. var sy = this.tile.tilemapLayer.scaleY;
  99684. var tileX = this.tile.getLeft();
  99685. var tileY = this.tile.getTop();
  99686. var collisionGroup = this.tile.getCollisionGroup();
  99687. var collisionObjects = GetFastValue(collisionGroup, 'objects', []);
  99688. var parts = [];
  99689. for (var i = 0; i < collisionObjects.length; i++)
  99690. {
  99691. var object = collisionObjects[i];
  99692. var ox = tileX + (object.x * sx);
  99693. var oy = tileY + (object.y * sy);
  99694. var ow = object.width * sx;
  99695. var oh = object.height * sy;
  99696. var body = null;
  99697. if (object.rectangle)
  99698. {
  99699. body = Bodies.rectangle(ox + ow / 2, oy + oh / 2, ow, oh, options);
  99700. }
  99701. else if (object.ellipse)
  99702. {
  99703. body = Bodies.circle(ox + ow / 2, oy + oh / 2, ow / 2, options);
  99704. }
  99705. else if (object.polygon || object.polyline)
  99706. {
  99707. // Polygons and polylines are both treated as closed polygons
  99708. var originalPoints = object.polygon ? object.polygon : object.polyline;
  99709. var points = originalPoints.map(function (p)
  99710. {
  99711. return { x: p.x * sx, y: p.y * sy };
  99712. });
  99713. var vertices = Vertices.create(points);
  99714. // Points are relative to the object's origin (first point placed in Tiled), but
  99715. // matter expects points to be relative to the center of mass. This only applies to
  99716. // convex shapes. When a concave shape is decomposed, multiple parts are created and
  99717. // the individual parts are positioned relative to (ox, oy).
  99718. //
  99719. // Update: 8th January 2019 - the latest version of Matter needs the Vertices adjusted,
  99720. // regardless if convex or concave.
  99721. var center = Vertices.centre(vertices);
  99722. ox += center.x;
  99723. oy += center.y;
  99724. body = Bodies.fromVertices(ox, oy, vertices, options);
  99725. }
  99726. if (body)
  99727. {
  99728. parts.push(body);
  99729. }
  99730. }
  99731. if (parts.length === 1)
  99732. {
  99733. this.setBody(parts[0], options.addToWorld);
  99734. }
  99735. else if (parts.length > 1)
  99736. {
  99737. options.parts = parts;
  99738. this.setBody(Body.create(options), options.addToWorld);
  99739. }
  99740. return this;
  99741. },
  99742. /**
  99743. * Sets the current body to the given body. This will remove the previous body, if one already
  99744. * exists.
  99745. *
  99746. * @method Phaser.Physics.Matter.TileBody#setBody
  99747. * @since 3.0.0
  99748. *
  99749. * @param {MatterJS.Body} body - The new Matter body to use.
  99750. * @param {boolean} [addToWorld=true] - Whether or not to add the body to the Matter world.
  99751. *
  99752. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  99753. */
  99754. setBody: function (body, addToWorld)
  99755. {
  99756. if (addToWorld === undefined) { addToWorld = true; }
  99757. if (this.body)
  99758. {
  99759. this.removeBody();
  99760. }
  99761. this.body = body;
  99762. this.body.gameObject = this;
  99763. if (addToWorld)
  99764. {
  99765. this.world.add(this.body);
  99766. }
  99767. return this;
  99768. },
  99769. /**
  99770. * Removes the current body from the TileBody and from the Matter world
  99771. *
  99772. * @method Phaser.Physics.Matter.TileBody#removeBody
  99773. * @since 3.0.0
  99774. *
  99775. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  99776. */
  99777. removeBody: function ()
  99778. {
  99779. if (this.body)
  99780. {
  99781. this.world.remove(this.body);
  99782. this.body.gameObject = undefined;
  99783. this.body = undefined;
  99784. }
  99785. return this;
  99786. },
  99787. /**
  99788. * Removes the current body from the tile and the world.
  99789. *
  99790. * @method Phaser.Physics.Matter.TileBody#destroy
  99791. * @since 3.0.0
  99792. *
  99793. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  99794. */
  99795. destroy: function ()
  99796. {
  99797. this.removeBody();
  99798. this.tile.physics.matterBody = undefined;
  99799. }
  99800. });
  99801. module.exports = MatterTileBody;
  99802. /***/ }),
  99803. /* 545 */
  99804. /***/ (function(module, exports, __webpack_require__) {
  99805. /**
  99806. * @author Richard Davey <rich@photonstorm.com>
  99807. * @copyright 2019 Photon Storm Ltd.
  99808. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99809. */
  99810. /**
  99811. * @namespace Phaser.Physics.Matter.Events
  99812. */
  99813. module.exports = {
  99814. AFTER_UPDATE: __webpack_require__(1325),
  99815. BEFORE_UPDATE: __webpack_require__(1324),
  99816. COLLISION_ACTIVE: __webpack_require__(1323),
  99817. COLLISION_END: __webpack_require__(1322),
  99818. COLLISION_START: __webpack_require__(1321),
  99819. DRAG_END: __webpack_require__(1320),
  99820. DRAG: __webpack_require__(1319),
  99821. DRAG_START: __webpack_require__(1318),
  99822. PAUSE: __webpack_require__(1317),
  99823. RESUME: __webpack_require__(1316),
  99824. SLEEP_END: __webpack_require__(1315),
  99825. SLEEP_START: __webpack_require__(1314)
  99826. };
  99827. /***/ }),
  99828. /* 546 */
  99829. /***/ (function(module, exports, __webpack_require__) {
  99830. /**
  99831. * The `Matter.Axes` module contains methods for creating and manipulating sets of axes.
  99832. *
  99833. * @class Axes
  99834. */
  99835. var Axes = {};
  99836. module.exports = Axes;
  99837. var Vector = __webpack_require__(87);
  99838. var Common = __webpack_require__(36);
  99839. (function() {
  99840. /**
  99841. * Creates a new set of axes from the given vertices.
  99842. * @method fromVertices
  99843. * @param {vertices} vertices
  99844. * @return {axes} A new axes from the given vertices
  99845. */
  99846. Axes.fromVertices = function(vertices) {
  99847. var axes = {};
  99848. // find the unique axes, using edge normal gradients
  99849. for (var i = 0; i < vertices.length; i++) {
  99850. var j = (i + 1) % vertices.length,
  99851. normal = Vector.normalise({
  99852. x: vertices[j].y - vertices[i].y,
  99853. y: vertices[i].x - vertices[j].x
  99854. }),
  99855. gradient = (normal.y === 0) ? Infinity : (normal.x / normal.y);
  99856. // limit precision
  99857. gradient = gradient.toFixed(3).toString();
  99858. axes[gradient] = normal;
  99859. }
  99860. return Common.values(axes);
  99861. };
  99862. /**
  99863. * Rotates a set of axes by the given angle.
  99864. * @method rotate
  99865. * @param {axes} axes
  99866. * @param {number} angle
  99867. */
  99868. Axes.rotate = function(axes, angle) {
  99869. if (angle === 0)
  99870. return;
  99871. var cos = Math.cos(angle),
  99872. sin = Math.sin(angle);
  99873. for (var i = 0; i < axes.length; i++) {
  99874. var axis = axes[i],
  99875. xx;
  99876. xx = axis.x * cos - axis.y * sin;
  99877. axis.y = axis.x * sin + axis.y * cos;
  99878. axis.x = xx;
  99879. }
  99880. };
  99881. })();
  99882. /***/ }),
  99883. /* 547 */
  99884. /***/ (function(module, exports, __webpack_require__) {
  99885. /**
  99886. * @author Richard Davey <rich@photonstorm.com>
  99887. * @copyright 2019 Photon Storm Ltd.
  99888. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99889. */
  99890. /**
  99891. * @namespace Phaser.Physics.Impact.Components
  99892. */
  99893. module.exports = {
  99894. Acceleration: __webpack_require__(1354),
  99895. BodyScale: __webpack_require__(1353),
  99896. BodyType: __webpack_require__(1352),
  99897. Bounce: __webpack_require__(1351),
  99898. CheckAgainst: __webpack_require__(1350),
  99899. Collides: __webpack_require__(1349),
  99900. Debug: __webpack_require__(1348),
  99901. Friction: __webpack_require__(1347),
  99902. Gravity: __webpack_require__(1346),
  99903. Offset: __webpack_require__(1345),
  99904. SetGameObject: __webpack_require__(1344),
  99905. Velocity: __webpack_require__(1343)
  99906. };
  99907. /***/ }),
  99908. /* 548 */
  99909. /***/ (function(module, exports, __webpack_require__) {
  99910. /**
  99911. * @author Richard Davey <rich@photonstorm.com>
  99912. * @copyright 2019 Photon Storm Ltd.
  99913. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99914. */
  99915. /**
  99916. * @namespace Phaser.Physics.Impact.Events
  99917. */
  99918. module.exports = {
  99919. COLLIDE: __webpack_require__(1358),
  99920. PAUSE: __webpack_require__(1357),
  99921. RESUME: __webpack_require__(1356)
  99922. };
  99923. /***/ }),
  99924. /* 549 */
  99925. /***/ (function(module, exports, __webpack_require__) {
  99926. /**
  99927. * @author Richard Davey <rich@photonstorm.com>
  99928. * @copyright 2019 Photon Storm Ltd.
  99929. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99930. */
  99931. var GetOverlapY = __webpack_require__(245);
  99932. /**
  99933. * Separates two overlapping bodies on the Y-axis (vertically).
  99934. *
  99935. * Separation involves moving two overlapping bodies so they don't overlap anymore and adjusting their velocities based on their mass. This is a core part of collision detection.
  99936. *
  99937. * The bodies won't be separated if there is no vertical overlap between them, if they are static, or if either one uses custom logic for its separation.
  99938. *
  99939. * @function Phaser.Physics.Arcade.SeparateY
  99940. * @since 3.0.0
  99941. *
  99942. * @param {Phaser.Physics.Arcade.Body} body1 - The first Body to separate.
  99943. * @param {Phaser.Physics.Arcade.Body} body2 - The second Body to separate.
  99944. * @param {boolean} overlapOnly - If `true`, the bodies will only have their overlap data set and no separation will take place.
  99945. * @param {number} bias - A value to add to the delta value during overlap checking. Used to prevent sprite tunneling.
  99946. *
  99947. * @return {boolean} `true` if the two bodies overlap vertically, otherwise `false`.
  99948. */
  99949. var SeparateY = function (body1, body2, overlapOnly, bias)
  99950. {
  99951. var overlap = GetOverlapY(body1, body2, overlapOnly, bias);
  99952. // Can't separate two immovable bodies, or a body with its own custom separation logic
  99953. if (overlapOnly || overlap === 0 || (body1.immovable && body2.immovable) || body1.customSeparateY || body2.customSeparateY)
  99954. {
  99955. // return true if there was some overlap, otherwise false
  99956. return (overlap !== 0) || (body1.embedded && body2.embedded);
  99957. }
  99958. // Adjust their positions and velocities accordingly (if there was any overlap)
  99959. var v1 = body1.velocity.y;
  99960. var v2 = body2.velocity.y;
  99961. if (!body1.immovable && !body2.immovable)
  99962. {
  99963. overlap *= 0.5;
  99964. body1.y -= overlap;
  99965. body2.y += overlap;
  99966. var nv1 = Math.sqrt((v2 * v2 * body2.mass) / body1.mass) * ((v2 > 0) ? 1 : -1);
  99967. var nv2 = Math.sqrt((v1 * v1 * body1.mass) / body2.mass) * ((v1 > 0) ? 1 : -1);
  99968. var avg = (nv1 + nv2) * 0.5;
  99969. nv1 -= avg;
  99970. nv2 -= avg;
  99971. body1.velocity.y = avg + nv1 * body1.bounce.y;
  99972. body2.velocity.y = avg + nv2 * body2.bounce.y;
  99973. }
  99974. else if (!body1.immovable)
  99975. {
  99976. body1.y -= overlap;
  99977. body1.velocity.y = v2 - v1 * body1.bounce.y;
  99978. // This is special case code that handles things like horizontal moving platforms you can ride
  99979. if (body2.moves)
  99980. {
  99981. body1.x += (body2.x - body2.prev.x) * body2.friction.x;
  99982. }
  99983. }
  99984. else
  99985. {
  99986. body2.y += overlap;
  99987. body2.velocity.y = v1 - v2 * body2.bounce.y;
  99988. // This is special case code that handles things like horizontal moving platforms you can ride
  99989. if (body1.moves)
  99990. {
  99991. body2.x += (body1.x - body1.prev.x) * body1.friction.x;
  99992. }
  99993. }
  99994. // If we got this far then there WAS overlap, and separation is complete, so return true
  99995. return true;
  99996. };
  99997. module.exports = SeparateY;
  99998. /***/ }),
  99999. /* 550 */
  100000. /***/ (function(module, exports, __webpack_require__) {
  100001. /**
  100002. * @author Richard Davey <rich@photonstorm.com>
  100003. * @copyright 2019 Photon Storm Ltd.
  100004. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100005. */
  100006. var GetOverlapX = __webpack_require__(246);
  100007. /**
  100008. * Separates two overlapping bodies on the X-axis (horizontally).
  100009. *
  100010. * Separation involves moving two overlapping bodies so they don't overlap anymore and adjusting their velocities based on their mass. This is a core part of collision detection.
  100011. *
  100012. * The bodies won't be separated if there is no horizontal overlap between them, if they are static, or if either one uses custom logic for its separation.
  100013. *
  100014. * @function Phaser.Physics.Arcade.SeparateX
  100015. * @since 3.0.0
  100016. *
  100017. * @param {Phaser.Physics.Arcade.Body} body1 - The first Body to separate.
  100018. * @param {Phaser.Physics.Arcade.Body} body2 - The second Body to separate.
  100019. * @param {boolean} overlapOnly - If `true`, the bodies will only have their overlap data set and no separation will take place.
  100020. * @param {number} bias - A value to add to the delta value during overlap checking. Used to prevent sprite tunneling.
  100021. *
  100022. * @return {boolean} `true` if the two bodies overlap horizontally, otherwise `false`.
  100023. */
  100024. var SeparateX = function (body1, body2, overlapOnly, bias)
  100025. {
  100026. var overlap = GetOverlapX(body1, body2, overlapOnly, bias);
  100027. // Can't separate two immovable bodies, or a body with its own custom separation logic
  100028. if (overlapOnly || overlap === 0 || (body1.immovable && body2.immovable) || body1.customSeparateX || body2.customSeparateX)
  100029. {
  100030. // return true if there was some overlap, otherwise false
  100031. return (overlap !== 0) || (body1.embedded && body2.embedded);
  100032. }
  100033. // Adjust their positions and velocities accordingly (if there was any overlap)
  100034. var v1 = body1.velocity.x;
  100035. var v2 = body2.velocity.x;
  100036. if (!body1.immovable && !body2.immovable)
  100037. {
  100038. overlap *= 0.5;
  100039. body1.x -= overlap;
  100040. body2.x += overlap;
  100041. var nv1 = Math.sqrt((v2 * v2 * body2.mass) / body1.mass) * ((v2 > 0) ? 1 : -1);
  100042. var nv2 = Math.sqrt((v1 * v1 * body1.mass) / body2.mass) * ((v1 > 0) ? 1 : -1);
  100043. var avg = (nv1 + nv2) * 0.5;
  100044. nv1 -= avg;
  100045. nv2 -= avg;
  100046. body1.velocity.x = avg + nv1 * body1.bounce.x;
  100047. body2.velocity.x = avg + nv2 * body2.bounce.x;
  100048. }
  100049. else if (!body1.immovable)
  100050. {
  100051. body1.x -= overlap;
  100052. body1.velocity.x = v2 - v1 * body1.bounce.x;
  100053. // This is special case code that handles things like vertically moving platforms you can ride
  100054. if (body2.moves)
  100055. {
  100056. body1.y += (body2.y - body2.prev.y) * body2.friction.y;
  100057. }
  100058. }
  100059. else
  100060. {
  100061. body2.x += overlap;
  100062. body2.velocity.x = v1 - v2 * body2.bounce.x;
  100063. // This is special case code that handles things like vertically moving platforms you can ride
  100064. if (body1.moves)
  100065. {
  100066. body2.y += (body1.y - body1.prev.y) * body1.friction.y;
  100067. }
  100068. }
  100069. // If we got this far then there WAS overlap, and separation is complete, so return true
  100070. return true;
  100071. };
  100072. module.exports = SeparateX;
  100073. /***/ }),
  100074. /* 551 */
  100075. /***/ (function(module, exports) {
  100076. /**
  100077. * @author Richard Davey <rich@photonstorm.com>
  100078. * @copyright 2019 Photon Storm Ltd.
  100079. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100080. */
  100081. /**
  100082. * Internal function to process the separation of a physics body from a tile.
  100083. *
  100084. * @function Phaser.Physics.Arcade.Tilemap.ProcessTileSeparationY
  100085. * @since 3.0.0
  100086. *
  100087. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  100088. * @param {number} y - The y separation amount.
  100089. */
  100090. var ProcessTileSeparationY = function (body, y)
  100091. {
  100092. if (y < 0)
  100093. {
  100094. body.blocked.none = false;
  100095. body.blocked.up = true;
  100096. }
  100097. else if (y > 0)
  100098. {
  100099. body.blocked.none = false;
  100100. body.blocked.down = true;
  100101. }
  100102. body.position.y -= y;
  100103. if (body.bounce.y === 0)
  100104. {
  100105. body.velocity.y = 0;
  100106. }
  100107. else
  100108. {
  100109. body.velocity.y = -body.velocity.y * body.bounce.y;
  100110. }
  100111. };
  100112. module.exports = ProcessTileSeparationY;
  100113. /***/ }),
  100114. /* 552 */
  100115. /***/ (function(module, exports, __webpack_require__) {
  100116. /**
  100117. * @author Richard Davey <rich@photonstorm.com>
  100118. * @copyright 2019 Photon Storm Ltd.
  100119. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100120. */
  100121. var ProcessTileSeparationY = __webpack_require__(551);
  100122. /**
  100123. * Check the body against the given tile on the Y axis.
  100124. * Used internally by the SeparateTile function.
  100125. *
  100126. * @function Phaser.Physics.Arcade.Tilemap.TileCheckY
  100127. * @since 3.0.0
  100128. *
  100129. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  100130. * @param {Phaser.Tilemaps.Tile} tile - The tile to check.
  100131. * @param {number} tileTop - The top position of the tile within the tile world.
  100132. * @param {number} tileBottom - The bottom position of the tile within the tile world.
  100133. * @param {number} tileBias - The tile bias value. Populated by the `World.TILE_BIAS` constant.
  100134. *
  100135. * @return {number} The amount of separation that occurred.
  100136. */
  100137. var TileCheckY = function (body, tile, tileTop, tileBottom, tileBias)
  100138. {
  100139. var oy = 0;
  100140. if (body.deltaY() < 0 && !body.blocked.up && tile.collideDown && body.checkCollision.up)
  100141. {
  100142. // Body is moving UP
  100143. if (tile.faceBottom && body.y < tileBottom)
  100144. {
  100145. oy = body.y - tileBottom;
  100146. if (oy < -tileBias)
  100147. {
  100148. oy = 0;
  100149. }
  100150. }
  100151. }
  100152. else if (body.deltaY() > 0 && !body.blocked.down && tile.collideUp && body.checkCollision.down)
  100153. {
  100154. // Body is moving DOWN
  100155. if (tile.faceTop && body.bottom > tileTop)
  100156. {
  100157. oy = body.bottom - tileTop;
  100158. if (oy > tileBias)
  100159. {
  100160. oy = 0;
  100161. }
  100162. }
  100163. }
  100164. if (oy !== 0)
  100165. {
  100166. if (body.customSeparateY)
  100167. {
  100168. body.overlapY = oy;
  100169. }
  100170. else
  100171. {
  100172. ProcessTileSeparationY(body, oy);
  100173. }
  100174. }
  100175. return oy;
  100176. };
  100177. module.exports = TileCheckY;
  100178. /***/ }),
  100179. /* 553 */
  100180. /***/ (function(module, exports) {
  100181. /**
  100182. * @author Richard Davey <rich@photonstorm.com>
  100183. * @copyright 2019 Photon Storm Ltd.
  100184. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100185. */
  100186. /**
  100187. * Internal function to process the separation of a physics body from a tile.
  100188. *
  100189. * @function Phaser.Physics.Arcade.Tilemap.ProcessTileSeparationX
  100190. * @since 3.0.0
  100191. *
  100192. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  100193. * @param {number} x - The x separation amount.
  100194. */
  100195. var ProcessTileSeparationX = function (body, x)
  100196. {
  100197. if (x < 0)
  100198. {
  100199. body.blocked.none = false;
  100200. body.blocked.left = true;
  100201. }
  100202. else if (x > 0)
  100203. {
  100204. body.blocked.none = false;
  100205. body.blocked.right = true;
  100206. }
  100207. body.position.x -= x;
  100208. if (body.bounce.x === 0)
  100209. {
  100210. body.velocity.x = 0;
  100211. }
  100212. else
  100213. {
  100214. body.velocity.x = -body.velocity.x * body.bounce.x;
  100215. }
  100216. };
  100217. module.exports = ProcessTileSeparationX;
  100218. /***/ }),
  100219. /* 554 */
  100220. /***/ (function(module, exports, __webpack_require__) {
  100221. /**
  100222. * @author Richard Davey <rich@photonstorm.com>
  100223. * @copyright 2019 Photon Storm Ltd.
  100224. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100225. */
  100226. var ProcessTileSeparationX = __webpack_require__(553);
  100227. /**
  100228. * Check the body against the given tile on the X axis.
  100229. * Used internally by the SeparateTile function.
  100230. *
  100231. * @function Phaser.Physics.Arcade.Tilemap.TileCheckX
  100232. * @since 3.0.0
  100233. *
  100234. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  100235. * @param {Phaser.Tilemaps.Tile} tile - The tile to check.
  100236. * @param {number} tileLeft - The left position of the tile within the tile world.
  100237. * @param {number} tileRight - The right position of the tile within the tile world.
  100238. * @param {number} tileBias - The tile bias value. Populated by the `World.TILE_BIAS` constant.
  100239. *
  100240. * @return {number} The amount of separation that occurred.
  100241. */
  100242. var TileCheckX = function (body, tile, tileLeft, tileRight, tileBias)
  100243. {
  100244. var ox = 0;
  100245. if (body.deltaX() < 0 && !body.blocked.left && tile.collideRight && body.checkCollision.left)
  100246. {
  100247. // Body is moving LEFT
  100248. if (tile.faceRight && body.x < tileRight)
  100249. {
  100250. ox = body.x - tileRight;
  100251. if (ox < -tileBias)
  100252. {
  100253. ox = 0;
  100254. }
  100255. }
  100256. }
  100257. else if (body.deltaX() > 0 && !body.blocked.right && tile.collideLeft && body.checkCollision.right)
  100258. {
  100259. // Body is moving RIGHT
  100260. if (tile.faceLeft && body.right > tileLeft)
  100261. {
  100262. ox = body.right - tileLeft;
  100263. if (ox > tileBias)
  100264. {
  100265. ox = 0;
  100266. }
  100267. }
  100268. }
  100269. if (ox !== 0)
  100270. {
  100271. if (body.customSeparateX)
  100272. {
  100273. body.overlapX = ox;
  100274. }
  100275. else
  100276. {
  100277. ProcessTileSeparationX(body, ox);
  100278. }
  100279. }
  100280. return ox;
  100281. };
  100282. module.exports = TileCheckX;
  100283. /***/ }),
  100284. /* 555 */
  100285. /***/ (function(module, exports, __webpack_require__) {
  100286. /**
  100287. * @author Richard Davey <rich@photonstorm.com>
  100288. * @copyright 2019 Photon Storm Ltd.
  100289. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100290. */
  100291. var TileCheckX = __webpack_require__(554);
  100292. var TileCheckY = __webpack_require__(552);
  100293. var TileIntersectsBody = __webpack_require__(242);
  100294. /**
  100295. * The core separation function to separate a physics body and a tile.
  100296. *
  100297. * @function Phaser.Physics.Arcade.Tilemap.SeparateTile
  100298. * @since 3.0.0
  100299. *
  100300. * @param {number} i - The index of the tile within the map data.
  100301. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  100302. * @param {Phaser.Tilemaps.Tile} tile - The tile to collide against.
  100303. * @param {Phaser.Geom.Rectangle} tileWorldRect - A rectangle-like object defining the dimensions of the tile.
  100304. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer - The tilemapLayer to collide against.
  100305. * @param {number} tileBias - The tile bias value. Populated by the `World.TILE_BIAS` constant.
  100306. *
  100307. * @return {boolean} `true` if the body was separated, otherwise `false`.
  100308. */
  100309. var SeparateTile = function (i, body, tile, tileWorldRect, tilemapLayer, tileBias)
  100310. {
  100311. var tileLeft = tileWorldRect.left;
  100312. var tileTop = tileWorldRect.top;
  100313. var tileRight = tileWorldRect.right;
  100314. var tileBottom = tileWorldRect.bottom;
  100315. var faceHorizontal = tile.faceLeft || tile.faceRight;
  100316. var faceVertical = tile.faceTop || tile.faceBottom;
  100317. // We don't need to go any further if this tile doesn't actually have any colliding faces. This
  100318. // could happen if the tile was meant to be collided with re: a callback, but otherwise isn't
  100319. // needed for separation.
  100320. if (!faceHorizontal && !faceVertical)
  100321. {
  100322. return false;
  100323. }
  100324. var ox = 0;
  100325. var oy = 0;
  100326. var minX = 0;
  100327. var minY = 1;
  100328. if (body.deltaAbsX() > body.deltaAbsY())
  100329. {
  100330. // Moving faster horizontally, check X axis first
  100331. minX = -1;
  100332. }
  100333. else if (body.deltaAbsX() < body.deltaAbsY())
  100334. {
  100335. // Moving faster vertically, check Y axis first
  100336. minY = -1;
  100337. }
  100338. if (body.deltaX() !== 0 && body.deltaY() !== 0 && faceHorizontal && faceVertical)
  100339. {
  100340. // We only need do this if both axes have colliding faces AND we're moving in both
  100341. // directions
  100342. minX = Math.min(Math.abs(body.position.x - tileRight), Math.abs(body.right - tileLeft));
  100343. minY = Math.min(Math.abs(body.position.y - tileBottom), Math.abs(body.bottom - tileTop));
  100344. }
  100345. if (minX < minY)
  100346. {
  100347. if (faceHorizontal)
  100348. {
  100349. ox = TileCheckX(body, tile, tileLeft, tileRight, tileBias);
  100350. // That's horizontal done, check if we still intersects? If not then we can return now
  100351. if (ox !== 0 && !TileIntersectsBody(tileWorldRect, body))
  100352. {
  100353. return true;
  100354. }
  100355. }
  100356. if (faceVertical)
  100357. {
  100358. oy = TileCheckY(body, tile, tileTop, tileBottom, tileBias);
  100359. }
  100360. }
  100361. else
  100362. {
  100363. if (faceVertical)
  100364. {
  100365. oy = TileCheckY(body, tile, tileTop, tileBottom, tileBias);
  100366. // That's vertical done, check if we still intersects? If not then we can return now
  100367. if (oy !== 0 && !TileIntersectsBody(tileWorldRect, body))
  100368. {
  100369. return true;
  100370. }
  100371. }
  100372. if (faceHorizontal)
  100373. {
  100374. ox = TileCheckX(body, tile, tileLeft, tileRight, tileBias);
  100375. }
  100376. }
  100377. return (ox !== 0 || oy !== 0);
  100378. };
  100379. module.exports = SeparateTile;
  100380. /***/ }),
  100381. /* 556 */
  100382. /***/ (function(module, exports) {
  100383. /**
  100384. * @author Richard Davey <rich@photonstorm.com>
  100385. * @copyright 2019 Photon Storm Ltd.
  100386. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100387. */
  100388. /**
  100389. * A function to process the collision callbacks between a single tile and an Arcade Physics enabled Game Object.
  100390. *
  100391. * @function Phaser.Physics.Arcade.Tilemap.ProcessTileCallbacks
  100392. * @since 3.0.0
  100393. *
  100394. * @param {Phaser.Tilemaps.Tile} tile - The Tile to process.
  100395. * @param {Phaser.GameObjects.Sprite} sprite - The Game Object to process with the Tile.
  100396. *
  100397. * @return {boolean} The result of the callback, `true` for further processing, or `false` to skip this pair.
  100398. */
  100399. var ProcessTileCallbacks = function (tile, sprite)
  100400. {
  100401. // Tile callbacks take priority over layer level callbacks
  100402. if (tile.collisionCallback)
  100403. {
  100404. return !tile.collisionCallback.call(tile.collisionCallbackContext, sprite, tile);
  100405. }
  100406. else if (tile.layer.callbacks[tile.index])
  100407. {
  100408. return !tile.layer.callbacks[tile.index].callback.call(
  100409. tile.layer.callbacks[tile.index].callbackContext, sprite, tile
  100410. );
  100411. }
  100412. return true;
  100413. };
  100414. module.exports = ProcessTileCallbacks;
  100415. /***/ }),
  100416. /* 557 */
  100417. /***/ (function(module, exports) {
  100418. /**
  100419. * @author Richard Davey <rich@photonstorm.com>
  100420. * @copyright 2019 Photon Storm Ltd.
  100421. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100422. */
  100423. /**
  100424. * The Arcade Physics World Bounds Event.
  100425. *
  100426. * This event is dispatched by an Arcade Physics World instance if a body makes contact with the world bounds _and_
  100427. * it has its [onWorldBounds]{@link Phaser.Physics.Arcade.Body#onWorldBounds} property set to `true`.
  100428. *
  100429. * It provides an alternative means to handling collide events rather than using the callback approach.
  100430. *
  100431. * Listen to it from a Scene using: `this.physics.world.on('worldbounds', listener)`.
  100432. *
  100433. * @event Phaser.Physics.Arcade.Events#WORLD_BOUNDS
  100434. *
  100435. * @param {Phaser.Physics.Arcade.Body} body - The Arcade Physics Body that hit the world bounds.
  100436. * @param {boolean} up - Is the Body blocked up? I.e. collided with the top of the world bounds.
  100437. * @param {boolean} down - Is the Body blocked down? I.e. collided with the bottom of the world bounds.
  100438. * @param {boolean} left - Is the Body blocked left? I.e. collided with the left of the world bounds.
  100439. * @param {boolean} right - Is the Body blocked right? I.e. collided with the right of the world bounds.
  100440. */
  100441. module.exports = 'worldbounds';
  100442. /***/ }),
  100443. /* 558 */
  100444. /***/ (function(module, exports) {
  100445. /**
  100446. * @author Richard Davey <rich@photonstorm.com>
  100447. * @copyright 2019 Photon Storm Ltd.
  100448. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100449. */
  100450. /**
  100451. * The Arcade Physics Tile Overlap Event.
  100452. *
  100453. * This event is dispatched by an Arcade Physics World instance if a body overlaps with a Tile _and_
  100454. * has its [onOverlap]{@link Phaser.Physics.Arcade.Body#onOverlap} property set to `true`.
  100455. *
  100456. * It provides an alternative means to handling overlap events rather than using the callback approach.
  100457. *
  100458. * Listen to it from a Scene using: `this.physics.world.on('tileoverlap', listener)`.
  100459. *
  100460. * Please note that 'collide' and 'overlap' are two different things in Arcade Physics.
  100461. *
  100462. * @event Phaser.Physics.Arcade.Events#TILE_OVERLAP
  100463. *
  100464. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object involved in the overlap. This is the parent of `body`.
  100465. * @param {Phaser.Tilemaps.Tile} tile - The tile the body overlapped.
  100466. * @param {Phaser.Physics.Arcade.Body} body - The Arcade Physics Body of the Game Object involved in the overlap.
  100467. */
  100468. module.exports = 'tileoverlap';
  100469. /***/ }),
  100470. /* 559 */
  100471. /***/ (function(module, exports) {
  100472. /**
  100473. * @author Richard Davey <rich@photonstorm.com>
  100474. * @copyright 2019 Photon Storm Ltd.
  100475. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100476. */
  100477. /**
  100478. * The Arcade Physics Tile Collide Event.
  100479. *
  100480. * This event is dispatched by an Arcade Physics World instance if a body collides with a Tile _and_
  100481. * has its [onCollide]{@link Phaser.Physics.Arcade.Body#onCollide} property set to `true`.
  100482. *
  100483. * It provides an alternative means to handling collide events rather than using the callback approach.
  100484. *
  100485. * Listen to it from a Scene using: `this.physics.world.on('tilecollide', listener)`.
  100486. *
  100487. * Please note that 'collide' and 'overlap' are two different things in Arcade Physics.
  100488. *
  100489. * @event Phaser.Physics.Arcade.Events#TILE_COLLIDE
  100490. *
  100491. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object involved in the collision. This is the parent of `body`.
  100492. * @param {Phaser.Tilemaps.Tile} tile - The tile the body collided with.
  100493. * @param {Phaser.Physics.Arcade.Body} body - The Arcade Physics Body of the Game Object involved in the collision.
  100494. */
  100495. module.exports = 'tilecollide';
  100496. /***/ }),
  100497. /* 560 */
  100498. /***/ (function(module, exports) {
  100499. /**
  100500. * @author Richard Davey <rich@photonstorm.com>
  100501. * @copyright 2019 Photon Storm Ltd.
  100502. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100503. */
  100504. /**
  100505. * The Arcade Physics World Resume Event.
  100506. *
  100507. * This event is dispatched by an Arcade Physics World instance when it resumes from a paused state.
  100508. *
  100509. * Listen to it from a Scene using: `this.physics.world.on('resume', listener)`.
  100510. *
  100511. * @event Phaser.Physics.Arcade.Events#RESUME
  100512. */
  100513. module.exports = 'resume';
  100514. /***/ }),
  100515. /* 561 */
  100516. /***/ (function(module, exports) {
  100517. /**
  100518. * @author Richard Davey <rich@photonstorm.com>
  100519. * @copyright 2019 Photon Storm Ltd.
  100520. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100521. */
  100522. /**
  100523. * The Arcade Physics World Pause Event.
  100524. *
  100525. * This event is dispatched by an Arcade Physics World instance when it is paused.
  100526. *
  100527. * Listen to it from a Scene using: `this.physics.world.on('pause', listener)`.
  100528. *
  100529. * @event Phaser.Physics.Arcade.Events#PAUSE
  100530. */
  100531. module.exports = 'pause';
  100532. /***/ }),
  100533. /* 562 */
  100534. /***/ (function(module, exports) {
  100535. /**
  100536. * @author Richard Davey <rich@photonstorm.com>
  100537. * @copyright 2019 Photon Storm Ltd.
  100538. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100539. */
  100540. /**
  100541. * The Arcade Physics World Overlap Event.
  100542. *
  100543. * This event is dispatched by an Arcade Physics World instance if two bodies overlap _and_ at least
  100544. * one of them has their [onOverlap]{@link Phaser.Physics.Arcade.Body#onOverlap} property set to `true`.
  100545. *
  100546. * It provides an alternative means to handling overlap events rather than using the callback approach.
  100547. *
  100548. * Listen to it from a Scene using: `this.physics.world.on('overlap', listener)`.
  100549. *
  100550. * Please note that 'collide' and 'overlap' are two different things in Arcade Physics.
  100551. *
  100552. * @event Phaser.Physics.Arcade.Events#OVERLAP
  100553. *
  100554. * @param {Phaser.GameObjects.GameObject} gameObject1 - The first Game Object involved in the overlap. This is the parent of `body1`.
  100555. * @param {Phaser.GameObjects.GameObject} gameObject2 - The second Game Object involved in the overlap. This is the parent of `body2`.
  100556. * @param {Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody} body1 - The first Physics Body involved in the overlap.
  100557. * @param {Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody} body2 - The second Physics Body involved in the overlap.
  100558. */
  100559. module.exports = 'overlap';
  100560. /***/ }),
  100561. /* 563 */
  100562. /***/ (function(module, exports) {
  100563. /**
  100564. * @author Richard Davey <rich@photonstorm.com>
  100565. * @copyright 2019 Photon Storm Ltd.
  100566. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100567. */
  100568. /**
  100569. * The Arcade Physics World Collide Event.
  100570. *
  100571. * This event is dispatched by an Arcade Physics World instance if two bodies collide _and_ at least
  100572. * one of them has their [onCollide]{@link Phaser.Physics.Arcade.Body#onCollide} property set to `true`.
  100573. *
  100574. * It provides an alternative means to handling collide events rather than using the callback approach.
  100575. *
  100576. * Listen to it from a Scene using: `this.physics.world.on('collide', listener)`.
  100577. *
  100578. * Please note that 'collide' and 'overlap' are two different things in Arcade Physics.
  100579. *
  100580. * @event Phaser.Physics.Arcade.Events#COLLIDE
  100581. *
  100582. * @param {Phaser.GameObjects.GameObject} gameObject1 - The first Game Object involved in the collision. This is the parent of `body1`.
  100583. * @param {Phaser.GameObjects.GameObject} gameObject2 - The second Game Object involved in the collision. This is the parent of `body2`.
  100584. * @param {Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody} body1 - The first Physics Body involved in the collision.
  100585. * @param {Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody} body2 - The second Physics Body involved in the collision.
  100586. */
  100587. module.exports = 'collide';
  100588. /***/ }),
  100589. /* 564 */
  100590. /***/ (function(module, exports) {
  100591. /**
  100592. * @author Richard Davey <rich@photonstorm.com>
  100593. * @copyright 2019 Photon Storm Ltd.
  100594. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100595. */
  100596. /**
  100597. * Provides methods for modifying the velocity of an Arcade Physics body.
  100598. *
  100599. * Should be applied as a mixin and not used directly.
  100600. *
  100601. * @name Phaser.Physics.Arcade.Components.Velocity
  100602. * @since 3.0.0
  100603. */
  100604. var Velocity = {
  100605. /**
  100606. * Sets the velocity of the Body.
  100607. *
  100608. * @method Phaser.Physics.Arcade.Components.Velocity#setVelocity
  100609. * @since 3.0.0
  100610. *
  100611. * @param {number} x - The horizontal velocity of the body. Positive values move the body to the right, while negative values move it to the left.
  100612. * @param {number} [y=x] - The vertical velocity of the body. Positive values move the body down, while negative values move it up.
  100613. *
  100614. * @return {this} This Game Object.
  100615. */
  100616. setVelocity: function (x, y)
  100617. {
  100618. this.body.setVelocity(x, y);
  100619. return this;
  100620. },
  100621. /**
  100622. * Sets the horizontal component of the body's velocity.
  100623. *
  100624. * Positive values move the body to the right, while negative values move it to the left.
  100625. *
  100626. * @method Phaser.Physics.Arcade.Components.Velocity#setVelocityX
  100627. * @since 3.0.0
  100628. *
  100629. * @param {number} x - The new horizontal velocity.
  100630. *
  100631. * @return {this} This Game Object.
  100632. */
  100633. setVelocityX: function (x)
  100634. {
  100635. this.body.setVelocityX(x);
  100636. return this;
  100637. },
  100638. /**
  100639. * Sets the vertical component of the body's velocity.
  100640. *
  100641. * Positive values move the body down, while negative values move it up.
  100642. *
  100643. * @method Phaser.Physics.Arcade.Components.Velocity#setVelocityY
  100644. * @since 3.0.0
  100645. *
  100646. * @param {number} y - The new vertical velocity of the body.
  100647. *
  100648. * @return {this} This Game Object.
  100649. */
  100650. setVelocityY: function (y)
  100651. {
  100652. this.body.setVelocityY(y);
  100653. return this;
  100654. },
  100655. /**
  100656. * Sets the maximum velocity of the body.
  100657. *
  100658. * @method Phaser.Physics.Arcade.Components.Velocity#setMaxVelocity
  100659. * @since 3.0.0
  100660. *
  100661. * @param {number} x - The new maximum horizontal velocity.
  100662. * @param {number} [y=x] - The new maximum vertical velocity.
  100663. *
  100664. * @return {this} This Game Object.
  100665. */
  100666. setMaxVelocity: function (x, y)
  100667. {
  100668. this.body.maxVelocity.set(x, y);
  100669. return this;
  100670. }
  100671. };
  100672. module.exports = Velocity;
  100673. /***/ }),
  100674. /* 565 */
  100675. /***/ (function(module, exports) {
  100676. /**
  100677. * @author Richard Davey <rich@photonstorm.com>
  100678. * @copyright 2019 Photon Storm Ltd.
  100679. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100680. */
  100681. /**
  100682. * Provides methods for setting the size of an Arcade Physics Game Object.
  100683. * Should be applied as a mixin and not used directly.
  100684. *
  100685. * @name Phaser.Physics.Arcade.Components.Size
  100686. * @since 3.0.0
  100687. */
  100688. var Size = {
  100689. /**
  100690. * Sets the body offset. This allows you to adjust the difference between the center of the body
  100691. * and the x and y coordinates of the parent Game Object.
  100692. *
  100693. * @method Phaser.Physics.Arcade.Components.Size#setOffset
  100694. * @since 3.0.0
  100695. *
  100696. * @param {number} x - The amount to offset the body from the parent Game Object along the x-axis.
  100697. * @param {number} [y=x] - The amount to offset the body from the parent Game Object along the y-axis. Defaults to the value given for the x-axis.
  100698. *
  100699. * @return {this} This Game Object.
  100700. */
  100701. setOffset: function (x, y)
  100702. {
  100703. this.body.setOffset(x, y);
  100704. return this;
  100705. },
  100706. /**
  100707. * Sets the size of this physics body. Setting the size does not adjust the dimensions
  100708. * of the parent Game Object.
  100709. *
  100710. * @method Phaser.Physics.Arcade.Components.Size#setSize
  100711. * @since 3.0.0
  100712. *
  100713. * @param {number} width - The new width of the physics body, in pixels.
  100714. * @param {number} height - The new height of the physics body, in pixels.
  100715. * @param {boolean} [center=true] - Should the body be re-positioned so its center aligns with the parent Game Object?
  100716. *
  100717. * @return {this} This Game Object.
  100718. */
  100719. setSize: function (width, height, center)
  100720. {
  100721. this.body.setSize(width, height, center);
  100722. return this;
  100723. },
  100724. /**
  100725. * Sets this physics body to use a circle for collision instead of a rectangle.
  100726. *
  100727. * @method Phaser.Physics.Arcade.Components.Size#setCircle
  100728. * @since 3.0.0
  100729. *
  100730. * @param {number} radius - The radius of the physics body, in pixels.
  100731. * @param {number} [offsetX] - The amount to offset the body from the parent Game Object along the x-axis.
  100732. * @param {number} [offsetY] - The amount to offset the body from the parent Game Object along the y-axis.
  100733. *
  100734. * @return {this} This Game Object.
  100735. */
  100736. setCircle: function (radius, offsetX, offsetY)
  100737. {
  100738. this.body.setCircle(radius, offsetX, offsetY);
  100739. return this;
  100740. }
  100741. };
  100742. module.exports = Size;
  100743. /***/ }),
  100744. /* 566 */
  100745. /***/ (function(module, exports) {
  100746. /**
  100747. * @author Richard Davey <rich@photonstorm.com>
  100748. * @copyright 2019 Photon Storm Ltd.
  100749. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100750. */
  100751. /**
  100752. * Provides methods used for setting the mass properties of an Arcade Physics Body.
  100753. *
  100754. * @name Phaser.Physics.Arcade.Components.Mass
  100755. * @since 3.0.0
  100756. */
  100757. var Mass = {
  100758. /**
  100759. * Sets the mass of the physics body
  100760. *
  100761. * @method Phaser.Physics.Arcade.Components.Mass#setMass
  100762. * @since 3.0.0
  100763. *
  100764. * @param {number} value - New value for the mass of the body.
  100765. *
  100766. * @return {this} This Game Object.
  100767. */
  100768. setMass: function (value)
  100769. {
  100770. this.body.mass = value;
  100771. return this;
  100772. }
  100773. };
  100774. module.exports = Mass;
  100775. /***/ }),
  100776. /* 567 */
  100777. /***/ (function(module, exports) {
  100778. /**
  100779. * @author Richard Davey <rich@photonstorm.com>
  100780. * @copyright 2019 Photon Storm Ltd.
  100781. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100782. */
  100783. /**
  100784. * Provides methods used for setting the immovable properties of an Arcade Physics Body.
  100785. *
  100786. * @name Phaser.Physics.Arcade.Components.Immovable
  100787. * @since 3.0.0
  100788. */
  100789. var Immovable = {
  100790. /**
  100791. * Sets Whether this Body can be moved by collisions with another Body.
  100792. *
  100793. * @method Phaser.Physics.Arcade.Components.Immovable#setImmovable
  100794. * @since 3.0.0
  100795. *
  100796. * @param {boolean} [value=true] - Sets if this body can be moved by collisions with another Body.
  100797. *
  100798. * @return {this} This Game Object.
  100799. */
  100800. setImmovable: function (value)
  100801. {
  100802. if (value === undefined) { value = true; }
  100803. this.body.immovable = value;
  100804. return this;
  100805. }
  100806. };
  100807. module.exports = Immovable;
  100808. /***/ }),
  100809. /* 568 */
  100810. /***/ (function(module, exports) {
  100811. /**
  100812. * @author Richard Davey <rich@photonstorm.com>
  100813. * @copyright 2019 Photon Storm Ltd.
  100814. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100815. */
  100816. /**
  100817. * Provides methods for setting the gravity properties of an Arcade Physics Game Object.
  100818. * Should be applied as a mixin and not used directly.
  100819. *
  100820. * @name Phaser.Physics.Arcade.Components.Gravity
  100821. * @since 3.0.0
  100822. */
  100823. var Gravity = {
  100824. /**
  100825. * Set the X and Y values of the gravitational pull to act upon this Arcade Physics Game Object. Values can be positive or negative. Larger values result in a stronger effect.
  100826. *
  100827. * If only one value is provided, this value will be used for both the X and Y axis.
  100828. *
  100829. * @method Phaser.Physics.Arcade.Components.Gravity#setGravity
  100830. * @since 3.0.0
  100831. *
  100832. * @param {number} x - The gravitational force to be applied to the X-axis.
  100833. * @param {number} [y=x] - The gravitational force to be applied to the Y-axis. If this is not specified, the X value will be used.
  100834. *
  100835. * @return {this} This Game Object.
  100836. */
  100837. setGravity: function (x, y)
  100838. {
  100839. this.body.gravity.set(x, y);
  100840. return this;
  100841. },
  100842. /**
  100843. * Set the gravitational force to be applied to the X axis. Value can be positive or negative. Larger values result in a stronger effect.
  100844. *
  100845. * @method Phaser.Physics.Arcade.Components.Gravity#setGravityX
  100846. * @since 3.0.0
  100847. *
  100848. * @param {number} x - The gravitational force to be applied to the X-axis.
  100849. *
  100850. * @return {this} This Game Object.
  100851. */
  100852. setGravityX: function (x)
  100853. {
  100854. this.body.gravity.x = x;
  100855. return this;
  100856. },
  100857. /**
  100858. * Set the gravitational force to be applied to the Y axis. Value can be positive or negative. Larger values result in a stronger effect.
  100859. *
  100860. * @method Phaser.Physics.Arcade.Components.Gravity#setGravityY
  100861. * @since 3.0.0
  100862. *
  100863. * @param {number} y - The gravitational force to be applied to the Y-axis.
  100864. *
  100865. * @return {this} This Game Object.
  100866. */
  100867. setGravityY: function (y)
  100868. {
  100869. this.body.gravity.y = y;
  100870. return this;
  100871. }
  100872. };
  100873. module.exports = Gravity;
  100874. /***/ }),
  100875. /* 569 */
  100876. /***/ (function(module, exports) {
  100877. /**
  100878. * @author Richard Davey <rich@photonstorm.com>
  100879. * @copyright 2019 Photon Storm Ltd.
  100880. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100881. */
  100882. /**
  100883. * Sets the friction (e.g. the amount of velocity reduced over time) of the physics body when moving horizontally in the X axis. The higher than friction, the faster the body will slow down once force stops being applied to it.
  100884. *
  100885. * @name Phaser.Physics.Arcade.Components.Friction
  100886. * @since 3.0.0
  100887. */
  100888. var Friction = {
  100889. /**
  100890. * Sets the friction (e.g. the amount of velocity reduced over time) of the physics body when moving.
  100891. * The higher than friction, the faster the body will slow down once force stops being applied to it.
  100892. *
  100893. * @method Phaser.Physics.Arcade.Components.Friction#setFriction
  100894. * @since 3.0.0
  100895. *
  100896. * @param {number} x - The amount of horizontal friction to apply.
  100897. * @param {number} [y=x] - The amount of vertical friction to apply.
  100898. *
  100899. * @return {this} This Game Object.
  100900. */
  100901. setFriction: function (x, y)
  100902. {
  100903. this.body.friction.set(x, y);
  100904. return this;
  100905. },
  100906. /**
  100907. * Sets the friction (e.g. the amount of velocity reduced over time) of the physics body when moving horizontally in the X axis.
  100908. * The higher than friction, the faster the body will slow down once force stops being applied to it.
  100909. *
  100910. * @method Phaser.Physics.Arcade.Components.Friction#setFrictionX
  100911. * @since 3.0.0
  100912. *
  100913. * @param {number} x - The amount of friction to apply.
  100914. *
  100915. * @return {this} This Game Object.
  100916. */
  100917. setFrictionX: function (x)
  100918. {
  100919. this.body.friction.x = x;
  100920. return this;
  100921. },
  100922. /**
  100923. * Sets the friction (e.g. the amount of velocity reduced over time) of the physics body when moving vertically in the Y axis.
  100924. * The higher than friction, the faster the body will slow down once force stops being applied to it.
  100925. *
  100926. * @method Phaser.Physics.Arcade.Components.Friction#setFrictionY
  100927. * @since 3.0.0
  100928. *
  100929. * @param {number} x - The amount of friction to apply.
  100930. *
  100931. * @return {this} This Game Object.
  100932. */
  100933. setFrictionY: function (y)
  100934. {
  100935. this.body.friction.y = y;
  100936. return this;
  100937. }
  100938. };
  100939. module.exports = Friction;
  100940. /***/ }),
  100941. /* 570 */
  100942. /***/ (function(module, exports) {
  100943. /**
  100944. * @author Richard Davey <rich@photonstorm.com>
  100945. * @copyright 2019 Photon Storm Ltd.
  100946. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100947. */
  100948. /**
  100949. * Provides methods used for setting the enable properties of an Arcade Physics Body.
  100950. *
  100951. * @name Phaser.Physics.Arcade.Components.Enable
  100952. * @since 3.0.0
  100953. */
  100954. var Enable = {
  100955. /**
  100956. * Enables this Game Object's Body.
  100957. *
  100958. * @method Phaser.Physics.Arcade.Components.Enable#enableBody
  100959. * @since 3.0.0
  100960. *
  100961. * @param {boolean} reset - Also reset the Body and place it at (x, y).
  100962. * @param {number} x - The horizontal position to place the Game Object and Body.
  100963. * @param {number} y - The horizontal position to place the Game Object and Body.
  100964. * @param {boolean} enableGameObject - Also activate this Game Object.
  100965. * @param {boolean} showGameObject - Also show this Game Object.
  100966. *
  100967. * @return {this} This Game Object.
  100968. *
  100969. * @see Phaser.Physics.Arcade.Body#enable
  100970. * @see Phaser.Physics.Arcade.StaticBody#enable
  100971. * @see Phaser.Physics.Arcade.Body#reset
  100972. * @see Phaser.Physics.Arcade.StaticBody#reset
  100973. * @see Phaser.GameObjects.GameObject#active
  100974. * @see Phaser.GameObjects.GameObject#visible
  100975. */
  100976. enableBody: function (reset, x, y, enableGameObject, showGameObject)
  100977. {
  100978. if (reset)
  100979. {
  100980. this.body.reset(x, y);
  100981. }
  100982. if (enableGameObject)
  100983. {
  100984. this.body.gameObject.active = true;
  100985. }
  100986. if (showGameObject)
  100987. {
  100988. this.body.gameObject.visible = true;
  100989. }
  100990. this.body.enable = true;
  100991. return this;
  100992. },
  100993. /**
  100994. * Stops and disables this Game Object's Body.
  100995. *
  100996. * @method Phaser.Physics.Arcade.Components.Enable#disableBody
  100997. * @since 3.0.0
  100998. *
  100999. * @param {boolean} [disableGameObject=false] - Also deactivate this Game Object.
  101000. * @param {boolean} [hideGameObject=false] - Also hide this Game Object.
  101001. *
  101002. * @return {this} This Game Object.
  101003. *
  101004. * @see Phaser.Physics.Arcade.Body#enable
  101005. * @see Phaser.Physics.Arcade.StaticBody#enable
  101006. * @see Phaser.GameObjects.GameObject#active
  101007. * @see Phaser.GameObjects.GameObject#visible
  101008. */
  101009. disableBody: function (disableGameObject, hideGameObject)
  101010. {
  101011. if (disableGameObject === undefined) { disableGameObject = false; }
  101012. if (hideGameObject === undefined) { hideGameObject = false; }
  101013. this.body.stop();
  101014. this.body.enable = false;
  101015. if (disableGameObject)
  101016. {
  101017. this.body.gameObject.active = false;
  101018. }
  101019. if (hideGameObject)
  101020. {
  101021. this.body.gameObject.visible = false;
  101022. }
  101023. return this;
  101024. },
  101025. /**
  101026. * Syncs the Body's position and size with its parent Game Object.
  101027. * You don't need to call this for Dynamic Bodies, as it happens automatically.
  101028. * But for Static bodies it's a useful way of modifying the position of a Static Body
  101029. * in the Physics World, based on its Game Object.
  101030. *
  101031. * @method Phaser.Physics.Arcade.Components.Enable#refreshBody
  101032. * @since 3.1.0
  101033. *
  101034. * @return {this} This Game Object.
  101035. *
  101036. * @see Phaser.Physics.Arcade.StaticBody#updateFromGameObject
  101037. */
  101038. refreshBody: function ()
  101039. {
  101040. this.body.updateFromGameObject();
  101041. return this;
  101042. }
  101043. };
  101044. module.exports = Enable;
  101045. /***/ }),
  101046. /* 571 */
  101047. /***/ (function(module, exports) {
  101048. /**
  101049. * @author Richard Davey <rich@photonstorm.com>
  101050. * @copyright 2019 Photon Storm Ltd.
  101051. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101052. */
  101053. /**
  101054. * Provides methods used for setting the drag properties of an Arcade Physics Body.
  101055. *
  101056. * @name Phaser.Physics.Arcade.Components.Drag
  101057. * @since 3.0.0
  101058. */
  101059. var Drag = {
  101060. /**
  101061. * Sets the body's horizontal and vertical drag. If the vertical drag value is not provided, the vertical drag is set to the same value as the horizontal drag.
  101062. *
  101063. * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time.
  101064. * It is the absolute loss of velocity due to movement, in pixels per second squared.
  101065. * The x and y components are applied separately.
  101066. *
  101067. * When `useDamping` is true, this is 1 minus the damping factor.
  101068. * A value of 1 means the Body loses no velocity.
  101069. * A value of 0.95 means the Body loses 5% of its velocity per step.
  101070. * A value of 0.5 means the Body loses 50% of its velocity per step.
  101071. *
  101072. * Drag is applied only when `acceleration` is zero.
  101073. *
  101074. * @method Phaser.Physics.Arcade.Components.Drag#setDrag
  101075. * @since 3.0.0
  101076. *
  101077. * @param {number} x - The amount of horizontal drag to apply.
  101078. * @param {number} [y=x] - The amount of vertical drag to apply.
  101079. *
  101080. * @return {this} This Game Object.
  101081. */
  101082. setDrag: function (x, y)
  101083. {
  101084. this.body.drag.set(x, y);
  101085. return this;
  101086. },
  101087. /**
  101088. * Sets the body's horizontal drag.
  101089. *
  101090. * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time.
  101091. * It is the absolute loss of velocity due to movement, in pixels per second squared.
  101092. * The x and y components are applied separately.
  101093. *
  101094. * When `useDamping` is true, this is 1 minus the damping factor.
  101095. * A value of 1 means the Body loses no velocity.
  101096. * A value of 0.95 means the Body loses 5% of its velocity per step.
  101097. * A value of 0.5 means the Body loses 50% of its velocity per step.
  101098. *
  101099. * Drag is applied only when `acceleration` is zero.
  101100. *
  101101. * @method Phaser.Physics.Arcade.Components.Drag#setDragX
  101102. * @since 3.0.0
  101103. *
  101104. * @param {number} value - The amount of horizontal drag to apply.
  101105. *
  101106. * @return {this} This Game Object.
  101107. */
  101108. setDragX: function (value)
  101109. {
  101110. this.body.drag.x = value;
  101111. return this;
  101112. },
  101113. /**
  101114. * Sets the body's vertical drag.
  101115. *
  101116. * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time.
  101117. * It is the absolute loss of velocity due to movement, in pixels per second squared.
  101118. * The x and y components are applied separately.
  101119. *
  101120. * When `useDamping` is true, this is 1 minus the damping factor.
  101121. * A value of 1 means the Body loses no velocity.
  101122. * A value of 0.95 means the Body loses 5% of its velocity per step.
  101123. * A value of 0.5 means the Body loses 50% of its velocity per step.
  101124. *
  101125. * Drag is applied only when `acceleration` is zero.
  101126. *
  101127. * @method Phaser.Physics.Arcade.Components.Drag#setDragY
  101128. * @since 3.0.0
  101129. *
  101130. * @param {number} value - The amount of vertical drag to apply.
  101131. *
  101132. * @return {this} This Game Object.
  101133. */
  101134. setDragY: function (value)
  101135. {
  101136. this.body.drag.y = value;
  101137. return this;
  101138. },
  101139. /**
  101140. * If this Body is using `drag` for deceleration this function controls how the drag is applied.
  101141. * If set to `true` drag will use a damping effect rather than a linear approach. If you are
  101142. * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in
  101143. * the game Asteroids) then you will get a far smoother and more visually correct deceleration
  101144. * by using damping, avoiding the axis-drift that is prone with linear deceleration.
  101145. *
  101146. * If you enable this property then you should use far smaller `drag` values than with linear, as
  101147. * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow
  101148. * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately.
  101149. *
  101150. * @method Phaser.Physics.Arcade.Components.Drag#setDamping
  101151. * @since 3.10.0
  101152. *
  101153. * @param {boolean} value - `true` to use damping for deceleration, or `false` to use linear deceleration.
  101154. *
  101155. * @return {this} This Game Object.
  101156. */
  101157. setDamping: function (value)
  101158. {
  101159. this.body.useDamping = value;
  101160. return this;
  101161. }
  101162. };
  101163. module.exports = Drag;
  101164. /***/ }),
  101165. /* 572 */
  101166. /***/ (function(module, exports) {
  101167. /**
  101168. * @author Richard Davey <rich@photonstorm.com>
  101169. * @copyright 2019 Photon Storm Ltd.
  101170. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101171. */
  101172. /**
  101173. * Provides methods used for setting the debug properties of an Arcade Physics Body.
  101174. *
  101175. * @name Phaser.Physics.Arcade.Components.Debug
  101176. * @since 3.0.0
  101177. */
  101178. var Debug = {
  101179. /**
  101180. * Sets the debug values of this body.
  101181. *
  101182. * Bodies will only draw their debug if debug has been enabled for Arcade Physics as a whole.
  101183. * Note that there is a performance cost in drawing debug displays. It should never be used in production.
  101184. *
  101185. * @method Phaser.Physics.Arcade.Components.Debug#setDebug
  101186. * @since 3.0.0
  101187. *
  101188. * @param {boolean} showBody - Set to `true` to have this body render its outline to the debug display.
  101189. * @param {boolean} showVelocity - Set to `true` to have this body render a velocity marker to the debug display.
  101190. * @param {number} bodyColor - The color of the body outline when rendered to the debug display.
  101191. *
  101192. * @return {this} This Game Object.
  101193. */
  101194. setDebug: function (showBody, showVelocity, bodyColor)
  101195. {
  101196. this.debugShowBody = showBody;
  101197. this.debugShowVelocity = showVelocity;
  101198. this.debugBodyColor = bodyColor;
  101199. return this;
  101200. },
  101201. /**
  101202. * Sets the color of the body outline when it renders to the debug display.
  101203. *
  101204. * @method Phaser.Physics.Arcade.Components.Debug#setDebugBodyColor
  101205. * @since 3.0.0
  101206. *
  101207. * @param {number} value - The color of the body outline when rendered to the debug display.
  101208. *
  101209. * @return {this} This Game Object.
  101210. */
  101211. setDebugBodyColor: function (value)
  101212. {
  101213. this.body.debugBodyColor = value;
  101214. return this;
  101215. },
  101216. /**
  101217. * Set to `true` to have this body render its outline to the debug display.
  101218. *
  101219. * @name Phaser.Physics.Arcade.Components.Debug#debugShowBody
  101220. * @type {boolean}
  101221. * @since 3.0.0
  101222. */
  101223. debugShowBody: {
  101224. get: function ()
  101225. {
  101226. return this.body.debugShowBody;
  101227. },
  101228. set: function (value)
  101229. {
  101230. this.body.debugShowBody = value;
  101231. }
  101232. },
  101233. /**
  101234. * Set to `true` to have this body render a velocity marker to the debug display.
  101235. *
  101236. * @name Phaser.Physics.Arcade.Components.Debug#debugShowVelocity
  101237. * @type {boolean}
  101238. * @since 3.0.0
  101239. */
  101240. debugShowVelocity: {
  101241. get: function ()
  101242. {
  101243. return this.body.debugShowVelocity;
  101244. },
  101245. set: function (value)
  101246. {
  101247. this.body.debugShowVelocity = value;
  101248. }
  101249. },
  101250. /**
  101251. * The color of the body outline when it renders to the debug display.
  101252. *
  101253. * @name Phaser.Physics.Arcade.Components.Debug#debugBodyColor
  101254. * @type {number}
  101255. * @since 3.0.0
  101256. */
  101257. debugBodyColor: {
  101258. get: function ()
  101259. {
  101260. return this.body.debugBodyColor;
  101261. },
  101262. set: function (value)
  101263. {
  101264. this.body.debugBodyColor = value;
  101265. }
  101266. }
  101267. };
  101268. module.exports = Debug;
  101269. /***/ }),
  101270. /* 573 */
  101271. /***/ (function(module, exports) {
  101272. /**
  101273. * @author Richard Davey <rich@photonstorm.com>
  101274. * @copyright 2019 Photon Storm Ltd.
  101275. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101276. */
  101277. /**
  101278. * Provides methods used for setting the bounce properties of an Arcade Physics Body.
  101279. *
  101280. * @name Phaser.Physics.Arcade.Components.Bounce
  101281. * @since 3.0.0
  101282. */
  101283. var Bounce = {
  101284. /**
  101285. * Sets the bounce values of this body.
  101286. *
  101287. * Bounce is the amount of restitution, or elasticity, the body has when it collides with another object.
  101288. * A value of 1 means that it will retain its full velocity after the rebound. A value of 0 means it will not rebound at all.
  101289. *
  101290. * @method Phaser.Physics.Arcade.Components.Bounce#setBounce
  101291. * @since 3.0.0
  101292. *
  101293. * @param {number} x - The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1.
  101294. * @param {number} [y=x] - The amount of vertical bounce to apply on collision. A float, typically between 0 and 1.
  101295. *
  101296. * @return {this} This Game Object.
  101297. */
  101298. setBounce: function (x, y)
  101299. {
  101300. this.body.bounce.set(x, y);
  101301. return this;
  101302. },
  101303. /**
  101304. * Sets the horizontal bounce value for this body.
  101305. *
  101306. * @method Phaser.Physics.Arcade.Components.Bounce#setBounceX
  101307. * @since 3.0.0
  101308. *
  101309. * @param {number} value - The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1.
  101310. *
  101311. * @return {this} This Game Object.
  101312. */
  101313. setBounceX: function (value)
  101314. {
  101315. this.body.bounce.x = value;
  101316. return this;
  101317. },
  101318. /**
  101319. * Sets the vertical bounce value for this body.
  101320. *
  101321. * @method Phaser.Physics.Arcade.Components.Bounce#setBounceY
  101322. * @since 3.0.0
  101323. *
  101324. * @param {number} value - The amount of vertical bounce to apply on collision. A float, typically between 0 and 1.
  101325. *
  101326. * @return {this} This Game Object.
  101327. */
  101328. setBounceY: function (value)
  101329. {
  101330. this.body.bounce.y = value;
  101331. return this;
  101332. },
  101333. /**
  101334. * Sets if this body should collide with the world bounds or not.
  101335. *
  101336. * @method Phaser.Physics.Arcade.Components.Bounce#setCollideWorldBounds
  101337. * @since 3.0.0
  101338. *
  101339. * @param {boolean} value - `true` if this body should collide with the world bounds, otherwise `false`.
  101340. *
  101341. * @return {this} This Game Object.
  101342. */
  101343. setCollideWorldBounds: function (value)
  101344. {
  101345. this.body.collideWorldBounds = value;
  101346. return this;
  101347. }
  101348. };
  101349. module.exports = Bounce;
  101350. /***/ }),
  101351. /* 574 */
  101352. /***/ (function(module, exports) {
  101353. /**
  101354. * @author Richard Davey <rich@photonstorm.com>
  101355. * @copyright 2019 Photon Storm Ltd.
  101356. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101357. */
  101358. /**
  101359. * Provides methods used for setting the angular acceleration properties of an Arcade Physics Body.
  101360. *
  101361. * @name Phaser.Physics.Arcade.Components.Angular
  101362. * @since 3.0.0
  101363. */
  101364. var Angular = {
  101365. /**
  101366. * Sets the angular velocity of the body.
  101367. *
  101368. * In Arcade Physics, bodies cannot rotate. They are always axis-aligned.
  101369. * However, they can have angular motion, which is passed on to the Game Object bound to the body,
  101370. * causing them to visually rotate, even though the body remains axis-aligned.
  101371. *
  101372. * @method Phaser.Physics.Arcade.Components.Angular#setAngularVelocity
  101373. * @since 3.0.0
  101374. *
  101375. * @param {number} value - The amount of angular velocity.
  101376. *
  101377. * @return {this} This Game Object.
  101378. */
  101379. setAngularVelocity: function (value)
  101380. {
  101381. this.body.angularVelocity = value;
  101382. return this;
  101383. },
  101384. /**
  101385. * Sets the angular acceleration of the body.
  101386. *
  101387. * In Arcade Physics, bodies cannot rotate. They are always axis-aligned.
  101388. * However, they can have angular motion, which is passed on to the Game Object bound to the body,
  101389. * causing them to visually rotate, even though the body remains axis-aligned.
  101390. *
  101391. * @method Phaser.Physics.Arcade.Components.Angular#setAngularAcceleration
  101392. * @since 3.0.0
  101393. *
  101394. * @param {number} value - The amount of angular acceleration.
  101395. *
  101396. * @return {this} This Game Object.
  101397. */
  101398. setAngularAcceleration: function (value)
  101399. {
  101400. this.body.angularAcceleration = value;
  101401. return this;
  101402. },
  101403. /**
  101404. * Sets the angular drag of the body. Drag is applied to the current velocity, providing a form of deceleration.
  101405. *
  101406. * @method Phaser.Physics.Arcade.Components.Angular#setAngularDrag
  101407. * @since 3.0.0
  101408. *
  101409. * @param {number} value - The amount of drag.
  101410. *
  101411. * @return {this} This Game Object.
  101412. */
  101413. setAngularDrag: function (value)
  101414. {
  101415. this.body.angularDrag = value;
  101416. return this;
  101417. }
  101418. };
  101419. module.exports = Angular;
  101420. /***/ }),
  101421. /* 575 */
  101422. /***/ (function(module, exports) {
  101423. /**
  101424. * @author Richard Davey <rich@photonstorm.com>
  101425. * @copyright 2019 Photon Storm Ltd.
  101426. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101427. */
  101428. /**
  101429. * Provides methods used for setting the acceleration properties of an Arcade Physics Body.
  101430. *
  101431. * @name Phaser.Physics.Arcade.Components.Acceleration
  101432. * @since 3.0.0
  101433. */
  101434. var Acceleration = {
  101435. /**
  101436. * Sets the body's horizontal and vertical acceleration. If the vertical acceleration value is not provided, the vertical acceleration is set to the same value as the horizontal acceleration.
  101437. *
  101438. * @method Phaser.Physics.Arcade.Components.Acceleration#setAcceleration
  101439. * @since 3.0.0
  101440. *
  101441. * @param {number} x - The horizontal acceleration
  101442. * @param {number} [y=x] - The vertical acceleration
  101443. *
  101444. * @return {this} This Game Object.
  101445. */
  101446. setAcceleration: function (x, y)
  101447. {
  101448. this.body.acceleration.set(x, y);
  101449. return this;
  101450. },
  101451. /**
  101452. * Sets the body's horizontal acceleration.
  101453. *
  101454. * @method Phaser.Physics.Arcade.Components.Acceleration#setAccelerationX
  101455. * @since 3.0.0
  101456. *
  101457. * @param {number} value - The horizontal acceleration
  101458. *
  101459. * @return {this} This Game Object.
  101460. */
  101461. setAccelerationX: function (value)
  101462. {
  101463. this.body.acceleration.x = value;
  101464. return this;
  101465. },
  101466. /**
  101467. * Sets the body's vertical acceleration.
  101468. *
  101469. * @method Phaser.Physics.Arcade.Components.Acceleration#setAccelerationY
  101470. * @since 3.0.0
  101471. *
  101472. * @param {number} value - The vertical acceleration
  101473. *
  101474. * @return {this} This Game Object.
  101475. */
  101476. setAccelerationY: function (value)
  101477. {
  101478. this.body.acceleration.y = value;
  101479. return this;
  101480. }
  101481. };
  101482. module.exports = Acceleration;
  101483. /***/ }),
  101484. /* 576 */
  101485. /***/ (function(module, exports, __webpack_require__) {
  101486. /**
  101487. * @author Richard Davey <rich@photonstorm.com>
  101488. * @copyright 2019 Photon Storm Ltd.
  101489. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101490. */
  101491. var Class = __webpack_require__(0);
  101492. var DegToRad = __webpack_require__(34);
  101493. var DistanceBetween = __webpack_require__(56);
  101494. var DistanceSquared = __webpack_require__(384);
  101495. var Factory = __webpack_require__(255);
  101496. var GetFastValue = __webpack_require__(2);
  101497. var Merge = __webpack_require__(103);
  101498. var PluginCache = __webpack_require__(17);
  101499. var SceneEvents = __webpack_require__(16);
  101500. var Vector2 = __webpack_require__(3);
  101501. var World = __webpack_require__(250);
  101502. /**
  101503. * @classdesc
  101504. * The Arcade Physics Plugin belongs to a Scene and sets up and manages the Scene's physics simulation.
  101505. * It also holds some useful methods for moving and rotating Arcade Physics Bodies.
  101506. *
  101507. * You can access it from within a Scene using `this.physics`.
  101508. *
  101509. * @class ArcadePhysics
  101510. * @memberof Phaser.Physics.Arcade
  101511. * @constructor
  101512. * @since 3.0.0
  101513. *
  101514. * @param {Phaser.Scene} scene - The Scene that this Plugin belongs to.
  101515. */
  101516. var ArcadePhysics = new Class({
  101517. initialize:
  101518. function ArcadePhysics (scene)
  101519. {
  101520. /**
  101521. * The Scene that this Plugin belongs to.
  101522. *
  101523. * @name Phaser.Physics.Arcade.ArcadePhysics#scene
  101524. * @type {Phaser.Scene}
  101525. * @since 3.0.0
  101526. */
  101527. this.scene = scene;
  101528. /**
  101529. * The Scene's Systems.
  101530. *
  101531. * @name Phaser.Physics.Arcade.ArcadePhysics#systems
  101532. * @type {Phaser.Scenes.Systems}
  101533. * @since 3.0.0
  101534. */
  101535. this.systems = scene.sys;
  101536. /**
  101537. * A configuration object. Union of the `physics.arcade.*` properties of the GameConfig and SceneConfig objects.
  101538. *
  101539. * @name Phaser.Physics.Arcade.ArcadePhysics#config
  101540. * @type {object}
  101541. * @since 3.0.0
  101542. */
  101543. this.config = this.getConfig();
  101544. /**
  101545. * The physics simulation.
  101546. *
  101547. * @name Phaser.Physics.Arcade.ArcadePhysics#world
  101548. * @type {Phaser.Physics.Arcade.World}
  101549. * @since 3.0.0
  101550. */
  101551. this.world;
  101552. /**
  101553. * An object holding the Arcade Physics factory methods.
  101554. *
  101555. * @name Phaser.Physics.Arcade.ArcadePhysics#add
  101556. * @type {Phaser.Physics.Arcade.Factory}
  101557. * @since 3.0.0
  101558. */
  101559. this.add;
  101560. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  101561. scene.sys.events.on(SceneEvents.START, this.start, this);
  101562. },
  101563. /**
  101564. * This method is called automatically, only once, when the Scene is first created.
  101565. * Do not invoke it directly.
  101566. *
  101567. * @method Phaser.Physics.Arcade.ArcadePhysics#boot
  101568. * @private
  101569. * @since 3.5.1
  101570. */
  101571. boot: function ()
  101572. {
  101573. this.world = new World(this.scene, this.config);
  101574. this.add = new Factory(this.world);
  101575. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  101576. },
  101577. /**
  101578. * This method is called automatically by the Scene when it is starting up.
  101579. * It is responsible for creating local systems, properties and listening for Scene events.
  101580. * Do not invoke it directly.
  101581. *
  101582. * @method Phaser.Physics.Arcade.ArcadePhysics#start
  101583. * @private
  101584. * @since 3.5.0
  101585. */
  101586. start: function ()
  101587. {
  101588. if (!this.world)
  101589. {
  101590. this.world = new World(this.scene, this.config);
  101591. this.add = new Factory(this.world);
  101592. }
  101593. var eventEmitter = this.systems.events;
  101594. eventEmitter.on(SceneEvents.UPDATE, this.world.update, this.world);
  101595. eventEmitter.on(SceneEvents.POST_UPDATE, this.world.postUpdate, this.world);
  101596. eventEmitter.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  101597. },
  101598. /**
  101599. * Creates the physics configuration for the current Scene.
  101600. *
  101601. * @method Phaser.Physics.Arcade.ArcadePhysics#getConfig
  101602. * @since 3.0.0
  101603. *
  101604. * @return {object} The physics configuration.
  101605. */
  101606. getConfig: function ()
  101607. {
  101608. var gameConfig = this.systems.game.config.physics;
  101609. var sceneConfig = this.systems.settings.physics;
  101610. var config = Merge(
  101611. GetFastValue(sceneConfig, 'arcade', {}),
  101612. GetFastValue(gameConfig, 'arcade', {})
  101613. );
  101614. return config;
  101615. },
  101616. /**
  101617. * Tests if Game Objects overlap. See {@link Phaser.Physics.Arcade.World#overlap}
  101618. *
  101619. * @method Phaser.Physics.Arcade.ArcadePhysics#overlap
  101620. * @since 3.0.0
  101621. *
  101622. * @param {ArcadeColliderType} object1 - The first object or array of objects to check.
  101623. * @param {ArcadeColliderType} [object2] - The second object or array of objects to check, or `undefined`.
  101624. * @param {ArcadePhysicsCallback} [collideCallback] - An optional callback function that is called if the objects collide.
  101625. * @param {ArcadePhysicsCallback} [processCallback] - An optional callback function that lets you perform additional checks against the two objects if they overlap. If this is set then `collideCallback` will only be called if this callback returns `true`.
  101626. * @param {*} [callbackContext] - The context in which to run the callbacks.
  101627. *
  101628. * @return {boolean} True if at least one Game Object overlaps another.
  101629. *
  101630. * @see Phaser.Physics.Arcade.World#overlap
  101631. */
  101632. overlap: function (object1, object2, overlapCallback, processCallback, callbackContext)
  101633. {
  101634. if (overlapCallback === undefined) { overlapCallback = null; }
  101635. if (processCallback === undefined) { processCallback = null; }
  101636. if (callbackContext === undefined) { callbackContext = overlapCallback; }
  101637. return this.world.collideObjects(object1, object2, overlapCallback, processCallback, callbackContext, true);
  101638. },
  101639. /**
  101640. * Tests if Game Objects overlap and separates them (if possible). See {@link Phaser.Physics.Arcade.World#collide}.
  101641. *
  101642. * @method Phaser.Physics.Arcade.ArcadePhysics#collide
  101643. * @since 3.0.0
  101644. *
  101645. * @param {ArcadeColliderType} object1 - The first object or array of objects to check.
  101646. * @param {ArcadeColliderType} [object2] - The second object or array of objects to check, or `undefined`.
  101647. * @param {ArcadePhysicsCallback} [collideCallback] - An optional callback function that is called if the objects collide.
  101648. * @param {ArcadePhysicsCallback} [processCallback] - An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`.
  101649. * @param {*} [callbackContext] - The context in which to run the callbacks.
  101650. *
  101651. * @return {boolean} True if any overlapping Game Objects were separated, otherwise false.
  101652. *
  101653. * @see Phaser.Physics.Arcade.World#collide
  101654. */
  101655. collide: function (object1, object2, collideCallback, processCallback, callbackContext)
  101656. {
  101657. if (collideCallback === undefined) { collideCallback = null; }
  101658. if (processCallback === undefined) { processCallback = null; }
  101659. if (callbackContext === undefined) { callbackContext = collideCallback; }
  101660. return this.world.collideObjects(object1, object2, collideCallback, processCallback, callbackContext, false);
  101661. },
  101662. /**
  101663. * Pauses the simulation.
  101664. *
  101665. * @method Phaser.Physics.Arcade.ArcadePhysics#pause
  101666. * @since 3.0.0
  101667. *
  101668. * @return {Phaser.Physics.Arcade.World} The simulation.
  101669. */
  101670. pause: function ()
  101671. {
  101672. return this.world.pause();
  101673. },
  101674. /**
  101675. * Resumes the simulation (if paused).
  101676. *
  101677. * @method Phaser.Physics.Arcade.ArcadePhysics#resume
  101678. * @since 3.0.0
  101679. *
  101680. * @return {Phaser.Physics.Arcade.World} The simulation.
  101681. */
  101682. resume: function ()
  101683. {
  101684. return this.world.resume();
  101685. },
  101686. /**
  101687. * Sets the acceleration.x/y property on the game object so it will move towards the x/y coordinates at the given rate (in pixels per second squared)
  101688. *
  101689. * You must give a maximum speed value, beyond which the game object won't go any faster.
  101690. *
  101691. * Note: The game object does not continuously track the target. If the target changes location during transit the game object will not modify its course.
  101692. * Note: The game object doesn't stop moving once it reaches the destination coordinates.
  101693. *
  101694. * @method Phaser.Physics.Arcade.ArcadePhysics#accelerateTo
  101695. * @since 3.0.0
  101696. *
  101697. * @param {Phaser.GameObjects.GameObject} gameObject - Any Game Object with an Arcade Physics body.
  101698. * @param {number} x - The x coordinate to accelerate towards.
  101699. * @param {number} y - The y coordinate to accelerate towards.
  101700. * @param {number} [speed=60] - The acceleration (change in speed) in pixels per second squared.
  101701. * @param {number} [xSpeedMax=500] - The maximum x velocity the game object can reach.
  101702. * @param {number} [ySpeedMax=500] - The maximum y velocity the game object can reach.
  101703. *
  101704. * @return {number} The angle (in radians) that the object should be visually set to in order to match its new velocity.
  101705. */
  101706. accelerateTo: function (gameObject, x, y, speed, xSpeedMax, ySpeedMax)
  101707. {
  101708. if (speed === undefined) { speed = 60; }
  101709. var angle = Math.atan2(y - gameObject.y, x - gameObject.x);
  101710. gameObject.body.acceleration.setToPolar(angle, speed);
  101711. if (xSpeedMax !== undefined && ySpeedMax !== undefined)
  101712. {
  101713. gameObject.body.maxVelocity.set(xSpeedMax, ySpeedMax);
  101714. }
  101715. return angle;
  101716. },
  101717. /**
  101718. * Sets the acceleration.x/y property on the game object so it will move towards the x/y coordinates at the given rate (in pixels per second squared)
  101719. *
  101720. * You must give a maximum speed value, beyond which the game object won't go any faster.
  101721. *
  101722. * Note: The game object does not continuously track the target. If the target changes location during transit the game object will not modify its course.
  101723. * Note: The game object doesn't stop moving once it reaches the destination coordinates.
  101724. *
  101725. * @method Phaser.Physics.Arcade.ArcadePhysics#accelerateToObject
  101726. * @since 3.0.0
  101727. *
  101728. * @param {Phaser.GameObjects.GameObject} gameObject - Any Game Object with an Arcade Physics body.
  101729. * @param {Phaser.GameObjects.GameObject} destination - The Game Object to move towards. Can be any object but must have visible x/y properties.
  101730. * @param {number} [speed=60] - The acceleration (change in speed) in pixels per second squared.
  101731. * @param {number} [xSpeedMax=500] - The maximum x velocity the game object can reach.
  101732. * @param {number} [ySpeedMax=500] - The maximum y velocity the game object can reach.
  101733. *
  101734. * @return {number} The angle (in radians) that the object should be visually set to in order to match its new velocity.
  101735. */
  101736. accelerateToObject: function (gameObject, destination, speed, xSpeedMax, ySpeedMax)
  101737. {
  101738. return this.accelerateTo(gameObject, destination.x, destination.y, speed, xSpeedMax, ySpeedMax);
  101739. },
  101740. /**
  101741. * Finds the Body closest to a source point or object.
  101742. *
  101743. * @method Phaser.Physics.Arcade.ArcadePhysics#closest
  101744. * @since 3.0.0
  101745. *
  101746. * @param {object} source - Any object with public `x` and `y` properties, such as a Game Object or Geometry object.
  101747. *
  101748. * @return {Phaser.Physics.Arcade.Body} The closest Body to the given source point.
  101749. */
  101750. closest: function (source)
  101751. {
  101752. var bodies = this.world.tree.all();
  101753. var min = Number.MAX_VALUE;
  101754. var closest = null;
  101755. var x = source.x;
  101756. var y = source.y;
  101757. for (var i = bodies.length - 1; i >= 0; i--)
  101758. {
  101759. var target = bodies[i];
  101760. var distance = DistanceSquared(x, y, target.x, target.y);
  101761. if (distance < min)
  101762. {
  101763. closest = target;
  101764. min = distance;
  101765. }
  101766. }
  101767. return closest;
  101768. },
  101769. /**
  101770. * Finds the Body farthest from a source point or object.
  101771. *
  101772. * @method Phaser.Physics.Arcade.ArcadePhysics#furthest
  101773. * @since 3.0.0
  101774. *
  101775. * @param {object} source - Any object with public `x` and `y` properties, such as a Game Object or Geometry object.
  101776. *
  101777. * @return {Phaser.Physics.Arcade.Body} The Body furthest from the given source point.
  101778. */
  101779. furthest: function (source)
  101780. {
  101781. var bodies = this.world.tree.all();
  101782. var max = -1;
  101783. var farthest = null;
  101784. var x = source.x;
  101785. var y = source.y;
  101786. for (var i = bodies.length - 1; i >= 0; i--)
  101787. {
  101788. var target = bodies[i];
  101789. var distance = DistanceSquared(x, y, target.x, target.y);
  101790. if (distance > max)
  101791. {
  101792. farthest = target;
  101793. max = distance;
  101794. }
  101795. }
  101796. return farthest;
  101797. },
  101798. /**
  101799. * Move the given display object towards the x/y coordinates at a steady velocity.
  101800. * If you specify a maxTime then it will adjust the speed (over-writing what you set) so it arrives at the destination in that number of seconds.
  101801. * Timings are approximate due to the way browser timers work. Allow for a variance of +- 50ms.
  101802. * Note: The display object does not continuously track the target. If the target changes location during transit the display object will not modify its course.
  101803. * Note: The display object doesn't stop moving once it reaches the destination coordinates.
  101804. * Note: Doesn't take into account acceleration, maxVelocity or drag (if you've set drag or acceleration too high this object may not move at all)
  101805. *
  101806. * @method Phaser.Physics.Arcade.ArcadePhysics#moveTo
  101807. * @since 3.0.0
  101808. *
  101809. * @param {Phaser.GameObjects.GameObject} gameObject - Any Game Object with an Arcade Physics body.
  101810. * @param {number} x - The x coordinate to move towards.
  101811. * @param {number} y - The y coordinate to move towards.
  101812. * @param {number} [speed=60] - The speed it will move, in pixels per second (default is 60 pixels/sec)
  101813. * @param {number} [maxTime=0] - Time given in milliseconds (1000 = 1 sec). If set the speed is adjusted so the object will arrive at destination in the given number of ms.
  101814. *
  101815. * @return {number} The angle (in radians) that the object should be visually set to in order to match its new velocity.
  101816. */
  101817. moveTo: function (gameObject, x, y, speed, maxTime)
  101818. {
  101819. if (speed === undefined) { speed = 60; }
  101820. if (maxTime === undefined) { maxTime = 0; }
  101821. var angle = Math.atan2(y - gameObject.y, x - gameObject.x);
  101822. if (maxTime > 0)
  101823. {
  101824. // We know how many pixels we need to move, but how fast?
  101825. speed = DistanceBetween(gameObject.x, gameObject.y, x, y) / (maxTime / 1000);
  101826. }
  101827. gameObject.body.velocity.setToPolar(angle, speed);
  101828. return angle;
  101829. },
  101830. /**
  101831. * Move the given display object towards the destination object at a steady velocity.
  101832. * If you specify a maxTime then it will adjust the speed (overwriting what you set) so it arrives at the destination in that number of seconds.
  101833. * Timings are approximate due to the way browser timers work. Allow for a variance of +- 50ms.
  101834. * Note: The display object does not continuously track the target. If the target changes location during transit the display object will not modify its course.
  101835. * Note: The display object doesn't stop moving once it reaches the destination coordinates.
  101836. * Note: Doesn't take into account acceleration, maxVelocity or drag (if you've set drag or acceleration too high this object may not move at all)
  101837. *
  101838. * @method Phaser.Physics.Arcade.ArcadePhysics#moveToObject
  101839. * @since 3.0.0
  101840. *
  101841. * @param {Phaser.GameObjects.GameObject} gameObject - Any Game Object with an Arcade Physics body.
  101842. * @param {object} destination - Any object with public `x` and `y` properties, such as a Game Object or Geometry object.
  101843. * @param {number} [speed=60] - The speed it will move, in pixels per second (default is 60 pixels/sec)
  101844. * @param {number} [maxTime=0] - Time given in milliseconds (1000 = 1 sec). If set the speed is adjusted so the object will arrive at destination in the given number of ms.
  101845. *
  101846. * @return {number} The angle (in radians) that the object should be visually set to in order to match its new velocity.
  101847. */
  101848. moveToObject: function (gameObject, destination, speed, maxTime)
  101849. {
  101850. return this.moveTo(gameObject, destination.x, destination.y, speed, maxTime);
  101851. },
  101852. /**
  101853. * Given the angle (in degrees) and speed calculate the velocity and return it as a vector, or set it to the given vector object.
  101854. * One way to use this is: velocityFromAngle(angle, 200, sprite.body.velocity) which will set the values directly to the sprite's velocity and not create a new vector object.
  101855. *
  101856. * @method Phaser.Physics.Arcade.ArcadePhysics#velocityFromAngle
  101857. * @since 3.0.0
  101858. *
  101859. * @param {number} angle - The angle in degrees calculated in clockwise positive direction (down = 90 degrees positive, right = 0 degrees positive, up = 90 degrees negative)
  101860. * @param {number} [speed=60] - The speed it will move, in pixels per second squared.
  101861. * @param {Phaser.Math.Vector2} [vec2] - The Vector2 in which the x and y properties will be set to the calculated velocity.
  101862. *
  101863. * @return {Phaser.Math.Vector2} The Vector2 that stores the velocity.
  101864. */
  101865. velocityFromAngle: function (angle, speed, vec2)
  101866. {
  101867. if (speed === undefined) { speed = 60; }
  101868. if (vec2 === undefined) { vec2 = new Vector2(); }
  101869. return vec2.setToPolar(DegToRad(angle), speed);
  101870. },
  101871. /**
  101872. * Given the rotation (in radians) and speed calculate the velocity and return it as a vector, or set it to the given vector object.
  101873. * One way to use this is: velocityFromRotation(rotation, 200, sprite.body.velocity) which will set the values directly to the sprite's velocity and not create a new vector object.
  101874. *
  101875. * @method Phaser.Physics.Arcade.ArcadePhysics#velocityFromRotation
  101876. * @since 3.0.0
  101877. *
  101878. * @param {number} rotation - The angle in radians.
  101879. * @param {number} [speed=60] - The speed it will move, in pixels per second squared
  101880. * @param {Phaser.Math.Vector2} [vec2] - The Vector2 in which the x and y properties will be set to the calculated velocity.
  101881. *
  101882. * @return {Phaser.Math.Vector2} The Vector2 that stores the velocity.
  101883. */
  101884. velocityFromRotation: function (rotation, speed, vec2)
  101885. {
  101886. if (speed === undefined) { speed = 60; }
  101887. if (vec2 === undefined) { vec2 = new Vector2(); }
  101888. return vec2.setToPolar(rotation, speed);
  101889. },
  101890. /**
  101891. * The Scene that owns this plugin is shutting down.
  101892. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  101893. *
  101894. * @method Phaser.Physics.Arcade.ArcadePhysics#shutdown
  101895. * @since 3.0.0
  101896. */
  101897. shutdown: function ()
  101898. {
  101899. if (!this.world)
  101900. {
  101901. // Already destroyed
  101902. return;
  101903. }
  101904. var eventEmitter = this.systems.events;
  101905. eventEmitter.off(SceneEvents.UPDATE, this.world.update, this.world);
  101906. eventEmitter.off(SceneEvents.POST_UPDATE, this.world.postUpdate, this.world);
  101907. eventEmitter.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  101908. this.add.destroy();
  101909. this.world.destroy();
  101910. this.add = null;
  101911. this.world = null;
  101912. },
  101913. /**
  101914. * The Scene that owns this plugin is being destroyed.
  101915. * We need to shutdown and then kill off all external references.
  101916. *
  101917. * @method Phaser.Physics.Arcade.ArcadePhysics#destroy
  101918. * @since 3.0.0
  101919. */
  101920. destroy: function ()
  101921. {
  101922. this.shutdown();
  101923. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  101924. this.scene = null;
  101925. this.systems = null;
  101926. }
  101927. });
  101928. PluginCache.register('ArcadePhysics', ArcadePhysics, 'arcadePhysics');
  101929. module.exports = ArcadePhysics;
  101930. /***/ }),
  101931. /* 577 */
  101932. /***/ (function(module, exports, __webpack_require__) {
  101933. /**
  101934. * @author Richard Davey <rich@photonstorm.com>
  101935. * @copyright 2019 Photon Storm Ltd.
  101936. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101937. */
  101938. var CONST = __webpack_require__(38);
  101939. var Extend = __webpack_require__(19);
  101940. /**
  101941. * @callback ArcadePhysicsCallback
  101942. *
  101943. * @param {Phaser.GameObjects.GameObject} object1 - The first Body to separate.
  101944. * @param {Phaser.GameObjects.GameObject} object2 - The second Body to separate.
  101945. */
  101946. /**
  101947. * @namespace Phaser.Physics.Arcade
  101948. */
  101949. var Arcade = {
  101950. ArcadePhysics: __webpack_require__(576),
  101951. Body: __webpack_require__(249),
  101952. Collider: __webpack_require__(247),
  101953. Factory: __webpack_require__(255),
  101954. Group: __webpack_require__(252),
  101955. Image: __webpack_require__(254),
  101956. Sprite: __webpack_require__(111),
  101957. StaticBody: __webpack_require__(241),
  101958. StaticGroup: __webpack_require__(251),
  101959. World: __webpack_require__(250)
  101960. };
  101961. // Merge in the consts
  101962. Arcade = Extend(false, Arcade, CONST);
  101963. module.exports = Arcade;
  101964. /***/ }),
  101965. /* 578 */
  101966. /***/ (function(module, exports, __webpack_require__) {
  101967. /**
  101968. * @author Richard Davey <rich@photonstorm.com>
  101969. * @copyright 2019 Photon Storm Ltd.
  101970. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101971. */
  101972. var Class = __webpack_require__(0);
  101973. var CONST = __webpack_require__(15);
  101974. var CustomSet = __webpack_require__(102);
  101975. var EventEmitter = __webpack_require__(11);
  101976. var Events = __webpack_require__(75);
  101977. var FileTypesManager = __webpack_require__(7);
  101978. var GetFastValue = __webpack_require__(2);
  101979. var PluginCache = __webpack_require__(17);
  101980. var SceneEvents = __webpack_require__(16);
  101981. var XHRSettings = __webpack_require__(112);
  101982. /**
  101983. * @classdesc
  101984. * The Loader handles loading all external content such as Images, Sounds, Texture Atlases and data files.
  101985. * You typically interact with it via `this.load` in your Scene. Scenes can have a `preload` method, which is always
  101986. * called before the Scenes `create` method, allowing you to preload assets that the Scene may need.
  101987. *
  101988. * If you call any `this.load` methods from outside of `Scene.preload` then you need to start the Loader going
  101989. * yourself by calling `Loader.start()`. It's only automatically started during the Scene preload.
  101990. *
  101991. * The Loader uses a combination of tag loading (eg. Audio elements) and XHR and provides progress and completion events.
  101992. * Files are loaded in parallel by default. The amount of concurrent connections can be controlled in your Game Configuration.
  101993. *
  101994. * Once the Loader has started loading you are still able to add files to it. These can be injected as a result of a loader
  101995. * event, the type of file being loaded (such as a pack file) or other external events. As long as the Loader hasn't finished
  101996. * simply adding a new file to it, while running, will ensure it's added into the current queue.
  101997. *
  101998. * Every Scene has its own instance of the Loader and they are bound to the Scene in which they are created. However,
  101999. * assets loaded by the Loader are placed into global game-level caches. For example, loading an XML file will place that
  102000. * file inside `Game.cache.xml`, which is accessible from every Scene in your game, no matter who was responsible
  102001. * for loading it. The same is true of Textures. A texture loaded in one Scene is instantly available to all other Scenes
  102002. * in your game.
  102003. *
  102004. * The Loader works by using custom File Types. These are stored in the FileTypesManager, which injects them into the Loader
  102005. * when it's instantiated. You can create your own custom file types by extending either the File or MultiFile classes.
  102006. * See those files for more details.
  102007. *
  102008. * @class LoaderPlugin
  102009. * @extends Phaser.Events.EventEmitter
  102010. * @memberof Phaser.Loader
  102011. * @constructor
  102012. * @since 3.0.0
  102013. *
  102014. * @param {Phaser.Scene} scene - The Scene which owns this Loader instance.
  102015. */
  102016. var LoaderPlugin = new Class({
  102017. Extends: EventEmitter,
  102018. initialize:
  102019. function LoaderPlugin (scene)
  102020. {
  102021. EventEmitter.call(this);
  102022. var gameConfig = scene.sys.game.config;
  102023. var sceneConfig = scene.sys.settings.loader;
  102024. /**
  102025. * The Scene which owns this Loader instance.
  102026. *
  102027. * @name Phaser.Loader.LoaderPlugin#scene
  102028. * @type {Phaser.Scene}
  102029. * @since 3.0.0
  102030. */
  102031. this.scene = scene;
  102032. /**
  102033. * A reference to the Scene Systems.
  102034. *
  102035. * @name Phaser.Loader.LoaderPlugin#systems
  102036. * @type {Phaser.Scenes.Systems}
  102037. * @since 3.0.0
  102038. */
  102039. this.systems = scene.sys;
  102040. /**
  102041. * A reference to the global Cache Manager.
  102042. *
  102043. * @name Phaser.Loader.LoaderPlugin#cacheManager
  102044. * @type {Phaser.Cache.CacheManager}
  102045. * @since 3.7.0
  102046. */
  102047. this.cacheManager = scene.sys.cache;
  102048. /**
  102049. * A reference to the global Texture Manager.
  102050. *
  102051. * @name Phaser.Loader.LoaderPlugin#textureManager
  102052. * @type {Phaser.Textures.TextureManager}
  102053. * @since 3.7.0
  102054. */
  102055. this.textureManager = scene.sys.textures;
  102056. /**
  102057. * A reference to the global Scene Manager.
  102058. *
  102059. * @name Phaser.Loader.LoaderPlugin#sceneManager
  102060. * @type {Phaser.Scenes.SceneManager}
  102061. * @protected
  102062. * @since 3.16.0
  102063. */
  102064. this.sceneManager = scene.sys.game.scene;
  102065. // Inject the available filetypes into the Loader
  102066. FileTypesManager.install(this);
  102067. /**
  102068. * An optional prefix that is automatically prepended to the start of every file key.
  102069. * If prefix was `MENU.` and you load an image with the key 'Background' the resulting key would be `MENU.Background`.
  102070. * You can set this directly, or call `Loader.setPrefix()`. It will then affect every file added to the Loader
  102071. * from that point on. It does _not_ change any file already in the load queue.
  102072. *
  102073. * @name Phaser.Loader.LoaderPlugin#prefix
  102074. * @type {string}
  102075. * @default ''
  102076. * @since 3.7.0
  102077. */
  102078. this.prefix = '';
  102079. /**
  102080. * The value of `path`, if set, is placed before any _relative_ file path given. For example:
  102081. *
  102082. * ```javascript
  102083. * this.load.path = "images/sprites/";
  102084. * this.load.image("ball", "ball.png");
  102085. * this.load.image("tree", "level1/oaktree.png");
  102086. * this.load.image("boom", "http://server.com/explode.png");
  102087. * ```
  102088. *
  102089. * Would load the `ball` file from `images/sprites/ball.png` and the tree from
  102090. * `images/sprites/level1/oaktree.png` but the file `boom` would load from the URL
  102091. * given as it's an absolute URL.
  102092. *
  102093. * Please note that the path is added before the filename but *after* the baseURL (if set.)
  102094. *
  102095. * If you set this property directly then it _must_ end with a "/". Alternatively, call `setPath()` and it'll do it for you.
  102096. *
  102097. * @name Phaser.Loader.LoaderPlugin#path
  102098. * @type {string}
  102099. * @default ''
  102100. * @since 3.0.0
  102101. */
  102102. this.path = '';
  102103. /**
  102104. * If you want to append a URL before the path of any asset you can set this here.
  102105. *
  102106. * Useful if allowing the asset base url to be configured outside of the game code.
  102107. *
  102108. * If you set this property directly then it _must_ end with a "/". Alternatively, call `setBaseURL()` and it'll do it for you.
  102109. *
  102110. * @name Phaser.Loader.LoaderPlugin#baseURL
  102111. * @type {string}
  102112. * @default ''
  102113. * @since 3.0.0
  102114. */
  102115. this.baseURL = '';
  102116. this.setBaseURL(GetFastValue(sceneConfig, 'baseURL', gameConfig.loaderBaseURL));
  102117. this.setPath(GetFastValue(sceneConfig, 'path', gameConfig.loaderPath));
  102118. this.setPrefix(GetFastValue(sceneConfig, 'prefix', gameConfig.loaderPrefix));
  102119. /**
  102120. * The number of concurrent / parallel resources to try and fetch at once.
  102121. *
  102122. * Old browsers limit 6 requests per domain; modern ones, especially those with HTTP/2 don't limit it at all.
  102123. *
  102124. * The default is 32 but you can change this in your Game Config, or by changing this property before the Loader starts.
  102125. *
  102126. * @name Phaser.Loader.LoaderPlugin#maxParallelDownloads
  102127. * @type {integer}
  102128. * @since 3.0.0
  102129. */
  102130. this.maxParallelDownloads = GetFastValue(sceneConfig, 'maxParallelDownloads', gameConfig.loaderMaxParallelDownloads);
  102131. /**
  102132. * xhr specific global settings (can be overridden on a per-file basis)
  102133. *
  102134. * @name Phaser.Loader.LoaderPlugin#xhr
  102135. * @type {XHRSettingsObject}
  102136. * @since 3.0.0
  102137. */
  102138. this.xhr = XHRSettings(
  102139. GetFastValue(sceneConfig, 'responseType', gameConfig.loaderResponseType),
  102140. GetFastValue(sceneConfig, 'async', gameConfig.loaderAsync),
  102141. GetFastValue(sceneConfig, 'user', gameConfig.loaderUser),
  102142. GetFastValue(sceneConfig, 'password', gameConfig.loaderPassword),
  102143. GetFastValue(sceneConfig, 'timeout', gameConfig.loaderTimeout)
  102144. );
  102145. /**
  102146. * The crossOrigin value applied to loaded images. Very often this needs to be set to 'anonymous'.
  102147. *
  102148. * @name Phaser.Loader.LoaderPlugin#crossOrigin
  102149. * @type {string}
  102150. * @since 3.0.0
  102151. */
  102152. this.crossOrigin = GetFastValue(sceneConfig, 'crossOrigin', gameConfig.loaderCrossOrigin);
  102153. /**
  102154. * The total number of files to load. It may not always be accurate because you may add to the Loader during the process
  102155. * of loading, especially if you load a Pack File. Therefore this value can change, but in most cases remains static.
  102156. *
  102157. * @name Phaser.Loader.LoaderPlugin#totalToLoad
  102158. * @type {integer}
  102159. * @default 0
  102160. * @since 3.0.0
  102161. */
  102162. this.totalToLoad = 0;
  102163. /**
  102164. * The progress of the current load queue, as a float value between 0 and 1.
  102165. * This is updated automatically as files complete loading.
  102166. * Note that it is possible for this value to go down again if you add content to the current load queue during a load.
  102167. *
  102168. * @name Phaser.Loader.LoaderPlugin#progress
  102169. * @type {number}
  102170. * @default 0
  102171. * @since 3.0.0
  102172. */
  102173. this.progress = 0;
  102174. /**
  102175. * Files are placed in this Set when they're added to the Loader via `addFile`.
  102176. *
  102177. * They are moved to the `inflight` Set when they start loading, and assuming a successful
  102178. * load, to the `queue` Set for further processing.
  102179. *
  102180. * By the end of the load process this Set will be empty.
  102181. *
  102182. * @name Phaser.Loader.LoaderPlugin#list
  102183. * @type {Phaser.Structs.Set.<Phaser.Loader.File>}
  102184. * @since 3.0.0
  102185. */
  102186. this.list = new CustomSet();
  102187. /**
  102188. * Files are stored in this Set while they're in the process of being loaded.
  102189. *
  102190. * Upon a successful load they are moved to the `queue` Set.
  102191. *
  102192. * By the end of the load process this Set will be empty.
  102193. *
  102194. * @name Phaser.Loader.LoaderPlugin#inflight
  102195. * @type {Phaser.Structs.Set.<Phaser.Loader.File>}
  102196. * @since 3.0.0
  102197. */
  102198. this.inflight = new CustomSet();
  102199. /**
  102200. * Files are stored in this Set while they're being processed.
  102201. *
  102202. * If the process is successful they are moved to their final destination, which could be
  102203. * a Cache or the Texture Manager.
  102204. *
  102205. * At the end of the load process this Set will be empty.
  102206. *
  102207. * @name Phaser.Loader.LoaderPlugin#queue
  102208. * @type {Phaser.Structs.Set.<Phaser.Loader.File>}
  102209. * @since 3.0.0
  102210. */
  102211. this.queue = new CustomSet();
  102212. /**
  102213. * A temporary Set in which files are stored after processing,
  102214. * awaiting destruction at the end of the load process.
  102215. *
  102216. * @name Phaser.Loader.LoaderPlugin#_deleteQueue
  102217. * @type {Phaser.Structs.Set.<Phaser.Loader.File>}
  102218. * @private
  102219. * @since 3.7.0
  102220. */
  102221. this._deleteQueue = new CustomSet();
  102222. /**
  102223. * The total number of files that failed to load during the most recent load.
  102224. * This value is reset when you call `Loader.start`.
  102225. *
  102226. * @name Phaser.Loader.LoaderPlugin#totalFailed
  102227. * @type {integer}
  102228. * @default 0
  102229. * @since 3.7.0
  102230. */
  102231. this.totalFailed = 0;
  102232. /**
  102233. * The total number of files that successfully loaded during the most recent load.
  102234. * This value is reset when you call `Loader.start`.
  102235. *
  102236. * @name Phaser.Loader.LoaderPlugin#totalComplete
  102237. * @type {integer}
  102238. * @default 0
  102239. * @since 3.7.0
  102240. */
  102241. this.totalComplete = 0;
  102242. /**
  102243. * The current state of the Loader.
  102244. *
  102245. * @name Phaser.Loader.LoaderPlugin#state
  102246. * @type {integer}
  102247. * @readonly
  102248. * @since 3.0.0
  102249. */
  102250. this.state = CONST.LOADER_IDLE;
  102251. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  102252. scene.sys.events.on(SceneEvents.START, this.pluginStart, this);
  102253. },
  102254. /**
  102255. * This method is called automatically, only once, when the Scene is first created.
  102256. * Do not invoke it directly.
  102257. *
  102258. * @method Phaser.Loader.LoaderPlugin#boot
  102259. * @private
  102260. * @since 3.5.1
  102261. */
  102262. boot: function ()
  102263. {
  102264. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  102265. },
  102266. /**
  102267. * This method is called automatically by the Scene when it is starting up.
  102268. * It is responsible for creating local systems, properties and listening for Scene events.
  102269. * Do not invoke it directly.
  102270. *
  102271. * @method Phaser.Loader.LoaderPlugin#pluginStart
  102272. * @private
  102273. * @since 3.5.1
  102274. */
  102275. pluginStart: function ()
  102276. {
  102277. this.systems.events.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  102278. },
  102279. /**
  102280. * If you want to append a URL before the path of any asset you can set this here.
  102281. *
  102282. * Useful if allowing the asset base url to be configured outside of the game code.
  102283. *
  102284. * Once a base URL is set it will affect every file loaded by the Loader from that point on. It does _not_ change any
  102285. * file _already_ being loaded. To reset it, call this method with no arguments.
  102286. *
  102287. * @method Phaser.Loader.LoaderPlugin#setBaseURL
  102288. * @since 3.0.0
  102289. *
  102290. * @param {string} [url] - The URL to use. Leave empty to reset.
  102291. *
  102292. * @return {Phaser.Loader.LoaderPlugin} This Loader object.
  102293. */
  102294. setBaseURL: function (url)
  102295. {
  102296. if (url === undefined) { url = ''; }
  102297. if (url !== '' && url.substr(-1) !== '/')
  102298. {
  102299. url = url.concat('/');
  102300. }
  102301. this.baseURL = url;
  102302. return this;
  102303. },
  102304. /**
  102305. * The value of `path`, if set, is placed before any _relative_ file path given. For example:
  102306. *
  102307. * ```javascript
  102308. * this.load.setPath("images/sprites/");
  102309. * this.load.image("ball", "ball.png");
  102310. * this.load.image("tree", "level1/oaktree.png");
  102311. * this.load.image("boom", "http://server.com/explode.png");
  102312. * ```
  102313. *
  102314. * Would load the `ball` file from `images/sprites/ball.png` and the tree from
  102315. * `images/sprites/level1/oaktree.png` but the file `boom` would load from the URL
  102316. * given as it's an absolute URL.
  102317. *
  102318. * Please note that the path is added before the filename but *after* the baseURL (if set.)
  102319. *
  102320. * Once a path is set it will then affect every file added to the Loader from that point on. It does _not_ change any
  102321. * file _already_ in the load queue. To reset it, call this method with no arguments.
  102322. *
  102323. * @method Phaser.Loader.LoaderPlugin#setPath
  102324. * @since 3.0.0
  102325. *
  102326. * @param {string} [path] - The path to use. Leave empty to reset.
  102327. *
  102328. * @return {Phaser.Loader.LoaderPlugin} This Loader object.
  102329. */
  102330. setPath: function (path)
  102331. {
  102332. if (path === undefined) { path = ''; }
  102333. if (path !== '' && path.substr(-1) !== '/')
  102334. {
  102335. path = path.concat('/');
  102336. }
  102337. this.path = path;
  102338. return this;
  102339. },
  102340. /**
  102341. * An optional prefix that is automatically prepended to the start of every file key.
  102342. *
  102343. * If prefix was `MENU.` and you load an image with the key 'Background' the resulting key would be `MENU.Background`.
  102344. *
  102345. * Once a prefix is set it will then affect every file added to the Loader from that point on. It does _not_ change any
  102346. * file _already_ in the load queue. To reset it, call this method with no arguments.
  102347. *
  102348. * @method Phaser.Loader.LoaderPlugin#setPrefix
  102349. * @since 3.7.0
  102350. *
  102351. * @param {string} [prefix] - The prefix to use. Leave empty to reset.
  102352. *
  102353. * @return {Phaser.Loader.LoaderPlugin} This Loader object.
  102354. */
  102355. setPrefix: function (prefix)
  102356. {
  102357. if (prefix === undefined) { prefix = ''; }
  102358. this.prefix = prefix;
  102359. return this;
  102360. },
  102361. /**
  102362. * Sets the Cross Origin Resource Sharing value used when loading files.
  102363. *
  102364. * Files can override this value on a per-file basis by specifying an alternative `crossOrigin` value in their file config.
  102365. *
  102366. * Once CORs is set it will then affect every file loaded by the Loader from that point on, as long as they don't have
  102367. * their own CORs setting. To reset it, call this method with no arguments.
  102368. *
  102369. * For more details about CORs see https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
  102370. *
  102371. * @method Phaser.Loader.LoaderPlugin#setCORS
  102372. * @since 3.0.0
  102373. *
  102374. * @param {string} [crossOrigin] - The value to use for the `crossOrigin` property in the load request.
  102375. *
  102376. * @return {Phaser.Loader.LoaderPlugin} This Loader object.
  102377. */
  102378. setCORS: function (crossOrigin)
  102379. {
  102380. this.crossOrigin = crossOrigin;
  102381. return this;
  102382. },
  102383. /**
  102384. * Adds a file, or array of files, into the load queue.
  102385. *
  102386. * The file must be an instance of `Phaser.Loader.File`, or a class that extends it. The Loader will check that the key
  102387. * used by the file won't conflict with any other key either in the loader, the inflight queue or the target cache.
  102388. * If allowed it will then add the file into the pending list, read for the load to start. Or, if the load has already
  102389. * started, ready for the next batch of files to be pulled from the list to the inflight queue.
  102390. *
  102391. * You should not normally call this method directly, but rather use one of the Loader methods like `image` or `atlas`,
  102392. * however you can call this as long as the file given to it is well formed.
  102393. *
  102394. * @method Phaser.Loader.LoaderPlugin#addFile
  102395. * @fires Phaser.Loader.Events#ADD
  102396. * @since 3.0.0
  102397. *
  102398. * @param {(Phaser.Loader.File|Phaser.Loader.File[])} file - The file, or array of files, to be added to the load queue.
  102399. */
  102400. addFile: function (file)
  102401. {
  102402. if (!Array.isArray(file))
  102403. {
  102404. file = [ file ];
  102405. }
  102406. for (var i = 0; i < file.length; i++)
  102407. {
  102408. var item = file[i];
  102409. // Does the file already exist in the cache or texture manager?
  102410. // Or will it conflict with a file already in the queue or inflight?
  102411. if (!this.keyExists(item))
  102412. {
  102413. this.list.set(item);
  102414. this.emit(Events.ADD, item.key, item.type, this, item);
  102415. if (this.isLoading())
  102416. {
  102417. this.totalToLoad++;
  102418. this.updateProgress();
  102419. }
  102420. }
  102421. }
  102422. },
  102423. /**
  102424. * Checks the key and type of the given file to see if it will conflict with anything already
  102425. * in a Cache, the Texture Manager, or the list or inflight queues.
  102426. *
  102427. * @method Phaser.Loader.LoaderPlugin#keyExists
  102428. * @since 3.7.0
  102429. *
  102430. * @param {Phaser.Loader.File} file - The file to check the key of.
  102431. *
  102432. * @return {boolean} `true` if adding this file will cause a cache or queue conflict, otherwise `false`.
  102433. */
  102434. keyExists: function (file)
  102435. {
  102436. var keyConflict = file.hasCacheConflict();
  102437. if (!keyConflict)
  102438. {
  102439. this.list.iterate(function (item)
  102440. {
  102441. if (item.type === file.type && item.key === file.key)
  102442. {
  102443. keyConflict = true;
  102444. return false;
  102445. }
  102446. });
  102447. }
  102448. if (!keyConflict && this.isLoading())
  102449. {
  102450. this.inflight.iterate(function (item)
  102451. {
  102452. if (item.type === file.type && item.key === file.key)
  102453. {
  102454. keyConflict = true;
  102455. return false;
  102456. }
  102457. });
  102458. this.queue.iterate(function (item)
  102459. {
  102460. if (item.type === file.type && item.key === file.key)
  102461. {
  102462. keyConflict = true;
  102463. return false;
  102464. }
  102465. });
  102466. }
  102467. return keyConflict;
  102468. },
  102469. /**
  102470. * Takes a well formed, fully parsed pack file object and adds its entries into the load queue. Usually you do not call
  102471. * this method directly, but instead use `Loader.pack` and supply a path to a JSON file that holds the
  102472. * pack data. However, if you've got the data prepared you can pass it to this method.
  102473. *
  102474. * You can also provide an optional key. If you do then it will only add the entries from that part of the pack into
  102475. * to the load queue. If not specified it will add all entries it finds. For more details about the pack file format
  102476. * see the `LoaderPlugin.pack` method.
  102477. *
  102478. * @method Phaser.Loader.LoaderPlugin#addPack
  102479. * @since 3.7.0
  102480. *
  102481. * @param {any} data - The Pack File data to be parsed and each entry of it to added to the load queue.
  102482. * @param {string} [packKey] - An optional key to use from the pack file data.
  102483. *
  102484. * @return {boolean} `true` if any files were added to the queue, otherwise `false`.
  102485. */
  102486. addPack: function (pack, packKey)
  102487. {
  102488. // if no packKey provided we'll add everything to the queue
  102489. if (packKey && pack.hasOwnProperty(packKey))
  102490. {
  102491. pack = { packKey: pack[packKey] };
  102492. }
  102493. var total = 0;
  102494. // Store the loader settings in case this pack replaces them
  102495. var currentBaseURL = this.baseURL;
  102496. var currentPath = this.path;
  102497. var currentPrefix = this.prefix;
  102498. // Here we go ...
  102499. for (var key in pack)
  102500. {
  102501. var config = pack[key];
  102502. // Any meta data to process?
  102503. var baseURL = GetFastValue(config, 'baseURL', currentBaseURL);
  102504. var path = GetFastValue(config, 'path', currentPath);
  102505. var prefix = GetFastValue(config, 'prefix', currentPrefix);
  102506. var files = GetFastValue(config, 'files', null);
  102507. var defaultType = GetFastValue(config, 'defaultType', 'void');
  102508. if (Array.isArray(files))
  102509. {
  102510. this.setBaseURL(baseURL);
  102511. this.setPath(path);
  102512. this.setPrefix(prefix);
  102513. for (var i = 0; i < files.length; i++)
  102514. {
  102515. var file = files[i];
  102516. var type = (file.hasOwnProperty('type')) ? file.type : defaultType;
  102517. if (this[type])
  102518. {
  102519. this[type](file);
  102520. total++;
  102521. }
  102522. }
  102523. }
  102524. }
  102525. // Reset the loader settings
  102526. this.setBaseURL(currentBaseURL);
  102527. this.setPath(currentPath);
  102528. this.setPrefix(currentPrefix);
  102529. return (total > 0);
  102530. },
  102531. /**
  102532. * Is the Loader actively loading, or processing loaded files?
  102533. *
  102534. * @method Phaser.Loader.LoaderPlugin#isLoading
  102535. * @since 3.0.0
  102536. *
  102537. * @return {boolean} `true` if the Loader is busy loading or processing, otherwise `false`.
  102538. */
  102539. isLoading: function ()
  102540. {
  102541. return (this.state === CONST.LOADER_LOADING || this.state === CONST.LOADER_PROCESSING);
  102542. },
  102543. /**
  102544. * Is the Loader ready to start a new load?
  102545. *
  102546. * @method Phaser.Loader.LoaderPlugin#isReady
  102547. * @since 3.0.0
  102548. *
  102549. * @return {boolean} `true` if the Loader is ready to start a new load, otherwise `false`.
  102550. */
  102551. isReady: function ()
  102552. {
  102553. return (this.state === CONST.LOADER_IDLE || this.state === CONST.LOADER_COMPLETE);
  102554. },
  102555. /**
  102556. * Starts the Loader running. This will reset the progress and totals and then emit a `start` event.
  102557. * If there is nothing in the queue the Loader will immediately complete, otherwise it will start
  102558. * loading the first batch of files.
  102559. *
  102560. * The Loader is started automatically if the queue is populated within your Scenes `preload` method.
  102561. *
  102562. * However, outside of this, you need to call this method to start it.
  102563. *
  102564. * If the Loader is already running this method will simply return.
  102565. *
  102566. * @method Phaser.Loader.LoaderPlugin#start
  102567. * @fires Phaser.Loader.Events#START
  102568. * @since 3.0.0
  102569. */
  102570. start: function ()
  102571. {
  102572. if (!this.isReady())
  102573. {
  102574. return;
  102575. }
  102576. this.progress = 0;
  102577. this.totalFailed = 0;
  102578. this.totalComplete = 0;
  102579. this.totalToLoad = this.list.size;
  102580. this.emit(Events.START, this);
  102581. if (this.list.size === 0)
  102582. {
  102583. this.loadComplete();
  102584. }
  102585. else
  102586. {
  102587. this.state = CONST.LOADER_LOADING;
  102588. this.inflight.clear();
  102589. this.queue.clear();
  102590. this.updateProgress();
  102591. this.checkLoadQueue();
  102592. this.systems.events.on(SceneEvents.UPDATE, this.update, this);
  102593. }
  102594. },
  102595. /**
  102596. * Called automatically during the load process.
  102597. * It updates the `progress` value and then emits a progress event, which you can use to
  102598. * display a loading bar in your game.
  102599. *
  102600. * @method Phaser.Loader.LoaderPlugin#updateProgress
  102601. * @fires Phaser.Loader.Events#PROGRESS
  102602. * @since 3.0.0
  102603. */
  102604. updateProgress: function ()
  102605. {
  102606. this.progress = 1 - ((this.list.size + this.inflight.size) / this.totalToLoad);
  102607. this.emit(Events.PROGRESS, this.progress);
  102608. },
  102609. /**
  102610. * Called automatically during the load process.
  102611. *
  102612. * @method Phaser.Loader.LoaderPlugin#update
  102613. * @since 3.10.0
  102614. */
  102615. update: function ()
  102616. {
  102617. if (this.state === CONST.LOADER_LOADING && this.list.size > 0 && this.inflight.size < this.maxParallelDownloads)
  102618. {
  102619. this.checkLoadQueue();
  102620. }
  102621. },
  102622. /**
  102623. * An internal method called by the Loader.
  102624. *
  102625. * It will check to see if there are any more files in the pending list that need loading, and if so it will move
  102626. * them from the list Set into the inflight Set, set their CORs flag and start them loading.
  102627. *
  102628. * It will carrying on doing this for each file in the pending list until it runs out, or hits the max allowed parallel downloads.
  102629. *
  102630. * @method Phaser.Loader.LoaderPlugin#checkLoadQueue
  102631. * @private
  102632. * @since 3.7.0
  102633. */
  102634. checkLoadQueue: function ()
  102635. {
  102636. this.list.each(function (file)
  102637. {
  102638. if (file.state === CONST.FILE_POPULATED || (file.state === CONST.FILE_PENDING && this.inflight.size < this.maxParallelDownloads))
  102639. {
  102640. this.inflight.set(file);
  102641. this.list.delete(file);
  102642. // If the file doesn't have its own crossOrigin set, we'll use the Loaders (which is undefined by default)
  102643. if (!file.crossOrigin)
  102644. {
  102645. file.crossOrigin = this.crossOrigin;
  102646. }
  102647. file.load();
  102648. }
  102649. if (this.inflight.size === this.maxParallelDownloads)
  102650. {
  102651. // Tells the Set iterator to abort
  102652. return false;
  102653. }
  102654. }, this);
  102655. },
  102656. /**
  102657. * An internal method called automatically by the XHRLoader belong to a File.
  102658. *
  102659. * This method will remove the given file from the inflight Set and update the load progress.
  102660. * If the file was successful its `onProcess` method is called, otherwise it is added to the delete queue.
  102661. *
  102662. * @method Phaser.Loader.LoaderPlugin#nextFile
  102663. * @fires Phaser.Loader.Events#FILE_LOAD
  102664. * @fires Phaser.Loader.Events#FILE_LOAD_ERROR
  102665. * @since 3.0.0
  102666. *
  102667. * @param {Phaser.Loader.File} file - The File that just finished loading, or errored during load.
  102668. * @param {boolean} success - `true` if the file loaded successfully, otherwise `false`.
  102669. */
  102670. nextFile: function (file, success)
  102671. {
  102672. // Has the game been destroyed during load? If so, bail out now.
  102673. if (!this.inflight)
  102674. {
  102675. return;
  102676. }
  102677. this.inflight.delete(file);
  102678. this.updateProgress();
  102679. if (success)
  102680. {
  102681. this.totalComplete++;
  102682. this.queue.set(file);
  102683. this.emit(Events.FILE_LOAD, file);
  102684. file.onProcess();
  102685. }
  102686. else
  102687. {
  102688. this.totalFailed++;
  102689. this._deleteQueue.set(file);
  102690. this.emit(Events.FILE_LOAD_ERROR, file);
  102691. this.fileProcessComplete(file);
  102692. }
  102693. },
  102694. /**
  102695. * An internal method that is called automatically by the File when it has finished processing.
  102696. *
  102697. * If the process was successful, and the File isn't part of a MultiFile, its `addToCache` method is called.
  102698. *
  102699. * It this then removed from the queue. If there are no more files to load `loadComplete` is called.
  102700. *
  102701. * @method Phaser.Loader.LoaderPlugin#fileProcessComplete
  102702. * @since 3.7.0
  102703. *
  102704. * @param {Phaser.Loader.File} file - The file that has finished processing.
  102705. */
  102706. fileProcessComplete: function (file)
  102707. {
  102708. // Has the game been destroyed during load? If so, bail out now.
  102709. if (!this.scene || !this.systems || !this.systems.game || this.systems.game.pendingDestroy)
  102710. {
  102711. return;
  102712. }
  102713. // This file has failed, so move it to the failed Set
  102714. if (file.state === CONST.FILE_ERRORED)
  102715. {
  102716. if (file.multiFile)
  102717. {
  102718. file.multiFile.onFileFailed(file);
  102719. }
  102720. }
  102721. else if (file.state === CONST.FILE_COMPLETE)
  102722. {
  102723. if (file.multiFile)
  102724. {
  102725. if (file.multiFile.isReadyToProcess())
  102726. {
  102727. // If we got here then all files the link file needs are ready to add to the cache
  102728. file.multiFile.addToCache();
  102729. }
  102730. }
  102731. else
  102732. {
  102733. // If we got here, then the file processed, so let it add itself to its cache
  102734. file.addToCache();
  102735. }
  102736. }
  102737. // Remove it from the queue
  102738. this.queue.delete(file);
  102739. // Nothing left to do?
  102740. if (this.list.size === 0 && this.inflight.size === 0 && this.queue.size === 0)
  102741. {
  102742. this.loadComplete();
  102743. }
  102744. },
  102745. /**
  102746. * Called at the end when the load queue is exhausted and all files have either loaded or errored.
  102747. * By this point every loaded file will now be in its associated cache and ready for use.
  102748. *
  102749. * Also clears down the Sets, puts progress to 1 and clears the deletion queue.
  102750. *
  102751. * @method Phaser.Loader.LoaderPlugin#loadComplete
  102752. * @fires Phaser.Loader.Events#COMPLETE
  102753. * @fires Phaser.Loader.Events#POST_PROCESS
  102754. * @since 3.7.0
  102755. */
  102756. loadComplete: function ()
  102757. {
  102758. this.emit(Events.POST_PROCESS, this);
  102759. this.list.clear();
  102760. this.inflight.clear();
  102761. this.queue.clear();
  102762. this.progress = 1;
  102763. this.state = CONST.LOADER_COMPLETE;
  102764. this.systems.events.off(SceneEvents.UPDATE, this.update, this);
  102765. // Call 'destroy' on each file ready for deletion
  102766. this._deleteQueue.iterateLocal('destroy');
  102767. this._deleteQueue.clear();
  102768. this.emit(Events.COMPLETE, this, this.totalComplete, this.totalFailed);
  102769. },
  102770. /**
  102771. * Adds a File into the pending-deletion queue.
  102772. *
  102773. * @method Phaser.Loader.LoaderPlugin#flagForRemoval
  102774. * @since 3.7.0
  102775. *
  102776. * @param {Phaser.Loader.File} file - The File to be queued for deletion when the Loader completes.
  102777. */
  102778. flagForRemoval: function (file)
  102779. {
  102780. this._deleteQueue.set(file);
  102781. },
  102782. /**
  102783. * Converts the given JSON data into a file that the browser then prompts you to download so you can save it locally.
  102784. *
  102785. * The data must be well formed JSON and ready-parsed, not a JavaScript object.
  102786. *
  102787. * @method Phaser.Loader.LoaderPlugin#saveJSON
  102788. * @since 3.0.0
  102789. *
  102790. * @param {*} data - The JSON data, ready parsed.
  102791. * @param {string} [filename=file.json] - The name to save the JSON file as.
  102792. *
  102793. * @return {Phaser.Loader.LoaderPlugin} This Loader plugin.
  102794. */
  102795. saveJSON: function (data, filename)
  102796. {
  102797. return this.save(JSON.stringify(data), filename);
  102798. },
  102799. /**
  102800. * Causes the browser to save the given data as a file to its default Downloads folder.
  102801. *
  102802. * Creates a DOM level anchor link, assigns it as being a `download` anchor, sets the href
  102803. * to be an ObjectURL based on the given data, and then invokes a click event.
  102804. *
  102805. * @method Phaser.Loader.LoaderPlugin#save
  102806. * @since 3.0.0
  102807. *
  102808. * @param {*} data - The data to be saved. Will be passed through URL.createObjectURL.
  102809. * @param {string} [filename=file.json] - The filename to save the file as.
  102810. * @param {string} [filetype=application/json] - The file type to use when saving the file. Defaults to JSON.
  102811. *
  102812. * @return {Phaser.Loader.LoaderPlugin} This Loader plugin.
  102813. */
  102814. save: function (data, filename, filetype)
  102815. {
  102816. if (filename === undefined) { filename = 'file.json'; }
  102817. if (filetype === undefined) { filetype = 'application/json'; }
  102818. var blob = new Blob([ data ], { type: filetype });
  102819. var url = URL.createObjectURL(blob);
  102820. var a = document.createElement('a');
  102821. a.download = filename;
  102822. a.textContent = 'Download ' + filename;
  102823. a.href = url;
  102824. a.click();
  102825. return this;
  102826. },
  102827. /**
  102828. * Resets the Loader.
  102829. *
  102830. * This will clear all lists and reset the base URL, path and prefix.
  102831. *
  102832. * Warning: If the Loader is currently downloading files, or has files in its queue, they will be aborted.
  102833. *
  102834. * @method Phaser.Loader.LoaderPlugin#reset
  102835. * @since 3.0.0
  102836. */
  102837. reset: function ()
  102838. {
  102839. this.list.clear();
  102840. this.inflight.clear();
  102841. this.queue.clear();
  102842. var gameConfig = this.systems.game.config;
  102843. var sceneConfig = this.systems.settings.loader;
  102844. this.setBaseURL(GetFastValue(sceneConfig, 'baseURL', gameConfig.loaderBaseURL));
  102845. this.setPath(GetFastValue(sceneConfig, 'path', gameConfig.loaderPath));
  102846. this.setPrefix(GetFastValue(sceneConfig, 'prefix', gameConfig.loaderPrefix));
  102847. this.state = CONST.LOADER_IDLE;
  102848. },
  102849. /**
  102850. * The Scene that owns this plugin is shutting down.
  102851. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  102852. *
  102853. * @method Phaser.Loader.LoaderPlugin#shutdown
  102854. * @private
  102855. * @since 3.0.0
  102856. */
  102857. shutdown: function ()
  102858. {
  102859. this.reset();
  102860. this.state = CONST.LOADER_SHUTDOWN;
  102861. this.systems.events.off(SceneEvents.UPDATE, this.update, this);
  102862. this.systems.events.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  102863. },
  102864. /**
  102865. * The Scene that owns this plugin is being destroyed.
  102866. * We need to shutdown and then kill off all external references.
  102867. *
  102868. * @method Phaser.Loader.LoaderPlugin#destroy
  102869. * @private
  102870. * @since 3.0.0
  102871. */
  102872. destroy: function ()
  102873. {
  102874. this.shutdown();
  102875. this.state = CONST.LOADER_DESTROYED;
  102876. this.systems.events.off(SceneEvents.UPDATE, this.update, this);
  102877. this.systems.events.off(SceneEvents.START, this.pluginStart, this);
  102878. this.list = null;
  102879. this.inflight = null;
  102880. this.queue = null;
  102881. this.scene = null;
  102882. this.systems = null;
  102883. this.textureManager = null;
  102884. this.cacheManager = null;
  102885. this.sceneManager = null;
  102886. }
  102887. });
  102888. PluginCache.register('Loader', LoaderPlugin, 'load');
  102889. module.exports = LoaderPlugin;
  102890. /***/ }),
  102891. /* 579 */
  102892. /***/ (function(module, exports, __webpack_require__) {
  102893. /**
  102894. * @author Richard Davey <rich@photonstorm.com>
  102895. * @copyright 2019 Photon Storm Ltd.
  102896. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  102897. */
  102898. var Class = __webpack_require__(0);
  102899. var FileTypesManager = __webpack_require__(7);
  102900. var GetFastValue = __webpack_require__(2);
  102901. var ImageFile = __webpack_require__(64);
  102902. var IsPlainObject = __webpack_require__(8);
  102903. var MultiFile = __webpack_require__(63);
  102904. var TextFile = __webpack_require__(256);
  102905. /**
  102906. * @typedef {object} Phaser.Loader.FileTypes.UnityAtlasFileConfig
  102907. *
  102908. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  102909. * @property {string} [textureURL] - The absolute or relative URL to load the texture image file from.
  102910. * @property {string} [textureExtension='png'] - The default file extension to use for the image texture if no url is provided.
  102911. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture image file.
  102912. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the texture image.
  102913. * @property {string} [atlasURL] - The absolute or relative URL to load the atlas data file from.
  102914. * @property {string} [atlasExtension='txt'] - The default file extension to use for the atlas data if no url is provided.
  102915. * @property {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas data file.
  102916. */
  102917. /**
  102918. * @classdesc
  102919. * A single text file based Unity Texture Atlas File suitable for loading by the Loader.
  102920. *
  102921. * These are created when you use the Phaser.Loader.LoaderPlugin#unityAtlas method and are not typically created directly.
  102922. *
  102923. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#unityAtlas.
  102924. *
  102925. * @class UnityAtlasFile
  102926. * @extends Phaser.Loader.MultiFile
  102927. * @memberof Phaser.Loader.FileTypes
  102928. * @constructor
  102929. *
  102930. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  102931. * @param {(string|Phaser.Loader.FileTypes.UnityAtlasFileConfig)} key - The key to use for this file, or a file configuration object.
  102932. * @param {string|string[]} [textureURL] - The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  102933. * @param {string} [atlasURL] - The absolute or relative URL to load the texture atlas data file from. If undefined or `null` it will be set to `<key>.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt".
  102934. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  102935. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas data file. Used in replacement of the Loaders default XHR Settings.
  102936. */
  102937. var UnityAtlasFile = new Class({
  102938. Extends: MultiFile,
  102939. initialize:
  102940. function UnityAtlasFile (loader, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  102941. {
  102942. var image;
  102943. var data;
  102944. if (IsPlainObject(key))
  102945. {
  102946. var config = key;
  102947. key = GetFastValue(config, 'key');
  102948. image = new ImageFile(loader, {
  102949. key: key,
  102950. url: GetFastValue(config, 'textureURL'),
  102951. extension: GetFastValue(config, 'textureExtension', 'png'),
  102952. normalMap: GetFastValue(config, 'normalMap'),
  102953. xhrSettings: GetFastValue(config, 'textureXhrSettings')
  102954. });
  102955. data = new TextFile(loader, {
  102956. key: key,
  102957. url: GetFastValue(config, 'atlasURL'),
  102958. extension: GetFastValue(config, 'atlasExtension', 'txt'),
  102959. xhrSettings: GetFastValue(config, 'atlasXhrSettings')
  102960. });
  102961. }
  102962. else
  102963. {
  102964. image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  102965. data = new TextFile(loader, key, atlasURL, atlasXhrSettings);
  102966. }
  102967. if (image.linkFile)
  102968. {
  102969. // Image has a normal map
  102970. MultiFile.call(this, loader, 'unityatlas', key, [ image, data, image.linkFile ]);
  102971. }
  102972. else
  102973. {
  102974. MultiFile.call(this, loader, 'unityatlas', key, [ image, data ]);
  102975. }
  102976. },
  102977. /**
  102978. * Adds this file to its target cache upon successful loading and processing.
  102979. *
  102980. * @method Phaser.Loader.FileTypes.UnityAtlasFile#addToCache
  102981. * @since 3.7.0
  102982. */
  102983. addToCache: function ()
  102984. {
  102985. if (this.isReadyToProcess())
  102986. {
  102987. var image = this.files[0];
  102988. var text = this.files[1];
  102989. var normalMap = (this.files[2]) ? this.files[2].data : null;
  102990. this.loader.textureManager.addUnityAtlas(image.key, image.data, text.data, normalMap);
  102991. text.addToCache();
  102992. this.complete = true;
  102993. }
  102994. }
  102995. });
  102996. /**
  102997. * Adds a Unity YAML based Texture Atlas, or array of atlases, to the current load queue.
  102998. *
  102999. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  103000. *
  103001. * ```javascript
  103002. * function preload ()
  103003. * {
  103004. * this.load.unityAtlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.txt');
  103005. * }
  103006. * ```
  103007. *
  103008. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  103009. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  103010. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  103011. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  103012. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  103013. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  103014. * loaded.
  103015. *
  103016. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  103017. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  103018. *
  103019. * Phaser expects the atlas data to be provided in a YAML formatted text file as exported from Unity.
  103020. *
  103021. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  103022. *
  103023. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  103024. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  103025. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  103026. * then remove it from the Texture Manager first, before loading a new one.
  103027. *
  103028. * Instead of passing arguments you can pass a configuration object, such as:
  103029. *
  103030. * ```javascript
  103031. * this.load.unityAtlas({
  103032. * key: 'mainmenu',
  103033. * textureURL: 'images/MainMenu.png',
  103034. * atlasURL: 'images/MainMenu.txt'
  103035. * });
  103036. * ```
  103037. *
  103038. * See the documentation for `Phaser.Loader.FileTypes.UnityAtlasFileConfig` for more details.
  103039. *
  103040. * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key:
  103041. *
  103042. * ```javascript
  103043. * this.load.unityAtlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json');
  103044. * // and later in your game ...
  103045. * this.add.image(x, y, 'mainmenu', 'background');
  103046. * ```
  103047. *
  103048. * To get a list of all available frames within an atlas please consult your Texture Atlas software.
  103049. *
  103050. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  103051. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  103052. * this is what you would use to retrieve the image from the Texture Manager.
  103053. *
  103054. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  103055. *
  103056. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  103057. * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although
  103058. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  103059. *
  103060. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  103061. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  103062. *
  103063. * ```javascript
  103064. * this.load.unityAtlas('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.txt');
  103065. * ```
  103066. *
  103067. * Or, if you are using a config object use the `normalMap` property:
  103068. *
  103069. * ```javascript
  103070. * this.load.unityAtlas({
  103071. * key: 'mainmenu',
  103072. * textureURL: 'images/MainMenu.png',
  103073. * normalMap: 'images/MainMenu-n.png',
  103074. * atlasURL: 'images/MainMenu.txt'
  103075. * });
  103076. * ```
  103077. *
  103078. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  103079. * Normal maps are a WebGL only feature.
  103080. *
  103081. * Note: The ability to load this type of file will only be available if the Unity Atlas File type has been built into Phaser.
  103082. * It is available in the default build but can be excluded from custom builds.
  103083. *
  103084. * @method Phaser.Loader.LoaderPlugin#unityAtlas
  103085. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  103086. * @since 3.0.0
  103087. *
  103088. * @param {(string|Phaser.Loader.FileTypes.UnityAtlasFileConfig|Phaser.Loader.FileTypes.UnityAtlasFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  103089. * @param {string|string[]} [textureURL] - The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  103090. * @param {string} [atlasURL] - The absolute or relative URL to load the texture atlas data file from. If undefined or `null` it will be set to `<key>.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt".
  103091. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  103092. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas data file. Used in replacement of the Loaders default XHR Settings.
  103093. *
  103094. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  103095. */
  103096. FileTypesManager.register('unityAtlas', function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  103097. {
  103098. var multifile;
  103099. // Supports an Object file definition in the key argument
  103100. // Or an array of objects in the key argument
  103101. // Or a single entry where all arguments have been defined
  103102. if (Array.isArray(key))
  103103. {
  103104. for (var i = 0; i < key.length; i++)
  103105. {
  103106. multifile = new UnityAtlasFile(this, key[i]);
  103107. this.addFile(multifile.files);
  103108. }
  103109. }
  103110. else
  103111. {
  103112. multifile = new UnityAtlasFile(this, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings);
  103113. this.addFile(multifile.files);
  103114. }
  103115. return this;
  103116. });
  103117. module.exports = UnityAtlasFile;
  103118. /***/ }),
  103119. /* 580 */
  103120. /***/ (function(module, exports, __webpack_require__) {
  103121. /**
  103122. * @author Richard Davey <rich@photonstorm.com>
  103123. * @copyright 2019 Photon Storm Ltd.
  103124. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103125. */
  103126. var Class = __webpack_require__(0);
  103127. var FileTypesManager = __webpack_require__(7);
  103128. var JSONFile = __webpack_require__(55);
  103129. var TILEMAP_FORMATS = __webpack_require__(31);
  103130. /**
  103131. * @typedef {object} Phaser.Loader.FileTypes.TilemapJSONFileConfig
  103132. *
  103133. * @property {string} key - The key of the file. Must be unique within both the Loader and the Tilemap Cache.
  103134. * @property {string} [url] - The absolute or relative URL to load the file from.
  103135. * @property {string} [extension='json'] - The default file extension to use if no url is provided.
  103136. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103137. */
  103138. /**
  103139. * @classdesc
  103140. * A single Tiled Tilemap JSON File suitable for loading by the Loader.
  103141. *
  103142. * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapTiledJSON method and are not typically created directly.
  103143. *
  103144. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapTiledJSON.
  103145. *
  103146. * @class TilemapJSONFile
  103147. * @extends Phaser.Loader.File
  103148. * @memberof Phaser.Loader.FileTypes
  103149. * @constructor
  103150. * @since 3.0.0
  103151. *
  103152. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  103153. * @param {(string|Phaser.Loader.FileTypes.TilemapJSONFileConfig)} key - The key to use for this file, or a file configuration object.
  103154. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  103155. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103156. */
  103157. var TilemapJSONFile = new Class({
  103158. Extends: JSONFile,
  103159. initialize:
  103160. function TilemapJSONFile (loader, key, url, xhrSettings)
  103161. {
  103162. JSONFile.call(this, loader, key, url, xhrSettings);
  103163. this.type = 'tilemapJSON';
  103164. this.cache = loader.cacheManager.tilemap;
  103165. },
  103166. /**
  103167. * Adds this file to its target cache upon successful loading and processing.
  103168. *
  103169. * @method Phaser.Loader.FileTypes.TilemapJSONFile#addToCache
  103170. * @since 3.7.0
  103171. */
  103172. addToCache: function ()
  103173. {
  103174. var tiledata = { format: TILEMAP_FORMATS.TILED_JSON, data: this.data };
  103175. this.cache.add(this.key, tiledata);
  103176. this.pendingDestroy(tiledata);
  103177. }
  103178. });
  103179. /**
  103180. * Adds a Tiled JSON Tilemap file, or array of map files, to the current load queue.
  103181. *
  103182. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  103183. *
  103184. * ```javascript
  103185. * function preload ()
  103186. * {
  103187. * this.load.tilemapTiledJSON('level1', 'maps/Level1.json');
  103188. * }
  103189. * ```
  103190. *
  103191. * The Tilemap data is created using the Tiled Map Editor and selecting JSON as the export format.
  103192. *
  103193. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  103194. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  103195. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  103196. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  103197. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  103198. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  103199. * loaded.
  103200. *
  103201. * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load.
  103202. * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache.
  103203. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  103204. * then remove it from the Text Cache first, before loading a new one.
  103205. *
  103206. * Instead of passing arguments you can pass a configuration object, such as:
  103207. *
  103208. * ```javascript
  103209. * this.load.tilemapTiledJSON({
  103210. * key: 'level1',
  103211. * url: 'maps/Level1.json'
  103212. * });
  103213. * ```
  103214. *
  103215. * See the documentation for `Phaser.Loader.FileTypes.TilemapJSONFileConfig` for more details.
  103216. *
  103217. * Once the file has finished loading you can access it from its Cache using its key:
  103218. *
  103219. * ```javascript
  103220. * this.load.tilemapTiledJSON('level1', 'maps/Level1.json');
  103221. * // and later in your game ...
  103222. * var map = this.make.tilemap({ key: 'level1' });
  103223. * ```
  103224. *
  103225. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  103226. * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and
  103227. * this is what you would use to retrieve the text from the Tilemap Cache.
  103228. *
  103229. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  103230. *
  103231. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "level"
  103232. * and no URL is given then the Loader will set the URL to be "level.json". It will always add `.json` as the extension, although
  103233. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  103234. *
  103235. * Note: The ability to load this type of file will only be available if the Tilemap JSON File type has been built into Phaser.
  103236. * It is available in the default build but can be excluded from custom builds.
  103237. *
  103238. * @method Phaser.Loader.LoaderPlugin#tilemapTiledJSON
  103239. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  103240. * @since 3.0.0
  103241. *
  103242. * @param {(string|Phaser.Loader.FileTypes.TilemapJSONFileConfig|Phaser.Loader.FileTypes.TilemapJSONFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  103243. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  103244. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  103245. *
  103246. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  103247. */
  103248. FileTypesManager.register('tilemapTiledJSON', function (key, url, xhrSettings)
  103249. {
  103250. if (Array.isArray(key))
  103251. {
  103252. for (var i = 0; i < key.length; i++)
  103253. {
  103254. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  103255. this.addFile(new TilemapJSONFile(this, key[i]));
  103256. }
  103257. }
  103258. else
  103259. {
  103260. this.addFile(new TilemapJSONFile(this, key, url, xhrSettings));
  103261. }
  103262. return this;
  103263. });
  103264. module.exports = TilemapJSONFile;
  103265. /***/ }),
  103266. /* 581 */
  103267. /***/ (function(module, exports, __webpack_require__) {
  103268. /**
  103269. * @author Richard Davey <rich@photonstorm.com>
  103270. * @copyright 2019 Photon Storm Ltd.
  103271. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103272. */
  103273. var Class = __webpack_require__(0);
  103274. var FileTypesManager = __webpack_require__(7);
  103275. var JSONFile = __webpack_require__(55);
  103276. var TILEMAP_FORMATS = __webpack_require__(31);
  103277. /**
  103278. * @typedef {object} Phaser.Loader.FileTypes.TilemapImpactFileConfig
  103279. *
  103280. * @property {string} key - The key of the file. Must be unique within both the Loader and the Tilemap Cache.
  103281. * @property {string} [url] - The absolute or relative URL to load the file from.
  103282. * @property {string} [extension='json'] - The default file extension to use if no url is provided.
  103283. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103284. */
  103285. /**
  103286. * @classdesc
  103287. * A single Impact.js Tilemap JSON File suitable for loading by the Loader.
  103288. *
  103289. * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapImpact method and are not typically created directly.
  103290. *
  103291. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapImpact.
  103292. *
  103293. * @class TilemapImpactFile
  103294. * @extends Phaser.Loader.File
  103295. * @memberof Phaser.Loader.FileTypes
  103296. * @constructor
  103297. * @since 3.7.0
  103298. *
  103299. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  103300. * @param {(string|Phaser.Loader.FileTypes.TilemapImpactFileConfig)} key - The key to use for this file, or a file configuration object.
  103301. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  103302. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103303. */
  103304. var TilemapImpactFile = new Class({
  103305. Extends: JSONFile,
  103306. initialize:
  103307. function TilemapImpactFile (loader, key, url, xhrSettings)
  103308. {
  103309. JSONFile.call(this, loader, key, url, xhrSettings);
  103310. this.type = 'tilemapJSON';
  103311. this.cache = loader.cacheManager.tilemap;
  103312. },
  103313. /**
  103314. * Adds this file to its target cache upon successful loading and processing.
  103315. *
  103316. * @method Phaser.Loader.FileTypes.TilemapImpactFile#addToCache
  103317. * @since 3.7.0
  103318. */
  103319. addToCache: function ()
  103320. {
  103321. var tiledata = { format: TILEMAP_FORMATS.WELTMEISTER, data: this.data };
  103322. this.cache.add(this.key, tiledata);
  103323. this.pendingDestroy(tiledata);
  103324. }
  103325. });
  103326. /**
  103327. * Adds an Impact.js Tilemap file, or array of map files, to the current load queue.
  103328. *
  103329. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  103330. *
  103331. * ```javascript
  103332. * function preload ()
  103333. * {
  103334. * this.load.tilemapImpact('level1', 'maps/Level1.json');
  103335. * }
  103336. * ```
  103337. *
  103338. * Impact Tilemap data is created the Impact.js Map Editor called Weltmeister.
  103339. *
  103340. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  103341. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  103342. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  103343. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  103344. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  103345. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  103346. * loaded.
  103347. *
  103348. * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load.
  103349. * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache.
  103350. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  103351. * then remove it from the Text Cache first, before loading a new one.
  103352. *
  103353. * Instead of passing arguments you can pass a configuration object, such as:
  103354. *
  103355. * ```javascript
  103356. * this.load.tilemapImpact({
  103357. * key: 'level1',
  103358. * url: 'maps/Level1.json'
  103359. * });
  103360. * ```
  103361. *
  103362. * See the documentation for `Phaser.Loader.FileTypes.TilemapImpactFileConfig` for more details.
  103363. *
  103364. * Once the file has finished loading you can access it from its Cache using its key:
  103365. *
  103366. * ```javascript
  103367. * this.load.tilemapImpact('level1', 'maps/Level1.json');
  103368. * // and later in your game ...
  103369. * var map = this.make.tilemap({ key: 'level1' });
  103370. * ```
  103371. *
  103372. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  103373. * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and
  103374. * this is what you would use to retrieve the text from the Tilemap Cache.
  103375. *
  103376. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  103377. *
  103378. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "level"
  103379. * and no URL is given then the Loader will set the URL to be "level.json". It will always add `.json` as the extension, although
  103380. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  103381. *
  103382. * Note: The ability to load this type of file will only be available if the Tilemap Impact File type has been built into Phaser.
  103383. * It is available in the default build but can be excluded from custom builds.
  103384. *
  103385. * @method Phaser.Loader.LoaderPlugin#tilemapImpact
  103386. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  103387. * @since 3.7.0
  103388. *
  103389. * @param {(string|Phaser.Loader.FileTypes.TilemapImpactFileConfig|Phaser.Loader.FileTypes.TilemapImpactFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  103390. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  103391. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  103392. *
  103393. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  103394. */
  103395. FileTypesManager.register('tilemapImpact', function (key, url, xhrSettings)
  103396. {
  103397. if (Array.isArray(key))
  103398. {
  103399. for (var i = 0; i < key.length; i++)
  103400. {
  103401. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  103402. this.addFile(new TilemapImpactFile(this, key[i]));
  103403. }
  103404. }
  103405. else
  103406. {
  103407. this.addFile(new TilemapImpactFile(this, key, url, xhrSettings));
  103408. }
  103409. return this;
  103410. });
  103411. module.exports = TilemapImpactFile;
  103412. /***/ }),
  103413. /* 582 */
  103414. /***/ (function(module, exports, __webpack_require__) {
  103415. /**
  103416. * @author Richard Davey <rich@photonstorm.com>
  103417. * @copyright 2019 Photon Storm Ltd.
  103418. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103419. */
  103420. var Class = __webpack_require__(0);
  103421. var CONST = __webpack_require__(15);
  103422. var File = __webpack_require__(22);
  103423. var FileTypesManager = __webpack_require__(7);
  103424. var GetFastValue = __webpack_require__(2);
  103425. var IsPlainObject = __webpack_require__(8);
  103426. var TILEMAP_FORMATS = __webpack_require__(31);
  103427. /**
  103428. * @typedef {object} Phaser.Loader.FileTypes.TilemapCSVFileConfig
  103429. *
  103430. * @property {string} key - The key of the file. Must be unique within both the Loader and the Tilemap Cache.
  103431. * @property {string} [url] - The absolute or relative URL to load the file from.
  103432. * @property {string} [extension='csv'] - The default file extension to use if no url is provided.
  103433. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103434. */
  103435. /**
  103436. * @classdesc
  103437. * A single Tilemap CSV File suitable for loading by the Loader.
  103438. *
  103439. * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapCSV method and are not typically created directly.
  103440. *
  103441. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapCSV.
  103442. *
  103443. * @class TilemapCSVFile
  103444. * @extends Phaser.Loader.File
  103445. * @memberof Phaser.Loader.FileTypes
  103446. * @constructor
  103447. * @since 3.0.0
  103448. *
  103449. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  103450. * @param {(string|Phaser.Loader.FileTypes.TilemapCSVFileConfig)} key - The key to use for this file, or a file configuration object.
  103451. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.csv`, i.e. if `key` was "alien" then the URL will be "alien.csv".
  103452. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103453. */
  103454. var TilemapCSVFile = new Class({
  103455. Extends: File,
  103456. initialize:
  103457. function TilemapCSVFile (loader, key, url, xhrSettings)
  103458. {
  103459. var extension = 'csv';
  103460. if (IsPlainObject(key))
  103461. {
  103462. var config = key;
  103463. key = GetFastValue(config, 'key');
  103464. url = GetFastValue(config, 'url');
  103465. xhrSettings = GetFastValue(config, 'xhrSettings');
  103466. extension = GetFastValue(config, 'extension', extension);
  103467. }
  103468. var fileConfig = {
  103469. type: 'tilemapCSV',
  103470. cache: loader.cacheManager.tilemap,
  103471. extension: extension,
  103472. responseType: 'text',
  103473. key: key,
  103474. url: url,
  103475. xhrSettings: xhrSettings
  103476. };
  103477. File.call(this, loader, fileConfig);
  103478. this.tilemapFormat = TILEMAP_FORMATS.CSV;
  103479. },
  103480. /**
  103481. * Called automatically by Loader.nextFile.
  103482. * This method controls what extra work this File does with its loaded data.
  103483. *
  103484. * @method Phaser.Loader.FileTypes.TilemapCSVFile#onProcess
  103485. * @since 3.7.0
  103486. */
  103487. onProcess: function ()
  103488. {
  103489. this.state = CONST.FILE_PROCESSING;
  103490. this.data = this.xhrLoader.responseText;
  103491. this.onProcessComplete();
  103492. },
  103493. /**
  103494. * Adds this file to its target cache upon successful loading and processing.
  103495. *
  103496. * @method Phaser.Loader.FileTypes.TilemapCSVFile#addToCache
  103497. * @since 3.7.0
  103498. */
  103499. addToCache: function ()
  103500. {
  103501. var tiledata = { format: this.tilemapFormat, data: this.data };
  103502. this.cache.add(this.key, tiledata);
  103503. this.pendingDestroy(tiledata);
  103504. }
  103505. });
  103506. /**
  103507. * Adds a CSV Tilemap file, or array of CSV files, to the current load queue.
  103508. *
  103509. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  103510. *
  103511. * ```javascript
  103512. * function preload ()
  103513. * {
  103514. * this.load.tilemapCSV('level1', 'maps/Level1.csv');
  103515. * }
  103516. * ```
  103517. *
  103518. * Tilemap CSV data can be created in a text editor, or a 3rd party app that exports as CSV.
  103519. *
  103520. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  103521. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  103522. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  103523. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  103524. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  103525. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  103526. * loaded.
  103527. *
  103528. * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load.
  103529. * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache.
  103530. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  103531. * then remove it from the Text Cache first, before loading a new one.
  103532. *
  103533. * Instead of passing arguments you can pass a configuration object, such as:
  103534. *
  103535. * ```javascript
  103536. * this.load.tilemapCSV({
  103537. * key: 'level1',
  103538. * url: 'maps/Level1.csv'
  103539. * });
  103540. * ```
  103541. *
  103542. * See the documentation for `Phaser.Loader.FileTypes.TilemapCSVFileConfig` for more details.
  103543. *
  103544. * Once the file has finished loading you can access it from its Cache using its key:
  103545. *
  103546. * ```javascript
  103547. * this.load.tilemapCSV('level1', 'maps/Level1.csv');
  103548. * // and later in your game ...
  103549. * var map = this.make.tilemap({ key: 'level1' });
  103550. * ```
  103551. *
  103552. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  103553. * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and
  103554. * this is what you would use to retrieve the text from the Tilemap Cache.
  103555. *
  103556. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  103557. *
  103558. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "level"
  103559. * and no URL is given then the Loader will set the URL to be "level.csv". It will always add `.csv` as the extension, although
  103560. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  103561. *
  103562. * Note: The ability to load this type of file will only be available if the Tilemap CSV File type has been built into Phaser.
  103563. * It is available in the default build but can be excluded from custom builds.
  103564. *
  103565. * @method Phaser.Loader.LoaderPlugin#tilemapCSV
  103566. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  103567. * @since 3.0.0
  103568. *
  103569. * @param {(string|Phaser.Loader.FileTypes.TilemapCSVFileConfig|Phaser.Loader.FileTypes.TilemapCSVFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  103570. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.csv`, i.e. if `key` was "alien" then the URL will be "alien.csv".
  103571. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  103572. *
  103573. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  103574. */
  103575. FileTypesManager.register('tilemapCSV', function (key, url, xhrSettings)
  103576. {
  103577. if (Array.isArray(key))
  103578. {
  103579. for (var i = 0; i < key.length; i++)
  103580. {
  103581. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  103582. this.addFile(new TilemapCSVFile(this, key[i]));
  103583. }
  103584. }
  103585. else
  103586. {
  103587. this.addFile(new TilemapCSVFile(this, key, url, xhrSettings));
  103588. }
  103589. return this;
  103590. });
  103591. module.exports = TilemapCSVFile;
  103592. /***/ }),
  103593. /* 583 */
  103594. /***/ (function(module, exports, __webpack_require__) {
  103595. /**
  103596. * @author Richard Davey <rich@photonstorm.com>
  103597. * @copyright 2019 Photon Storm Ltd.
  103598. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103599. */
  103600. var Class = __webpack_require__(0);
  103601. var CONST = __webpack_require__(15);
  103602. var File = __webpack_require__(22);
  103603. var FileTypesManager = __webpack_require__(7);
  103604. var GetFastValue = __webpack_require__(2);
  103605. var IsPlainObject = __webpack_require__(8);
  103606. /**
  103607. * @typedef {object} Phaser.Loader.FileTypes.SVGSizeConfig
  103608. *
  103609. * @property {integer} [width] - An optional width. The SVG will be resized to this size before being rendered to a texture.
  103610. * @property {integer} [height] - An optional height. The SVG will be resized to this size before being rendered to a texture.
  103611. * @property {number} [scale] - An optional scale. If given it overrides the width / height properties. The SVG is scaled by the scale factor before being rendered to a texture.
  103612. */
  103613. /**
  103614. * @typedef {object} Phaser.Loader.FileTypes.SVGFileConfig
  103615. *
  103616. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  103617. * @property {string} [url] - The absolute or relative URL to load the file from.
  103618. * @property {string} [extension='svg'] - The default file extension to use if no url is provided.
  103619. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103620. * @property {Phaser.Loader.FileTypes.SVGSizeConfig} [svgConfig] - The svg size configuration object.
  103621. */
  103622. /**
  103623. * @classdesc
  103624. * A single SVG File suitable for loading by the Loader.
  103625. *
  103626. * These are created when you use the Phaser.Loader.LoaderPlugin#svg method and are not typically created directly.
  103627. *
  103628. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#svg.
  103629. *
  103630. * @class SVGFile
  103631. * @extends Phaser.Loader.File
  103632. * @memberof Phaser.Loader.FileTypes
  103633. * @constructor
  103634. * @since 3.0.0
  103635. *
  103636. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  103637. * @param {(string|Phaser.Loader.FileTypes.SVGFileConfig)} key - The key to use for this file, or a file configuration object.
  103638. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.svg`, i.e. if `key` was "alien" then the URL will be "alien.svg".
  103639. * @param {Phaser.Loader.FileTypes.SVGSizeConfig} [svgConfig] - The svg size configuration object.
  103640. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103641. */
  103642. var SVGFile = new Class({
  103643. Extends: File,
  103644. initialize:
  103645. function SVGFile (loader, key, url, svgConfig, xhrSettings)
  103646. {
  103647. var extension = 'svg';
  103648. if (IsPlainObject(key))
  103649. {
  103650. var config = key;
  103651. key = GetFastValue(config, 'key');
  103652. url = GetFastValue(config, 'url');
  103653. svgConfig = GetFastValue(config, 'svgConfig', {});
  103654. xhrSettings = GetFastValue(config, 'xhrSettings');
  103655. extension = GetFastValue(config, 'extension', extension);
  103656. }
  103657. var fileConfig = {
  103658. type: 'svg',
  103659. cache: loader.textureManager,
  103660. extension: extension,
  103661. responseType: 'text',
  103662. key: key,
  103663. url: url,
  103664. xhrSettings: xhrSettings,
  103665. config: {
  103666. width: GetFastValue(svgConfig, 'width'),
  103667. height: GetFastValue(svgConfig, 'height'),
  103668. scale: GetFastValue(svgConfig, 'scale')
  103669. }
  103670. };
  103671. File.call(this, loader, fileConfig);
  103672. },
  103673. /**
  103674. * Called automatically by Loader.nextFile.
  103675. * This method controls what extra work this File does with its loaded data.
  103676. *
  103677. * @method Phaser.Loader.FileTypes.SVGFile#onProcess
  103678. * @since 3.7.0
  103679. */
  103680. onProcess: function ()
  103681. {
  103682. this.state = CONST.FILE_PROCESSING;
  103683. var text = this.xhrLoader.responseText;
  103684. var svg = [ text ];
  103685. var width = this.config.width;
  103686. var height = this.config.height;
  103687. var scale = this.config.scale;
  103688. resize: if (width && height || scale)
  103689. {
  103690. var xml = null;
  103691. var parser = new DOMParser();
  103692. xml = parser.parseFromString(text, 'text/xml');
  103693. var svgXML = xml.getElementsByTagName('svg')[0];
  103694. var hasViewBox = svgXML.hasAttribute('viewBox');
  103695. var svgWidth = parseFloat(svgXML.getAttribute('width'));
  103696. var svgHeight = parseFloat(svgXML.getAttribute('height'));
  103697. if (!hasViewBox && svgWidth && svgHeight)
  103698. {
  103699. // If there's no viewBox attribute, set one
  103700. svgXML.setAttribute('viewBox', '0 0 ' + svgWidth + ' ' + svgHeight);
  103701. }
  103702. else if (hasViewBox && !svgWidth && !svgHeight)
  103703. {
  103704. // Get the w/h from the viewbox
  103705. var viewBox = svgXML.getAttribute('viewBox').split(/\s+|,/);
  103706. svgWidth = viewBox[2];
  103707. svgHeight = viewBox[3];
  103708. }
  103709. if (scale)
  103710. {
  103711. if (svgWidth && svgHeight)
  103712. {
  103713. width = svgWidth * scale;
  103714. height = svgHeight * scale;
  103715. }
  103716. else
  103717. {
  103718. break resize;
  103719. }
  103720. }
  103721. svgXML.setAttribute('width', width.toString() + 'px');
  103722. svgXML.setAttribute('height', height.toString() + 'px');
  103723. svg = [ (new XMLSerializer()).serializeToString(svgXML) ];
  103724. }
  103725. try
  103726. {
  103727. var blob = new window.Blob(svg, { type: 'image/svg+xml;charset=utf-8' });
  103728. }
  103729. catch (e)
  103730. {
  103731. this.onProcessError();
  103732. return;
  103733. }
  103734. this.data = new Image();
  103735. this.data.crossOrigin = this.crossOrigin;
  103736. var _this = this;
  103737. var retry = false;
  103738. this.data.onload = function ()
  103739. {
  103740. if (!retry)
  103741. {
  103742. File.revokeObjectURL(_this.data);
  103743. }
  103744. _this.onProcessComplete();
  103745. };
  103746. this.data.onerror = function ()
  103747. {
  103748. // Safari 8 re-try
  103749. if (!retry)
  103750. {
  103751. retry = true;
  103752. File.revokeObjectURL(_this.data);
  103753. _this.data.src = 'data:image/svg+xml,' + encodeURIComponent(svg.join(''));
  103754. }
  103755. else
  103756. {
  103757. _this.onProcessError();
  103758. }
  103759. };
  103760. File.createObjectURL(this.data, blob, 'image/svg+xml');
  103761. },
  103762. /**
  103763. * Adds this file to its target cache upon successful loading and processing.
  103764. *
  103765. * @method Phaser.Loader.FileTypes.SVGFile#addToCache
  103766. * @since 3.7.0
  103767. */
  103768. addToCache: function ()
  103769. {
  103770. var texture = this.cache.addImage(this.key, this.data);
  103771. this.pendingDestroy(texture);
  103772. }
  103773. });
  103774. /**
  103775. * Adds an SVG File, or array of SVG Files, to the current load queue. When the files are loaded they
  103776. * will be rendered to bitmap textures and stored in the Texture Manager.
  103777. *
  103778. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  103779. *
  103780. * ```javascript
  103781. * function preload ()
  103782. * {
  103783. * this.load.svg('morty', 'images/Morty.svg');
  103784. * }
  103785. * ```
  103786. *
  103787. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  103788. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  103789. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  103790. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  103791. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  103792. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  103793. * loaded.
  103794. *
  103795. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  103796. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  103797. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  103798. * then remove it from the Texture Manager first, before loading a new one.
  103799. *
  103800. * Instead of passing arguments you can pass a configuration object, such as:
  103801. *
  103802. * ```javascript
  103803. * this.load.svg({
  103804. * key: 'morty',
  103805. * url: 'images/Morty.svg'
  103806. * });
  103807. * ```
  103808. *
  103809. * See the documentation for `Phaser.Loader.FileTypes.SVGFileConfig` for more details.
  103810. *
  103811. * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key:
  103812. *
  103813. * ```javascript
  103814. * this.load.svg('morty', 'images/Morty.svg');
  103815. * // and later in your game ...
  103816. * this.add.image(x, y, 'morty');
  103817. * ```
  103818. *
  103819. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  103820. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  103821. * this is what you would use to retrieve the image from the Texture Manager.
  103822. *
  103823. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  103824. *
  103825. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  103826. * and no URL is given then the Loader will set the URL to be "alien.html". It will always add `.html` as the extension, although
  103827. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  103828. *
  103829. * You can optionally pass an SVG Resize Configuration object when you load an SVG file. By default the SVG will be rendered to a texture
  103830. * at the same size defined in the SVG file attributes. However, this isn't always desirable. You may wish to resize the SVG (either down
  103831. * or up) to improve texture clarity, or reduce texture memory consumption. You can either specify an exact width and height to resize
  103832. * the SVG to:
  103833. *
  103834. * ```javascript
  103835. * function preload ()
  103836. * {
  103837. * this.load.svg('morty', 'images/Morty.svg', { width: 300, height: 600 });
  103838. * }
  103839. * ```
  103840. *
  103841. * Or when using a configuration object:
  103842. *
  103843. * ```javascript
  103844. * this.load.svg({
  103845. * key: 'morty',
  103846. * url: 'images/Morty.svg',
  103847. * svgConfig: {
  103848. * width: 300,
  103849. * height: 600
  103850. * }
  103851. * });
  103852. * ```
  103853. *
  103854. * Alternatively, you can just provide a scale factor instead:
  103855. *
  103856. * ```javascript
  103857. * function preload ()
  103858. * {
  103859. * this.load.svg('morty', 'images/Morty.svg', { scale: 2.5 });
  103860. * }
  103861. * ```
  103862. *
  103863. * Or when using a configuration object:
  103864. *
  103865. * ```javascript
  103866. * this.load.svg({
  103867. * key: 'morty',
  103868. * url: 'images/Morty.svg',
  103869. * svgConfig: {
  103870. * scale: 2.5
  103871. * }
  103872. * });
  103873. * ```
  103874. *
  103875. * If scale, width and height values are all given, the scale has priority and the width and height values are ignored.
  103876. *
  103877. * Note: The ability to load this type of file will only be available if the SVG File type has been built into Phaser.
  103878. * It is available in the default build but can be excluded from custom builds.
  103879. *
  103880. * @method Phaser.Loader.LoaderPlugin#svg
  103881. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  103882. * @since 3.0.0
  103883. *
  103884. * @param {(string|Phaser.Loader.FileTypes.SVGFileConfig|Phaser.Loader.FileTypes.SVGFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  103885. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.svg`, i.e. if `key` was "alien" then the URL will be "alien.svg".
  103886. * @param {Phaser.Loader.FileTypes.SVGSizeConfig} [svgConfig] - The svg size configuration object.
  103887. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  103888. *
  103889. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  103890. */
  103891. FileTypesManager.register('svg', function (key, url, svgConfig, xhrSettings)
  103892. {
  103893. if (Array.isArray(key))
  103894. {
  103895. for (var i = 0; i < key.length; i++)
  103896. {
  103897. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  103898. this.addFile(new SVGFile(this, key[i]));
  103899. }
  103900. }
  103901. else
  103902. {
  103903. this.addFile(new SVGFile(this, key, url, svgConfig, xhrSettings));
  103904. }
  103905. return this;
  103906. });
  103907. module.exports = SVGFile;
  103908. /***/ }),
  103909. /* 584 */
  103910. /***/ (function(module, exports, __webpack_require__) {
  103911. /**
  103912. * @author Richard Davey <rich@photonstorm.com>
  103913. * @copyright 2019 Photon Storm Ltd.
  103914. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103915. */
  103916. var Class = __webpack_require__(0);
  103917. var FileTypesManager = __webpack_require__(7);
  103918. var ImageFile = __webpack_require__(64);
  103919. /**
  103920. * @typedef {object} Phaser.Loader.FileTypes.SpriteSheetFileConfig
  103921. *
  103922. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  103923. * @property {string} [url] - The absolute or relative URL to load the file from.
  103924. * @property {string} [extension='png'] - The default file extension to use if no url is provided.
  103925. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the image.
  103926. * @property {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object.
  103927. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103928. */
  103929. /**
  103930. * @classdesc
  103931. * A single Sprite Sheet Image File suitable for loading by the Loader.
  103932. *
  103933. * These are created when you use the Phaser.Loader.LoaderPlugin#spritesheet method and are not typically created directly.
  103934. *
  103935. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#spritesheet.
  103936. *
  103937. * @class SpriteSheetFile
  103938. * @extends Phaser.Loader.File
  103939. * @memberof Phaser.Loader.FileTypes
  103940. * @constructor
  103941. * @since 3.0.0
  103942. *
  103943. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  103944. * @param {(string|Phaser.Loader.FileTypes.SpriteSheetFileConfig)} key - The key to use for this file, or a file configuration object.
  103945. * @param {string|string[]} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  103946. * @param {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object.
  103947. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  103948. */
  103949. var SpriteSheetFile = new Class({
  103950. Extends: ImageFile,
  103951. initialize:
  103952. function SpriteSheetFile (loader, key, url, frameConfig, xhrSettings)
  103953. {
  103954. ImageFile.call(this, loader, key, url, xhrSettings, frameConfig);
  103955. this.type = 'spritesheet';
  103956. },
  103957. /**
  103958. * Adds this file to its target cache upon successful loading and processing.
  103959. *
  103960. * @method Phaser.Loader.FileTypes.SpriteSheetFile#addToCache
  103961. * @since 3.7.0
  103962. */
  103963. addToCache: function ()
  103964. {
  103965. var texture = this.cache.addSpriteSheet(this.key, this.data, this.config);
  103966. this.pendingDestroy(texture);
  103967. }
  103968. });
  103969. /**
  103970. * Adds a Sprite Sheet Image, or array of Sprite Sheet Images, to the current load queue.
  103971. *
  103972. * The term 'Sprite Sheet' in Phaser means a fixed-size sheet. Where every frame in the sheet is the exact same size,
  103973. * and you reference those frames using numbers, not frame names. This is not the same thing as a Texture Atlas, where
  103974. * the frames are packed in a way where they take up the least amount of space, and are referenced by their names,
  103975. * not numbers. Some articles and software use the term 'Sprite Sheet' to mean Texture Atlas, so please be aware of
  103976. * what sort of file you're actually trying to load.
  103977. *
  103978. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  103979. *
  103980. * ```javascript
  103981. * function preload ()
  103982. * {
  103983. * this.load.spritesheet('bot', 'images/robot.png', { frameWidth: 32, frameHeight: 38 });
  103984. * }
  103985. * ```
  103986. *
  103987. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  103988. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  103989. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  103990. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  103991. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  103992. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  103993. * loaded.
  103994. *
  103995. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  103996. * If you try to load an animated gif only the first frame will be rendered. Browsers do not natively support playback
  103997. * of animated gifs to Canvas elements.
  103998. *
  103999. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  104000. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  104001. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  104002. * then remove it from the Texture Manager first, before loading a new one.
  104003. *
  104004. * Instead of passing arguments you can pass a configuration object, such as:
  104005. *
  104006. * ```javascript
  104007. * this.load.spritesheet({
  104008. * key: 'bot',
  104009. * url: 'images/robot.png',
  104010. * frameConfig: {
  104011. * frameWidth: 32,
  104012. * frameHeight: 38,
  104013. * startFrame: 0,
  104014. * endFrame: 8
  104015. * }
  104016. * });
  104017. * ```
  104018. *
  104019. * See the documentation for `Phaser.Loader.FileTypes.SpriteSheetFileConfig` for more details.
  104020. *
  104021. * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key:
  104022. *
  104023. * ```javascript
  104024. * this.load.spritesheet('bot', 'images/robot.png', { frameWidth: 32, frameHeight: 38 });
  104025. * // and later in your game ...
  104026. * this.add.image(x, y, 'bot', 0);
  104027. * ```
  104028. *
  104029. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  104030. * key. For example, if the prefix was `PLAYER.` and the key was `Running` the final key will be `PLAYER.Running` and
  104031. * this is what you would use to retrieve the image from the Texture Manager.
  104032. *
  104033. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  104034. *
  104035. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  104036. * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although
  104037. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  104038. *
  104039. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  104040. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  104041. *
  104042. * ```javascript
  104043. * this.load.spritesheet('logo', [ 'images/AtariLogo.png', 'images/AtariLogo-n.png' ], { frameWidth: 256, frameHeight: 80 });
  104044. * ```
  104045. *
  104046. * Or, if you are using a config object use the `normalMap` property:
  104047. *
  104048. * ```javascript
  104049. * this.load.spritesheet({
  104050. * key: 'logo',
  104051. * url: 'images/AtariLogo.png',
  104052. * normalMap: 'images/AtariLogo-n.png',
  104053. * frameConfig: {
  104054. * frameWidth: 256,
  104055. * frameHeight: 80
  104056. * }
  104057. * });
  104058. * ```
  104059. *
  104060. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  104061. * Normal maps are a WebGL only feature.
  104062. *
  104063. * Note: The ability to load this type of file will only be available if the Sprite Sheet File type has been built into Phaser.
  104064. * It is available in the default build but can be excluded from custom builds.
  104065. *
  104066. * @method Phaser.Loader.LoaderPlugin#spritesheet
  104067. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  104068. * @since 3.0.0
  104069. *
  104070. * @param {(string|Phaser.Loader.FileTypes.SpriteSheetFileConfig|Phaser.Loader.FileTypes.SpriteSheetFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  104071. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  104072. * @param {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object. At a minimum it should have a `frameWidth` property.
  104073. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  104074. *
  104075. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  104076. */
  104077. FileTypesManager.register('spritesheet', function (key, url, frameConfig, xhrSettings)
  104078. {
  104079. if (Array.isArray(key))
  104080. {
  104081. for (var i = 0; i < key.length; i++)
  104082. {
  104083. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  104084. this.addFile(new SpriteSheetFile(this, key[i]));
  104085. }
  104086. }
  104087. else
  104088. {
  104089. this.addFile(new SpriteSheetFile(this, key, url, frameConfig, xhrSettings));
  104090. }
  104091. return this;
  104092. });
  104093. module.exports = SpriteSheetFile;
  104094. /***/ }),
  104095. /* 585 */
  104096. /***/ (function(module, exports, __webpack_require__) {
  104097. /**
  104098. * @author Richard Davey <rich@photonstorm.com>
  104099. * @copyright 2019 Photon Storm Ltd.
  104100. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104101. */
  104102. var Class = __webpack_require__(0);
  104103. var CONST = __webpack_require__(15);
  104104. var File = __webpack_require__(22);
  104105. var FileTypesManager = __webpack_require__(7);
  104106. var GetFastValue = __webpack_require__(2);
  104107. var IsPlainObject = __webpack_require__(8);
  104108. /**
  104109. * @typedef {object} Phaser.Loader.FileTypes.ScriptFileConfig
  104110. *
  104111. * @property {string} key - The key of the file. Must be unique within the Loader.
  104112. * @property {string} [url] - The absolute or relative URL to load the file from.
  104113. * @property {string} [extension='js'] - The default file extension to use if no url is provided.
  104114. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104115. */
  104116. /**
  104117. * @classdesc
  104118. * A single Script File suitable for loading by the Loader.
  104119. *
  104120. * These are created when you use the Phaser.Loader.LoaderPlugin#script method and are not typically created directly.
  104121. *
  104122. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#script.
  104123. *
  104124. * @class ScriptFile
  104125. * @extends Phaser.Loader.File
  104126. * @memberof Phaser.Loader.FileTypes
  104127. * @constructor
  104128. * @since 3.0.0
  104129. *
  104130. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  104131. * @param {(string|Phaser.Loader.FileTypes.ScriptFileConfig)} key - The key to use for this file, or a file configuration object.
  104132. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.js`, i.e. if `key` was "alien" then the URL will be "alien.js".
  104133. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104134. */
  104135. var ScriptFile = new Class({
  104136. Extends: File,
  104137. initialize:
  104138. function ScriptFile (loader, key, url, xhrSettings)
  104139. {
  104140. var extension = 'js';
  104141. if (IsPlainObject(key))
  104142. {
  104143. var config = key;
  104144. key = GetFastValue(config, 'key');
  104145. url = GetFastValue(config, 'url');
  104146. xhrSettings = GetFastValue(config, 'xhrSettings');
  104147. extension = GetFastValue(config, 'extension', extension);
  104148. }
  104149. var fileConfig = {
  104150. type: 'script',
  104151. cache: false,
  104152. extension: extension,
  104153. responseType: 'text',
  104154. key: key,
  104155. url: url,
  104156. xhrSettings: xhrSettings
  104157. };
  104158. File.call(this, loader, fileConfig);
  104159. },
  104160. /**
  104161. * Called automatically by Loader.nextFile.
  104162. * This method controls what extra work this File does with its loaded data.
  104163. *
  104164. * @method Phaser.Loader.FileTypes.ScriptFile#onProcess
  104165. * @since 3.7.0
  104166. */
  104167. onProcess: function ()
  104168. {
  104169. this.state = CONST.FILE_PROCESSING;
  104170. this.data = document.createElement('script');
  104171. this.data.language = 'javascript';
  104172. this.data.type = 'text/javascript';
  104173. this.data.defer = false;
  104174. this.data.text = this.xhrLoader.responseText;
  104175. document.head.appendChild(this.data);
  104176. this.onProcessComplete();
  104177. }
  104178. });
  104179. /**
  104180. * Adds a Script file, or array of Script files, to the current load queue.
  104181. *
  104182. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  104183. *
  104184. * ```javascript
  104185. * function preload ()
  104186. * {
  104187. * this.load.script('aliens', 'lib/aliens.js');
  104188. * }
  104189. * ```
  104190. *
  104191. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  104192. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  104193. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  104194. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  104195. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  104196. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  104197. * loaded.
  104198. *
  104199. * The key must be a unique String and not already in-use by another file in the Loader.
  104200. *
  104201. * Instead of passing arguments you can pass a configuration object, such as:
  104202. *
  104203. * ```javascript
  104204. * this.load.script({
  104205. * key: 'aliens',
  104206. * url: 'lib/aliens.js'
  104207. * });
  104208. * ```
  104209. *
  104210. * See the documentation for `Phaser.Loader.FileTypes.ScriptFileConfig` for more details.
  104211. *
  104212. * Once the file has finished loading it will automatically be converted into a script element
  104213. * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to
  104214. * false and then the resulting element will be appended to `document.head`. Any code then in the
  104215. * script will be executed.
  104216. *
  104217. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  104218. *
  104219. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  104220. * and no URL is given then the Loader will set the URL to be "alien.js". It will always add `.js` as the extension, although
  104221. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  104222. *
  104223. * Note: The ability to load this type of file will only be available if the Script File type has been built into Phaser.
  104224. * It is available in the default build but can be excluded from custom builds.
  104225. *
  104226. * @method Phaser.Loader.LoaderPlugin#script
  104227. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  104228. * @since 3.0.0
  104229. *
  104230. * @param {(string|Phaser.Loader.FileTypes.ScriptFileConfig|Phaser.Loader.FileTypes.ScriptFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  104231. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.js`, i.e. if `key` was "alien" then the URL will be "alien.js".
  104232. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  104233. *
  104234. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  104235. */
  104236. FileTypesManager.register('script', function (key, url, xhrSettings)
  104237. {
  104238. if (Array.isArray(key))
  104239. {
  104240. for (var i = 0; i < key.length; i++)
  104241. {
  104242. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  104243. this.addFile(new ScriptFile(this, key[i]));
  104244. }
  104245. }
  104246. else
  104247. {
  104248. this.addFile(new ScriptFile(this, key, url, xhrSettings));
  104249. }
  104250. return this;
  104251. });
  104252. module.exports = ScriptFile;
  104253. /***/ }),
  104254. /* 586 */
  104255. /***/ (function(module, exports, __webpack_require__) {
  104256. /**
  104257. * @author Richard Davey <rich@photonstorm.com>
  104258. * @copyright 2019 Photon Storm Ltd.
  104259. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104260. */
  104261. var Class = __webpack_require__(0);
  104262. var CONST = __webpack_require__(15);
  104263. var File = __webpack_require__(22);
  104264. var FileTypesManager = __webpack_require__(7);
  104265. var GetFastValue = __webpack_require__(2);
  104266. var IsPlainObject = __webpack_require__(8);
  104267. /**
  104268. * @typedef {object} Phaser.Loader.FileTypes.ScenePluginFileConfig
  104269. *
  104270. * @property {string} key - The key of the file. Must be unique within the Loader.
  104271. * @property {(string|function)} [url] - The absolute or relative URL to load the file from. Or, a Scene Plugin.
  104272. * @property {string} [extension='js'] - The default file extension to use if no url is provided.
  104273. * @property {string} [systemKey] - If this plugin is to be added to Scene.Systems, this is the property key for it.
  104274. * @property {string} [sceneKey] - If this plugin is to be added to the Scene, this is the property key for it.
  104275. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104276. */
  104277. /**
  104278. * @classdesc
  104279. * A single Scene Plugin Script File suitable for loading by the Loader.
  104280. *
  104281. * These are created when you use the Phaser.Loader.LoaderPlugin#scenePlugin method and are not typically created directly.
  104282. *
  104283. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#scenePlugin.
  104284. *
  104285. * @class ScenePluginFile
  104286. * @extends Phaser.Loader.File
  104287. * @memberof Phaser.Loader.FileTypes
  104288. * @constructor
  104289. * @since 3.8.0
  104290. *
  104291. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  104292. * @param {(string|Phaser.Loader.FileTypes.ScenePluginFileConfig)} key - The key to use for this file, or a file configuration object.
  104293. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.js`, i.e. if `key` was "alien" then the URL will be "alien.js".
  104294. * @param {string} [systemKey] - If this plugin is to be added to Scene.Systems, this is the property key for it.
  104295. * @param {string} [sceneKey] - If this plugin is to be added to the Scene, this is the property key for it.
  104296. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104297. */
  104298. var ScenePluginFile = new Class({
  104299. Extends: File,
  104300. initialize:
  104301. function ScenePluginFile (loader, key, url, systemKey, sceneKey, xhrSettings)
  104302. {
  104303. var extension = 'js';
  104304. if (IsPlainObject(key))
  104305. {
  104306. var config = key;
  104307. key = GetFastValue(config, 'key');
  104308. url = GetFastValue(config, 'url');
  104309. xhrSettings = GetFastValue(config, 'xhrSettings');
  104310. extension = GetFastValue(config, 'extension', extension);
  104311. systemKey = GetFastValue(config, 'systemKey');
  104312. sceneKey = GetFastValue(config, 'sceneKey');
  104313. }
  104314. var fileConfig = {
  104315. type: 'scenePlugin',
  104316. cache: false,
  104317. extension: extension,
  104318. responseType: 'text',
  104319. key: key,
  104320. url: url,
  104321. xhrSettings: xhrSettings,
  104322. config: {
  104323. systemKey: systemKey,
  104324. sceneKey: sceneKey
  104325. }
  104326. };
  104327. File.call(this, loader, fileConfig);
  104328. // If the url variable refers to a class, add the plugin directly
  104329. if (typeof url === 'function')
  104330. {
  104331. this.data = url;
  104332. this.state = CONST.FILE_POPULATED;
  104333. }
  104334. },
  104335. /**
  104336. * Called automatically by Loader.nextFile.
  104337. * This method controls what extra work this File does with its loaded data.
  104338. *
  104339. * @method Phaser.Loader.FileTypes.ScenePluginFile#onProcess
  104340. * @since 3.8.0
  104341. */
  104342. onProcess: function ()
  104343. {
  104344. var pluginManager = this.loader.systems.plugins;
  104345. var config = this.config;
  104346. var key = this.key;
  104347. var systemKey = GetFastValue(config, 'systemKey', key);
  104348. var sceneKey = GetFastValue(config, 'sceneKey', key);
  104349. if (this.state === CONST.FILE_POPULATED)
  104350. {
  104351. pluginManager.installScenePlugin(systemKey, this.data, sceneKey, this.loader.scene);
  104352. }
  104353. else
  104354. {
  104355. // Plugin added via a js file
  104356. this.state = CONST.FILE_PROCESSING;
  104357. this.data = document.createElement('script');
  104358. this.data.language = 'javascript';
  104359. this.data.type = 'text/javascript';
  104360. this.data.defer = false;
  104361. this.data.text = this.xhrLoader.responseText;
  104362. document.head.appendChild(this.data);
  104363. pluginManager.installScenePlugin(systemKey, window[this.key], sceneKey, this.loader.scene);
  104364. }
  104365. this.onProcessComplete();
  104366. }
  104367. });
  104368. /**
  104369. * Adds a Scene Plugin Script file, or array of plugin files, to the current load queue.
  104370. *
  104371. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  104372. *
  104373. * ```javascript
  104374. * function preload ()
  104375. * {
  104376. * this.load.scenePlugin('ModPlayer', 'plugins/ModPlayer.js', 'modPlayer', 'mods');
  104377. * }
  104378. * ```
  104379. *
  104380. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  104381. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  104382. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  104383. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  104384. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  104385. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  104386. * loaded.
  104387. *
  104388. * The key must be a unique String and not already in-use by another file in the Loader.
  104389. *
  104390. * Instead of passing arguments you can pass a configuration object, such as:
  104391. *
  104392. * ```javascript
  104393. * this.load.scenePlugin({
  104394. * key: 'modplayer',
  104395. * url: 'plugins/ModPlayer.js'
  104396. * });
  104397. * ```
  104398. *
  104399. * See the documentation for `Phaser.Loader.FileTypes.ScenePluginFileConfig` for more details.
  104400. *
  104401. * Once the file has finished loading it will automatically be converted into a script element
  104402. * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to
  104403. * false and then the resulting element will be appended to `document.head`. Any code then in the
  104404. * script will be executed. It will then be passed to the Phaser PluginCache.register method.
  104405. *
  104406. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  104407. *
  104408. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  104409. * and no URL is given then the Loader will set the URL to be "alien.js". It will always add `.js` as the extension, although
  104410. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  104411. *
  104412. * Note: The ability to load this type of file will only be available if the Script File type has been built into Phaser.
  104413. * It is available in the default build but can be excluded from custom builds.
  104414. *
  104415. * @method Phaser.Loader.LoaderPlugin#scenePlugin
  104416. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  104417. * @since 3.8.0
  104418. *
  104419. * @param {(string|Phaser.Loader.FileTypes.ScenePluginFileConfig|Phaser.Loader.FileTypes.ScenePluginFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  104420. * @param {(string|function)} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.js`, i.e. if `key` was "alien" then the URL will be "alien.js". Or, set to a plugin function.
  104421. * @param {string} [systemKey] - If this plugin is to be added to Scene.Systems, this is the property key for it.
  104422. * @param {string} [sceneKey] - If this plugin is to be added to the Scene, this is the property key for it.
  104423. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  104424. *
  104425. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  104426. */
  104427. FileTypesManager.register('scenePlugin', function (key, url, systemKey, sceneKey, xhrSettings)
  104428. {
  104429. if (Array.isArray(key))
  104430. {
  104431. for (var i = 0; i < key.length; i++)
  104432. {
  104433. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  104434. this.addFile(new ScenePluginFile(this, key[i]));
  104435. }
  104436. }
  104437. else
  104438. {
  104439. this.addFile(new ScenePluginFile(this, key, url, systemKey, sceneKey, xhrSettings));
  104440. }
  104441. return this;
  104442. });
  104443. module.exports = ScenePluginFile;
  104444. /***/ }),
  104445. /* 587 */
  104446. /***/ (function(module, exports, __webpack_require__) {
  104447. /**
  104448. * @author Richard Davey <rich@photonstorm.com>
  104449. * @copyright 2019 Photon Storm Ltd.
  104450. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104451. */
  104452. var Class = __webpack_require__(0);
  104453. var CONST = __webpack_require__(15);
  104454. var File = __webpack_require__(22);
  104455. var FileTypesManager = __webpack_require__(7);
  104456. var GetFastValue = __webpack_require__(2);
  104457. var IsPlainObject = __webpack_require__(8);
  104458. /**
  104459. * @typedef {object} Phaser.Loader.FileTypes.SceneFileConfig
  104460. *
  104461. * @property {string} key - The key of the file. Must be unique within both the Loader and the Text Cache.
  104462. * @property {string} [url] - The absolute or relative URL to load the file from.
  104463. * @property {string} [extension='txt'] - The default file extension to use if no url is provided.
  104464. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104465. */
  104466. /**
  104467. * @classdesc
  104468. * An external Scene JavaScript File suitable for loading by the Loader.
  104469. *
  104470. * These are created when you use the Phaser.Loader.LoaderPlugin#sceneFile method and are not typically created directly.
  104471. *
  104472. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#sceneFile.
  104473. *
  104474. * @class SceneFile
  104475. * @extends Phaser.Loader.File
  104476. * @memberof Phaser.Loader.FileTypes
  104477. * @constructor
  104478. * @since 3.16.0
  104479. *
  104480. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  104481. * @param {(string|Phaser.Loader.FileTypes.SceneFileConfig)} key - The key to use for this file, or a file configuration object.
  104482. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.js`, i.e. if `key` was "alien" then the URL will be "alien.js".
  104483. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104484. */
  104485. var SceneFile = new Class({
  104486. Extends: File,
  104487. initialize:
  104488. function SceneFile (loader, key, url, xhrSettings)
  104489. {
  104490. var extension = 'js';
  104491. if (IsPlainObject(key))
  104492. {
  104493. var config = key;
  104494. key = GetFastValue(config, 'key');
  104495. url = GetFastValue(config, 'url');
  104496. xhrSettings = GetFastValue(config, 'xhrSettings');
  104497. extension = GetFastValue(config, 'extension', extension);
  104498. }
  104499. var fileConfig = {
  104500. type: 'text',
  104501. cache: loader.cacheManager.text,
  104502. extension: extension,
  104503. responseType: 'text',
  104504. key: key,
  104505. url: url,
  104506. xhrSettings: xhrSettings
  104507. };
  104508. File.call(this, loader, fileConfig);
  104509. },
  104510. /**
  104511. * Called automatically by Loader.nextFile.
  104512. * This method controls what extra work this File does with its loaded data.
  104513. *
  104514. * @method Phaser.Loader.FileTypes.SceneFile#onProcess
  104515. * @since 3.16.0
  104516. */
  104517. onProcess: function ()
  104518. {
  104519. this.state = CONST.FILE_PROCESSING;
  104520. this.data = this.xhrLoader.responseText;
  104521. this.onProcessComplete();
  104522. },
  104523. /**
  104524. * Adds this file to its target cache upon successful loading and processing.
  104525. *
  104526. * @method Phaser.Loader.FileTypes.SceneFile#addToCache
  104527. * @since 3.16.0
  104528. */
  104529. addToCache: function ()
  104530. {
  104531. var code = this.data.concat('(function(){\n' + 'return new ' + this.key + '();\n' + '}).call(this);');
  104532. this.loader.sceneManager.add(this.key, eval(code));
  104533. this.complete = true;
  104534. }
  104535. });
  104536. /**
  104537. * Adds an external Scene file, or array of Scene files, to the current load queue.
  104538. *
  104539. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  104540. *
  104541. * ```javascript
  104542. * function preload ()
  104543. * {
  104544. * this.load.sceneFile('Level1', 'src/Level1.js');
  104545. * }
  104546. * ```
  104547. *
  104548. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  104549. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  104550. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  104551. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  104552. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  104553. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  104554. * loaded.
  104555. *
  104556. * The key must be a unique String. It is used to add the file to the global Scene Manager upon a successful load.
  104557. *
  104558. * For a Scene File it's vitally important that the key matches the class name in the JavaScript file.
  104559. *
  104560. * For example here is the source file:
  104561. *
  104562. * ```javascript
  104563. * class ExternalScene extends Phaser.Scene {
  104564. *
  104565. * constructor ()
  104566. * {
  104567. * super('myScene');
  104568. * }
  104569. *
  104570. * }
  104571. * ```
  104572. *
  104573. * Because the class is called `ExternalScene` that is the exact same key you must use when loading it:
  104574. *
  104575. * ```javascript
  104576. * function preload ()
  104577. * {
  104578. * this.load.sceneFile('ExternalScene', 'src/yourScene.js');
  104579. * }
  104580. * ```
  104581. *
  104582. * The key that is used within the Scene Manager can either be set to the same, or you can override it in the Scene
  104583. * constructor, as we've done in the example above, where the Scene key was changed to `myScene`.
  104584. *
  104585. * The key should be unique both in terms of files being loaded and Scenes already present in the Scene Manager.
  104586. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  104587. * then remove it from the Scene Manager first, before loading a new one.
  104588. *
  104589. * Instead of passing arguments you can pass a configuration object, such as:
  104590. *
  104591. * ```javascript
  104592. * this.load.sceneFile({
  104593. * key: 'Level1',
  104594. * url: 'src/Level1.js'
  104595. * });
  104596. * ```
  104597. *
  104598. * See the documentation for `Phaser.Loader.FileTypes.SceneFileConfig` for more details.
  104599. *
  104600. * Once the file has finished loading it will be added to the Scene Manager.
  104601. *
  104602. * ```javascript
  104603. * this.load.sceneFile('Level1', 'src/Level1.js');
  104604. * // and later in your game ...
  104605. * this.scene.start('Level1');
  104606. * ```
  104607. *
  104608. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  104609. * key. For example, if the prefix was `WORLD1.` and the key was `Story` the final key will be `WORLD1.Story` and
  104610. * this is what you would use to retrieve the text from the Scene Manager.
  104611. *
  104612. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  104613. *
  104614. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story"
  104615. * and no URL is given then the Loader will set the URL to be "story.js". It will always add `.js` as the extension, although
  104616. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  104617. *
  104618. * Note: The ability to load this type of file will only be available if the Scene File type has been built into Phaser.
  104619. * It is available in the default build but can be excluded from custom builds.
  104620. *
  104621. * @method Phaser.Loader.LoaderPlugin#sceneFile
  104622. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  104623. * @since 3.16.0
  104624. *
  104625. * @param {(string|Phaser.Loader.FileTypes.SceneFileConfig|Phaser.Loader.FileTypes.SceneFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  104626. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.js`, i.e. if `key` was "alien" then the URL will be "alien.js".
  104627. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  104628. *
  104629. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  104630. */
  104631. FileTypesManager.register('sceneFile', function (key, url, xhrSettings)
  104632. {
  104633. if (Array.isArray(key))
  104634. {
  104635. for (var i = 0; i < key.length; i++)
  104636. {
  104637. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  104638. this.addFile(new SceneFile(this, key[i]));
  104639. }
  104640. }
  104641. else
  104642. {
  104643. this.addFile(new SceneFile(this, key, url, xhrSettings));
  104644. }
  104645. return this;
  104646. });
  104647. module.exports = SceneFile;
  104648. /***/ }),
  104649. /* 588 */
  104650. /***/ (function(module, exports, __webpack_require__) {
  104651. /**
  104652. * @author Richard Davey <rich@photonstorm.com>
  104653. * @copyright 2019 Photon Storm Ltd.
  104654. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104655. */
  104656. var Class = __webpack_require__(0);
  104657. var CONST = __webpack_require__(15);
  104658. var File = __webpack_require__(22);
  104659. var FileTypesManager = __webpack_require__(7);
  104660. var GetFastValue = __webpack_require__(2);
  104661. var IsPlainObject = __webpack_require__(8);
  104662. /**
  104663. * @typedef {object} Phaser.Loader.FileTypes.PluginFileConfig
  104664. *
  104665. * @property {string} key - The key of the file. Must be unique within the Loader.
  104666. * @property {string} [url] - The absolute or relative URL to load the file from.
  104667. * @property {string} [extension='js'] - The default file extension to use if no url is provided.
  104668. * @property {boolean} [start=false] - Automatically start the plugin after loading?
  104669. * @property {string} [mapping] - If this plugin is to be injected into the Scene, this is the property key used.
  104670. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104671. */
  104672. /**
  104673. * @classdesc
  104674. * A single Plugin Script File suitable for loading by the Loader.
  104675. *
  104676. * These are created when you use the Phaser.Loader.LoaderPlugin#plugin method and are not typically created directly.
  104677. *
  104678. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#plugin.
  104679. *
  104680. * @class PluginFile
  104681. * @extends Phaser.Loader.File
  104682. * @memberof Phaser.Loader.FileTypes
  104683. * @constructor
  104684. * @since 3.0.0
  104685. *
  104686. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  104687. * @param {(string|Phaser.Loader.FileTypes.PluginFileConfig)} key - The key to use for this file, or a file configuration object.
  104688. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.js`, i.e. if `key` was "alien" then the URL will be "alien.js".
  104689. * @param {boolean} [start=false] - Automatically start the plugin after loading?
  104690. * @param {string} [mapping] - If this plugin is to be injected into the Scene, this is the property key used.
  104691. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104692. */
  104693. var PluginFile = new Class({
  104694. Extends: File,
  104695. initialize:
  104696. function PluginFile (loader, key, url, start, mapping, xhrSettings)
  104697. {
  104698. var extension = 'js';
  104699. if (IsPlainObject(key))
  104700. {
  104701. var config = key;
  104702. key = GetFastValue(config, 'key');
  104703. url = GetFastValue(config, 'url');
  104704. xhrSettings = GetFastValue(config, 'xhrSettings');
  104705. extension = GetFastValue(config, 'extension', extension);
  104706. start = GetFastValue(config, 'start');
  104707. mapping = GetFastValue(config, 'mapping');
  104708. }
  104709. var fileConfig = {
  104710. type: 'plugin',
  104711. cache: false,
  104712. extension: extension,
  104713. responseType: 'text',
  104714. key: key,
  104715. url: url,
  104716. xhrSettings: xhrSettings,
  104717. config: {
  104718. start: start,
  104719. mapping: mapping
  104720. }
  104721. };
  104722. File.call(this, loader, fileConfig);
  104723. // If the url variable refers to a class, add the plugin directly
  104724. if (typeof url === 'function')
  104725. {
  104726. this.data = url;
  104727. this.state = CONST.FILE_POPULATED;
  104728. }
  104729. },
  104730. /**
  104731. * Called automatically by Loader.nextFile.
  104732. * This method controls what extra work this File does with its loaded data.
  104733. *
  104734. * @method Phaser.Loader.FileTypes.PluginFile#onProcess
  104735. * @since 3.7.0
  104736. */
  104737. onProcess: function ()
  104738. {
  104739. var pluginManager = this.loader.systems.plugins;
  104740. var config = this.config;
  104741. var start = GetFastValue(config, 'start', false);
  104742. var mapping = GetFastValue(config, 'mapping', null);
  104743. if (this.state === CONST.FILE_POPULATED)
  104744. {
  104745. pluginManager.install(this.key, this.data, start, mapping);
  104746. }
  104747. else
  104748. {
  104749. // Plugin added via a js file
  104750. this.state = CONST.FILE_PROCESSING;
  104751. this.data = document.createElement('script');
  104752. this.data.language = 'javascript';
  104753. this.data.type = 'text/javascript';
  104754. this.data.defer = false;
  104755. this.data.text = this.xhrLoader.responseText;
  104756. document.head.appendChild(this.data);
  104757. var plugin = pluginManager.install(this.key, window[this.key], start, mapping);
  104758. if (start || mapping)
  104759. {
  104760. // Install into the current Scene Systems and Scene
  104761. this.loader.systems[mapping] = plugin;
  104762. this.loader.scene[mapping] = plugin;
  104763. }
  104764. }
  104765. this.onProcessComplete();
  104766. }
  104767. });
  104768. /**
  104769. * Adds a Plugin Script file, or array of plugin files, to the current load queue.
  104770. *
  104771. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  104772. *
  104773. * ```javascript
  104774. * function preload ()
  104775. * {
  104776. * this.load.plugin('modplayer', 'plugins/ModPlayer.js');
  104777. * }
  104778. * ```
  104779. *
  104780. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  104781. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  104782. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  104783. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  104784. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  104785. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  104786. * loaded.
  104787. *
  104788. * The key must be a unique String and not already in-use by another file in the Loader.
  104789. *
  104790. * Instead of passing arguments you can pass a configuration object, such as:
  104791. *
  104792. * ```javascript
  104793. * this.load.plugin({
  104794. * key: 'modplayer',
  104795. * url: 'plugins/ModPlayer.js'
  104796. * });
  104797. * ```
  104798. *
  104799. * See the documentation for `Phaser.Loader.FileTypes.PluginFileConfig` for more details.
  104800. *
  104801. * Once the file has finished loading it will automatically be converted into a script element
  104802. * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to
  104803. * false and then the resulting element will be appended to `document.head`. Any code then in the
  104804. * script will be executed. It will then be passed to the Phaser PluginCache.register method.
  104805. *
  104806. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  104807. *
  104808. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  104809. * and no URL is given then the Loader will set the URL to be "alien.js". It will always add `.js` as the extension, although
  104810. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  104811. *
  104812. * Note: The ability to load this type of file will only be available if the Plugin File type has been built into Phaser.
  104813. * It is available in the default build but can be excluded from custom builds.
  104814. *
  104815. * @method Phaser.Loader.LoaderPlugin#plugin
  104816. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  104817. * @since 3.0.0
  104818. *
  104819. * @param {(string|Phaser.Loader.FileTypes.PluginFileConfig|Phaser.Loader.FileTypes.PluginFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  104820. * @param {(string|function)} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.js`, i.e. if `key` was "alien" then the URL will be "alien.js". Or, a plugin function.
  104821. * @param {boolean} [start] - Automatically start the plugin after loading?
  104822. * @param {string} [mapping] - If this plugin is to be injected into the Scene, this is the property key used.
  104823. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  104824. *
  104825. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  104826. */
  104827. FileTypesManager.register('plugin', function (key, url, start, mapping, xhrSettings)
  104828. {
  104829. if (Array.isArray(key))
  104830. {
  104831. for (var i = 0; i < key.length; i++)
  104832. {
  104833. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  104834. this.addFile(new PluginFile(this, key[i]));
  104835. }
  104836. }
  104837. else
  104838. {
  104839. this.addFile(new PluginFile(this, key, url, start, mapping, xhrSettings));
  104840. }
  104841. return this;
  104842. });
  104843. module.exports = PluginFile;
  104844. /***/ }),
  104845. /* 589 */
  104846. /***/ (function(module, exports, __webpack_require__) {
  104847. /**
  104848. * @author Richard Davey <rich@photonstorm.com>
  104849. * @copyright 2019 Photon Storm Ltd.
  104850. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104851. */
  104852. var Class = __webpack_require__(0);
  104853. var CONST = __webpack_require__(15);
  104854. var FileTypesManager = __webpack_require__(7);
  104855. var JSONFile = __webpack_require__(55);
  104856. /**
  104857. * @typedef {object} Phaser.Loader.FileTypes.PackFileConfig
  104858. *
  104859. * @property {string} key - The key of the file. Must be unique within both the Loader and the JSON Cache.
  104860. * @property {string|any} [url] - The absolute or relative URL to load the file from. Or can be a ready formed JSON object, in which case it will be directly processed.
  104861. * @property {string} [extension='json'] - The default file extension to use if no url is provided.
  104862. * @property {string} [dataKey] - If specified instead of the whole JSON file being parsed, only the section corresponding to this property key will be added. If the property you want to extract is nested, use periods to divide it.
  104863. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104864. */
  104865. /**
  104866. * @classdesc
  104867. * A single JSON Pack File suitable for loading by the Loader.
  104868. *
  104869. * These are created when you use the Phaser.Loader.LoaderPlugin#pack method and are not typically created directly.
  104870. *
  104871. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#pack.
  104872. *
  104873. * @class PackFile
  104874. * @extends Phaser.Loader.File
  104875. * @memberof Phaser.Loader.FileTypes
  104876. * @constructor
  104877. * @since 3.7.0
  104878. *
  104879. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  104880. * @param {(string|Phaser.Loader.FileTypes.JSONFileConfig)} key - The key to use for this file, or a file configuration object.
  104881. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  104882. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  104883. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  104884. */
  104885. var PackFile = new Class({
  104886. Extends: JSONFile,
  104887. initialize:
  104888. // url can either be a string, in which case it is treated like a proper url, or an object, in which case it is treated as a ready-made JS Object
  104889. // dataKey allows you to pluck a specific object out of the JSON and put just that into the cache, rather than the whole thing
  104890. function PackFile (loader, key, url, xhrSettings, dataKey)
  104891. {
  104892. JSONFile.call(this, loader, key, url, xhrSettings, dataKey);
  104893. this.type = 'packfile';
  104894. },
  104895. /**
  104896. * Called automatically by Loader.nextFile.
  104897. * This method controls what extra work this File does with its loaded data.
  104898. *
  104899. * @method Phaser.Loader.FileTypes.PackFile#onProcess
  104900. * @since 3.7.0
  104901. */
  104902. onProcess: function ()
  104903. {
  104904. if (this.state !== CONST.FILE_POPULATED)
  104905. {
  104906. this.state = CONST.FILE_PROCESSING;
  104907. this.data = JSON.parse(this.xhrLoader.responseText);
  104908. }
  104909. // Let's pass the pack file data over to the Loader ...
  104910. this.loader.addPack(this.data, this.config);
  104911. this.onProcessComplete();
  104912. }
  104913. });
  104914. /**
  104915. * Adds a JSON File Pack, or array of packs, to the current load queue.
  104916. *
  104917. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  104918. *
  104919. * ```javascript
  104920. * function preload ()
  104921. * {
  104922. * this.load.pack('level1', 'data/Level1Files.json');
  104923. * }
  104924. * ```
  104925. *
  104926. * A File Pack is a JSON file (or object) that contains details about other files that should be added into the Loader.
  104927. * Here is a small example:
  104928. *
  104929. * ```json
  104930. * {
  104931. * "test1": {
  104932. * "files": [
  104933. * {
  104934. * "type": "image",
  104935. * "key": "taikodrummaster",
  104936. * "url": "assets/pics/taikodrummaster.jpg"
  104937. * },
  104938. * {
  104939. * "type": "image",
  104940. * "key": "sukasuka-chtholly",
  104941. * "url": "assets/pics/sukasuka-chtholly.png"
  104942. * }
  104943. * ]
  104944. * },
  104945. * "meta": {
  104946. * "generated": "1401380327373",
  104947. * "app": "Phaser 3 Asset Packer",
  104948. * "url": "https://phaser.io",
  104949. * "version": "1.0",
  104950. * "copyright": "Photon Storm Ltd. 2018"
  104951. * }
  104952. * }
  104953. * ```
  104954. *
  104955. * The pack can be split into sections. In the example above you'll see a section called `test1. You can tell
  104956. * the `load.pack` method to parse only a particular section of a pack. The pack is stored in the JSON Cache,
  104957. * so you can pass it to the Loader to process additional sections as needed in your game, or you can just load
  104958. * them all at once without specifying anything.
  104959. *
  104960. * The pack file can contain an entry for any type of file that Phaser can load. The object structures exactly
  104961. * match that of the file type configs, and all properties available within the file type configs can be used
  104962. * in the pack file too.
  104963. *
  104964. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  104965. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  104966. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  104967. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  104968. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  104969. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  104970. * loaded.
  104971. *
  104972. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  104973. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  104974. *
  104975. * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load.
  104976. * The key should be unique both in terms of files being loaded and files already present in the JSON Cache.
  104977. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  104978. * then remove it from the JSON Cache first, before loading a new one.
  104979. *
  104980. * Instead of passing arguments you can pass a configuration object, such as:
  104981. *
  104982. * ```javascript
  104983. * this.load.pack({
  104984. * key: 'level1',
  104985. * url: 'data/Level1Files.json'
  104986. * });
  104987. * ```
  104988. *
  104989. * See the documentation for `Phaser.Loader.FileTypes.PackFileConfig` for more details.
  104990. *
  104991. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  104992. * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and
  104993. * this is what you would use to retrieve the text from the JSON Cache.
  104994. *
  104995. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  104996. *
  104997. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data"
  104998. * and no URL is given then the Loader will set the URL to be "data.json". It will always add `.json` as the extension, although
  104999. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  105000. *
  105001. * You can also optionally provide a `dataKey` to use. This allows you to extract only a part of the JSON and store it in the Cache,
  105002. * rather than the whole file. For example, if your JSON data had a structure like this:
  105003. *
  105004. * ```json
  105005. * {
  105006. * "level1": {
  105007. * "baddies": {
  105008. * "aliens": {},
  105009. * "boss": {}
  105010. * }
  105011. * },
  105012. * "level2": {},
  105013. * "level3": {}
  105014. * }
  105015. * ```
  105016. *
  105017. * And you only wanted to store the `boss` data in the Cache, then you could pass `level1.baddies.boss`as the `dataKey`.
  105018. *
  105019. * Note: The ability to load this type of file will only be available if the Pack File type has been built into Phaser.
  105020. * It is available in the default build but can be excluded from custom builds.
  105021. *
  105022. * @method Phaser.Loader.LoaderPlugin#pack
  105023. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  105024. * @since 3.7.0
  105025. *
  105026. * @param {(string|Phaser.Loader.FileTypes.PackFileConfig|Phaser.Loader.FileTypes.PackFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  105027. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  105028. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  105029. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  105030. *
  105031. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  105032. */
  105033. FileTypesManager.register('pack', function (key, url, packKey, xhrSettings)
  105034. {
  105035. // Supports an Object file definition in the key argument
  105036. // Or an array of objects in the key argument
  105037. // Or a single entry where all arguments have been defined
  105038. if (Array.isArray(key))
  105039. {
  105040. for (var i = 0; i < key.length; i++)
  105041. {
  105042. this.addFile(new PackFile(this, key[i]));
  105043. }
  105044. }
  105045. else
  105046. {
  105047. this.addFile(new PackFile(this, key, url, xhrSettings, packKey));
  105048. }
  105049. return this;
  105050. });
  105051. module.exports = PackFile;
  105052. /***/ }),
  105053. /* 590 */
  105054. /***/ (function(module, exports, __webpack_require__) {
  105055. /**
  105056. * @author Richard Davey <rich@photonstorm.com>
  105057. * @copyright 2019 Photon Storm Ltd.
  105058. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105059. */
  105060. var Class = __webpack_require__(0);
  105061. var FileTypesManager = __webpack_require__(7);
  105062. var GetFastValue = __webpack_require__(2);
  105063. var ImageFile = __webpack_require__(64);
  105064. var IsPlainObject = __webpack_require__(8);
  105065. var JSONFile = __webpack_require__(55);
  105066. var MultiFile = __webpack_require__(63);
  105067. /**
  105068. * @typedef {object} Phaser.Loader.FileTypes.MultiAtlasFileConfig
  105069. *
  105070. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  105071. * @property {string} [atlasURL] - The absolute or relative URL to load the multi atlas json file from. Or, a well formed JSON object.
  105072. * @property {string} [atlasExtension='json'] - The default file extension to use for the atlas json if no url is provided.
  105073. * @property {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas json file.
  105074. * @property {string} [path] - Optional path to use when loading the textures defined in the atlas data.
  105075. * @property {string} [baseURL] - Optional Base URL to use when loading the textures defined in the atlas data.
  105076. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture files.
  105077. */
  105078. /**
  105079. * @classdesc
  105080. * A single Multi Texture Atlas File suitable for loading by the Loader.
  105081. *
  105082. * These are created when you use the Phaser.Loader.LoaderPlugin#multiatlas method and are not typically created directly.
  105083. *
  105084. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#multiatlas.
  105085. *
  105086. * @class MultiAtlasFile
  105087. * @extends Phaser.Loader.MultiFile
  105088. * @memberof Phaser.Loader.FileTypes
  105089. * @constructor
  105090. * @since 3.7.0
  105091. *
  105092. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  105093. * @param {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  105094. * @param {string} [atlasURL] - The absolute or relative URL to load the multi atlas json file from.
  105095. * @param {string} [path] - Optional path to use when loading the textures defined in the atlas data.
  105096. * @param {string} [baseURL] - Optional Base URL to use when loading the textures defined in the atlas data.
  105097. * @param {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas json file.
  105098. * @param {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture files.
  105099. */
  105100. var MultiAtlasFile = new Class({
  105101. Extends: MultiFile,
  105102. initialize:
  105103. function MultiAtlasFile (loader, key, atlasURL, path, baseURL, atlasXhrSettings, textureXhrSettings)
  105104. {
  105105. if (IsPlainObject(key))
  105106. {
  105107. var config = key;
  105108. key = GetFastValue(config, 'key');
  105109. atlasURL = GetFastValue(config, 'url');
  105110. atlasXhrSettings = GetFastValue(config, 'xhrSettings');
  105111. path = GetFastValue(config, 'path');
  105112. baseURL = GetFastValue(config, 'baseURL');
  105113. textureXhrSettings = GetFastValue(config, 'textureXhrSettings');
  105114. }
  105115. var data = new JSONFile(loader, key, atlasURL, atlasXhrSettings);
  105116. MultiFile.call(this, loader, 'multiatlas', key, [ data ]);
  105117. this.config.path = path;
  105118. this.config.baseURL = baseURL;
  105119. this.config.textureXhrSettings = textureXhrSettings;
  105120. },
  105121. /**
  105122. * Called by each File when it finishes loading.
  105123. *
  105124. * @method Phaser.Loader.FileTypes.MultiAtlasFile#onFileComplete
  105125. * @since 3.7.0
  105126. *
  105127. * @param {Phaser.Loader.File} file - The File that has completed processing.
  105128. */
  105129. onFileComplete: function (file)
  105130. {
  105131. var index = this.files.indexOf(file);
  105132. if (index !== -1)
  105133. {
  105134. this.pending--;
  105135. if (file.type === 'json' && file.data.hasOwnProperty('textures'))
  105136. {
  105137. // Inspect the data for the files to now load
  105138. var textures = file.data.textures;
  105139. var config = this.config;
  105140. var loader = this.loader;
  105141. var currentBaseURL = loader.baseURL;
  105142. var currentPath = loader.path;
  105143. var currentPrefix = loader.prefix;
  105144. var baseURL = GetFastValue(config, 'baseURL', currentBaseURL);
  105145. var path = GetFastValue(config, 'path', currentPath);
  105146. var prefix = GetFastValue(config, 'prefix', currentPrefix);
  105147. var textureXhrSettings = GetFastValue(config, 'textureXhrSettings');
  105148. loader.setBaseURL(baseURL);
  105149. loader.setPath(path);
  105150. loader.setPrefix(prefix);
  105151. for (var i = 0; i < textures.length; i++)
  105152. {
  105153. // "image": "texture-packer-multi-atlas-0.png",
  105154. var textureURL = textures[i].image;
  105155. var key = '_MA_' + textureURL;
  105156. var image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  105157. this.addToMultiFile(image);
  105158. loader.addFile(image);
  105159. // "normalMap": "texture-packer-multi-atlas-0_n.png",
  105160. if (textures[i].normalMap)
  105161. {
  105162. var normalMap = new ImageFile(loader, key, textures[i].normalMap, textureXhrSettings);
  105163. normalMap.type = 'normalMap';
  105164. image.setLink(normalMap);
  105165. this.addToMultiFile(normalMap);
  105166. loader.addFile(normalMap);
  105167. }
  105168. }
  105169. // Reset the loader settings
  105170. loader.setBaseURL(currentBaseURL);
  105171. loader.setPath(currentPath);
  105172. loader.setPrefix(currentPrefix);
  105173. }
  105174. }
  105175. },
  105176. /**
  105177. * Adds this file to its target cache upon successful loading and processing.
  105178. *
  105179. * @method Phaser.Loader.FileTypes.MultiAtlasFile#addToCache
  105180. * @since 3.7.0
  105181. */
  105182. addToCache: function ()
  105183. {
  105184. if (this.isReadyToProcess())
  105185. {
  105186. var fileJSON = this.files[0];
  105187. fileJSON.addToCache();
  105188. var data = [];
  105189. var images = [];
  105190. var normalMaps = [];
  105191. for (var i = 1; i < this.files.length; i++)
  105192. {
  105193. var file = this.files[i];
  105194. if (file.type === 'normalMap')
  105195. {
  105196. continue;
  105197. }
  105198. var key = file.key.substr(4);
  105199. var image = file.data;
  105200. // Now we need to find out which json entry this mapped to
  105201. for (var t = 0; t < fileJSON.data.textures.length; t++)
  105202. {
  105203. var item = fileJSON.data.textures[t];
  105204. if (item.image === key)
  105205. {
  105206. images.push(image);
  105207. data.push(item);
  105208. if (file.linkFile)
  105209. {
  105210. normalMaps.push(file.linkFile.data);
  105211. }
  105212. break;
  105213. }
  105214. }
  105215. }
  105216. if (normalMaps.length === 0)
  105217. {
  105218. normalMaps = undefined;
  105219. }
  105220. this.loader.textureManager.addAtlasJSONArray(this.key, images, data, normalMaps);
  105221. this.complete = true;
  105222. for (i = 0; i < this.files.length; i++)
  105223. {
  105224. this.files[i].pendingDestroy();
  105225. }
  105226. }
  105227. }
  105228. });
  105229. /**
  105230. * Adds a Multi Texture Atlas, or array of multi atlases, to the current load queue.
  105231. *
  105232. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  105233. *
  105234. * ```javascript
  105235. * function preload ()
  105236. * {
  105237. * this.load.multiatlas('level1', 'images/Level1.json');
  105238. * }
  105239. * ```
  105240. *
  105241. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  105242. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  105243. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  105244. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  105245. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  105246. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  105247. * loaded.
  105248. *
  105249. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  105250. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  105251. *
  105252. * Phaser expects the atlas data to be provided in a JSON file as exported from the application Texture Packer,
  105253. * version 4.6.3 or above, where you have made sure to use the Phaser 3 Export option.
  105254. *
  105255. * The way it works internally is that you provide a URL to the JSON file. Phaser then loads this JSON, parses it and
  105256. * extracts which texture files it also needs to load to complete the process. If the JSON also defines normal maps,
  105257. * Phaser will load those as well.
  105258. *
  105259. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  105260. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  105261. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  105262. * then remove it from the Texture Manager first, before loading a new one.
  105263. *
  105264. * Instead of passing arguments you can pass a configuration object, such as:
  105265. *
  105266. * ```javascript
  105267. * this.load.multiatlas({
  105268. * key: 'level1',
  105269. * atlasURL: 'images/Level1.json'
  105270. * });
  105271. * ```
  105272. *
  105273. * See the documentation for `Phaser.Loader.FileTypes.MultiAtlasFileConfig` for more details.
  105274. *
  105275. * Instead of passing a URL for the atlas JSON data you can also pass in a well formed JSON object instead.
  105276. *
  105277. * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key:
  105278. *
  105279. * ```javascript
  105280. * this.load.multiatlas('level1', 'images/Level1.json');
  105281. * // and later in your game ...
  105282. * this.add.image(x, y, 'level1', 'background');
  105283. * ```
  105284. *
  105285. * To get a list of all available frames within an atlas please consult your Texture Atlas software.
  105286. *
  105287. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  105288. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  105289. * this is what you would use to retrieve the image from the Texture Manager.
  105290. *
  105291. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  105292. *
  105293. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  105294. * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although
  105295. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  105296. *
  105297. * Note: The ability to load this type of file will only be available if the Multi Atlas File type has been built into Phaser.
  105298. * It is available in the default build but can be excluded from custom builds.
  105299. *
  105300. * @method Phaser.Loader.LoaderPlugin#multiatlas
  105301. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  105302. * @since 3.7.0
  105303. *
  105304. * @param {(string|Phaser.Loader.FileTypes.MultiAtlasFileConfig|Phaser.Loader.FileTypes.MultiAtlasFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  105305. * @param {string} [atlasURL] - The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  105306. * @param {string} [path] - Optional path to use when loading the textures defined in the atlas data.
  105307. * @param {string} [baseURL] - Optional Base URL to use when loading the textures defined in the atlas data.
  105308. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings.
  105309. *
  105310. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  105311. */
  105312. FileTypesManager.register('multiatlas', function (key, atlasURL, path, baseURL, atlasXhrSettings)
  105313. {
  105314. var multifile;
  105315. // Supports an Object file definition in the key argument
  105316. // Or an array of objects in the key argument
  105317. // Or a single entry where all arguments have been defined
  105318. if (Array.isArray(key))
  105319. {
  105320. for (var i = 0; i < key.length; i++)
  105321. {
  105322. multifile = new MultiAtlasFile(this, key[i]);
  105323. this.addFile(multifile.files);
  105324. }
  105325. }
  105326. else
  105327. {
  105328. multifile = new MultiAtlasFile(this, key, atlasURL, path, baseURL, atlasXhrSettings);
  105329. this.addFile(multifile.files);
  105330. }
  105331. return this;
  105332. });
  105333. module.exports = MultiAtlasFile;
  105334. /***/ }),
  105335. /* 591 */
  105336. /***/ (function(module, exports, __webpack_require__) {
  105337. /**
  105338. * @author Richard Davey <rich@photonstorm.com>
  105339. * @copyright 2019 Photon Storm Ltd.
  105340. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105341. */
  105342. var Class = __webpack_require__(0);
  105343. var CONST = __webpack_require__(15);
  105344. var File = __webpack_require__(22);
  105345. var FileTypesManager = __webpack_require__(7);
  105346. var GetFastValue = __webpack_require__(2);
  105347. var IsPlainObject = __webpack_require__(8);
  105348. /**
  105349. * @typedef {object} Phaser.Loader.FileTypes.HTMLTextureFileConfig
  105350. *
  105351. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  105352. * @property {string} [url] - The absolute or relative URL to load the file from.
  105353. * @property {string} [extension='html'] - The default file extension to use if no url is provided.
  105354. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  105355. * @property {integer} [width=512] - The width of the texture the HTML will be rendered to.
  105356. * @property {integer} [height=512] - The height of the texture the HTML will be rendered to.
  105357. */
  105358. /**
  105359. * @classdesc
  105360. * A single HTML File suitable for loading by the Loader.
  105361. *
  105362. * These are created when you use the Phaser.Loader.LoaderPlugin#htmlTexture method and are not typically created directly.
  105363. *
  105364. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#htmlTexture.
  105365. *
  105366. * @class HTMLTextureFile
  105367. * @extends Phaser.Loader.File
  105368. * @memberof Phaser.Loader.FileTypes
  105369. * @constructor
  105370. * @since 3.12.0
  105371. *
  105372. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  105373. * @param {(string|Phaser.Loader.FileTypes.HTMLTextureFileConfig)} key - The key to use for this file, or a file configuration object.
  105374. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  105375. * @param {integer} [width] - The width of the texture the HTML will be rendered to.
  105376. * @param {integer} [height] - The height of the texture the HTML will be rendered to.
  105377. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  105378. */
  105379. var HTMLTextureFile = new Class({
  105380. Extends: File,
  105381. initialize:
  105382. function HTMLTextureFile (loader, key, url, width, height, xhrSettings)
  105383. {
  105384. if (width === undefined) { width = 512; }
  105385. if (height === undefined) { height = 512; }
  105386. var extension = 'html';
  105387. if (IsPlainObject(key))
  105388. {
  105389. var config = key;
  105390. key = GetFastValue(config, 'key');
  105391. url = GetFastValue(config, 'url');
  105392. xhrSettings = GetFastValue(config, 'xhrSettings');
  105393. extension = GetFastValue(config, 'extension', extension);
  105394. width = GetFastValue(config, 'width', width);
  105395. height = GetFastValue(config, 'height', height);
  105396. }
  105397. var fileConfig = {
  105398. type: 'html',
  105399. cache: loader.textureManager,
  105400. extension: extension,
  105401. responseType: 'text',
  105402. key: key,
  105403. url: url,
  105404. xhrSettings: xhrSettings,
  105405. config: {
  105406. width: width,
  105407. height: height
  105408. }
  105409. };
  105410. File.call(this, loader, fileConfig);
  105411. },
  105412. /**
  105413. * Called automatically by Loader.nextFile.
  105414. * This method controls what extra work this File does with its loaded data.
  105415. *
  105416. * @method Phaser.Loader.FileTypes.HTMLTextureFile#onProcess
  105417. * @since 3.7.0
  105418. */
  105419. onProcess: function ()
  105420. {
  105421. this.state = CONST.FILE_PROCESSING;
  105422. var w = this.config.width;
  105423. var h = this.config.height;
  105424. var data = [];
  105425. data.push('<svg width="' + w + 'px" height="' + h + 'px" viewBox="0 0 ' + w + ' ' + h + '" xmlns="http://www.w3.org/2000/svg">');
  105426. data.push('<foreignObject width="100%" height="100%">');
  105427. data.push('<body xmlns="http://www.w3.org/1999/xhtml">');
  105428. data.push(this.xhrLoader.responseText);
  105429. data.push('</body>');
  105430. data.push('</foreignObject>');
  105431. data.push('</svg>');
  105432. var svg = [ data.join('\n') ];
  105433. var _this = this;
  105434. try
  105435. {
  105436. var blob = new window.Blob(svg, { type: 'image/svg+xml;charset=utf-8' });
  105437. }
  105438. catch (e)
  105439. {
  105440. _this.state = CONST.FILE_ERRORED;
  105441. _this.onProcessComplete();
  105442. return;
  105443. }
  105444. this.data = new Image();
  105445. this.data.crossOrigin = this.crossOrigin;
  105446. this.data.onload = function ()
  105447. {
  105448. File.revokeObjectURL(_this.data);
  105449. _this.onProcessComplete();
  105450. };
  105451. this.data.onerror = function ()
  105452. {
  105453. File.revokeObjectURL(_this.data);
  105454. _this.onProcessError();
  105455. };
  105456. File.createObjectURL(this.data, blob, 'image/svg+xml');
  105457. },
  105458. /**
  105459. * Adds this file to its target cache upon successful loading and processing.
  105460. *
  105461. * @method Phaser.Loader.FileTypes.HTMLTextureFile#addToCache
  105462. * @since 3.7.0
  105463. */
  105464. addToCache: function ()
  105465. {
  105466. var texture = this.cache.addImage(this.key, this.data);
  105467. this.pendingDestroy(texture);
  105468. }
  105469. });
  105470. /**
  105471. * Adds an HTML File, or array of HTML Files, to the current load queue. When the files are loaded they
  105472. * will be rendered to textures and stored in the Texture Manager.
  105473. *
  105474. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  105475. *
  105476. * ```javascript
  105477. * function preload ()
  105478. * {
  105479. * this.load.htmlTexture('instructions', 'content/intro.html', 256, 512);
  105480. * }
  105481. * ```
  105482. *
  105483. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  105484. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  105485. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  105486. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  105487. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  105488. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  105489. * loaded.
  105490. *
  105491. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  105492. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  105493. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  105494. * then remove it from the Texture Manager first, before loading a new one.
  105495. *
  105496. * Instead of passing arguments you can pass a configuration object, such as:
  105497. *
  105498. * ```javascript
  105499. * this.load.htmlTexture({
  105500. * key: 'instructions',
  105501. * url: 'content/intro.html',
  105502. * width: 256,
  105503. * height: 512
  105504. * });
  105505. * ```
  105506. *
  105507. * See the documentation for `Phaser.Loader.FileTypes.HTMLTextureFileConfig` for more details.
  105508. *
  105509. * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key:
  105510. *
  105511. * ```javascript
  105512. * this.load.htmlTexture('instructions', 'content/intro.html', 256, 512);
  105513. * // and later in your game ...
  105514. * this.add.image(x, y, 'instructions');
  105515. * ```
  105516. *
  105517. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  105518. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  105519. * this is what you would use to retrieve the image from the Texture Manager.
  105520. *
  105521. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  105522. *
  105523. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  105524. * and no URL is given then the Loader will set the URL to be "alien.html". It will always add `.html` as the extension, although
  105525. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  105526. *
  105527. * The width and height are the size of the texture to which the HTML will be rendered. It's not possible to determine these
  105528. * automatically, so you will need to provide them, either as arguments or in the file config object.
  105529. * When the HTML file has loaded a new SVG element is created with a size and viewbox set to the width and height given.
  105530. * The SVG file has a body tag added to it, with the HTML file contents included. It then calls `window.Blob` on the SVG,
  105531. * and if successful is added to the Texture Manager, otherwise it fails processing. The overall quality of the rendered
  105532. * HTML depends on your browser, and some of them may not even support the svg / blob process used. Be aware that there are
  105533. * limitations on what HTML can be inside an SVG. You can find out more details in this
  105534. * [Mozilla MDN entry](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas).
  105535. *
  105536. * Note: The ability to load this type of file will only be available if the HTMLTextureFile File type has been built into Phaser.
  105537. * It is available in the default build but can be excluded from custom builds.
  105538. *
  105539. * @method Phaser.Loader.LoaderPlugin#htmlTexture
  105540. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  105541. * @since 3.12.0
  105542. *
  105543. * @param {(string|Phaser.Loader.FileTypes.HTMLTextureFileConfig|Phaser.Loader.FileTypes.HTMLTextureFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  105544. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.html`, i.e. if `key` was "alien" then the URL will be "alien.html".
  105545. * @param {integer} [width=512] - The width of the texture the HTML will be rendered to.
  105546. * @param {integer} [height=512] - The height of the texture the HTML will be rendered to.
  105547. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  105548. *
  105549. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  105550. */
  105551. FileTypesManager.register('htmlTexture', function (key, url, width, height, xhrSettings)
  105552. {
  105553. if (Array.isArray(key))
  105554. {
  105555. for (var i = 0; i < key.length; i++)
  105556. {
  105557. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  105558. this.addFile(new HTMLTextureFile(this, key[i]));
  105559. }
  105560. }
  105561. else
  105562. {
  105563. this.addFile(new HTMLTextureFile(this, key, url, width, height, xhrSettings));
  105564. }
  105565. return this;
  105566. });
  105567. module.exports = HTMLTextureFile;
  105568. /***/ }),
  105569. /* 592 */
  105570. /***/ (function(module, exports, __webpack_require__) {
  105571. /**
  105572. * @author Richard Davey <rich@photonstorm.com>
  105573. * @copyright 2019 Photon Storm Ltd.
  105574. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105575. */
  105576. var Class = __webpack_require__(0);
  105577. var CONST = __webpack_require__(15);
  105578. var File = __webpack_require__(22);
  105579. var FileTypesManager = __webpack_require__(7);
  105580. var GetFastValue = __webpack_require__(2);
  105581. var IsPlainObject = __webpack_require__(8);
  105582. /**
  105583. * @typedef {object} Phaser.Loader.FileTypes.HTMLFileConfig
  105584. *
  105585. * @property {string} key - The key of the file. Must be unique within both the Loader and the Text Cache.
  105586. * @property {string} [url] - The absolute or relative URL to load the file from.
  105587. * @property {string} [extension='html'] - The default file extension to use if no url is provided.
  105588. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  105589. */
  105590. /**
  105591. * @classdesc
  105592. * A single HTML File suitable for loading by the Loader.
  105593. *
  105594. * These are created when you use the Phaser.Loader.LoaderPlugin#html method and are not typically created directly.
  105595. *
  105596. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#html.
  105597. *
  105598. * @class HTMLFile
  105599. * @extends Phaser.Loader.File
  105600. * @memberof Phaser.Loader.FileTypes
  105601. * @constructor
  105602. * @since 3.12.0
  105603. *
  105604. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  105605. * @param {(string|Phaser.Loader.FileTypes.HTMLFileConfig)} key - The key to use for this file, or a file configuration object.
  105606. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.txt`, i.e. if `key` was "alien" then the URL will be "alien.html".
  105607. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  105608. */
  105609. var HTMLFile = new Class({
  105610. Extends: File,
  105611. initialize:
  105612. function HTMLFile (loader, key, url, xhrSettings)
  105613. {
  105614. var extension = 'html';
  105615. if (IsPlainObject(key))
  105616. {
  105617. var config = key;
  105618. key = GetFastValue(config, 'key');
  105619. url = GetFastValue(config, 'url');
  105620. xhrSettings = GetFastValue(config, 'xhrSettings');
  105621. extension = GetFastValue(config, 'extension', extension);
  105622. }
  105623. var fileConfig = {
  105624. type: 'text',
  105625. cache: loader.cacheManager.html,
  105626. extension: extension,
  105627. responseType: 'text',
  105628. key: key,
  105629. url: url,
  105630. xhrSettings: xhrSettings
  105631. };
  105632. File.call(this, loader, fileConfig);
  105633. },
  105634. /**
  105635. * Called automatically by Loader.nextFile.
  105636. * This method controls what extra work this File does with its loaded data.
  105637. *
  105638. * @method Phaser.Loader.FileTypes.HTMLFile#onProcess
  105639. * @since 3.7.0
  105640. */
  105641. onProcess: function ()
  105642. {
  105643. this.state = CONST.FILE_PROCESSING;
  105644. this.data = this.xhrLoader.responseText;
  105645. this.onProcessComplete();
  105646. }
  105647. });
  105648. /**
  105649. * Adds an HTML file, or array of HTML files, to the current load queue.
  105650. *
  105651. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  105652. *
  105653. * ```javascript
  105654. * function preload ()
  105655. * {
  105656. * this.load.html('story', 'files/LoginForm.html');
  105657. * }
  105658. * ```
  105659. *
  105660. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  105661. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  105662. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  105663. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  105664. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  105665. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  105666. * loaded.
  105667. *
  105668. * The key must be a unique String. It is used to add the file to the global HTML Cache upon a successful load.
  105669. * The key should be unique both in terms of files being loaded and files already present in the HTML Cache.
  105670. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  105671. * then remove it from the HTML Cache first, before loading a new one.
  105672. *
  105673. * Instead of passing arguments you can pass a configuration object, such as:
  105674. *
  105675. * ```javascript
  105676. * this.load.html({
  105677. * key: 'login',
  105678. * url: 'files/LoginForm.html'
  105679. * });
  105680. * ```
  105681. *
  105682. * See the documentation for `Phaser.Loader.FileTypes.HTMLFileConfig` for more details.
  105683. *
  105684. * Once the file has finished loading you can access it from its Cache using its key:
  105685. *
  105686. * ```javascript
  105687. * this.load.html('login', 'files/LoginForm.html');
  105688. * // and later in your game ...
  105689. * var data = this.cache.html.get('login');
  105690. * ```
  105691. *
  105692. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  105693. * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and
  105694. * this is what you would use to retrieve the html from the HTML Cache.
  105695. *
  105696. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  105697. *
  105698. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story"
  105699. * and no URL is given then the Loader will set the URL to be "story.html". It will always add `.html` as the extension, although
  105700. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  105701. *
  105702. * Note: The ability to load this type of file will only be available if the HTML File type has been built into Phaser.
  105703. * It is available in the default build but can be excluded from custom builds.
  105704. *
  105705. * @method Phaser.Loader.LoaderPlugin#html
  105706. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  105707. * @since 3.12.0
  105708. *
  105709. * @param {(string|Phaser.Loader.FileTypes.HTMLFileConfig|Phaser.Loader.FileTypes.HTMLFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  105710. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.html`, i.e. if `key` was "alien" then the URL will be "alien.html".
  105711. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  105712. *
  105713. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  105714. */
  105715. FileTypesManager.register('html', function (key, url, xhrSettings)
  105716. {
  105717. if (Array.isArray(key))
  105718. {
  105719. for (var i = 0; i < key.length; i++)
  105720. {
  105721. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  105722. this.addFile(new HTMLFile(this, key[i]));
  105723. }
  105724. }
  105725. else
  105726. {
  105727. this.addFile(new HTMLFile(this, key, url, xhrSettings));
  105728. }
  105729. return this;
  105730. });
  105731. module.exports = HTMLFile;
  105732. /***/ }),
  105733. /* 593 */
  105734. /***/ (function(module, exports, __webpack_require__) {
  105735. /**
  105736. * @author Richard Davey <rich@photonstorm.com>
  105737. * @copyright 2019 Photon Storm Ltd.
  105738. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105739. */
  105740. var Class = __webpack_require__(0);
  105741. var CONST = __webpack_require__(15);
  105742. var File = __webpack_require__(22);
  105743. var FileTypesManager = __webpack_require__(7);
  105744. var GetFastValue = __webpack_require__(2);
  105745. var IsPlainObject = __webpack_require__(8);
  105746. /**
  105747. * @typedef {object} Phaser.Loader.FileTypes.GLSLFileConfig
  105748. *
  105749. * @property {string} key - The key of the file. Must be unique within both the Loader and the Text Cache.
  105750. * @property {string} [url] - The absolute or relative URL to load the file from.
  105751. * @property {string} [extension='glsl'] - The default file extension to use if no url is provided.
  105752. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  105753. */
  105754. /**
  105755. * @classdesc
  105756. * A single GLSL File suitable for loading by the Loader.
  105757. *
  105758. * These are created when you use the Phaser.Loader.LoaderPlugin#glsl method and are not typically created directly.
  105759. *
  105760. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#glsl.
  105761. *
  105762. * @class GLSLFile
  105763. * @extends Phaser.Loader.File
  105764. * @memberof Phaser.Loader.FileTypes
  105765. * @constructor
  105766. * @since 3.0.0
  105767. *
  105768. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  105769. * @param {(string|Phaser.Loader.FileTypes.TextFileConfig)} key - The key to use for this file, or a file configuration object.
  105770. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt".
  105771. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  105772. */
  105773. var GLSLFile = new Class({
  105774. Extends: File,
  105775. initialize:
  105776. function GLSLFile (loader, key, url, xhrSettings)
  105777. {
  105778. var extension = 'glsl';
  105779. if (IsPlainObject(key))
  105780. {
  105781. var config = key;
  105782. key = GetFastValue(config, 'key');
  105783. url = GetFastValue(config, 'url');
  105784. xhrSettings = GetFastValue(config, 'xhrSettings');
  105785. extension = GetFastValue(config, 'extension', extension);
  105786. }
  105787. var fileConfig = {
  105788. type: 'glsl',
  105789. cache: loader.cacheManager.shader,
  105790. extension: extension,
  105791. responseType: 'text',
  105792. key: key,
  105793. url: url,
  105794. xhrSettings: xhrSettings
  105795. };
  105796. File.call(this, loader, fileConfig);
  105797. },
  105798. /**
  105799. * Called automatically by Loader.nextFile.
  105800. * This method controls what extra work this File does with its loaded data.
  105801. *
  105802. * @method Phaser.Loader.FileTypes.GLSLFile#onProcess
  105803. * @since 3.7.0
  105804. */
  105805. onProcess: function ()
  105806. {
  105807. this.state = CONST.FILE_PROCESSING;
  105808. this.data = this.xhrLoader.responseText;
  105809. this.onProcessComplete();
  105810. }
  105811. });
  105812. /**
  105813. * Adds a GLSL file, or array of GLSL files, to the current load queue.
  105814. * In Phaser 3 GLSL files are just plain Text files at the current moment in time.
  105815. *
  105816. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  105817. *
  105818. * ```javascript
  105819. * function preload ()
  105820. * {
  105821. * this.load.glsl('plasma', 'shaders/Plasma.glsl');
  105822. * }
  105823. * ```
  105824. *
  105825. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  105826. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  105827. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  105828. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  105829. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  105830. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  105831. * loaded.
  105832. *
  105833. * The key must be a unique String. It is used to add the file to the global Shader Cache upon a successful load.
  105834. * The key should be unique both in terms of files being loaded and files already present in the Shader Cache.
  105835. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  105836. * then remove it from the Shader Cache first, before loading a new one.
  105837. *
  105838. * Instead of passing arguments you can pass a configuration object, such as:
  105839. *
  105840. * ```javascript
  105841. * this.load.glsl({
  105842. * key: 'plasma',
  105843. * url: 'shaders/Plasma.glsl'
  105844. * });
  105845. * ```
  105846. *
  105847. * See the documentation for `Phaser.Loader.FileTypes.GLSLFileConfig` for more details.
  105848. *
  105849. * Once the file has finished loading you can access it from its Cache using its key:
  105850. *
  105851. * ```javascript
  105852. * this.load.glsl('plasma', 'shaders/Plasma.glsl');
  105853. * // and later in your game ...
  105854. * var data = this.cache.shader.get('plasma');
  105855. * ```
  105856. *
  105857. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  105858. * key. For example, if the prefix was `FX.` and the key was `Plasma` the final key will be `FX.Plasma` and
  105859. * this is what you would use to retrieve the text from the Shader Cache.
  105860. *
  105861. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  105862. *
  105863. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "plasma"
  105864. * and no URL is given then the Loader will set the URL to be "plasma.glsl". It will always add `.glsl` as the extension, although
  105865. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  105866. *
  105867. * Note: The ability to load this type of file will only be available if the GLSL File type has been built into Phaser.
  105868. * It is available in the default build but can be excluded from custom builds.
  105869. *
  105870. * @method Phaser.Loader.LoaderPlugin#glsl
  105871. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  105872. * @since 3.0.0
  105873. *
  105874. * @param {(string|Phaser.Loader.FileTypes.GLSLFileConfig|Phaser.Loader.FileTypes.GLSLFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  105875. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.glsl`, i.e. if `key` was "alien" then the URL will be "alien.glsl".
  105876. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  105877. *
  105878. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  105879. */
  105880. FileTypesManager.register('glsl', function (key, url, xhrSettings)
  105881. {
  105882. if (Array.isArray(key))
  105883. {
  105884. for (var i = 0; i < key.length; i++)
  105885. {
  105886. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  105887. this.addFile(new GLSLFile(this, key[i]));
  105888. }
  105889. }
  105890. else
  105891. {
  105892. this.addFile(new GLSLFile(this, key, url, xhrSettings));
  105893. }
  105894. return this;
  105895. });
  105896. module.exports = GLSLFile;
  105897. /***/ }),
  105898. /* 594 */
  105899. /***/ (function(module, exports, __webpack_require__) {
  105900. /**
  105901. * @author Richard Davey <rich@photonstorm.com>
  105902. * @copyright 2019 Photon Storm Ltd.
  105903. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105904. */
  105905. var Class = __webpack_require__(0);
  105906. var FileTypesManager = __webpack_require__(7);
  105907. var GetFastValue = __webpack_require__(2);
  105908. var ImageFile = __webpack_require__(64);
  105909. var IsPlainObject = __webpack_require__(8);
  105910. var MultiFile = __webpack_require__(63);
  105911. var ParseXMLBitmapFont = __webpack_require__(314);
  105912. var XMLFile = __webpack_require__(150);
  105913. /**
  105914. * @typedef {object} Phaser.Loader.FileTypes.BitmapFontFileConfig
  105915. *
  105916. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  105917. * @property {string} [textureURL] - The absolute or relative URL to load the texture image file from.
  105918. * @property {string} [textureExtension='png'] - The default file extension to use for the image texture if no url is provided.
  105919. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture image file.
  105920. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the texture image.
  105921. * @property {string} [fontDataURL] - The absolute or relative URL to load the font data xml file from.
  105922. * @property {string} [fontDataExtension='xml'] - The default file extension to use for the font data xml if no url is provided.
  105923. * @property {XHRSettingsObject} [fontDataXhrSettings] - Extra XHR Settings specifically for the font data xml file.
  105924. */
  105925. /**
  105926. * @classdesc
  105927. * A single Bitmap Font based File suitable for loading by the Loader.
  105928. *
  105929. * These are created when you use the Phaser.Loader.LoaderPlugin#bitmapFont method and are not typically created directly.
  105930. *
  105931. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#bitmapFont.
  105932. *
  105933. * @class BitmapFontFile
  105934. * @extends Phaser.Loader.MultiFile
  105935. * @memberof Phaser.Loader.FileTypes
  105936. * @constructor
  105937. * @since 3.0.0
  105938. *
  105939. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  105940. * @param {(string|Phaser.Loader.FileTypes.BitmapFontFileConfig)} key - The key to use for this file, or a file configuration object.
  105941. * @param {string|string[]} [textureURL] - The absolute or relative URL to load the font image file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  105942. * @param {string} [fontDataURL] - The absolute or relative URL to load the font xml data file from. If undefined or `null` it will be set to `<key>.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml".
  105943. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the font image file. Used in replacement of the Loaders default XHR Settings.
  105944. * @param {XHRSettingsObject} [fontDataXhrSettings] - An XHR Settings configuration object for the font data xml file. Used in replacement of the Loaders default XHR Settings.
  105945. */
  105946. var BitmapFontFile = new Class({
  105947. Extends: MultiFile,
  105948. initialize:
  105949. function BitmapFontFile (loader, key, textureURL, fontDataURL, textureXhrSettings, fontDataXhrSettings)
  105950. {
  105951. var image;
  105952. var data;
  105953. if (IsPlainObject(key))
  105954. {
  105955. var config = key;
  105956. key = GetFastValue(config, 'key');
  105957. image = new ImageFile(loader, {
  105958. key: key,
  105959. url: GetFastValue(config, 'textureURL'),
  105960. extension: GetFastValue(config, 'textureExtension', 'png'),
  105961. normalMap: GetFastValue(config, 'normalMap'),
  105962. xhrSettings: GetFastValue(config, 'textureXhrSettings')
  105963. });
  105964. data = new XMLFile(loader, {
  105965. key: key,
  105966. url: GetFastValue(config, 'fontDataURL'),
  105967. extension: GetFastValue(config, 'fontDataExtension', 'xml'),
  105968. xhrSettings: GetFastValue(config, 'fontDataXhrSettings')
  105969. });
  105970. }
  105971. else
  105972. {
  105973. image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  105974. data = new XMLFile(loader, key, fontDataURL, fontDataXhrSettings);
  105975. }
  105976. if (image.linkFile)
  105977. {
  105978. // Image has a normal map
  105979. MultiFile.call(this, loader, 'bitmapfont', key, [ image, data, image.linkFile ]);
  105980. }
  105981. else
  105982. {
  105983. MultiFile.call(this, loader, 'bitmapfont', key, [ image, data ]);
  105984. }
  105985. },
  105986. /**
  105987. * Adds this file to its target cache upon successful loading and processing.
  105988. *
  105989. * @method Phaser.Loader.FileTypes.BitmapFontFile#addToCache
  105990. * @since 3.7.0
  105991. */
  105992. addToCache: function ()
  105993. {
  105994. if (this.isReadyToProcess())
  105995. {
  105996. var image = this.files[0];
  105997. var xml = this.files[1];
  105998. image.addToCache();
  105999. xml.addToCache();
  106000. this.loader.cacheManager.bitmapFont.add(image.key, { data: ParseXMLBitmapFont(xml.data), texture: image.key, frame: null });
  106001. this.complete = true;
  106002. }
  106003. }
  106004. });
  106005. /**
  106006. * Adds an XML based Bitmap Font, or array of fonts, to the current load queue.
  106007. *
  106008. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  106009. * ```javascript
  106010. * function preload ()
  106011. * {
  106012. * this.load.bitmapFont('goldenFont', 'images/GoldFont.png', 'images/GoldFont.xml');
  106013. * }
  106014. * ```
  106015. *
  106016. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  106017. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  106018. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  106019. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  106020. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  106021. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  106022. * loaded.
  106023. *
  106024. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  106025. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  106026. *
  106027. * Phaser expects the font data to be provided in an XML file format.
  106028. * These files are created by software such as the [Angelcode Bitmap Font Generator](http://www.angelcode.com/products/bmfont/),
  106029. * [Littera](http://kvazars.com/littera/) or [Glyph Designer](https://71squared.com/glyphdesigner)
  106030. *
  106031. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  106032. *
  106033. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  106034. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  106035. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  106036. * then remove it from the Texture Manager first, before loading a new one.
  106037. *
  106038. * Instead of passing arguments you can pass a configuration object, such as:
  106039. *
  106040. * ```javascript
  106041. * this.load.bitmapFont({
  106042. * key: 'goldenFont',
  106043. * textureURL: 'images/GoldFont.png',
  106044. * fontDataURL: 'images/GoldFont.xml'
  106045. * });
  106046. * ```
  106047. *
  106048. * See the documentation for `Phaser.Loader.FileTypes.BitmapFontFileConfig` for more details.
  106049. *
  106050. * Once the atlas has finished loading you can use key of it when creating a Bitmap Text Game Object:
  106051. *
  106052. * ```javascript
  106053. * this.load.bitmapFont('goldenFont', 'images/GoldFont.png', 'images/GoldFont.xml');
  106054. * // and later in your game ...
  106055. * this.add.bitmapText(x, y, 'goldenFont', 'Hello World');
  106056. * ```
  106057. *
  106058. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  106059. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  106060. * this is what you would use when creating a Bitmap Text object.
  106061. *
  106062. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  106063. *
  106064. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  106065. * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although
  106066. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  106067. *
  106068. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  106069. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  106070. *
  106071. * ```javascript
  106072. * this.load.bitmapFont('goldenFont', [ 'images/GoldFont.png', 'images/GoldFont-n.png' ], 'images/GoldFont.xml');
  106073. * ```
  106074. *
  106075. * Or, if you are using a config object use the `normalMap` property:
  106076. *
  106077. * ```javascript
  106078. * this.load.bitmapFont({
  106079. * key: 'goldenFont',
  106080. * textureURL: 'images/GoldFont.png',
  106081. * normalMap: 'images/GoldFont-n.png',
  106082. * fontDataURL: 'images/GoldFont.xml'
  106083. * });
  106084. * ```
  106085. *
  106086. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  106087. * Normal maps are a WebGL only feature.
  106088. *
  106089. * Note: The ability to load this type of file will only be available if the Bitmap Font File type has been built into Phaser.
  106090. * It is available in the default build but can be excluded from custom builds.
  106091. *
  106092. * @method Phaser.Loader.LoaderPlugin#bitmapFont
  106093. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  106094. * @since 3.0.0
  106095. *
  106096. * @param {(string|Phaser.Loader.FileTypes.BitmapFontFileConfig|Phaser.Loader.FileTypes.BitmapFontFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  106097. * @param {string|string[]} [textureURL] - The absolute or relative URL to load the font image file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  106098. * @param {string} [fontDataURL] - The absolute or relative URL to load the font xml data file from. If undefined or `null` it will be set to `<key>.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml".
  106099. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the font image file. Used in replacement of the Loaders default XHR Settings.
  106100. * @param {XHRSettingsObject} [fontDataXhrSettings] - An XHR Settings configuration object for the font data xml file. Used in replacement of the Loaders default XHR Settings.
  106101. *
  106102. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  106103. */
  106104. FileTypesManager.register('bitmapFont', function (key, textureURL, fontDataURL, textureXhrSettings, fontDataXhrSettings)
  106105. {
  106106. var multifile;
  106107. // Supports an Object file definition in the key argument
  106108. // Or an array of objects in the key argument
  106109. // Or a single entry where all arguments have been defined
  106110. if (Array.isArray(key))
  106111. {
  106112. for (var i = 0; i < key.length; i++)
  106113. {
  106114. multifile = new BitmapFontFile(this, key[i]);
  106115. this.addFile(multifile.files);
  106116. }
  106117. }
  106118. else
  106119. {
  106120. multifile = new BitmapFontFile(this, key, textureURL, fontDataURL, textureXhrSettings, fontDataXhrSettings);
  106121. this.addFile(multifile.files);
  106122. }
  106123. return this;
  106124. });
  106125. module.exports = BitmapFontFile;
  106126. /***/ }),
  106127. /* 595 */
  106128. /***/ (function(module, exports, __webpack_require__) {
  106129. /**
  106130. * @author Richard Davey <rich@photonstorm.com>
  106131. * @copyright 2019 Photon Storm Ltd.
  106132. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106133. */
  106134. var Class = __webpack_require__(0);
  106135. var CONST = __webpack_require__(15);
  106136. var File = __webpack_require__(22);
  106137. var FileTypesManager = __webpack_require__(7);
  106138. var GetFastValue = __webpack_require__(2);
  106139. var IsPlainObject = __webpack_require__(8);
  106140. /**
  106141. * @typedef {object} Phaser.Loader.FileTypes.BinaryFileConfig
  106142. *
  106143. * @property {string} key - The key of the file. Must be unique within both the Loader and the Binary Cache.
  106144. * @property {string} [url] - The absolute or relative URL to load the file from.
  106145. * @property {string} [extension='bin'] - The default file extension to use if no url is provided.
  106146. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  106147. * @property {any} [dataType] - Optional type to cast the binary file to once loaded. For example, `Uint8Array`.
  106148. */
  106149. /**
  106150. * @classdesc
  106151. * A single Binary File suitable for loading by the Loader.
  106152. *
  106153. * These are created when you use the Phaser.Loader.LoaderPlugin#binary method and are not typically created directly.
  106154. *
  106155. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#binary.
  106156. *
  106157. * @class BinaryFile
  106158. * @extends Phaser.Loader.File
  106159. * @memberof Phaser.Loader.FileTypes
  106160. * @constructor
  106161. * @since 3.0.0
  106162. *
  106163. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  106164. * @param {(string|Phaser.Loader.FileTypes.BinaryFileConfig)} key - The key to use for this file, or a file configuration object.
  106165. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.bin`, i.e. if `key` was "alien" then the URL will be "alien.bin".
  106166. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  106167. * @param {any} [dataType] - Optional type to cast the binary file to once loaded. For example, `Uint8Array`.
  106168. */
  106169. var BinaryFile = new Class({
  106170. Extends: File,
  106171. initialize:
  106172. function BinaryFile (loader, key, url, xhrSettings, dataType)
  106173. {
  106174. var extension = 'bin';
  106175. if (IsPlainObject(key))
  106176. {
  106177. var config = key;
  106178. key = GetFastValue(config, 'key');
  106179. url = GetFastValue(config, 'url');
  106180. xhrSettings = GetFastValue(config, 'xhrSettings');
  106181. extension = GetFastValue(config, 'extension', extension);
  106182. dataType = GetFastValue(config, 'dataType', dataType);
  106183. }
  106184. var fileConfig = {
  106185. type: 'binary',
  106186. cache: loader.cacheManager.binary,
  106187. extension: extension,
  106188. responseType: 'arraybuffer',
  106189. key: key,
  106190. url: url,
  106191. xhrSettings: xhrSettings,
  106192. config: { dataType: dataType }
  106193. };
  106194. File.call(this, loader, fileConfig);
  106195. },
  106196. /**
  106197. * Called automatically by Loader.nextFile.
  106198. * This method controls what extra work this File does with its loaded data.
  106199. *
  106200. * @method Phaser.Loader.FileTypes.BinaryFile#onProcess
  106201. * @since 3.7.0
  106202. */
  106203. onProcess: function ()
  106204. {
  106205. this.state = CONST.FILE_PROCESSING;
  106206. var ctor = this.config.dataType;
  106207. this.data = (ctor) ? new ctor(this.xhrLoader.response) : this.xhrLoader.response;
  106208. this.onProcessComplete();
  106209. }
  106210. });
  106211. /**
  106212. * Adds a Binary file, or array of Binary files, to the current load queue.
  106213. *
  106214. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  106215. *
  106216. * ```javascript
  106217. * function preload ()
  106218. * {
  106219. * this.load.binary('doom', 'files/Doom.wad');
  106220. * }
  106221. * ```
  106222. *
  106223. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  106224. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  106225. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  106226. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  106227. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  106228. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  106229. * loaded.
  106230. *
  106231. * The key must be a unique String. It is used to add the file to the global Binary Cache upon a successful load.
  106232. * The key should be unique both in terms of files being loaded and files already present in the Binary Cache.
  106233. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  106234. * then remove it from the Binary Cache first, before loading a new one.
  106235. *
  106236. * Instead of passing arguments you can pass a configuration object, such as:
  106237. *
  106238. * ```javascript
  106239. * this.load.binary({
  106240. * key: 'doom',
  106241. * url: 'files/Doom.wad',
  106242. * dataType: Uint8Array
  106243. * });
  106244. * ```
  106245. *
  106246. * See the documentation for `Phaser.Loader.FileTypes.BinaryFileConfig` for more details.
  106247. *
  106248. * Once the file has finished loading you can access it from its Cache using its key:
  106249. *
  106250. * ```javascript
  106251. * this.load.binary('doom', 'files/Doom.wad');
  106252. * // and later in your game ...
  106253. * var data = this.cache.binary.get('doom');
  106254. * ```
  106255. *
  106256. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  106257. * key. For example, if the prefix was `LEVEL1.` and the key was `Data` the final key will be `LEVEL1.Data` and
  106258. * this is what you would use to retrieve the text from the Binary Cache.
  106259. *
  106260. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  106261. *
  106262. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "doom"
  106263. * and no URL is given then the Loader will set the URL to be "doom.bin". It will always add `.bin` as the extension, although
  106264. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  106265. *
  106266. * Note: The ability to load this type of file will only be available if the Binary File type has been built into Phaser.
  106267. * It is available in the default build but can be excluded from custom builds.
  106268. *
  106269. * @method Phaser.Loader.LoaderPlugin#binary
  106270. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  106271. * @since 3.0.0
  106272. *
  106273. * @param {(string|Phaser.Loader.FileTypes.BinaryFileConfig|Phaser.Loader.FileTypes.BinaryFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  106274. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.bin`, i.e. if `key` was "alien" then the URL will be "alien.bin".
  106275. * @param {any} [dataType] - Optional type to cast the binary file to once loaded. For example, `Uint8Array`.
  106276. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  106277. *
  106278. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  106279. */
  106280. FileTypesManager.register('binary', function (key, url, dataType, xhrSettings)
  106281. {
  106282. if (Array.isArray(key))
  106283. {
  106284. for (var i = 0; i < key.length; i++)
  106285. {
  106286. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  106287. this.addFile(new BinaryFile(this, key[i]));
  106288. }
  106289. }
  106290. else
  106291. {
  106292. this.addFile(new BinaryFile(this, key, url, xhrSettings, dataType));
  106293. }
  106294. return this;
  106295. });
  106296. module.exports = BinaryFile;
  106297. /***/ }),
  106298. /* 596 */
  106299. /***/ (function(module, exports, __webpack_require__) {
  106300. /**
  106301. * @author Richard Davey <rich@photonstorm.com>
  106302. * @copyright 2019 Photon Storm Ltd.
  106303. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106304. */
  106305. var AudioFile = __webpack_require__(258);
  106306. var Class = __webpack_require__(0);
  106307. var FileTypesManager = __webpack_require__(7);
  106308. var GetFastValue = __webpack_require__(2);
  106309. var IsPlainObject = __webpack_require__(8);
  106310. var JSONFile = __webpack_require__(55);
  106311. var MultiFile = __webpack_require__(63);
  106312. /**
  106313. * @typedef {object} Phaser.Loader.FileTypes.AudioSpriteFileConfig
  106314. *
  106315. * @property {string} key - The key of the file. Must be unique within both the Loader and the Audio Cache.
  106316. * @property {string} jsonURL - The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead.
  106317. * @property {XHRSettingsObject} [jsonXhrSettings] - Extra XHR Settings specifically for the json file.
  106318. * @property {{(string|string[])}} [audioURL] - The absolute or relative URL to load the audio file from.
  106319. * @property {any} [audioConfig] - The audio configuration options.
  106320. * @property {XHRSettingsObject} [audioXhrSettings] - Extra XHR Settings specifically for the audio file.
  106321. */
  106322. /**
  106323. * @classdesc
  106324. * An Audio Sprite File suitable for loading by the Loader.
  106325. *
  106326. * These are created when you use the Phaser.Loader.LoaderPlugin#audioSprite method and are not typically created directly.
  106327. *
  106328. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audioSprite.
  106329. *
  106330. * @class AudioSpriteFile
  106331. * @extends Phaser.Loader.MultiFile
  106332. * @memberof Phaser.Loader.FileTypes
  106333. * @constructor
  106334. * @since 3.7.0
  106335. *
  106336. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  106337. * @param {(string|Phaser.Loader.FileTypes.AudioSpriteFileConfig)} key - The key to use for this file, or a file configuration object.
  106338. * @param {string} jsonURL - The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead.
  106339. * @param {{(string|string[])}} [audioURL] - The absolute or relative URL to load the audio file from. If empty it will be obtained by parsing the JSON file.
  106340. * @param {any} [audioConfig] - The audio configuration options.
  106341. * @param {XHRSettingsObject} [audioXhrSettings] - An XHR Settings configuration object for the audio file. Used in replacement of the Loaders default XHR Settings.
  106342. * @param {XHRSettingsObject} [jsonXhrSettings] - An XHR Settings configuration object for the json file. Used in replacement of the Loaders default XHR Settings.
  106343. */
  106344. var AudioSpriteFile = new Class({
  106345. Extends: MultiFile,
  106346. initialize:
  106347. function AudioSpriteFile (loader, key, jsonURL, audioURL, audioConfig, audioXhrSettings, jsonXhrSettings)
  106348. {
  106349. if (IsPlainObject(key))
  106350. {
  106351. var config = key;
  106352. key = GetFastValue(config, 'key');
  106353. jsonURL = GetFastValue(config, 'jsonURL');
  106354. audioURL = GetFastValue(config, 'audioURL');
  106355. audioConfig = GetFastValue(config, 'audioConfig');
  106356. audioXhrSettings = GetFastValue(config, 'audioXhrSettings');
  106357. jsonXhrSettings = GetFastValue(config, 'jsonXhrSettings');
  106358. }
  106359. var data;
  106360. // No url? then we're going to do a json load and parse it from that
  106361. if (!audioURL)
  106362. {
  106363. data = new JSONFile(loader, key, jsonURL, jsonXhrSettings);
  106364. MultiFile.call(this, loader, 'audiosprite', key, [ data ]);
  106365. this.config.resourceLoad = true;
  106366. this.config.audioConfig = audioConfig;
  106367. this.config.audioXhrSettings = audioXhrSettings;
  106368. }
  106369. else
  106370. {
  106371. var audio = AudioFile.create(loader, key, audioURL, audioConfig, audioXhrSettings);
  106372. if (audio)
  106373. {
  106374. data = new JSONFile(loader, key, jsonURL, jsonXhrSettings);
  106375. MultiFile.call(this, loader, 'audiosprite', key, [ audio, data ]);
  106376. this.config.resourceLoad = false;
  106377. }
  106378. }
  106379. },
  106380. /**
  106381. * Called by each File when it finishes loading.
  106382. *
  106383. * @method Phaser.Loader.FileTypes.AudioSpriteFile#onFileComplete
  106384. * @since 3.7.0
  106385. *
  106386. * @param {Phaser.Loader.File} file - The File that has completed processing.
  106387. */
  106388. onFileComplete: function (file)
  106389. {
  106390. var index = this.files.indexOf(file);
  106391. if (index !== -1)
  106392. {
  106393. this.pending--;
  106394. if (this.config.resourceLoad && file.type === 'json' && file.data.hasOwnProperty('resources'))
  106395. {
  106396. // Inspect the data for the files to now load
  106397. var urls = file.data.resources;
  106398. var audioConfig = GetFastValue(this.config, 'audioConfig');
  106399. var audioXhrSettings = GetFastValue(this.config, 'audioXhrSettings');
  106400. var audio = AudioFile.create(this.loader, file.key, urls, audioConfig, audioXhrSettings);
  106401. if (audio)
  106402. {
  106403. this.addToMultiFile(audio);
  106404. this.loader.addFile(audio);
  106405. }
  106406. }
  106407. }
  106408. },
  106409. /**
  106410. * Adds this file to its target cache upon successful loading and processing.
  106411. *
  106412. * @method Phaser.Loader.FileTypes.AudioSpriteFile#addToCache
  106413. * @since 3.7.0
  106414. */
  106415. addToCache: function ()
  106416. {
  106417. if (this.isReadyToProcess())
  106418. {
  106419. var fileA = this.files[0];
  106420. var fileB = this.files[1];
  106421. fileA.addToCache();
  106422. fileB.addToCache();
  106423. this.complete = true;
  106424. }
  106425. }
  106426. });
  106427. /**
  106428. * Adds a JSON based Audio Sprite, or array of audio sprites, to the current load queue.
  106429. *
  106430. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  106431. *
  106432. * ```javascript
  106433. * function preload ()
  106434. * {
  106435. * this.load.audioSprite('kyobi', 'kyobi.json', [
  106436. * 'kyobi.ogg',
  106437. * 'kyobi.mp3',
  106438. * 'kyobi.m4a'
  106439. * ]);
  106440. * }
  106441. * ```
  106442. *
  106443. * Audio Sprites are a combination of audio files and a JSON configuration.
  106444. * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite
  106445. *
  106446. * If the JSON file includes a 'resource' object then you can let Phaser parse it and load the audio
  106447. * files automatically based on its content. To do this exclude the audio URLs from the load:
  106448. *
  106449. * ```javascript
  106450. * function preload ()
  106451. * {
  106452. * this.load.audioSprite('kyobi', 'kyobi.json');
  106453. * }
  106454. * ```
  106455. *
  106456. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  106457. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  106458. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  106459. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  106460. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  106461. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  106462. * loaded.
  106463. *
  106464. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  106465. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  106466. *
  106467. * The key must be a unique String. It is used to add the file to the global Audio Cache upon a successful load.
  106468. * The key should be unique both in terms of files being loaded and files already present in the Audio Cache.
  106469. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  106470. * then remove it from the Audio Cache first, before loading a new one.
  106471. *
  106472. * Instead of passing arguments you can pass a configuration object, such as:
  106473. *
  106474. * ```javascript
  106475. * this.load.audioSprite({
  106476. * key: 'kyobi',
  106477. * jsonURL: 'audio/Kyobi.json',
  106478. * audioURL: [
  106479. * 'audio/Kyobi.ogg',
  106480. * 'audio/Kyobi.mp3',
  106481. * 'audio/Kyobi.m4a'
  106482. * ]
  106483. * });
  106484. * ```
  106485. *
  106486. * See the documentation for `Phaser.Loader.FileTypes.AudioSpriteFileConfig` for more details.
  106487. *
  106488. * Instead of passing a URL for the audio JSON data you can also pass in a well formed JSON object instead.
  106489. *
  106490. * Once the audio has finished loading you can use it create an Audio Sprite by referencing its key:
  106491. *
  106492. * ```javascript
  106493. * this.load.audioSprite('kyobi', 'kyobi.json');
  106494. * // and later in your game ...
  106495. * var music = this.sound.addAudioSprite('kyobi');
  106496. * music.play('title');
  106497. * ```
  106498. *
  106499. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  106500. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  106501. * this is what you would use to retrieve the image from the Texture Manager.
  106502. *
  106503. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  106504. *
  106505. * Due to different browsers supporting different audio file types you should usually provide your audio files in a variety of formats.
  106506. * ogg, mp3 and m4a are the most common. If you provide an array of URLs then the Loader will determine which _one_ file to load based on
  106507. * browser support.
  106508. *
  106509. * If audio has been disabled in your game, either via the game config, or lack of support from the device, then no audio will be loaded.
  106510. *
  106511. * Note: The ability to load this type of file will only be available if the Audio Sprite File type has been built into Phaser.
  106512. * It is available in the default build but can be excluded from custom builds.
  106513. *
  106514. * @method Phaser.Loader.LoaderPlugin#audioSprite
  106515. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  106516. * @since 3.0.0
  106517. *
  106518. * @param {(string|Phaser.Loader.FileTypes.AudioSpriteFileConfig|Phaser.Loader.FileTypes.AudioSpriteFileConfig[])} key - The key to use for this file, or a file configuration object, or an array of objects.
  106519. * @param {string} jsonURL - The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead.
  106520. * @param {(string|string[])} [audioURL] - The absolute or relative URL to load the audio file from. If empty it will be obtained by parsing the JSON file.
  106521. * @param {any} [audioConfig] - The audio configuration options.
  106522. * @param {XHRSettingsObject} [audioXhrSettings] - An XHR Settings configuration object for the audio file. Used in replacement of the Loaders default XHR Settings.
  106523. * @param {XHRSettingsObject} [jsonXhrSettings] - An XHR Settings configuration object for the json file. Used in replacement of the Loaders default XHR Settings.
  106524. *
  106525. * @return {Phaser.Loader.LoaderPlugin} The Loader.
  106526. */
  106527. FileTypesManager.register('audioSprite', function (key, jsonURL, audioURL, audioConfig, audioXhrSettings, jsonXhrSettings)
  106528. {
  106529. var game = this.systems.game;
  106530. var gameAudioConfig = game.config.audio;
  106531. var deviceAudio = game.device.audio;
  106532. if ((gameAudioConfig && gameAudioConfig.noAudio) || (!deviceAudio.webAudio && !deviceAudio.audioData))
  106533. {
  106534. // Sounds are disabled, so skip loading audio
  106535. return this;
  106536. }
  106537. var multifile;
  106538. // Supports an Object file definition in the key argument
  106539. // Or an array of objects in the key argument
  106540. // Or a single entry where all arguments have been defined
  106541. if (Array.isArray(key))
  106542. {
  106543. for (var i = 0; i < key.length; i++)
  106544. {
  106545. multifile = new AudioSpriteFile(this, key[i]);
  106546. if (multifile.files)
  106547. {
  106548. this.addFile(multifile.files);
  106549. }
  106550. }
  106551. }
  106552. else
  106553. {
  106554. multifile = new AudioSpriteFile(this, key, jsonURL, audioURL, audioConfig, audioXhrSettings, jsonXhrSettings);
  106555. if (multifile.files)
  106556. {
  106557. this.addFile(multifile.files);
  106558. }
  106559. }
  106560. return this;
  106561. });
  106562. /***/ }),
  106563. /* 597 */
  106564. /***/ (function(module, exports, __webpack_require__) {
  106565. /**
  106566. * @author Richard Davey <rich@photonstorm.com>
  106567. * @copyright 2019 Photon Storm Ltd.
  106568. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106569. */
  106570. var Class = __webpack_require__(0);
  106571. var FileTypesManager = __webpack_require__(7);
  106572. var GetFastValue = __webpack_require__(2);
  106573. var ImageFile = __webpack_require__(64);
  106574. var IsPlainObject = __webpack_require__(8);
  106575. var MultiFile = __webpack_require__(63);
  106576. var XMLFile = __webpack_require__(150);
  106577. /**
  106578. * @typedef {object} Phaser.Loader.FileTypes.AtlasXMLFileConfig
  106579. *
  106580. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  106581. * @property {string} [textureURL] - The absolute or relative URL to load the texture image file from.
  106582. * @property {string} [textureExtension='png'] - The default file extension to use for the image texture if no url is provided.
  106583. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture image file.
  106584. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the texture image.
  106585. * @property {string} [atlasURL] - The absolute or relative URL to load the atlas xml file from.
  106586. * @property {string} [atlasExtension='xml'] - The default file extension to use for the atlas xml if no url is provided.
  106587. * @property {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas xml file.
  106588. */
  106589. /**
  106590. * @classdesc
  106591. * A single XML based Texture Atlas File suitable for loading by the Loader.
  106592. *
  106593. * These are created when you use the Phaser.Loader.LoaderPlugin#atlasXML method and are not typically created directly.
  106594. *
  106595. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlasXML.
  106596. *
  106597. * @class AtlasXMLFile
  106598. * @extends Phaser.Loader.MultiFile
  106599. * @memberof Phaser.Loader.FileTypes
  106600. * @constructor
  106601. *
  106602. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  106603. * @param {(string|Phaser.Loader.FileTypes.AtlasXMLFileConfig)} key - The key to use for this file, or a file configuration object.
  106604. * @param {string|string[]} [textureURL] - The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  106605. * @param {string} [atlasURL] - The absolute or relative URL to load the texture atlas xml data file from. If undefined or `null` it will be set to `<key>.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml".
  106606. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  106607. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas xml file. Used in replacement of the Loaders default XHR Settings.
  106608. */
  106609. var AtlasXMLFile = new Class({
  106610. Extends: MultiFile,
  106611. initialize:
  106612. function AtlasXMLFile (loader, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  106613. {
  106614. var image;
  106615. var data;
  106616. if (IsPlainObject(key))
  106617. {
  106618. var config = key;
  106619. key = GetFastValue(config, 'key');
  106620. image = new ImageFile(loader, {
  106621. key: key,
  106622. url: GetFastValue(config, 'textureURL'),
  106623. extension: GetFastValue(config, 'textureExtension', 'png'),
  106624. normalMap: GetFastValue(config, 'normalMap'),
  106625. xhrSettings: GetFastValue(config, 'textureXhrSettings')
  106626. });
  106627. data = new XMLFile(loader, {
  106628. key: key,
  106629. url: GetFastValue(config, 'atlasURL'),
  106630. extension: GetFastValue(config, 'atlasExtension', 'xml'),
  106631. xhrSettings: GetFastValue(config, 'atlasXhrSettings')
  106632. });
  106633. }
  106634. else
  106635. {
  106636. image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  106637. data = new XMLFile(loader, key, atlasURL, atlasXhrSettings);
  106638. }
  106639. if (image.linkFile)
  106640. {
  106641. // Image has a normal map
  106642. MultiFile.call(this, loader, 'atlasxml', key, [ image, data, image.linkFile ]);
  106643. }
  106644. else
  106645. {
  106646. MultiFile.call(this, loader, 'atlasxml', key, [ image, data ]);
  106647. }
  106648. },
  106649. /**
  106650. * Adds this file to its target cache upon successful loading and processing.
  106651. *
  106652. * @method Phaser.Loader.FileTypes.AtlasXMLFile#addToCache
  106653. * @since 3.7.0
  106654. */
  106655. addToCache: function ()
  106656. {
  106657. if (this.isReadyToProcess())
  106658. {
  106659. var image = this.files[0];
  106660. var xml = this.files[1];
  106661. var normalMap = (this.files[2]) ? this.files[2].data : null;
  106662. this.loader.textureManager.addAtlasXML(image.key, image.data, xml.data, normalMap);
  106663. xml.addToCache();
  106664. this.complete = true;
  106665. }
  106666. }
  106667. });
  106668. /**
  106669. * Adds an XML based Texture Atlas, or array of atlases, to the current load queue.
  106670. *
  106671. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  106672. *
  106673. * ```javascript
  106674. * function preload ()
  106675. * {
  106676. * this.load.atlasXML('mainmenu', 'images/MainMenu.png', 'images/MainMenu.xml');
  106677. * }
  106678. * ```
  106679. *
  106680. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  106681. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  106682. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  106683. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  106684. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  106685. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  106686. * loaded.
  106687. *
  106688. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  106689. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  106690. *
  106691. * Phaser expects the atlas data to be provided in an XML file format.
  106692. * These files are created by software such as Shoebox and Adobe Flash / Animate.
  106693. *
  106694. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  106695. *
  106696. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  106697. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  106698. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  106699. * then remove it from the Texture Manager first, before loading a new one.
  106700. *
  106701. * Instead of passing arguments you can pass a configuration object, such as:
  106702. *
  106703. * ```javascript
  106704. * this.load.atlasXML({
  106705. * key: 'mainmenu',
  106706. * textureURL: 'images/MainMenu.png',
  106707. * atlasURL: 'images/MainMenu.xml'
  106708. * });
  106709. * ```
  106710. *
  106711. * See the documentation for `Phaser.Loader.FileTypes.AtlasXMLFileConfig` for more details.
  106712. *
  106713. * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key:
  106714. *
  106715. * ```javascript
  106716. * this.load.atlasXML('mainmenu', 'images/MainMenu.png', 'images/MainMenu.xml');
  106717. * // and later in your game ...
  106718. * this.add.image(x, y, 'mainmenu', 'background');
  106719. * ```
  106720. *
  106721. * To get a list of all available frames within an atlas please consult your Texture Atlas software.
  106722. *
  106723. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  106724. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  106725. * this is what you would use to retrieve the image from the Texture Manager.
  106726. *
  106727. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  106728. *
  106729. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  106730. * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although
  106731. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  106732. *
  106733. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  106734. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  106735. *
  106736. * ```javascript
  106737. * this.load.atlasXML('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.xml');
  106738. * ```
  106739. *
  106740. * Or, if you are using a config object use the `normalMap` property:
  106741. *
  106742. * ```javascript
  106743. * this.load.atlasXML({
  106744. * key: 'mainmenu',
  106745. * textureURL: 'images/MainMenu.png',
  106746. * normalMap: 'images/MainMenu-n.png',
  106747. * atlasURL: 'images/MainMenu.xml'
  106748. * });
  106749. * ```
  106750. *
  106751. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  106752. * Normal maps are a WebGL only feature.
  106753. *
  106754. * Note: The ability to load this type of file will only be available if the Atlas XML File type has been built into Phaser.
  106755. * It is available in the default build but can be excluded from custom builds.
  106756. *
  106757. * @method Phaser.Loader.LoaderPlugin#atlasXML
  106758. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  106759. * @since 3.7.0
  106760. *
  106761. * @param {(string|Phaser.Loader.FileTypes.AtlasXMLFileConfig|Phaser.Loader.FileTypes.AtlasXMLFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  106762. * @param {string|string[]} [textureURL] - The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  106763. * @param {string} [atlasURL] - The absolute or relative URL to load the texture atlas xml data file from. If undefined or `null` it will be set to `<key>.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml".
  106764. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  106765. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas xml file. Used in replacement of the Loaders default XHR Settings.
  106766. *
  106767. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  106768. */
  106769. FileTypesManager.register('atlasXML', function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  106770. {
  106771. var multifile;
  106772. // Supports an Object file definition in the key argument
  106773. // Or an array of objects in the key argument
  106774. // Or a single entry where all arguments have been defined
  106775. if (Array.isArray(key))
  106776. {
  106777. for (var i = 0; i < key.length; i++)
  106778. {
  106779. multifile = new AtlasXMLFile(this, key[i]);
  106780. this.addFile(multifile.files);
  106781. }
  106782. }
  106783. else
  106784. {
  106785. multifile = new AtlasXMLFile(this, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings);
  106786. this.addFile(multifile.files);
  106787. }
  106788. return this;
  106789. });
  106790. module.exports = AtlasXMLFile;
  106791. /***/ }),
  106792. /* 598 */
  106793. /***/ (function(module, exports, __webpack_require__) {
  106794. /**
  106795. * @author Richard Davey <rich@photonstorm.com>
  106796. * @copyright 2019 Photon Storm Ltd.
  106797. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106798. */
  106799. var Class = __webpack_require__(0);
  106800. var FileTypesManager = __webpack_require__(7);
  106801. var GetFastValue = __webpack_require__(2);
  106802. var ImageFile = __webpack_require__(64);
  106803. var IsPlainObject = __webpack_require__(8);
  106804. var JSONFile = __webpack_require__(55);
  106805. var MultiFile = __webpack_require__(63);
  106806. /**
  106807. * @typedef {object} Phaser.Loader.FileTypes.AtlasJSONFileConfig
  106808. *
  106809. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  106810. * @property {string} [textureURL] - The absolute or relative URL to load the texture image file from.
  106811. * @property {string} [textureExtension='png'] - The default file extension to use for the image texture if no url is provided.
  106812. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture image file.
  106813. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the texture image.
  106814. * @property {string} [atlasURL] - The absolute or relative URL to load the atlas json file from. Or a well formed JSON object to use instead.
  106815. * @property {string} [atlasExtension='json'] - The default file extension to use for the atlas json if no url is provided.
  106816. * @property {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas json file.
  106817. */
  106818. /**
  106819. * @classdesc
  106820. * A single JSON based Texture Atlas File suitable for loading by the Loader.
  106821. *
  106822. * These are created when you use the Phaser.Loader.LoaderPlugin#atlas method and are not typically created directly.
  106823. *
  106824. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlas.
  106825. *
  106826. * https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?source=photonstorm
  106827. *
  106828. * @class AtlasJSONFile
  106829. * @extends Phaser.Loader.MultiFile
  106830. * @memberof Phaser.Loader.FileTypes
  106831. * @constructor
  106832. * @since 3.0.0
  106833. *
  106834. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  106835. * @param {(string|Phaser.Loader.FileTypes.AtlasJSONFileConfig)} key - The key to use for this file, or a file configuration object.
  106836. * @param {string|string[]} [textureURL] - The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  106837. * @param {string} [atlasURL] - The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  106838. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  106839. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings.
  106840. */
  106841. var AtlasJSONFile = new Class({
  106842. Extends: MultiFile,
  106843. initialize:
  106844. function AtlasJSONFile (loader, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  106845. {
  106846. var image;
  106847. var data;
  106848. if (IsPlainObject(key))
  106849. {
  106850. var config = key;
  106851. key = GetFastValue(config, 'key');
  106852. image = new ImageFile(loader, {
  106853. key: key,
  106854. url: GetFastValue(config, 'textureURL'),
  106855. extension: GetFastValue(config, 'textureExtension', 'png'),
  106856. normalMap: GetFastValue(config, 'normalMap'),
  106857. xhrSettings: GetFastValue(config, 'textureXhrSettings')
  106858. });
  106859. data = new JSONFile(loader, {
  106860. key: key,
  106861. url: GetFastValue(config, 'atlasURL'),
  106862. extension: GetFastValue(config, 'atlasExtension', 'json'),
  106863. xhrSettings: GetFastValue(config, 'atlasXhrSettings')
  106864. });
  106865. }
  106866. else
  106867. {
  106868. image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  106869. data = new JSONFile(loader, key, atlasURL, atlasXhrSettings);
  106870. }
  106871. if (image.linkFile)
  106872. {
  106873. // Image has a normal map
  106874. MultiFile.call(this, loader, 'atlasjson', key, [ image, data, image.linkFile ]);
  106875. }
  106876. else
  106877. {
  106878. MultiFile.call(this, loader, 'atlasjson', key, [ image, data ]);
  106879. }
  106880. },
  106881. /**
  106882. * Adds this file to its target cache upon successful loading and processing.
  106883. *
  106884. * @method Phaser.Loader.FileTypes.AtlasJSONFile#addToCache
  106885. * @since 3.7.0
  106886. */
  106887. addToCache: function ()
  106888. {
  106889. if (this.isReadyToProcess())
  106890. {
  106891. var image = this.files[0];
  106892. var json = this.files[1];
  106893. var normalMap = (this.files[2]) ? this.files[2].data : null;
  106894. this.loader.textureManager.addAtlas(image.key, image.data, json.data, normalMap);
  106895. json.addToCache();
  106896. this.complete = true;
  106897. }
  106898. }
  106899. });
  106900. /**
  106901. * Adds a JSON based Texture Atlas, or array of atlases, to the current load queue.
  106902. *
  106903. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  106904. *
  106905. * ```javascript
  106906. * function preload ()
  106907. * {
  106908. * this.load.atlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json');
  106909. * }
  106910. * ```
  106911. *
  106912. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  106913. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  106914. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  106915. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  106916. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  106917. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  106918. * loaded.
  106919. *
  106920. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  106921. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  106922. *
  106923. * Phaser expects the atlas data to be provided in a JSON file, using either the JSON Hash or JSON Array format.
  106924. * These files are created by software such as Texture Packer, Shoebox and Adobe Flash / Animate.
  106925. * If you are using Texture Packer and have enabled multi-atlas support, then please use the Phaser Multi Atlas loader
  106926. * instead of this one.
  106927. *
  106928. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  106929. *
  106930. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  106931. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  106932. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  106933. * then remove it from the Texture Manager first, before loading a new one.
  106934. *
  106935. * Instead of passing arguments you can pass a configuration object, such as:
  106936. *
  106937. * ```javascript
  106938. * this.load.atlas({
  106939. * key: 'mainmenu',
  106940. * textureURL: 'images/MainMenu.png',
  106941. * atlasURL: 'images/MainMenu.json'
  106942. * });
  106943. * ```
  106944. *
  106945. * See the documentation for `Phaser.Loader.FileTypes.AtlasJSONFileConfig` for more details.
  106946. *
  106947. * Instead of passing a URL for the atlas JSON data you can also pass in a well formed JSON object instead.
  106948. *
  106949. * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key:
  106950. *
  106951. * ```javascript
  106952. * this.load.atlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json');
  106953. * // and later in your game ...
  106954. * this.add.image(x, y, 'mainmenu', 'background');
  106955. * ```
  106956. *
  106957. * To get a list of all available frames within an atlas please consult your Texture Atlas software.
  106958. *
  106959. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  106960. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  106961. * this is what you would use to retrieve the image from the Texture Manager.
  106962. *
  106963. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  106964. *
  106965. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien"
  106966. * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although
  106967. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  106968. *
  106969. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  106970. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  106971. *
  106972. * ```javascript
  106973. * this.load.atlas('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.json');
  106974. * ```
  106975. *
  106976. * Or, if you are using a config object use the `normalMap` property:
  106977. *
  106978. * ```javascript
  106979. * this.load.atlas({
  106980. * key: 'mainmenu',
  106981. * textureURL: 'images/MainMenu.png',
  106982. * normalMap: 'images/MainMenu-n.png',
  106983. * atlasURL: 'images/MainMenu.json'
  106984. * });
  106985. * ```
  106986. *
  106987. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  106988. * Normal maps are a WebGL only feature.
  106989. *
  106990. * Note: The ability to load this type of file will only be available if the Atlas JSON File type has been built into Phaser.
  106991. * It is available in the default build but can be excluded from custom builds.
  106992. *
  106993. * @method Phaser.Loader.LoaderPlugin#atlas
  106994. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  106995. * @since 3.0.0
  106996. *
  106997. * @param {(string|Phaser.Loader.FileTypes.AtlasJSONFileConfig|Phaser.Loader.FileTypes.AtlasJSONFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  106998. * @param {string|string[]} [textureURL] - The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `<key>.png`, i.e. if `key` was "alien" then the URL will be "alien.png".
  106999. * @param {string} [atlasURL] - The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  107000. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  107001. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings.
  107002. *
  107003. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  107004. */
  107005. FileTypesManager.register('atlas', function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  107006. {
  107007. var multifile;
  107008. // Supports an Object file definition in the key argument
  107009. // Or an array of objects in the key argument
  107010. // Or a single entry where all arguments have been defined
  107011. if (Array.isArray(key))
  107012. {
  107013. for (var i = 0; i < key.length; i++)
  107014. {
  107015. multifile = new AtlasJSONFile(this, key[i]);
  107016. this.addFile(multifile.files);
  107017. }
  107018. }
  107019. else
  107020. {
  107021. multifile = new AtlasJSONFile(this, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings);
  107022. this.addFile(multifile.files);
  107023. }
  107024. return this;
  107025. });
  107026. module.exports = AtlasJSONFile;
  107027. /***/ }),
  107028. /* 599 */
  107029. /***/ (function(module, exports, __webpack_require__) {
  107030. /**
  107031. * @author Richard Davey <rich@photonstorm.com>
  107032. * @copyright 2019 Photon Storm Ltd.
  107033. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107034. */
  107035. var Class = __webpack_require__(0);
  107036. var FileTypesManager = __webpack_require__(7);
  107037. var JSONFile = __webpack_require__(55);
  107038. var LoaderEvents = __webpack_require__(75);
  107039. /**
  107040. * @classdesc
  107041. * A single Animation JSON File suitable for loading by the Loader.
  107042. *
  107043. * These are created when you use the Phaser.Loader.LoaderPlugin#animation method and are not typically created directly.
  107044. *
  107045. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#animation.
  107046. *
  107047. * @class AnimationJSONFile
  107048. * @extends Phaser.Loader.File
  107049. * @memberof Phaser.Loader.FileTypes
  107050. * @constructor
  107051. * @since 3.0.0
  107052. *
  107053. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  107054. * @param {(string|Phaser.Loader.FileTypes.JSONFileConfig)} key - The key to use for this file, or a file configuration object.
  107055. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  107056. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  107057. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  107058. */
  107059. var AnimationJSONFile = new Class({
  107060. Extends: JSONFile,
  107061. initialize:
  107062. // url can either be a string, in which case it is treated like a proper url, or an object, in which case it is treated as a ready-made JS Object
  107063. // dataKey allows you to pluck a specific object out of the JSON and put just that into the cache, rather than the whole thing
  107064. function AnimationJSONFile (loader, key, url, xhrSettings, dataKey)
  107065. {
  107066. JSONFile.call(this, loader, key, url, xhrSettings, dataKey);
  107067. this.type = 'animationJSON';
  107068. },
  107069. /**
  107070. * Called automatically by Loader.nextFile.
  107071. * This method controls what extra work this File does with its loaded data.
  107072. *
  107073. * @method Phaser.Loader.FileTypes.AnimationJSONFile#onProcess
  107074. * @since 3.7.0
  107075. */
  107076. onProcess: function ()
  107077. {
  107078. // We need to hook into this event:
  107079. this.loader.once(LoaderEvents.POST_PROCESS, this.onLoadComplete, this);
  107080. // But the rest is the same as a normal JSON file
  107081. JSONFile.prototype.onProcess.call(this);
  107082. },
  107083. /**
  107084. * Called at the end of the load process, after the Loader has finished all files in its queue.
  107085. *
  107086. * @method Phaser.Loader.FileTypes.AnimationJSONFile#onLoadComplete
  107087. * @since 3.7.0
  107088. */
  107089. onLoadComplete: function ()
  107090. {
  107091. this.loader.systems.anims.fromJSON(this.data);
  107092. this.pendingDestroy();
  107093. }
  107094. });
  107095. /**
  107096. * Adds an Animation JSON Data file, or array of Animation JSON files, to the current load queue.
  107097. *
  107098. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  107099. *
  107100. * ```javascript
  107101. * function preload ()
  107102. * {
  107103. * this.load.animation('baddieAnims', 'files/BaddieAnims.json');
  107104. * }
  107105. * ```
  107106. *
  107107. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  107108. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  107109. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  107110. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  107111. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  107112. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  107113. * loaded.
  107114. *
  107115. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  107116. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  107117. *
  107118. * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load.
  107119. * The key should be unique both in terms of files being loaded and files already present in the JSON Cache.
  107120. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  107121. * then remove it from the JSON Cache first, before loading a new one.
  107122. *
  107123. * Instead of passing arguments you can pass a configuration object, such as:
  107124. *
  107125. * ```javascript
  107126. * this.load.animation({
  107127. * key: 'baddieAnims',
  107128. * url: 'files/BaddieAnims.json'
  107129. * });
  107130. * ```
  107131. *
  107132. * See the documentation for `Phaser.Loader.FileTypes.JSONFileConfig` for more details.
  107133. *
  107134. * Once the file has finished loading it will automatically be passed to the global Animation Managers `fromJSON` method.
  107135. * This will parse all of the JSON data and create animation data from it. This process happens at the very end
  107136. * of the Loader, once every other file in the load queue has finished. The reason for this is to allow you to load
  107137. * both animation data and the images it relies upon in the same load call.
  107138. *
  107139. * Once the animation data has been parsed you will be able to play animations using that data.
  107140. * Please see the Animation Manager `fromJSON` method for more details about the format and playback.
  107141. *
  107142. * You can also access the raw animation data from its Cache using its key:
  107143. *
  107144. * ```javascript
  107145. * this.load.animation('baddieAnims', 'files/BaddieAnims.json');
  107146. * // and later in your game ...
  107147. * var data = this.cache.json.get('baddieAnims');
  107148. * ```
  107149. *
  107150. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  107151. * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and
  107152. * this is what you would use to retrieve the text from the JSON Cache.
  107153. *
  107154. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  107155. *
  107156. * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data"
  107157. * and no URL is given then the Loader will set the URL to be "data.json". It will always add `.json` as the extension, although
  107158. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  107159. *
  107160. * You can also optionally provide a `dataKey` to use. This allows you to extract only a part of the JSON and store it in the Cache,
  107161. * rather than the whole file. For example, if your JSON data had a structure like this:
  107162. *
  107163. * ```json
  107164. * {
  107165. * "level1": {
  107166. * "baddies": {
  107167. * "aliens": {},
  107168. * "boss": {}
  107169. * }
  107170. * },
  107171. * "level2": {},
  107172. * "level3": {}
  107173. * }
  107174. * ```
  107175. *
  107176. * And if you only wanted to create animations from the `boss` data, then you could pass `level1.baddies.boss`as the `dataKey`.
  107177. *
  107178. * Note: The ability to load this type of file will only be available if the JSON File type has been built into Phaser.
  107179. * It is available in the default build but can be excluded from custom builds.
  107180. *
  107181. * @method Phaser.Loader.LoaderPlugin#animation
  107182. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  107183. * @since 3.0.0
  107184. *
  107185. * @param {(string|Phaser.Loader.FileTypes.JSONFileConfig|Phaser.Loader.FileTypes.JSONFileConfig[])} key - The key to use for this file, or a file configuration object, or array of them.
  107186. * @param {string} [url] - The absolute or relative URL to load this file from. If undefined or `null` it will be set to `<key>.json`, i.e. if `key` was "alien" then the URL will be "alien.json".
  107187. * @param {string} [dataKey] - When the Animation JSON file loads only this property will be stored in the Cache and used to create animation data.
  107188. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  107189. *
  107190. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  107191. */
  107192. FileTypesManager.register('animation', function (key, url, dataKey, xhrSettings)
  107193. {
  107194. // Supports an Object file definition in the key argument
  107195. // Or an array of objects in the key argument
  107196. // Or a single entry where all arguments have been defined
  107197. if (Array.isArray(key))
  107198. {
  107199. for (var i = 0; i < key.length; i++)
  107200. {
  107201. this.addFile(new AnimationJSONFile(this, key[i]));
  107202. }
  107203. }
  107204. else
  107205. {
  107206. this.addFile(new AnimationJSONFile(this, key, url, xhrSettings, dataKey));
  107207. }
  107208. return this;
  107209. });
  107210. module.exports = AnimationJSONFile;
  107211. /***/ }),
  107212. /* 600 */
  107213. /***/ (function(module, exports, __webpack_require__) {
  107214. /**
  107215. * @author Richard Davey <rich@photonstorm.com>
  107216. * @copyright 2019 Photon Storm Ltd.
  107217. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107218. */
  107219. /**
  107220. * @namespace Phaser.Loader.FileTypes
  107221. */
  107222. module.exports = {
  107223. AnimationJSONFile: __webpack_require__(599),
  107224. AtlasJSONFile: __webpack_require__(598),
  107225. AtlasXMLFile: __webpack_require__(597),
  107226. AudioFile: __webpack_require__(258),
  107227. AudioSpriteFile: __webpack_require__(596),
  107228. BinaryFile: __webpack_require__(595),
  107229. BitmapFontFile: __webpack_require__(594),
  107230. GLSLFile: __webpack_require__(593),
  107231. HTML5AudioFile: __webpack_require__(257),
  107232. HTMLFile: __webpack_require__(592),
  107233. HTMLTextureFile: __webpack_require__(591),
  107234. ImageFile: __webpack_require__(64),
  107235. JSONFile: __webpack_require__(55),
  107236. MultiAtlasFile: __webpack_require__(590),
  107237. PackFile: __webpack_require__(589),
  107238. PluginFile: __webpack_require__(588),
  107239. SceneFile: __webpack_require__(587),
  107240. ScenePluginFile: __webpack_require__(586),
  107241. ScriptFile: __webpack_require__(585),
  107242. SpriteSheetFile: __webpack_require__(584),
  107243. SVGFile: __webpack_require__(583),
  107244. TextFile: __webpack_require__(256),
  107245. TilemapCSVFile: __webpack_require__(582),
  107246. TilemapImpactFile: __webpack_require__(581),
  107247. TilemapJSONFile: __webpack_require__(580),
  107248. UnityAtlasFile: __webpack_require__(579),
  107249. XMLFile: __webpack_require__(150)
  107250. };
  107251. /***/ }),
  107252. /* 601 */
  107253. /***/ (function(module, exports, __webpack_require__) {
  107254. /**
  107255. * @author Richard Davey <rich@photonstorm.com>
  107256. * @copyright 2019 Photon Storm Ltd.
  107257. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107258. */
  107259. var CONST = __webpack_require__(15);
  107260. var Extend = __webpack_require__(19);
  107261. /**
  107262. * @namespace Phaser.Loader
  107263. */
  107264. var Loader = {
  107265. Events: __webpack_require__(75),
  107266. FileTypes: __webpack_require__(600),
  107267. File: __webpack_require__(22),
  107268. FileTypesManager: __webpack_require__(7),
  107269. GetURL: __webpack_require__(152),
  107270. LoaderPlugin: __webpack_require__(578),
  107271. MergeXHRSettings: __webpack_require__(151),
  107272. MultiFile: __webpack_require__(63),
  107273. XHRLoader: __webpack_require__(259),
  107274. XHRSettings: __webpack_require__(112)
  107275. };
  107276. // Merge in the consts
  107277. Loader = Extend(false, Loader, CONST);
  107278. module.exports = Loader;
  107279. /***/ }),
  107280. /* 602 */
  107281. /***/ (function(module, exports, __webpack_require__) {
  107282. /**
  107283. * @author Richard Davey <rich@photonstorm.com>
  107284. * @copyright 2019 Photon Storm Ltd.
  107285. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107286. */
  107287. /**
  107288. * @namespace Phaser.Input.Touch
  107289. */
  107290. /* eslint-disable */
  107291. module.exports = {
  107292. TouchManager: __webpack_require__(337)
  107293. };
  107294. /* eslint-enable */
  107295. /***/ }),
  107296. /* 603 */
  107297. /***/ (function(module, exports, __webpack_require__) {
  107298. /**
  107299. * @author Richard Davey <rich@photonstorm.com>
  107300. * @copyright 2019 Photon Storm Ltd.
  107301. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107302. */
  107303. /**
  107304. * @namespace Phaser.Input.Mouse
  107305. */
  107306. /* eslint-disable */
  107307. module.exports = {
  107308. MouseManager: __webpack_require__(339)
  107309. };
  107310. /* eslint-enable */
  107311. /***/ }),
  107312. /* 604 */
  107313. /***/ (function(module, exports) {
  107314. /**
  107315. * @author Richard Davey <rich@photonstorm.com>
  107316. * @copyright 2019 Photon Storm Ltd.
  107317. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107318. */
  107319. /**
  107320. * Returns `true` if the Key was released within the `duration` value given, or `false` if it either isn't up,
  107321. * or was released longer ago than then given duration.
  107322. *
  107323. * @function Phaser.Input.Keyboard.UpDuration
  107324. * @since 3.0.0
  107325. *
  107326. * @param {Phaser.Input.Keyboard.Key} key - The Key object to test.
  107327. * @param {integer} [duration=50] - The duration, in ms, within which the key must have been released.
  107328. *
  107329. * @return {boolean} `true` if the Key was released within `duration` ms, otherwise `false`.
  107330. */
  107331. var UpDuration = function (key, duration)
  107332. {
  107333. if (duration === undefined) { duration = 50; }
  107334. return (key.isUp && key.duration < duration);
  107335. };
  107336. module.exports = UpDuration;
  107337. /***/ }),
  107338. /* 605 */
  107339. /***/ (function(module, exports) {
  107340. /**
  107341. * @author Richard Davey <rich@photonstorm.com>
  107342. * @copyright 2019 Photon Storm Ltd.
  107343. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107344. */
  107345. /**
  107346. * Returns `true` if the Key was pressed down within the `duration` value given, or `false` if it either isn't down,
  107347. * or was pressed down longer ago than then given duration.
  107348. *
  107349. * @function Phaser.Input.Keyboard.DownDuration
  107350. * @since 3.0.0
  107351. *
  107352. * @param {Phaser.Input.Keyboard.Key} key - The Key object to test.
  107353. * @param {integer} [duration=50] - The duration, in ms, within which the key must have been pressed down.
  107354. *
  107355. * @return {boolean} `true` if the Key was pressed down within `duration` ms, otherwise `false`.
  107356. */
  107357. var DownDuration = function (key, duration)
  107358. {
  107359. if (duration === undefined) { duration = 50; }
  107360. return (key.isDown && key.duration < duration);
  107361. };
  107362. module.exports = DownDuration;
  107363. /***/ }),
  107364. /* 606 */
  107365. /***/ (function(module, exports) {
  107366. /**
  107367. * @author Richard Davey <rich@photonstorm.com>
  107368. * @copyright 2019 Photon Storm Ltd.
  107369. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107370. */
  107371. /**
  107372. * The justUp value allows you to test if this Key has just been released or not.
  107373. *
  107374. * When you check this value it will return `true` if the Key is up, otherwise `false`.
  107375. *
  107376. * You can only call JustUp once per key release. It will only return `true` once, until the Key is pressed down and released again.
  107377. * This allows you to use it in situations where you want to check if this key is up without using an event, such as in a core game loop.
  107378. *
  107379. * @function Phaser.Input.Keyboard.JustUp
  107380. * @since 3.0.0
  107381. *
  107382. * @param {Phaser.Input.Keyboard.Key} key - The Key to check to see if it's just up or not.
  107383. *
  107384. * @return {boolean} `true` if the Key was just released, otherwise `false`.
  107385. */
  107386. var JustUp = function (key)
  107387. {
  107388. if (key._justUp)
  107389. {
  107390. key._justUp = false;
  107391. return true;
  107392. }
  107393. else
  107394. {
  107395. return false;
  107396. }
  107397. };
  107398. module.exports = JustUp;
  107399. /***/ }),
  107400. /* 607 */
  107401. /***/ (function(module, exports) {
  107402. /**
  107403. * @author Richard Davey <rich@photonstorm.com>
  107404. * @copyright 2019 Photon Storm Ltd.
  107405. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107406. */
  107407. /**
  107408. * The justDown value allows you to test if this Key has just been pressed down or not.
  107409. *
  107410. * When you check this value it will return `true` if the Key is down, otherwise `false`.
  107411. *
  107412. * You can only call justDown once per key press. It will only return `true` once, until the Key is released and pressed down again.
  107413. * This allows you to use it in situations where you want to check if this key is down without using an event, such as in a core game loop.
  107414. *
  107415. * @function Phaser.Input.Keyboard.JustDown
  107416. * @since 3.0.0
  107417. *
  107418. * @param {Phaser.Input.Keyboard.Key} key - The Key to check to see if it's just down or not.
  107419. *
  107420. * @return {boolean} `true` if the Key was just pressed, otherwise `false`.
  107421. */
  107422. var JustDown = function (key)
  107423. {
  107424. if (key._justDown)
  107425. {
  107426. key._justDown = false;
  107427. return true;
  107428. }
  107429. else
  107430. {
  107431. return false;
  107432. }
  107433. };
  107434. module.exports = JustDown;
  107435. /***/ }),
  107436. /* 608 */
  107437. /***/ (function(module, exports, __webpack_require__) {
  107438. /**
  107439. * @author Richard Davey <rich@photonstorm.com>
  107440. * @copyright 2019 Photon Storm Ltd.
  107441. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107442. */
  107443. var KeyCodes = __webpack_require__(125);
  107444. var KeyMap = {};
  107445. for (var key in KeyCodes)
  107446. {
  107447. KeyMap[KeyCodes[key]] = key;
  107448. }
  107449. module.exports = KeyMap;
  107450. /***/ }),
  107451. /* 609 */
  107452. /***/ (function(module, exports) {
  107453. /**
  107454. * @author Richard Davey <rich@photonstorm.com>
  107455. * @copyright 2019 Photon Storm Ltd.
  107456. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107457. */
  107458. /**
  107459. * Used internally by the KeyCombo class.
  107460. *
  107461. * @function Phaser.Input.Keyboard.KeyCombo.ResetKeyCombo
  107462. * @private
  107463. * @since 3.0.0
  107464. *
  107465. * @param {Phaser.Input.Keyboard.KeyCombo} combo - The KeyCombo to reset.
  107466. *
  107467. * @return {Phaser.Input.Keyboard.KeyCombo} The KeyCombo.
  107468. */
  107469. var ResetKeyCombo = function (combo)
  107470. {
  107471. combo.current = combo.keyCodes[0];
  107472. combo.index = 0;
  107473. combo.timeLastMatched = 0;
  107474. combo.matched = false;
  107475. combo.timeMatched = 0;
  107476. return combo;
  107477. };
  107478. module.exports = ResetKeyCombo;
  107479. /***/ }),
  107480. /* 610 */
  107481. /***/ (function(module, exports) {
  107482. /**
  107483. * @author Richard Davey <rich@photonstorm.com>
  107484. * @copyright 2019 Photon Storm Ltd.
  107485. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107486. */
  107487. /**
  107488. * Used internally by the KeyCombo class.
  107489. * Return `true` if it reached the end of the combo, `false` if not.
  107490. *
  107491. * @function Phaser.Input.Keyboard.KeyCombo.AdvanceKeyCombo
  107492. * @private
  107493. * @since 3.0.0
  107494. *
  107495. * @param {KeyboardEvent} event - The native Keyboard Event.
  107496. * @param {Phaser.Input.Keyboard.KeyCombo} combo - The KeyCombo object to advance.
  107497. *
  107498. * @return {boolean} `true` if it reached the end of the combo, `false` if not.
  107499. */
  107500. var AdvanceKeyCombo = function (event, combo)
  107501. {
  107502. combo.timeLastMatched = event.timeStamp;
  107503. combo.index++;
  107504. if (combo.index === combo.size)
  107505. {
  107506. return true;
  107507. }
  107508. else
  107509. {
  107510. combo.current = combo.keyCodes[combo.index];
  107511. return false;
  107512. }
  107513. };
  107514. module.exports = AdvanceKeyCombo;
  107515. /***/ }),
  107516. /* 611 */
  107517. /***/ (function(module, exports, __webpack_require__) {
  107518. /**
  107519. * @author Richard Davey <rich@photonstorm.com>
  107520. * @copyright 2019 Photon Storm Ltd.
  107521. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107522. */
  107523. var AdvanceKeyCombo = __webpack_require__(610);
  107524. /**
  107525. * Used internally by the KeyCombo class.
  107526. *
  107527. * @function Phaser.Input.Keyboard.KeyCombo.ProcessKeyCombo
  107528. * @private
  107529. * @since 3.0.0
  107530. *
  107531. * @param {KeyboardEvent} event - The native Keyboard Event.
  107532. * @param {Phaser.Input.Keyboard.KeyCombo} combo - The KeyCombo object to be processed.
  107533. *
  107534. * @return {boolean} `true` if the combo was matched, otherwise `false`.
  107535. */
  107536. var ProcessKeyCombo = function (event, combo)
  107537. {
  107538. if (combo.matched)
  107539. {
  107540. return true;
  107541. }
  107542. var comboMatched = false;
  107543. var keyMatched = false;
  107544. if (event.keyCode === combo.current)
  107545. {
  107546. // Key was correct
  107547. if (combo.index > 0 && combo.maxKeyDelay > 0)
  107548. {
  107549. // We have to check to see if the delay between
  107550. // the new key and the old one was too long (if enabled)
  107551. var timeLimit = combo.timeLastMatched + combo.maxKeyDelay;
  107552. // Check if they pressed it in time or not
  107553. if (event.timeStamp <= timeLimit)
  107554. {
  107555. keyMatched = true;
  107556. comboMatched = AdvanceKeyCombo(event, combo);
  107557. }
  107558. }
  107559. else
  107560. {
  107561. keyMatched = true;
  107562. // We don't check the time for the first key pressed, so just advance it
  107563. comboMatched = AdvanceKeyCombo(event, combo);
  107564. }
  107565. }
  107566. if (!keyMatched && combo.resetOnWrongKey)
  107567. {
  107568. // Wrong key was pressed
  107569. combo.index = 0;
  107570. combo.current = combo.keyCodes[0];
  107571. }
  107572. if (comboMatched)
  107573. {
  107574. combo.timeLastMatched = event.timeStamp;
  107575. combo.matched = true;
  107576. combo.timeMatched = event.timeStamp;
  107577. }
  107578. return comboMatched;
  107579. };
  107580. module.exports = ProcessKeyCombo;
  107581. /***/ }),
  107582. /* 612 */
  107583. /***/ (function(module, exports, __webpack_require__) {
  107584. /**
  107585. * @author Richard Davey <rich@photonstorm.com>
  107586. * @copyright 2019 Photon Storm Ltd.
  107587. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107588. */
  107589. var Class = __webpack_require__(0);
  107590. var EventEmitter = __webpack_require__(11);
  107591. var Events = __webpack_require__(113);
  107592. var GameEvents = __webpack_require__(26);
  107593. var GetValue = __webpack_require__(4);
  107594. var InputEvents = __webpack_require__(52);
  107595. var InputPluginCache = __webpack_require__(114);
  107596. var Key = __webpack_require__(261);
  107597. var KeyCodes = __webpack_require__(125);
  107598. var KeyCombo = __webpack_require__(260);
  107599. var KeyMap = __webpack_require__(608);
  107600. var SnapFloor = __webpack_require__(98);
  107601. /**
  107602. * @classdesc
  107603. * The Keyboard Plugin is an input plugin that belongs to the Scene-owned Input system.
  107604. *
  107605. * Its role is to listen for native DOM Keyboard Events and then process them.
  107606. *
  107607. * You do not need to create this class directly, the Input system will create an instance of it automatically.
  107608. *
  107609. * You can access it from within a Scene using `this.input.keyboard`. For example, you can do:
  107610. *
  107611. * ```javascript
  107612. * this.input.keyboard.on('keydown', callback, context);
  107613. * ```
  107614. *
  107615. * Or, to listen for a specific key:
  107616. *
  107617. * ```javascript
  107618. * this.input.keyboard.on('keydown-A', callback, context);
  107619. * ```
  107620. *
  107621. * You can also create Key objects, which you can then poll in your game loop:
  107622. *
  107623. * ```javascript
  107624. * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE);
  107625. * ```
  107626. *
  107627. * If you have multiple parallel Scenes, each trying to get keyboard input, be sure to disable capture on them to stop them from
  107628. * stealing input from another Scene in the list. You can do this with `this.input.keyboard.enabled = false` within the
  107629. * Scene to stop all input, or `this.input.keyboard.preventDefault = false` to stop a Scene halting input on another Scene.
  107630. *
  107631. * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting.
  107632. * See http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/ for more details.
  107633. *
  107634. * Also please be aware that certain browser extensions can disable or override Phaser keyboard handling.
  107635. * For example the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key.
  107636. * And there are others. So, please check your extensions before opening Phaser issues about keys that don't work.
  107637. *
  107638. * @class KeyboardPlugin
  107639. * @extends Phaser.Events.EventEmitter
  107640. * @memberof Phaser.Input.Keyboard
  107641. * @constructor
  107642. * @since 3.10.0
  107643. *
  107644. * @param {Phaser.Input.InputPlugin} sceneInputPlugin - A reference to the Scene Input Plugin that the KeyboardPlugin belongs to.
  107645. */
  107646. var KeyboardPlugin = new Class({
  107647. Extends: EventEmitter,
  107648. initialize:
  107649. function KeyboardPlugin (sceneInputPlugin)
  107650. {
  107651. EventEmitter.call(this);
  107652. /**
  107653. * A reference to the core game, so we can listen for visibility events.
  107654. *
  107655. * @name Phaser.Input.Keyboard.KeyboardPlugin#game
  107656. * @type {Phaser.Game}
  107657. * @since 3.16.0
  107658. */
  107659. this.game = sceneInputPlugin.systems.game;
  107660. /**
  107661. * A reference to the Scene that this Input Plugin is responsible for.
  107662. *
  107663. * @name Phaser.Input.Keyboard.KeyboardPlugin#scene
  107664. * @type {Phaser.Scene}
  107665. * @since 3.10.0
  107666. */
  107667. this.scene = sceneInputPlugin.scene;
  107668. /**
  107669. * A reference to the Scene Systems Settings.
  107670. *
  107671. * @name Phaser.Input.Keyboard.KeyboardPlugin#settings
  107672. * @type {Phaser.Scenes.Settings.Object}
  107673. * @since 3.10.0
  107674. */
  107675. this.settings = this.scene.sys.settings;
  107676. /**
  107677. * A reference to the Scene Input Plugin that created this Keyboard Plugin.
  107678. *
  107679. * @name Phaser.Input.Keyboard.KeyboardPlugin#sceneInputPlugin
  107680. * @type {Phaser.Input.InputPlugin}
  107681. * @since 3.10.0
  107682. */
  107683. this.sceneInputPlugin = sceneInputPlugin;
  107684. /**
  107685. * A reference to the global Keyboard Manager.
  107686. *
  107687. * @name Phaser.Input.Keyboard.KeyboardPlugin#manager
  107688. * @type {Phaser.Input.InputPlugin}
  107689. * @since 3.16.0
  107690. */
  107691. this.manager = sceneInputPlugin.manager.keyboard;
  107692. /**
  107693. * A boolean that controls if this Keyboard Plugin is enabled or not.
  107694. * Can be toggled on the fly.
  107695. *
  107696. * @name Phaser.Input.Keyboard.KeyboardPlugin#enabled
  107697. * @type {boolean}
  107698. * @default true
  107699. * @since 3.10.0
  107700. */
  107701. this.enabled = true;
  107702. /**
  107703. * An array of Key objects to process.
  107704. *
  107705. * @name Phaser.Input.Keyboard.KeyboardPlugin#keys
  107706. * @type {Phaser.Input.Keyboard.Key[]}
  107707. * @since 3.10.0
  107708. */
  107709. this.keys = [];
  107710. /**
  107711. * An array of KeyCombo objects to process.
  107712. *
  107713. * @name Phaser.Input.Keyboard.KeyboardPlugin#combos
  107714. * @type {Phaser.Input.Keyboard.KeyCombo[]}
  107715. * @since 3.10.0
  107716. */
  107717. this.combos = [];
  107718. sceneInputPlugin.pluginEvents.once(InputEvents.BOOT, this.boot, this);
  107719. sceneInputPlugin.pluginEvents.on(InputEvents.START, this.start, this);
  107720. },
  107721. /**
  107722. * This method is called automatically, only once, when the Scene is first created.
  107723. * Do not invoke it directly.
  107724. *
  107725. * @method Phaser.Input.Keyboard.KeyboardPlugin#boot
  107726. * @private
  107727. * @since 3.10.0
  107728. */
  107729. boot: function ()
  107730. {
  107731. var settings = this.settings.input;
  107732. this.enabled = GetValue(settings, 'keyboard', true);
  107733. var captures = GetValue(settings, 'keyboard.capture', null);
  107734. if (captures)
  107735. {
  107736. this.addCaptures(captures);
  107737. }
  107738. this.sceneInputPlugin.pluginEvents.once(InputEvents.DESTROY, this.destroy, this);
  107739. },
  107740. /**
  107741. * This method is called automatically by the Scene when it is starting up.
  107742. * It is responsible for creating local systems, properties and listening for Scene events.
  107743. * Do not invoke it directly.
  107744. *
  107745. * @method Phaser.Input.Keyboard.KeyboardPlugin#start
  107746. * @private
  107747. * @since 3.10.0
  107748. */
  107749. start: function ()
  107750. {
  107751. if (this.sceneInputPlugin.manager.useQueue)
  107752. {
  107753. this.sceneInputPlugin.pluginEvents.on(InputEvents.UPDATE, this.update, this);
  107754. }
  107755. else
  107756. {
  107757. this.sceneInputPlugin.manager.events.on(InputEvents.MANAGER_PROCESS, this.update, this);
  107758. }
  107759. this.sceneInputPlugin.pluginEvents.once(InputEvents.SHUTDOWN, this.shutdown, this);
  107760. this.game.events.on(GameEvents.BLUR, this.resetKeys, this);
  107761. },
  107762. /**
  107763. * Checks to see if both this plugin and the Scene to which it belongs is active.
  107764. *
  107765. * @method Phaser.Input.Keyboard.KeyboardPlugin#isActive
  107766. * @since 3.10.0
  107767. *
  107768. * @return {boolean} `true` if the plugin and the Scene it belongs to is active.
  107769. */
  107770. isActive: function ()
  107771. {
  107772. return (this.enabled && this.scene.sys.isActive());
  107773. },
  107774. /**
  107775. * By default when a key is pressed Phaser will not stop the event from propagating up to the browser.
  107776. * There are some keys this can be annoying for, like the arrow keys or space bar, which make the browser window scroll.
  107777. *
  107778. * This `addCapture` method enables consuming keyboard events for specific keys, so they don't bubble up the browser
  107779. * and cause the default behaviors.
  107780. *
  107781. * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to say prevent
  107782. * the SPACE BAR from triggering a page scroll, then it will prevent it for any Scene in your game, not just the calling one.
  107783. *
  107784. * You can pass a single key code value:
  107785. *
  107786. * ```javascript
  107787. * this.input.keyboard.addCapture(62);
  107788. * ```
  107789. *
  107790. * An array of key codes:
  107791. *
  107792. * ```javascript
  107793. * this.input.keyboard.addCapture([ 62, 63, 64 ]);
  107794. * ```
  107795. *
  107796. * Or, a comma-delimited string:
  107797. *
  107798. * ```javascript
  107799. * this.input.keyboard.addCapture('W,S,A,D');
  107800. * ```
  107801. *
  107802. * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'.
  107803. *
  107804. * You can also provide an array mixing both strings and key code integers.
  107805. *
  107806. * @method Phaser.Input.Keyboard.KeyboardPlugin#addCapture
  107807. * @since 3.16.0
  107808. *
  107809. * @param {(string|integer|integer[]|any[])} keycode - The Key Codes to enable event capture for.
  107810. *
  107811. * @return {Phaser.Input.Keyboard.KeyboardPlugin} This KeyboardPlugin object.
  107812. */
  107813. addCapture: function (keycode)
  107814. {
  107815. this.manager.addCapture(keycode);
  107816. return this;
  107817. },
  107818. /**
  107819. * Removes an existing key capture.
  107820. *
  107821. * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to remove
  107822. * the capture of a key, then it will remove it for any Scene in your game, not just the calling one.
  107823. *
  107824. * You can pass a single key code value:
  107825. *
  107826. * ```javascript
  107827. * this.input.keyboard.removeCapture(62);
  107828. * ```
  107829. *
  107830. * An array of key codes:
  107831. *
  107832. * ```javascript
  107833. * this.input.keyboard.removeCapture([ 62, 63, 64 ]);
  107834. * ```
  107835. *
  107836. * Or, a comma-delimited string:
  107837. *
  107838. * ```javascript
  107839. * this.input.keyboard.removeCapture('W,S,A,D');
  107840. * ```
  107841. *
  107842. * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'.
  107843. *
  107844. * You can also provide an array mixing both strings and key code integers.
  107845. *
  107846. * @method Phaser.Input.Keyboard.KeyboardPlugin#removeCapture
  107847. * @since 3.16.0
  107848. *
  107849. * @param {(string|integer|integer[]|any[])} keycode - The Key Codes to disable event capture for.
  107850. *
  107851. * @return {Phaser.Input.Keyboard.KeyboardPlugin} This KeyboardPlugin object.
  107852. */
  107853. removeCapture: function (keycode)
  107854. {
  107855. this.manager.removeCapture(keycode);
  107856. return this;
  107857. },
  107858. /**
  107859. * Returns an array that contains all of the keyboard captures currently enabled.
  107860. *
  107861. * @method Phaser.Input.Keyboard.KeyboardPlugin#getCaptures
  107862. * @since 3.16.0
  107863. *
  107864. * @return {integer[]} An array of all the currently capturing key codes.
  107865. */
  107866. getCaptures: function ()
  107867. {
  107868. return this.manager.captures;
  107869. },
  107870. /**
  107871. * Allows Phaser to prevent any key captures you may have defined from bubbling up the browser.
  107872. * You can use this to re-enable event capturing if you had paused it via `disableGlobalCapture`.
  107873. *
  107874. * @method Phaser.Input.Keyboard.KeyboardPlugin#enableGlobalCapture
  107875. * @since 3.16.0
  107876. *
  107877. * @return {Phaser.Input.Keyboard.KeyboardPlugin} This KeyboardPlugin object.
  107878. */
  107879. enableGlobalCapture: function ()
  107880. {
  107881. this.manager.preventDefault = true;
  107882. return this;
  107883. },
  107884. /**
  107885. * Disables Phaser from preventing any key captures you may have defined, without actually removing them.
  107886. * You can use this to temporarily disable event capturing if, for example, you swap to a DOM element.
  107887. *
  107888. * @method Phaser.Input.Keyboard.KeyboardPlugin#disableGlobalCapture
  107889. * @since 3.16.0
  107890. *
  107891. * @return {Phaser.Input.Keyboard.KeyboardPlugin} This KeyboardPlugin object.
  107892. */
  107893. disableGlobalCapture: function ()
  107894. {
  107895. this.manager.preventDefault = false;
  107896. return this;
  107897. },
  107898. /**
  107899. * Removes all keyboard captures.
  107900. *
  107901. * Note that this is a global change. It will clear all event captures across your game, not just for this specific Scene.
  107902. *
  107903. * @method Phaser.Input.Keyboard.KeyboardPlugin#clearCaptures
  107904. * @since 3.16.0
  107905. *
  107906. * @return {Phaser.Input.Keyboard.KeyboardPlugin} This KeyboardPlugin object.
  107907. */
  107908. clearCaptures: function ()
  107909. {
  107910. this.manager.clearCaptures();
  107911. return this;
  107912. },
  107913. /**
  107914. * @typedef {object} CursorKeys
  107915. * @memberof Phaser.Input.Keyboard
  107916. *
  107917. * @property {Phaser.Input.Keyboard.Key} [up] - A Key object mapping to the UP arrow key.
  107918. * @property {Phaser.Input.Keyboard.Key} [down] - A Key object mapping to the DOWN arrow key.
  107919. * @property {Phaser.Input.Keyboard.Key} [left] - A Key object mapping to the LEFT arrow key.
  107920. * @property {Phaser.Input.Keyboard.Key} [right] - A Key object mapping to the RIGHT arrow key.
  107921. * @property {Phaser.Input.Keyboard.Key} [space] - A Key object mapping to the SPACE BAR key.
  107922. * @property {Phaser.Input.Keyboard.Key} [shift] - A Key object mapping to the SHIFT key.
  107923. */
  107924. /**
  107925. * Creates and returns an object containing 4 hotkeys for Up, Down, Left and Right, and also Space Bar and shift.
  107926. *
  107927. * @method Phaser.Input.Keyboard.KeyboardPlugin#createCursorKeys
  107928. * @since 3.10.0
  107929. *
  107930. * @return {CursorKeys} An object containing the properties: `up`, `down`, `left`, `right`, `space` and `shift`.
  107931. */
  107932. createCursorKeys: function ()
  107933. {
  107934. return this.addKeys({
  107935. up: KeyCodes.UP,
  107936. down: KeyCodes.DOWN,
  107937. left: KeyCodes.LEFT,
  107938. right: KeyCodes.RIGHT,
  107939. space: KeyCodes.SPACE,
  107940. shift: KeyCodes.SHIFT
  107941. });
  107942. },
  107943. /**
  107944. * A practical way to create an object containing user selected hotkeys.
  107945. *
  107946. * For example:
  107947. *
  107948. * ```javascript
  107949. * this.input.keyboard.addKeys({ 'up': Phaser.Input.Keyboard.KeyCodes.W, 'down': Phaser.Input.Keyboard.KeyCodes.S });
  107950. * ```
  107951. *
  107952. * would return an object containing the properties (`up` and `down`) mapped to W and S {@link Phaser.Input.Keyboard.Key} objects.
  107953. *
  107954. * You can also pass in a comma-separated string:
  107955. *
  107956. * ```javascript
  107957. * this.input.keyboard.addKeys('W,S,A,D');
  107958. * ```
  107959. *
  107960. * Which will return an object with the properties W, S, A and D mapped to the relevant Key objects.
  107961. *
  107962. * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'.
  107963. *
  107964. * @method Phaser.Input.Keyboard.KeyboardPlugin#addKeys
  107965. * @since 3.10.0
  107966. *
  107967. * @param {(object|string)} keys - An object containing Key Codes, or a comma-separated string.
  107968. * @param {boolean} [enableCapture=true] - Automatically call `preventDefault` on the native DOM browser event for the key codes being added.
  107969. * @param {boolean} [emitOnRepeat=false] - Controls if the Key will continuously emit a 'down' event while being held down (true), or emit the event just once (false, the default).
  107970. *
  107971. * @return {object} An object containing Key objects mapped to the input properties.
  107972. */
  107973. addKeys: function (keys, enableCapture, emitOnRepeat)
  107974. {
  107975. if (enableCapture === undefined) { enableCapture = true; }
  107976. if (emitOnRepeat === undefined) { emitOnRepeat = false; }
  107977. var output = {};
  107978. if (typeof keys === 'string')
  107979. {
  107980. keys = keys.split(',');
  107981. for (var i = 0; i < keys.length; i++)
  107982. {
  107983. var currentKey = keys[i].trim();
  107984. if (currentKey)
  107985. {
  107986. output[currentKey] = this.addKey(currentKey, enableCapture, emitOnRepeat);
  107987. }
  107988. }
  107989. }
  107990. else
  107991. {
  107992. for (var key in keys)
  107993. {
  107994. output[key] = this.addKey(keys[key], enableCapture, emitOnRepeat);
  107995. }
  107996. }
  107997. return output;
  107998. },
  107999. /**
  108000. * Adds a Key object to this Keyboard Plugin.
  108001. *
  108002. * The given argument can be either an existing Key object, a string, such as `A` or `SPACE`, or a key code value.
  108003. *
  108004. * If a Key object is given, and one already exists matching the same key code, the existing one is replaced with the new one.
  108005. *
  108006. * @method Phaser.Input.Keyboard.KeyboardPlugin#addKey
  108007. * @since 3.10.0
  108008. *
  108009. * @param {(Phaser.Input.Keyboard.Key|string|integer)} key - Either a Key object, a string, such as `A` or `SPACE`, or a key code value.
  108010. * @param {boolean} [enableCapture=true] - Automatically call `preventDefault` on the native DOM browser event for the key codes being added.
  108011. * @param {boolean} [emitOnRepeat=false] - Controls if the Key will continuously emit a 'down' event while being held down (true), or emit the event just once (false, the default).
  108012. *
  108013. * @return {Phaser.Input.Keyboard.Key} The newly created Key object, or a reference to it if it already existed in the keys array.
  108014. */
  108015. addKey: function (key, enableCapture, emitOnRepeat)
  108016. {
  108017. if (enableCapture === undefined) { enableCapture = true; }
  108018. if (emitOnRepeat === undefined) { emitOnRepeat = false; }
  108019. var keys = this.keys;
  108020. if (key instanceof Key)
  108021. {
  108022. var idx = keys.indexOf(key);
  108023. if (idx > -1)
  108024. {
  108025. keys[idx] = key;
  108026. }
  108027. else
  108028. {
  108029. keys[key.keyCode] = key;
  108030. }
  108031. if (enableCapture)
  108032. {
  108033. this.addCapture(key.keyCode);
  108034. }
  108035. key.setEmitOnRepeat(emitOnRepeat);
  108036. return key;
  108037. }
  108038. if (typeof key === 'string')
  108039. {
  108040. key = KeyCodes[key.toUpperCase()];
  108041. }
  108042. if (!keys[key])
  108043. {
  108044. keys[key] = new Key(key);
  108045. if (enableCapture)
  108046. {
  108047. this.addCapture(key);
  108048. }
  108049. keys[key].setEmitOnRepeat(emitOnRepeat);
  108050. }
  108051. return keys[key];
  108052. },
  108053. /**
  108054. * Removes a Key object from this Keyboard Plugin.
  108055. *
  108056. * The given argument can be either a Key object, a string, such as `A` or `SPACE`, or a key code value.
  108057. *
  108058. * @method Phaser.Input.Keyboard.KeyboardPlugin#removeKey
  108059. * @since 3.10.0
  108060. *
  108061. * @param {(Phaser.Input.Keyboard.Key|string|integer)} key - Either a Key object, a string, such as `A` or `SPACE`, or a key code value.
  108062. *
  108063. * @return {Phaser.Input.Keyboard.KeyboardPlugin} This KeyboardPlugin object.
  108064. */
  108065. removeKey: function (key)
  108066. {
  108067. var keys = this.keys;
  108068. if (key instanceof Key)
  108069. {
  108070. var idx = keys.indexOf(key);
  108071. if (idx > -1)
  108072. {
  108073. this.keys[idx] = undefined;
  108074. }
  108075. }
  108076. else if (typeof key === 'string')
  108077. {
  108078. key = KeyCodes[key.toUpperCase()];
  108079. }
  108080. if (keys[key])
  108081. {
  108082. keys[key] = undefined;
  108083. }
  108084. return this;
  108085. },
  108086. /**
  108087. * Creates a new KeyCombo.
  108088. *
  108089. * A KeyCombo will listen for a specific string of keys from the Keyboard, and when it receives them
  108090. * it will emit a `keycombomatch` event from this Keyboard Plugin.
  108091. *
  108092. * The keys to be listened for can be defined as:
  108093. *
  108094. * A string (i.e. 'ATARI')
  108095. * An array of either integers (key codes) or strings, or a mixture of both
  108096. * An array of objects (such as Key objects) with a public 'keyCode' property
  108097. *
  108098. * For example, to listen for the Konami code (up, up, down, down, left, right, left, right, b, a, enter)
  108099. * you could pass the following array of key codes:
  108100. *
  108101. * ```javascript
  108102. * this.input.keyboard.createCombo([ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ], { resetOnMatch: true });
  108103. *
  108104. * this.input.keyboard.on('keycombomatch', function (event) {
  108105. * console.log('Konami Code entered!');
  108106. * });
  108107. * ```
  108108. *
  108109. * Or, to listen for the user entering the word PHASER:
  108110. *
  108111. * ```javascript
  108112. * this.input.keyboard.createCombo('PHASER');
  108113. * ```
  108114. *
  108115. * @method Phaser.Input.Keyboard.KeyboardPlugin#createCombo
  108116. * @since 3.10.0
  108117. *
  108118. * @param {(string|integer[]|object[])} keys - The keys that comprise this combo.
  108119. * @param {KeyComboConfig} [config] - A Key Combo configuration object.
  108120. *
  108121. * @return {Phaser.Input.Keyboard.KeyCombo} The new KeyCombo object.
  108122. */
  108123. createCombo: function (keys, config)
  108124. {
  108125. return new KeyCombo(this, keys, config);
  108126. },
  108127. /**
  108128. * Checks if the given Key object is currently being held down.
  108129. *
  108130. * The difference between this method and checking the `Key.isDown` property directly is that you can provide
  108131. * a duration to this method. For example, if you wanted a key press to fire a bullet, but you only wanted
  108132. * it to be able to fire every 100ms, then you can call this method with a `duration` of 100 and it
  108133. * will only return `true` every 100ms.
  108134. *
  108135. * If the Keyboard Plugin has been disabled, this method will always return `false`.
  108136. *
  108137. * @method Phaser.Input.Keyboard.KeyboardPlugin#checkDown
  108138. * @since 3.11.0
  108139. *
  108140. * @param {Phaser.Input.Keyboard.Key} key - A Key object.
  108141. * @param {number} [duration=0] - The duration which must have elapsed before this Key is considered as being down.
  108142. *
  108143. * @return {boolean} `true` if the Key is down within the duration specified, otherwise `false`.
  108144. */
  108145. checkDown: function (key, duration)
  108146. {
  108147. if (this.enabled && key.isDown)
  108148. {
  108149. var t = SnapFloor(this.time - key.timeDown, duration);
  108150. if (t > key._tick)
  108151. {
  108152. key._tick = t;
  108153. return true;
  108154. }
  108155. }
  108156. return false;
  108157. },
  108158. /**
  108159. * Internal update handler called by the Input Plugin, which is in turn invoked by the Game step.
  108160. *
  108161. * @method Phaser.Input.Keyboard.KeyboardPlugin#update
  108162. * @private
  108163. * @since 3.10.0
  108164. */
  108165. update: function ()
  108166. {
  108167. var queue = this.manager.queue;
  108168. var len = queue.length;
  108169. if (!this.isActive() || len === 0)
  108170. {
  108171. return;
  108172. }
  108173. var keys = this.keys;
  108174. // Process the event queue, dispatching all of the events that have stored up
  108175. for (var i = 0; i < len; i++)
  108176. {
  108177. var event = queue[i];
  108178. var code = event.keyCode;
  108179. var key = keys[code];
  108180. var repeat = false;
  108181. // Override the default functions (it's too late for the browser to use them anyway, so we may as well)
  108182. if (event.cancelled === undefined)
  108183. {
  108184. // Event allowed to flow across all handlers in this Scene, and any other Scene in the Scene list
  108185. event.cancelled = 0;
  108186. // Won't reach any more local (Scene level) handlers
  108187. event.stopImmediatePropagation = function ()
  108188. {
  108189. event.cancelled = 1;
  108190. };
  108191. // Won't reach any more handlers in any Scene further down the Scene list
  108192. event.stopPropagation = function ()
  108193. {
  108194. event.cancelled = -1;
  108195. };
  108196. }
  108197. if (event.cancelled === -1)
  108198. {
  108199. // This event has been stopped from broadcasting to any other Scene, so abort.
  108200. continue;
  108201. }
  108202. if (event.type === 'keydown')
  108203. {
  108204. // Key specific callback first
  108205. if (key)
  108206. {
  108207. repeat = key.isDown;
  108208. key.onDown(event);
  108209. }
  108210. if (!event.cancelled && (!key || !repeat))
  108211. {
  108212. if (KeyMap[code])
  108213. {
  108214. this.emit(Events.KEY_DOWN + KeyMap[code], event);
  108215. // Deprecated, kept in for compatibility with 3.15
  108216. // To be removed by 3.20.
  108217. this.emit('keydown_' + KeyMap[code], event);
  108218. }
  108219. if (!event.cancelled)
  108220. {
  108221. this.emit(Events.ANY_KEY_DOWN, event);
  108222. }
  108223. }
  108224. }
  108225. else
  108226. {
  108227. // Key specific callback first
  108228. if (key)
  108229. {
  108230. key.onUp(event);
  108231. }
  108232. if (!event.cancelled)
  108233. {
  108234. if (KeyMap[code])
  108235. {
  108236. this.emit(Events.KEY_UP + KeyMap[code], event);
  108237. // Deprecated, kept in for compatibility with 3.15
  108238. // To be removed by 3.20.
  108239. this.emit('keyup_' + KeyMap[code], event);
  108240. }
  108241. if (!event.cancelled)
  108242. {
  108243. this.emit(Events.ANY_KEY_UP, event);
  108244. }
  108245. }
  108246. }
  108247. // Reset the cancel state for other Scenes to use
  108248. if (event.cancelled === 1)
  108249. {
  108250. event.cancelled = 0;
  108251. }
  108252. }
  108253. },
  108254. /**
  108255. * Resets all Key objects created by _this_ Keyboard Plugin back to their default un-pressed states.
  108256. * This can only reset keys created via the `addKey`, `addKeys` or `createCursorKeys` methods.
  108257. * If you have created a Key object directly you'll need to reset it yourself.
  108258. *
  108259. * This method is called automatically when the Keyboard Plugin shuts down, but can be
  108260. * invoked directly at any time you require.
  108261. *
  108262. * @method Phaser.Input.Keyboard.KeyboardPlugin#resetKeys
  108263. * @since 3.15.0
  108264. *
  108265. * @return {Phaser.Input.Keyboard.KeyboardPlugin} This KeyboardPlugin object.
  108266. */
  108267. resetKeys: function ()
  108268. {
  108269. var keys = this.keys;
  108270. for (var i = 0; i < keys.length; i++)
  108271. {
  108272. // Because it's a sparsely populated array
  108273. if (keys[i])
  108274. {
  108275. keys[i].reset();
  108276. }
  108277. }
  108278. return this;
  108279. },
  108280. /**
  108281. * Shuts this Keyboard Plugin down. This performs the following tasks:
  108282. *
  108283. * 1 - Resets all keys created by this Keyboard plugin.
  108284. * 2 - Stops and removes the keyboard event listeners.
  108285. * 3 - Clears out any pending requests in the queue, without processing them.
  108286. *
  108287. * @method Phaser.Input.Keyboard.KeyboardPlugin#shutdown
  108288. * @private
  108289. * @since 3.10.0
  108290. */
  108291. shutdown: function ()
  108292. {
  108293. this.resetKeys();
  108294. if (this.sceneInputPlugin.manager.useQueue)
  108295. {
  108296. this.sceneInputPlugin.pluginEvents.off(InputEvents.UPDATE, this.update, this);
  108297. }
  108298. else
  108299. {
  108300. this.sceneInputPlugin.manager.events.off(InputEvents.MANAGER_PROCESS, this.update, this);
  108301. }
  108302. this.game.events.off(GameEvents.BLUR, this.resetKeys);
  108303. this.removeAllListeners();
  108304. this.queue = [];
  108305. },
  108306. /**
  108307. * Destroys this Keyboard Plugin instance and all references it holds, plus clears out local arrays.
  108308. *
  108309. * @method Phaser.Input.Keyboard.KeyboardPlugin#destroy
  108310. * @private
  108311. * @since 3.10.0
  108312. */
  108313. destroy: function ()
  108314. {
  108315. this.shutdown();
  108316. var keys = this.keys;
  108317. for (var i = 0; i < keys.length; i++)
  108318. {
  108319. // Because it's a sparsely populated array
  108320. if (keys[i])
  108321. {
  108322. keys[i].destroy();
  108323. }
  108324. }
  108325. this.keys = [];
  108326. this.combos = [];
  108327. this.queue = [];
  108328. this.scene = null;
  108329. this.settings = null;
  108330. this.sceneInputPlugin = null;
  108331. this.manager = null;
  108332. },
  108333. /**
  108334. * Internal time value.
  108335. *
  108336. * @name Phaser.Input.Keyboard.KeyboardPlugin#time
  108337. * @type {number}
  108338. * @private
  108339. * @since 3.11.0
  108340. */
  108341. time: {
  108342. get: function ()
  108343. {
  108344. return this.sceneInputPlugin.manager.time;
  108345. }
  108346. }
  108347. });
  108348. /**
  108349. * An instance of the Keyboard Plugin class, if enabled via the `input.keyboard` Scene or Game Config property.
  108350. * Use this to create Key objects and listen for keyboard specific events.
  108351. *
  108352. * @name Phaser.Input.InputPlugin#keyboard
  108353. * @type {?Phaser.Input.Keyboard.KeyboardPlugin}
  108354. * @since 3.10.0
  108355. */
  108356. InputPluginCache.register('KeyboardPlugin', KeyboardPlugin, 'keyboard', 'keyboard', 'inputKeyboard');
  108357. module.exports = KeyboardPlugin;
  108358. /***/ }),
  108359. /* 613 */
  108360. /***/ (function(module, exports) {
  108361. /**
  108362. * @author Richard Davey <rich@photonstorm.com>
  108363. * @copyright 2019 Photon Storm Ltd.
  108364. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108365. */
  108366. /**
  108367. * The Key Up Event.
  108368. *
  108369. * This event is dispatched by a [Key]{@link Phaser.Input.Keyboard.Key} object when it is released.
  108370. *
  108371. * Listen for this event from the Key object instance directly:
  108372. *
  108373. * ```javascript
  108374. * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE);
  108375. *
  108376. * spaceBar.on('up', listener)
  108377. * ```
  108378. *
  108379. * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_UP]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_UP} for details.
  108380. *
  108381. * @event Phaser.Input.Keyboard.Events#UP
  108382. *
  108383. * @param {Phaser.Input.Keyboard.Key} key - The Key object that was released.
  108384. * @param {KeyboardEvent} event - The native DOM Keyboard Event. You can inspect this to learn more about any modifiers, etc.
  108385. */
  108386. module.exports = 'up';
  108387. /***/ }),
  108388. /* 614 */
  108389. /***/ (function(module, exports) {
  108390. /**
  108391. * @author Richard Davey <rich@photonstorm.com>
  108392. * @copyright 2019 Photon Storm Ltd.
  108393. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108394. */
  108395. /**
  108396. * The Key Up Event.
  108397. *
  108398. * This event is dispatched by the Keyboard Plugin when any key on the keyboard is released.
  108399. *
  108400. * Unlike the `ANY_KEY_UP` event, this one has a special dynamic event name. For example, to listen for the `A` key being released
  108401. * use the following from within a Scene: `this.input.keyboard.on('keyup-A', listener)`. You can replace the `-A` part of the event
  108402. * name with any valid [Key Code string]{@link Phaser.Input.Keyboard.KeyCodes}. For example, this will listen for the space bar:
  108403. * `this.input.keyboard.on('keyup-SPACE', listener)`.
  108404. *
  108405. * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_UP]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_UP} for details.
  108406. *
  108407. * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.UP]{@linkcode Phaser.Input.Keyboard.Events#event:UP} for details.
  108408. *
  108409. * @event Phaser.Input.Keyboard.Events#KEY_UP
  108410. *
  108411. * @param {KeyboardEvent} event - The native DOM Keyboard Event. You can inspect this to learn more about the key that was released, any modifiers, etc.
  108412. */
  108413. module.exports = 'keyup-';
  108414. /***/ }),
  108415. /* 615 */
  108416. /***/ (function(module, exports) {
  108417. /**
  108418. * @author Richard Davey <rich@photonstorm.com>
  108419. * @copyright 2019 Photon Storm Ltd.
  108420. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108421. */
  108422. /**
  108423. * The Key Down Event.
  108424. *
  108425. * This event is dispatched by the Keyboard Plugin when any key on the keyboard is pressed down.
  108426. *
  108427. * Unlike the `ANY_KEY_DOWN` event, this one has a special dynamic event name. For example, to listen for the `A` key being pressed
  108428. * use the following from within a Scene: `this.input.keyboard.on('keydown-A', listener)`. You can replace the `-A` part of the event
  108429. * name with any valid [Key Code string]{@link Phaser.Input.Keyboard.KeyCodes}. For example, this will listen for the space bar:
  108430. * `this.input.keyboard.on('keydown-SPACE', listener)`.
  108431. *
  108432. * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_DOWN} for details.
  108433. *
  108434. * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:DOWN} for details.
  108435. *
  108436. * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting.
  108437. * Read [this article on ghosting]{@link http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/} for details.
  108438. *
  108439. * Also, please be aware that some browser extensions can disable or override Phaser keyboard handling.
  108440. * For example, the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key.
  108441. * There are others. So, please check your extensions if you find you have specific keys that don't work.
  108442. *
  108443. * @event Phaser.Input.Keyboard.Events#KEY_DOWN
  108444. *
  108445. * @param {KeyboardEvent} event - The native DOM Keyboard Event. You can inspect this to learn more about the key that was pressed, any modifiers, etc.
  108446. */
  108447. module.exports = 'keydown-';
  108448. /***/ }),
  108449. /* 616 */
  108450. /***/ (function(module, exports) {
  108451. /**
  108452. * @author Richard Davey <rich@photonstorm.com>
  108453. * @copyright 2019 Photon Storm Ltd.
  108454. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108455. */
  108456. /**
  108457. * The Key Down Event.
  108458. *
  108459. * This event is dispatched by a [Key]{@link Phaser.Input.Keyboard.Key} object when it is pressed.
  108460. *
  108461. * Listen for this event from the Key object instance directly:
  108462. *
  108463. * ```javascript
  108464. * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE);
  108465. *
  108466. * spaceBar.on('down', listener)
  108467. * ```
  108468. *
  108469. * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_DOWN} for details.
  108470. *
  108471. * @event Phaser.Input.Keyboard.Events#DOWN
  108472. *
  108473. * @param {Phaser.Input.Keyboard.Key} key - The Key object that was pressed.
  108474. * @param {KeyboardEvent} event - The native DOM Keyboard Event. You can inspect this to learn more about any modifiers, etc.
  108475. */
  108476. module.exports = 'down';
  108477. /***/ }),
  108478. /* 617 */
  108479. /***/ (function(module, exports) {
  108480. /**
  108481. * @author Richard Davey <rich@photonstorm.com>
  108482. * @copyright 2019 Photon Storm Ltd.
  108483. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108484. */
  108485. /**
  108486. * The Key Combo Match Event.
  108487. *
  108488. * This event is dispatched by the Keyboard Plugin when a [Key Combo]{@link Phaser.Input.Keyboard.KeyCombo} is matched.
  108489. *
  108490. * Listen for this event from the Key Plugin after a combo has been created:
  108491. *
  108492. * ```javascript
  108493. * this.input.keyboard.createCombo([ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ], { resetOnMatch: true });
  108494. *
  108495. * this.input.keyboard.on('keycombomatch', function (event) {
  108496. * console.log('Konami Code entered!');
  108497. * });
  108498. * ```
  108499. *
  108500. * @event Phaser.Input.Keyboard.Events#COMBO_MATCH
  108501. *
  108502. * @param {Phaser.Input.Keyboard.KeyCombo} keycombo - The Key Combo object that was matched.
  108503. * @param {KeyboardEvent} event - The native DOM Keyboard Event of the final key in the combo. You can inspect this to learn more about any modifiers, etc.
  108504. */
  108505. module.exports = 'keycombomatch';
  108506. /***/ }),
  108507. /* 618 */
  108508. /***/ (function(module, exports) {
  108509. /**
  108510. * @author Richard Davey <rich@photonstorm.com>
  108511. * @copyright 2019 Photon Storm Ltd.
  108512. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108513. */
  108514. /**
  108515. * The Global Key Up Event.
  108516. *
  108517. * This event is dispatched by the Keyboard Plugin when any key on the keyboard is released.
  108518. *
  108519. * Listen to this event from within a Scene using: `this.input.keyboard.on('keyup', listener)`.
  108520. *
  108521. * You can also listen for a specific key being released. See [Keyboard.Events.KEY_UP]{@linkcode Phaser.Input.Keyboard.Events#event:KEY_UP} for details.
  108522. *
  108523. * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.UP]{@linkcode Phaser.Input.Keyboard.Events#event:UP} for details.
  108524. *
  108525. * @event Phaser.Input.Keyboard.Events#ANY_KEY_UP
  108526. *
  108527. * @param {KeyboardEvent} event - The native DOM Keyboard Event. You can inspect this to learn more about the key that was released, any modifiers, etc.
  108528. */
  108529. module.exports = 'keyup';
  108530. /***/ }),
  108531. /* 619 */
  108532. /***/ (function(module, exports) {
  108533. /**
  108534. * @author Richard Davey <rich@photonstorm.com>
  108535. * @copyright 2019 Photon Storm Ltd.
  108536. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108537. */
  108538. /**
  108539. * The Global Key Down Event.
  108540. *
  108541. * This event is dispatched by the Keyboard Plugin when any key on the keyboard is pressed down.
  108542. *
  108543. * Listen to this event from within a Scene using: `this.input.keyboard.on('keydown', listener)`.
  108544. *
  108545. * You can also listen for a specific key being pressed. See [Keyboard.Events.KEY_DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:KEY_DOWN} for details.
  108546. *
  108547. * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:DOWN} for details.
  108548. *
  108549. * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting.
  108550. * Read [this article on ghosting]{@link http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/} for details.
  108551. *
  108552. * Also, please be aware that some browser extensions can disable or override Phaser keyboard handling.
  108553. * For example, the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key.
  108554. * There are others. So, please check your extensions if you find you have specific keys that don't work.
  108555. *
  108556. * @event Phaser.Input.Keyboard.Events#ANY_KEY_DOWN
  108557. *
  108558. * @param {KeyboardEvent} event - The native DOM Keyboard Event. You can inspect this to learn more about the key that was pressed, any modifiers, etc.
  108559. */
  108560. module.exports = 'keydown';
  108561. /***/ }),
  108562. /* 620 */
  108563. /***/ (function(module, exports, __webpack_require__) {
  108564. /**
  108565. * @author Richard Davey <rich@photonstorm.com>
  108566. * @copyright 2019 Photon Storm Ltd.
  108567. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108568. */
  108569. /**
  108570. * @namespace Phaser.Input.Keyboard
  108571. */
  108572. module.exports = {
  108573. Events: __webpack_require__(113),
  108574. KeyboardManager: __webpack_require__(340),
  108575. KeyboardPlugin: __webpack_require__(612),
  108576. Key: __webpack_require__(261),
  108577. KeyCodes: __webpack_require__(125),
  108578. KeyCombo: __webpack_require__(260),
  108579. JustDown: __webpack_require__(607),
  108580. JustUp: __webpack_require__(606),
  108581. DownDuration: __webpack_require__(605),
  108582. UpDuration: __webpack_require__(604)
  108583. };
  108584. /***/ }),
  108585. /* 621 */
  108586. /***/ (function(module, exports) {
  108587. /**
  108588. * @author Richard Davey <rich@photonstorm.com>
  108589. * @copyright 2019 Photon Storm Ltd.
  108590. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108591. */
  108592. /**
  108593. * Creates a new Pixel Perfect Handler function.
  108594. *
  108595. * Access via `InputPlugin.makePixelPerfect` rather than calling it directly.
  108596. *
  108597. * @function Phaser.Input.CreatePixelPerfectHandler
  108598. * @since 3.10.0
  108599. *
  108600. * @param {Phaser.Textures.TextureManager} textureManager - A reference to the Texture Manager.
  108601. * @param {integer} alphaTolerance - The alpha level that the pixel should be above to be included as a successful interaction.
  108602. *
  108603. * @return {function} The new Pixel Perfect Handler function.
  108604. */
  108605. var CreatePixelPerfectHandler = function (textureManager, alphaTolerance)
  108606. {
  108607. return function (hitArea, x, y, gameObject)
  108608. {
  108609. var alpha = textureManager.getPixelAlpha(x, y, gameObject.texture.key, gameObject.frame.name);
  108610. return (alpha && alpha >= alphaTolerance);
  108611. };
  108612. };
  108613. module.exports = CreatePixelPerfectHandler;
  108614. /***/ }),
  108615. /* 622 */
  108616. /***/ (function(module, exports, __webpack_require__) {
  108617. /**
  108618. * @author Richard Davey <rich@photonstorm.com>
  108619. * @copyright 2019 Photon Storm Ltd.
  108620. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108621. */
  108622. var Circle = __webpack_require__(77);
  108623. var CircleContains = __webpack_require__(43);
  108624. var Class = __webpack_require__(0);
  108625. var CreateInteractiveObject = __webpack_require__(265);
  108626. var CreatePixelPerfectHandler = __webpack_require__(621);
  108627. var DistanceBetween = __webpack_require__(56);
  108628. var Ellipse = __webpack_require__(96);
  108629. var EllipseContains = __webpack_require__(95);
  108630. var Events = __webpack_require__(52);
  108631. var EventEmitter = __webpack_require__(11);
  108632. var GetFastValue = __webpack_require__(2);
  108633. var InputPluginCache = __webpack_require__(114);
  108634. var IsPlainObject = __webpack_require__(8);
  108635. var PluginCache = __webpack_require__(17);
  108636. var Rectangle = __webpack_require__(10);
  108637. var RectangleContains = __webpack_require__(42);
  108638. var SceneEvents = __webpack_require__(16);
  108639. var Triangle = __webpack_require__(65);
  108640. var TriangleContains = __webpack_require__(74);
  108641. /**
  108642. * @classdesc
  108643. * The Input Plugin belongs to a Scene and handles all input related events and operations for it.
  108644. *
  108645. * You can access it from within a Scene using `this.input`.
  108646. *
  108647. * It emits events directly. For example, you can do:
  108648. *
  108649. * ```javascript
  108650. * this.input.on('pointerdown', callback, context);
  108651. * ```
  108652. *
  108653. * To listen for a pointer down event anywhere on the game canvas.
  108654. *
  108655. * Game Objects can be enabled for input by calling their `setInteractive` method. After which they
  108656. * will directly emit input events:
  108657. *
  108658. * ```javascript
  108659. * var sprite = this.add.sprite(x, y, texture);
  108660. * sprite.setInteractive();
  108661. * sprite.on('pointerdown', callback, context);
  108662. * ```
  108663. *
  108664. * Please see the Input examples and tutorials for more information.
  108665. *
  108666. * @class InputPlugin
  108667. * @extends Phaser.Events.EventEmitter
  108668. * @memberof Phaser.Input
  108669. * @constructor
  108670. * @since 3.0.0
  108671. *
  108672. * @param {Phaser.Scene} scene - A reference to the Scene that this Input Plugin is responsible for.
  108673. */
  108674. var InputPlugin = new Class({
  108675. Extends: EventEmitter,
  108676. initialize:
  108677. function InputPlugin (scene)
  108678. {
  108679. EventEmitter.call(this);
  108680. /**
  108681. * A reference to the Scene that this Input Plugin is responsible for.
  108682. *
  108683. * @name Phaser.Input.InputPlugin#scene
  108684. * @type {Phaser.Scene}
  108685. * @since 3.0.0
  108686. */
  108687. this.scene = scene;
  108688. /**
  108689. * A reference to the Scene Systems class.
  108690. *
  108691. * @name Phaser.Input.InputPlugin#systems
  108692. * @type {Phaser.Scenes.Systems}
  108693. * @since 3.0.0
  108694. */
  108695. this.systems = scene.sys;
  108696. /**
  108697. * A reference to the Scene Systems Settings.
  108698. *
  108699. * @name Phaser.Input.InputPlugin#settings
  108700. * @type {Phaser.Scenes.Settings.Object}
  108701. * @since 3.5.0
  108702. */
  108703. this.settings = scene.sys.settings;
  108704. /**
  108705. * A reference to the Game Input Manager.
  108706. *
  108707. * @name Phaser.Input.InputPlugin#manager
  108708. * @type {Phaser.Input.InputManager}
  108709. * @since 3.0.0
  108710. */
  108711. this.manager = scene.sys.game.input;
  108712. /**
  108713. * Internal event queue used for plugins only.
  108714. *
  108715. * @name Phaser.Input.InputPlugin#pluginEvents
  108716. * @type {Phaser.Events.EventEmitter}
  108717. * @private
  108718. * @since 3.10.0
  108719. */
  108720. this.pluginEvents = new EventEmitter();
  108721. /**
  108722. * If set, the Input Plugin will run its update loop every frame.
  108723. *
  108724. * @name Phaser.Input.InputPlugin#enabled
  108725. * @type {boolean}
  108726. * @default true
  108727. * @since 3.5.0
  108728. */
  108729. this.enabled = true;
  108730. /**
  108731. * A reference to the Scene Display List. This property is set during the `boot` method.
  108732. *
  108733. * @name Phaser.Input.InputPlugin#displayList
  108734. * @type {Phaser.GameObjects.DisplayList}
  108735. * @since 3.0.0
  108736. */
  108737. this.displayList;
  108738. /**
  108739. * A reference to the Scene Cameras Manager. This property is set during the `boot` method.
  108740. *
  108741. * @name Phaser.Input.InputPlugin#cameras
  108742. * @type {Phaser.Cameras.Scene2D.CameraManager}
  108743. * @since 3.0.0
  108744. */
  108745. this.cameras;
  108746. // Inject the available input plugins into this class
  108747. InputPluginCache.install(this);
  108748. /**
  108749. * A reference to the Mouse Manager.
  108750. *
  108751. * This property is only set if Mouse support has been enabled in your Game Configuration file.
  108752. *
  108753. * If you just wish to get access to the mouse pointer, use the `mousePointer` property instead.
  108754. *
  108755. * @name Phaser.Input.InputPlugin#mouse
  108756. * @type {?Phaser.Input.Mouse.MouseManager}
  108757. * @since 3.0.0
  108758. */
  108759. this.mouse = this.manager.mouse;
  108760. /**
  108761. * When set to `true` (the default) the Input Plugin will emulate DOM behavior by only emitting events from
  108762. * the top-most Game Objects in the Display List.
  108763. *
  108764. * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one.
  108765. *
  108766. * @name Phaser.Input.InputPlugin#topOnly
  108767. * @type {boolean}
  108768. * @default true
  108769. * @since 3.0.0
  108770. */
  108771. this.topOnly = true;
  108772. /**
  108773. * How often should the Pointers be checked?
  108774. *
  108775. * The value is a time, given in ms, and is the time that must have elapsed between game steps before
  108776. * the Pointers will be polled again. When a pointer is polled it runs a hit test to see which Game
  108777. * Objects are currently below it, or being interacted with it.
  108778. *
  108779. * Pointers will *always* be checked if they have been moved by the user, or press or released.
  108780. *
  108781. * This property only controls how often they will be polled if they have not been updated.
  108782. * You should set this if you want to have Game Objects constantly check against the pointers, even
  108783. * if the pointer didn't move itself.
  108784. *
  108785. * Set to 0 to poll constantly. Set to -1 to only poll on user movement.
  108786. *
  108787. * @name Phaser.Input.InputPlugin#pollRate
  108788. * @type {integer}
  108789. * @default -1
  108790. * @since 3.0.0
  108791. */
  108792. this.pollRate = -1;
  108793. /**
  108794. * Internal poll timer value.
  108795. *
  108796. * @name Phaser.Input.InputPlugin#_pollTimer
  108797. * @type {number}
  108798. * @private
  108799. * @default 0
  108800. * @since 3.0.0
  108801. */
  108802. this._pollTimer = 0;
  108803. var _eventData = { cancelled: false };
  108804. /**
  108805. * Internal event propagation callback container.
  108806. *
  108807. * @name Phaser.Input.InputPlugin#_eventContainer
  108808. * @type {Phaser.Input.EventData}
  108809. * @private
  108810. * @since 3.13.0
  108811. */
  108812. this._eventContainer = {
  108813. stopPropagation: function ()
  108814. {
  108815. _eventData.cancelled = true;
  108816. }
  108817. };
  108818. /**
  108819. * Internal event propagation data object.
  108820. *
  108821. * @name Phaser.Input.InputPlugin#_eventData
  108822. * @type {object}
  108823. * @private
  108824. * @since 3.13.0
  108825. */
  108826. this._eventData = _eventData;
  108827. /**
  108828. * The distance, in pixels, a pointer has to move while being held down, before it thinks it is being dragged.
  108829. *
  108830. * @name Phaser.Input.InputPlugin#dragDistanceThreshold
  108831. * @type {number}
  108832. * @default 0
  108833. * @since 3.0.0
  108834. */
  108835. this.dragDistanceThreshold = 0;
  108836. /**
  108837. * The amount of time, in ms, a pointer has to be held down before it thinks it is dragging.
  108838. *
  108839. * @name Phaser.Input.InputPlugin#dragTimeThreshold
  108840. * @type {number}
  108841. * @default 0
  108842. * @since 3.0.0
  108843. */
  108844. this.dragTimeThreshold = 0;
  108845. /**
  108846. * Used to temporarily store the results of the Hit Test
  108847. *
  108848. * @name Phaser.Input.InputPlugin#_temp
  108849. * @type {array}
  108850. * @private
  108851. * @default []
  108852. * @since 3.0.0
  108853. */
  108854. this._temp = [];
  108855. /**
  108856. * Used to temporarily store the results of the Hit Test dropZones
  108857. *
  108858. * @name Phaser.Input.InputPlugin#_tempZones
  108859. * @type {array}
  108860. * @private
  108861. * @default []
  108862. * @since 3.0.0
  108863. */
  108864. this._tempZones = [];
  108865. /**
  108866. * A list of all Game Objects that have been set to be interactive in the Scene this Input Plugin is managing.
  108867. *
  108868. * @name Phaser.Input.InputPlugin#_list
  108869. * @type {Phaser.GameObjects.GameObject[]}
  108870. * @private
  108871. * @default []
  108872. * @since 3.0.0
  108873. */
  108874. this._list = [];
  108875. /**
  108876. * Objects waiting to be inserted to the list on the next call to 'begin'.
  108877. *
  108878. * @name Phaser.Input.InputPlugin#_pendingInsertion
  108879. * @type {Phaser.GameObjects.GameObject[]}
  108880. * @private
  108881. * @default []
  108882. * @since 3.0.0
  108883. */
  108884. this._pendingInsertion = [];
  108885. /**
  108886. * Objects waiting to be removed from the list on the next call to 'begin'.
  108887. *
  108888. * @name Phaser.Input.InputPlugin#_pendingRemoval
  108889. * @type {Phaser.GameObjects.GameObject[]}
  108890. * @private
  108891. * @default []
  108892. * @since 3.0.0
  108893. */
  108894. this._pendingRemoval = [];
  108895. /**
  108896. * A list of all Game Objects that have been enabled for dragging.
  108897. *
  108898. * @name Phaser.Input.InputPlugin#_draggable
  108899. * @type {Phaser.GameObjects.GameObject[]}
  108900. * @private
  108901. * @default []
  108902. * @since 3.0.0
  108903. */
  108904. this._draggable = [];
  108905. /**
  108906. * A list of all Interactive Objects currently considered as being 'draggable' by any pointer, indexed by pointer ID.
  108907. *
  108908. * @name Phaser.Input.InputPlugin#_drag
  108909. * @type {{0:Array,2:Array,3:Array,4:Array,5:Array,6:Array,7:Array,8:Array,9:Array}}
  108910. * @private
  108911. * @since 3.0.0
  108912. */
  108913. this._drag = { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: [], 10: [] };
  108914. /**
  108915. * A array containing the dragStates, for this Scene, index by the Pointer ID.
  108916. *
  108917. * @name Phaser.Input.InputPlugin#_dragState
  108918. * @type {integer[]}
  108919. * @private
  108920. * @since 3.16.0
  108921. */
  108922. this._dragState = [];
  108923. /**
  108924. * A list of all Interactive Objects currently considered as being 'over' by any pointer, indexed by pointer ID.
  108925. *
  108926. * @name Phaser.Input.InputPlugin#_over
  108927. * @type {{0:Array,2:Array,3:Array,4:Array,5:Array,6:Array,7:Array,8:Array,9:Array}}
  108928. * @private
  108929. * @since 3.0.0
  108930. */
  108931. this._over = { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: [], 10: [] };
  108932. /**
  108933. * A list of valid DOM event types.
  108934. *
  108935. * @name Phaser.Input.InputPlugin#_validTypes
  108936. * @type {string[]}
  108937. * @private
  108938. * @since 3.0.0
  108939. */
  108940. this._validTypes = [ 'onDown', 'onUp', 'onOver', 'onOut', 'onMove', 'onDragStart', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDrop' ];
  108941. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  108942. scene.sys.events.on(SceneEvents.START, this.start, this);
  108943. },
  108944. /**
  108945. * This method is called automatically, only once, when the Scene is first created.
  108946. * Do not invoke it directly.
  108947. *
  108948. * @method Phaser.Input.InputPlugin#boot
  108949. * @fires Phaser.Input.Events#BOOT
  108950. * @private
  108951. * @since 3.5.1
  108952. */
  108953. boot: function ()
  108954. {
  108955. this.cameras = this.systems.cameras;
  108956. this.displayList = this.systems.displayList;
  108957. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  108958. // Registered input plugins listen for this
  108959. this.pluginEvents.emit(Events.BOOT);
  108960. },
  108961. /**
  108962. * This method is called automatically by the Scene when it is starting up.
  108963. * It is responsible for creating local systems, properties and listening for Scene events.
  108964. * Do not invoke it directly.
  108965. *
  108966. * @method Phaser.Input.InputPlugin#start
  108967. * @fires Phaser.Input.Events#START
  108968. * @private
  108969. * @since 3.5.0
  108970. */
  108971. start: function ()
  108972. {
  108973. var eventEmitter = this.systems.events;
  108974. eventEmitter.on(SceneEvents.TRANSITION_START, this.transitionIn, this);
  108975. eventEmitter.on(SceneEvents.TRANSITION_OUT, this.transitionOut, this);
  108976. eventEmitter.on(SceneEvents.TRANSITION_COMPLETE, this.transitionComplete, this);
  108977. eventEmitter.on(SceneEvents.PRE_UPDATE, this.preUpdate, this);
  108978. if (this.manager.useQueue)
  108979. {
  108980. eventEmitter.on(SceneEvents.UPDATE, this.update, this);
  108981. }
  108982. eventEmitter.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  108983. this.manager.events.on(Events.GAME_OUT, this.onGameOut, this);
  108984. this.manager.events.on(Events.GAME_OVER, this.onGameOver, this);
  108985. this.enabled = true;
  108986. // Populate the pointer drag states
  108987. this._dragState = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
  108988. // Registered input plugins listen for this
  108989. this.pluginEvents.emit(Events.START);
  108990. },
  108991. /**
  108992. * Game Over handler.
  108993. *
  108994. * @method Phaser.Input.InputPlugin#onGameOver
  108995. * @fires Phaser.Input.Events#GAME_OVER
  108996. * @private
  108997. * @since 3.16.2
  108998. */
  108999. onGameOver: function (event)
  109000. {
  109001. if (this.isActive())
  109002. {
  109003. this.emit(Events.GAME_OVER, event.timeStamp, event);
  109004. }
  109005. },
  109006. /**
  109007. * Game Out handler.
  109008. *
  109009. * @method Phaser.Input.InputPlugin#onGameOut
  109010. * @fires Phaser.Input.Events#GAME_OUT
  109011. * @private
  109012. * @since 3.16.2
  109013. */
  109014. onGameOut: function (event)
  109015. {
  109016. if (this.isActive())
  109017. {
  109018. this.emit(Events.GAME_OUT, event.timeStamp, event);
  109019. }
  109020. },
  109021. /**
  109022. * The pre-update handler is responsible for checking the pending removal and insertion lists and
  109023. * deleting old Game Objects.
  109024. *
  109025. * @method Phaser.Input.InputPlugin#preUpdate
  109026. * @fires Phaser.Input.Events#PRE_UPDATE
  109027. * @private
  109028. * @since 3.0.0
  109029. */
  109030. preUpdate: function ()
  109031. {
  109032. // Registered input plugins listen for this
  109033. this.pluginEvents.emit(Events.PRE_UPDATE);
  109034. var removeList = this._pendingRemoval;
  109035. var insertList = this._pendingInsertion;
  109036. var toRemove = removeList.length;
  109037. var toInsert = insertList.length;
  109038. if (toRemove === 0 && toInsert === 0)
  109039. {
  109040. // Quick bail
  109041. return;
  109042. }
  109043. var current = this._list;
  109044. // Delete old gameObjects
  109045. for (var i = 0; i < toRemove; i++)
  109046. {
  109047. var gameObject = removeList[i];
  109048. var index = current.indexOf(gameObject);
  109049. if (index > -1)
  109050. {
  109051. current.splice(index, 1);
  109052. this.clear(gameObject);
  109053. }
  109054. }
  109055. // Clear the removal list
  109056. removeList.length = 0;
  109057. this._pendingRemoval.length = 0;
  109058. // Move pendingInsertion to list (also clears pendingInsertion at the same time)
  109059. this._list = current.concat(insertList.splice(0));
  109060. },
  109061. /**
  109062. * Checks to see if both this plugin and the Scene to which it belongs is active.
  109063. *
  109064. * @method Phaser.Input.InputPlugin#isActive
  109065. * @since 3.10.0
  109066. *
  109067. * @return {boolean} `true` if the plugin and the Scene it belongs to is active.
  109068. */
  109069. isActive: function ()
  109070. {
  109071. return (this.enabled && this.scene.sys.isActive());
  109072. },
  109073. /**
  109074. * The internal update loop for the Input Plugin.
  109075. * Called automatically by the Scene Systems step.
  109076. *
  109077. * @method Phaser.Input.InputPlugin#update
  109078. * @fires Phaser.Input.Events#UPDATE
  109079. * @private
  109080. * @since 3.0.0
  109081. *
  109082. * @param {number} time - The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now().
  109083. * @param {number} delta - The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class.
  109084. */
  109085. update: function (time, delta)
  109086. {
  109087. if (!this.isActive())
  109088. {
  109089. return;
  109090. }
  109091. var manager = this.manager;
  109092. this.pluginEvents.emit(Events.UPDATE, time, delta);
  109093. // Another Scene above this one has already consumed the input events, or we're in transition
  109094. if (manager.globalTopOnly && manager.ignoreEvents)
  109095. {
  109096. return;
  109097. }
  109098. var runUpdate = (manager.dirty || this.pollRate === 0);
  109099. if (this.pollRate > -1)
  109100. {
  109101. this._pollTimer -= delta;
  109102. if (this._pollTimer < 0)
  109103. {
  109104. runUpdate = true;
  109105. // Discard timer diff
  109106. this._pollTimer = this.pollRate;
  109107. }
  109108. }
  109109. if (!runUpdate)
  109110. {
  109111. return;
  109112. }
  109113. var pointers = this.manager.pointers;
  109114. var pointersTotal = this.manager.pointersTotal;
  109115. for (var i = 0; i < pointersTotal; i++)
  109116. {
  109117. var pointer = pointers[i];
  109118. // Always reset this array
  109119. this._tempZones = [];
  109120. // _temp contains a hit tested and camera culled list of IO objects
  109121. this._temp = this.hitTestPointer(pointer);
  109122. this.sortGameObjects(this._temp);
  109123. this.sortGameObjects(this._tempZones);
  109124. if (this.topOnly)
  109125. {
  109126. // Only the top-most one counts now, so safely ignore the rest
  109127. if (this._temp.length)
  109128. {
  109129. this._temp.splice(1);
  109130. }
  109131. if (this._tempZones.length)
  109132. {
  109133. this._tempZones.splice(1);
  109134. }
  109135. }
  109136. var total = this.processDragEvents(pointer, time);
  109137. // TODO: Enable for touch - the method needs recoding to take ALL pointers at once
  109138. // and process them all together, in the same batch, otherwise the justOut and stillOver
  109139. // arrays will get corrupted in multi-touch enabled games. For now, we'll enable it for
  109140. // single touch games (which is probably the majority anyway).
  109141. if (pointersTotal < 3 || !pointer.wasTouch)
  109142. {
  109143. total += this.processOverOutEvents(pointer);
  109144. }
  109145. if (pointer.justDown)
  109146. {
  109147. total += this.processDownEvents(pointer);
  109148. }
  109149. if (pointer.justMoved)
  109150. {
  109151. total += this.processMoveEvents(pointer);
  109152. }
  109153. if (pointer.justUp)
  109154. {
  109155. total += this.processUpEvents(pointer);
  109156. }
  109157. if (total > 0 && manager.globalTopOnly)
  109158. {
  109159. // We interacted with an event in this Scene, so block any Scenes below us from doing the same this frame
  109160. manager.ignoreEvents = true;
  109161. }
  109162. }
  109163. },
  109164. /**
  109165. * Clears a Game Object so it no longer has an Interactive Object associated with it.
  109166. * The Game Object is then queued for removal from the Input Plugin on the next update.
  109167. *
  109168. * @method Phaser.Input.InputPlugin#clear
  109169. * @since 3.0.0
  109170. *
  109171. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will have its Interactive Object removed.
  109172. *
  109173. * @return {Phaser.GameObjects.GameObject} The Game Object that had its Interactive Object removed.
  109174. */
  109175. clear: function (gameObject)
  109176. {
  109177. var input = gameObject.input;
  109178. // If GameObject.input already cleared from higher class
  109179. if (!input)
  109180. {
  109181. return;
  109182. }
  109183. this.queueForRemoval(gameObject);
  109184. input.gameObject = undefined;
  109185. input.target = undefined;
  109186. input.hitArea = undefined;
  109187. input.hitAreaCallback = undefined;
  109188. input.callbackContext = undefined;
  109189. this.manager.resetCursor(input);
  109190. gameObject.input = null;
  109191. // Clear from _draggable, _drag and _over
  109192. var index = this._draggable.indexOf(gameObject);
  109193. if (index > -1)
  109194. {
  109195. this._draggable.splice(index, 1);
  109196. }
  109197. index = this._drag[0].indexOf(gameObject);
  109198. if (index > -1)
  109199. {
  109200. this._drag[0].splice(index, 1);
  109201. }
  109202. index = this._over[0].indexOf(gameObject);
  109203. if (index > -1)
  109204. {
  109205. this._over[0].splice(index, 1);
  109206. }
  109207. return gameObject;
  109208. },
  109209. /**
  109210. * Disables Input on a single Game Object.
  109211. *
  109212. * An input disabled Game Object still retains its Interactive Object component and can be re-enabled
  109213. * at any time, by passing it to `InputPlugin.enable`.
  109214. *
  109215. * @method Phaser.Input.InputPlugin#disable
  109216. * @since 3.0.0
  109217. *
  109218. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to have its input system disabled.
  109219. */
  109220. disable: function (gameObject)
  109221. {
  109222. gameObject.input.enabled = false;
  109223. },
  109224. /**
  109225. * Enable a Game Object for interaction.
  109226. *
  109227. * If the Game Object already has an Interactive Object component, it is enabled and returned.
  109228. *
  109229. * Otherwise, a new Interactive Object component is created and assigned to the Game Object's `input` property.
  109230. *
  109231. * Input works by using hit areas, these are nearly always geometric shapes, such as rectangles or circles, that act as the hit area
  109232. * for the Game Object. However, you can provide your own hit area shape and callback, should you wish to handle some more advanced
  109233. * input detection.
  109234. *
  109235. * If no arguments are provided it will try and create a rectangle hit area based on the texture frame the Game Object is using. If
  109236. * this isn't a texture-bound object, such as a Graphics or BitmapText object, this will fail, and you'll need to provide a specific
  109237. * shape for it to use.
  109238. *
  109239. * You can also provide an Input Configuration Object as the only argument to this method.
  109240. *
  109241. * @method Phaser.Input.InputPlugin#enable
  109242. * @since 3.0.0
  109243. *
  109244. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to be enabled for input.
  109245. * @param {(Phaser.Input.InputConfiguration|any)} [shape] - Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not specified a Rectangle will be used.
  109246. * @param {HitAreaCallback} [callback] - The 'contains' function to invoke to check if the pointer is within the hit area.
  109247. * @param {boolean} [dropZone=false] - Is this Game Object a drop zone or not?
  109248. *
  109249. * @return {Phaser.Input.InputPlugin} This Input Plugin.
  109250. */
  109251. enable: function (gameObject, shape, callback, dropZone)
  109252. {
  109253. if (dropZone === undefined) { dropZone = false; }
  109254. if (gameObject.input)
  109255. {
  109256. // If it is already has an InteractiveObject then just enable it and return
  109257. gameObject.input.enabled = true;
  109258. }
  109259. else
  109260. {
  109261. // Create an InteractiveObject and enable it
  109262. this.setHitArea(gameObject, shape, callback);
  109263. }
  109264. if (gameObject.input && dropZone && !gameObject.input.dropZone)
  109265. {
  109266. gameObject.input.dropZone = dropZone;
  109267. }
  109268. return this;
  109269. },
  109270. /**
  109271. * Takes the given Pointer and performs a hit test against it, to see which interactive Game Objects
  109272. * it is currently above.
  109273. *
  109274. * The hit test is performed against which-ever Camera the Pointer is over. If it is over multiple
  109275. * cameras, it starts checking the camera at the top of the camera list, and if nothing is found, iterates down the list.
  109276. *
  109277. * @method Phaser.Input.InputPlugin#hitTestPointer
  109278. * @since 3.0.0
  109279. *
  109280. * @param {Phaser.Input.Pointer} pointer - The Pointer to check against the Game Objects.
  109281. *
  109282. * @return {Phaser.GameObjects.GameObject[]} An array of all the interactive Game Objects the Pointer was above.
  109283. */
  109284. hitTestPointer: function (pointer)
  109285. {
  109286. var cameras = this.cameras.getCamerasBelowPointer(pointer);
  109287. for (var c = 0; c < cameras.length; c++)
  109288. {
  109289. var camera = cameras[c];
  109290. // Get a list of all objects that can be seen by the camera below the pointer in the scene and store in 'over' array.
  109291. // All objects in this array are input enabled, as checked by the hitTest method, so we don't need to check later on as well.
  109292. var over = this.manager.hitTest(pointer, this._list, camera);
  109293. // Filter out the drop zones
  109294. for (var i = 0; i < over.length; i++)
  109295. {
  109296. var obj = over[i];
  109297. if (obj.input.dropZone)
  109298. {
  109299. this._tempZones.push(obj);
  109300. }
  109301. }
  109302. if (over.length > 0)
  109303. {
  109304. pointer.camera = camera;
  109305. return over;
  109306. }
  109307. }
  109308. // If we got this far then there were no Game Objects below the pointer, but it was still over
  109309. // a camera, so set that the top-most one into the pointer
  109310. pointer.camera = cameras[0];
  109311. return [];
  109312. },
  109313. /**
  109314. * An internal method that handles the Pointer down event.
  109315. *
  109316. * @method Phaser.Input.InputPlugin#processDownEvents
  109317. * @private
  109318. * @fires Phaser.Input.Events#GAMEOBJECT_POINTER_DOWN
  109319. * @fires Phaser.Input.Events#GAMEOBJECT_DOWN
  109320. * @fires Phaser.Input.Events#POINTER_DOWN
  109321. * @fires Phaser.Input.Events#POINTER_DOWN_OUTSIDE
  109322. * @since 3.0.0
  109323. *
  109324. * @param {Phaser.Input.Pointer} pointer - The Pointer being tested.
  109325. *
  109326. * @return {integer} The total number of objects interacted with.
  109327. */
  109328. processDownEvents: function (pointer)
  109329. {
  109330. var total = 0;
  109331. var currentlyOver = this._temp;
  109332. var _eventData = this._eventData;
  109333. var _eventContainer = this._eventContainer;
  109334. _eventData.cancelled = false;
  109335. var aborted = false;
  109336. // Go through all objects the pointer was over and fire their events / callbacks
  109337. for (var i = 0; i < currentlyOver.length; i++)
  109338. {
  109339. var gameObject = currentlyOver[i];
  109340. if (!gameObject.input)
  109341. {
  109342. continue;
  109343. }
  109344. total++;
  109345. gameObject.emit(Events.GAMEOBJECT_POINTER_DOWN, pointer, gameObject.input.localX, gameObject.input.localY, _eventContainer);
  109346. if (_eventData.cancelled)
  109347. {
  109348. aborted = true;
  109349. break;
  109350. }
  109351. this.emit(Events.GAMEOBJECT_DOWN, pointer, gameObject, _eventContainer);
  109352. if (_eventData.cancelled)
  109353. {
  109354. aborted = true;
  109355. break;
  109356. }
  109357. }
  109358. // If they released outside the canvas, but pressed down inside it, we'll still dispatch the event.
  109359. if (!aborted)
  109360. {
  109361. if (pointer.downElement === this.manager.game.canvas)
  109362. {
  109363. this.emit(Events.POINTER_DOWN, pointer, currentlyOver);
  109364. }
  109365. else
  109366. {
  109367. this.emit(Events.POINTER_DOWN_OUTSIDE, pointer);
  109368. }
  109369. }
  109370. return total;
  109371. },
  109372. /**
  109373. * Returns the drag state of the given Pointer for this Input Plugin.
  109374. *
  109375. * The state will be one of the following:
  109376. *
  109377. * 0 = Not dragging anything
  109378. * 1 = Primary button down and objects below, so collect a draglist
  109379. * 2 = Pointer being checked if meets drag criteria
  109380. * 3 = Pointer meets criteria, notify the draglist
  109381. * 4 = Pointer actively dragging the draglist and has moved
  109382. * 5 = Pointer actively dragging but has been released, notify draglist
  109383. *
  109384. * @method Phaser.Input.InputPlugin#getDragState
  109385. * @since 3.16.0
  109386. *
  109387. * @param {Phaser.Input.Pointer} pointer - The Pointer to get the drag state for.
  109388. *
  109389. * @return {integer} The drag state of the given Pointer.
  109390. */
  109391. getDragState: function (pointer)
  109392. {
  109393. return this._dragState[pointer.id];
  109394. },
  109395. /**
  109396. * Sets the drag state of the given Pointer for this Input Plugin.
  109397. *
  109398. * The state must be one of the following values:
  109399. *
  109400. * 0 = Not dragging anything
  109401. * 1 = Primary button down and objects below, so collect a draglist
  109402. * 2 = Pointer being checked if meets drag criteria
  109403. * 3 = Pointer meets criteria, notify the draglist
  109404. * 4 = Pointer actively dragging the draglist and has moved
  109405. * 5 = Pointer actively dragging but has been released, notify draglist
  109406. *
  109407. * @method Phaser.Input.InputPlugin#setDragState
  109408. * @since 3.16.0
  109409. *
  109410. * @param {Phaser.Input.Pointer} pointer - The Pointer to set the drag state for.
  109411. * @param {integer} state - The drag state value. An integer between 0 and 5.
  109412. */
  109413. setDragState: function (pointer, state)
  109414. {
  109415. this._dragState[pointer.id] = state;
  109416. },
  109417. /**
  109418. * An internal method that handles the Pointer drag events.
  109419. *
  109420. * @method Phaser.Input.InputPlugin#processDragEvents
  109421. * @private
  109422. * @fires Phaser.Input.Events#DRAG_END
  109423. * @fires Phaser.Input.Events#DRAG_ENTER
  109424. * @fires Phaser.Input.Events#DRAG
  109425. * @fires Phaser.Input.Events#DRAG_LEAVE
  109426. * @fires Phaser.Input.Events#DRAG_OVER
  109427. * @fires Phaser.Input.Events#DRAG_START
  109428. * @fires Phaser.Input.Events#DROP
  109429. * @fires Phaser.Input.Events#GAMEOBJECT_DOWN
  109430. * @fires Phaser.Input.Events#GAMEOBJECT_DRAG_END
  109431. * @fires Phaser.Input.Events#GAMEOBJECT_DRAG_ENTER
  109432. * @fires Phaser.Input.Events#GAMEOBJECT_DRAG
  109433. * @fires Phaser.Input.Events#GAMEOBJECT_DRAG_LEAVE
  109434. * @fires Phaser.Input.Events#GAMEOBJECT_DRAG_OVER
  109435. * @fires Phaser.Input.Events#GAMEOBJECT_DRAG_START
  109436. * @fires Phaser.Input.Events#GAMEOBJECT_DROP
  109437. * @since 3.0.0
  109438. *
  109439. * @param {Phaser.Input.Pointer} pointer - The Pointer to check against the Game Objects.
  109440. * @param {number} time - The time stamp of the most recent Game step.
  109441. *
  109442. * @return {integer} The total number of objects interacted with.
  109443. */
  109444. processDragEvents: function (pointer, time)
  109445. {
  109446. if (this._draggable.length === 0)
  109447. {
  109448. // There are no draggable items, so let's not even bother going further
  109449. return 0;
  109450. }
  109451. var i;
  109452. var gameObject;
  109453. var list;
  109454. var input;
  109455. var currentlyOver = this._temp;
  109456. // 0 = Not dragging anything
  109457. // 1 = Primary button down and objects below, so collect a draglist
  109458. // 2 = Pointer being checked if meets drag criteria
  109459. // 3 = Pointer meets criteria, notify the draglist
  109460. // 4 = Pointer actively dragging the draglist and has moved
  109461. // 5 = Pointer actively dragging but has been released, notify draglist
  109462. if (this.getDragState(pointer) === 0 && pointer.primaryDown && pointer.justDown && currentlyOver.length > 0)
  109463. {
  109464. this.setDragState(pointer, 1);
  109465. }
  109466. else if (this.getDragState(pointer) > 0 && !pointer.primaryDown && pointer.justUp)
  109467. {
  109468. this.setDragState(pointer, 5);
  109469. }
  109470. // Process the various drag states
  109471. // 1 = Primary button down and objects below, so collect a draglist
  109472. if (this.getDragState(pointer) === 1)
  109473. {
  109474. // Get draggable objects, sort them, pick the top (or all) and store them somewhere
  109475. var draglist = [];
  109476. for (i = 0; i < currentlyOver.length; i++)
  109477. {
  109478. gameObject = currentlyOver[i];
  109479. if (gameObject.input.draggable && (gameObject.input.dragState === 0))
  109480. {
  109481. draglist.push(gameObject);
  109482. }
  109483. }
  109484. if (draglist.length === 0)
  109485. {
  109486. this.setDragState(pointer, 0);
  109487. return 0;
  109488. }
  109489. else if (draglist.length > 1)
  109490. {
  109491. this.sortGameObjects(draglist);
  109492. if (this.topOnly)
  109493. {
  109494. draglist.splice(1);
  109495. }
  109496. }
  109497. // draglist now contains all potential candidates for dragging
  109498. this._drag[pointer.id] = draglist;
  109499. if (this.dragDistanceThreshold === 0 && this.dragTimeThreshold === 0)
  109500. {
  109501. // No drag criteria, so snap immediately to mode 3
  109502. this.setDragState(pointer, 3);
  109503. }
  109504. else
  109505. {
  109506. // Check the distance / time
  109507. this.setDragState(pointer, 2);
  109508. }
  109509. }
  109510. // 2 = Pointer being checked if meets drag criteria
  109511. if (this.getDragState(pointer) === 2)
  109512. {
  109513. // Has it moved far enough to be considered a drag?
  109514. if (this.dragDistanceThreshold > 0 && DistanceBetween(pointer.x, pointer.y, pointer.downX, pointer.downY) >= this.dragDistanceThreshold)
  109515. {
  109516. // Alrighty, we've got a drag going on ...
  109517. this.setDragState(pointer, 3);
  109518. }
  109519. // Held down long enough to be considered a drag?
  109520. if (this.dragTimeThreshold > 0 && (time >= pointer.downTime + this.dragTimeThreshold))
  109521. {
  109522. // Alrighty, we've got a drag going on ...
  109523. this.setDragState(pointer, 3);
  109524. }
  109525. }
  109526. // 3 = Pointer meets criteria and is freshly down, notify the draglist
  109527. if (this.getDragState(pointer) === 3)
  109528. {
  109529. list = this._drag[pointer.id];
  109530. for (i = 0; i < list.length; i++)
  109531. {
  109532. gameObject = list[i];
  109533. input = gameObject.input;
  109534. input.dragState = 2;
  109535. input.dragX = pointer.x - gameObject.x;
  109536. input.dragY = pointer.y - gameObject.y;
  109537. input.dragStartX = gameObject.x;
  109538. input.dragStartY = gameObject.y;
  109539. gameObject.emit(Events.GAMEOBJECT_DRAG_START, pointer, input.dragX, input.dragY);
  109540. this.emit(Events.DRAG_START, pointer, gameObject);
  109541. }
  109542. this.setDragState(pointer, 4);
  109543. return list.length;
  109544. }
  109545. // 4 = Pointer actively dragging the draglist and has moved
  109546. if (this.getDragState(pointer) === 4 && pointer.justMoved && !pointer.justUp)
  109547. {
  109548. var dropZones = this._tempZones;
  109549. list = this._drag[pointer.id];
  109550. for (i = 0; i < list.length; i++)
  109551. {
  109552. gameObject = list[i];
  109553. input = gameObject.input;
  109554. // If this GO has a target then let's check it
  109555. if (input.target)
  109556. {
  109557. var index = dropZones.indexOf(input.target);
  109558. // Got a target, are we still over it?
  109559. if (index === 0)
  109560. {
  109561. // We're still over it, and it's still the top of the display list, phew ...
  109562. gameObject.emit(Events.GAMEOBJECT_DRAG_OVER, pointer, input.target);
  109563. this.emit(Events.DRAG_OVER, pointer, gameObject, input.target);
  109564. }
  109565. else if (index > 0)
  109566. {
  109567. // Still over it but it's no longer top of the display list (targets must always be at the top)
  109568. gameObject.emit(Events.GAMEOBJECT_DRAG_LEAVE, pointer, input.target);
  109569. this.emit(Events.DRAG_LEAVE, pointer, gameObject, input.target);
  109570. input.target = dropZones[0];
  109571. gameObject.emit(Events.GAMEOBJECT_DRAG_ENTER, pointer, input.target);
  109572. this.emit(Events.DRAG_ENTER, pointer, gameObject, input.target);
  109573. }
  109574. else
  109575. {
  109576. // Nope, we've moved on (or the target has!), leave the old target
  109577. gameObject.emit(Events.GAMEOBJECT_DRAG_LEAVE, pointer, input.target);
  109578. this.emit(Events.DRAG_LEAVE, pointer, gameObject, input.target);
  109579. // Anything new to replace it?
  109580. // Yup!
  109581. if (dropZones[0])
  109582. {
  109583. input.target = dropZones[0];
  109584. gameObject.emit(Events.GAMEOBJECT_DRAG_ENTER, pointer, input.target);
  109585. this.emit(Events.DRAG_ENTER, pointer, gameObject, input.target);
  109586. }
  109587. else
  109588. {
  109589. // Nope
  109590. input.target = null;
  109591. }
  109592. }
  109593. }
  109594. else if (!input.target && dropZones[0])
  109595. {
  109596. input.target = dropZones[0];
  109597. gameObject.emit(Events.GAMEOBJECT_DRAG_ENTER, pointer, input.target);
  109598. this.emit(Events.DRAG_ENTER, pointer, gameObject, input.target);
  109599. }
  109600. var dragX = pointer.x - gameObject.input.dragX;
  109601. var dragY = pointer.y - gameObject.input.dragY;
  109602. gameObject.emit(Events.GAMEOBJECT_DRAG, pointer, dragX, dragY);
  109603. this.emit(Events.DRAG, pointer, gameObject, dragX, dragY);
  109604. }
  109605. return list.length;
  109606. }
  109607. // 5 = Pointer was actively dragging but has been released, notify draglist
  109608. if (this.getDragState(pointer) === 5)
  109609. {
  109610. list = this._drag[pointer.id];
  109611. for (i = 0; i < list.length; i++)
  109612. {
  109613. gameObject = list[i];
  109614. input = gameObject.input;
  109615. if (input.dragState === 2)
  109616. {
  109617. input.dragState = 0;
  109618. input.dragX = input.localX - gameObject.displayOriginX;
  109619. input.dragY = input.localY - gameObject.displayOriginY;
  109620. var dropped = false;
  109621. if (input.target)
  109622. {
  109623. gameObject.emit(Events.GAMEOBJECT_DROP, pointer, input.target);
  109624. this.emit(Events.DROP, pointer, gameObject, input.target);
  109625. input.target = null;
  109626. dropped = true;
  109627. }
  109628. // And finally the dragend event
  109629. gameObject.emit(Events.GAMEOBJECT_DRAG_END, pointer, input.dragX, input.dragY, dropped);
  109630. this.emit(Events.DRAG_END, pointer, gameObject, dropped);
  109631. }
  109632. }
  109633. this.setDragState(pointer, 0);
  109634. list.splice(0);
  109635. }
  109636. return 0;
  109637. },
  109638. /**
  109639. * An internal method that handles the Pointer movement event.
  109640. *
  109641. * @method Phaser.Input.InputPlugin#processMoveEvents
  109642. * @fires Phaser.Input.Events#GAMEOBJECT_POINTER_MOVE
  109643. * @fires Phaser.Input.Events#GAMEOBJECT_MOVE
  109644. * @fires Phaser.Input.Events#POINTER_MOVE
  109645. * @private
  109646. * @since 3.0.0
  109647. *
  109648. * @param {Phaser.Input.Pointer} pointer - The pointer to check for events against.
  109649. *
  109650. * @return {integer} The total number of objects interacted with.
  109651. */
  109652. processMoveEvents: function (pointer)
  109653. {
  109654. var total = 0;
  109655. var currentlyOver = this._temp;
  109656. var _eventData = this._eventData;
  109657. var _eventContainer = this._eventContainer;
  109658. _eventData.cancelled = false;
  109659. var aborted = false;
  109660. // Go through all objects the pointer was over and fire their events / callbacks
  109661. for (var i = 0; i < currentlyOver.length; i++)
  109662. {
  109663. var gameObject = currentlyOver[i];
  109664. if (!gameObject.input)
  109665. {
  109666. continue;
  109667. }
  109668. total++;
  109669. gameObject.emit(Events.GAMEOBJECT_POINTER_MOVE, pointer, gameObject.input.localX, gameObject.input.localY, _eventContainer);
  109670. if (_eventData.cancelled)
  109671. {
  109672. aborted = true;
  109673. break;
  109674. }
  109675. this.emit(Events.GAMEOBJECT_MOVE, pointer, gameObject, _eventContainer);
  109676. if (_eventData.cancelled)
  109677. {
  109678. aborted = true;
  109679. break;
  109680. }
  109681. if (this.topOnly)
  109682. {
  109683. break;
  109684. }
  109685. }
  109686. if (!aborted)
  109687. {
  109688. this.emit(Events.POINTER_MOVE, pointer, currentlyOver);
  109689. }
  109690. return total;
  109691. },
  109692. /**
  109693. * An internal method that handles the Pointer over and out events.
  109694. *
  109695. * @method Phaser.Input.InputPlugin#processOverOutEvents
  109696. * @private
  109697. * @fires Phaser.Input.Events#GAMEOBJECT_POINTER_OVER
  109698. * @fires Phaser.Input.Events#GAMEOBJECT_OVER
  109699. * @fires Phaser.Input.Events#POINTER_OVER
  109700. * @fires Phaser.Input.Events#GAMEOBJECT_POINTER_OUT
  109701. * @fires Phaser.Input.Events#GAMEOBJECT_OUT
  109702. * @fires Phaser.Input.Events#POINTER_OUT
  109703. * @since 3.0.0
  109704. *
  109705. * @param {Phaser.Input.Pointer} pointer - The pointer to check for events against.
  109706. *
  109707. * @return {integer} The total number of objects interacted with.
  109708. */
  109709. processOverOutEvents: function (pointer)
  109710. {
  109711. var currentlyOver = this._temp;
  109712. var i;
  109713. var gameObject;
  109714. var justOut = [];
  109715. var justOver = [];
  109716. var stillOver = [];
  109717. var previouslyOver = this._over[pointer.id];
  109718. var currentlyDragging = this._drag[pointer.id];
  109719. var manager = this.manager;
  109720. // Go through all objects the pointer was previously over, and see if it still is.
  109721. // Splits the previouslyOver array into two parts: justOut and stillOver
  109722. for (i = 0; i < previouslyOver.length; i++)
  109723. {
  109724. gameObject = previouslyOver[i];
  109725. if (currentlyOver.indexOf(gameObject) === -1 && currentlyDragging.indexOf(gameObject) === -1)
  109726. {
  109727. // Not in the currentlyOver array, so must be outside of this object now
  109728. justOut.push(gameObject);
  109729. }
  109730. else
  109731. {
  109732. // In the currentlyOver array
  109733. stillOver.push(gameObject);
  109734. }
  109735. }
  109736. // Go through all objects the pointer is currently over (the hit test results)
  109737. // and if not in the previouslyOver array we know it's a new entry, so add to justOver
  109738. for (i = 0; i < currentlyOver.length; i++)
  109739. {
  109740. gameObject = currentlyOver[i];
  109741. // Is this newly over?
  109742. if (previouslyOver.indexOf(gameObject) === -1)
  109743. {
  109744. justOver.push(gameObject);
  109745. }
  109746. }
  109747. // By this point the arrays are filled, so now we can process what happened...
  109748. // Process the Just Out objects
  109749. var total = justOut.length;
  109750. var totalInteracted = 0;
  109751. var _eventData = this._eventData;
  109752. var _eventContainer = this._eventContainer;
  109753. _eventData.cancelled = false;
  109754. var aborted = false;
  109755. if (total > 0)
  109756. {
  109757. this.sortGameObjects(justOut);
  109758. // Call onOut for everything in the justOut array
  109759. for (i = 0; i < total; i++)
  109760. {
  109761. gameObject = justOut[i];
  109762. if (!gameObject.input)
  109763. {
  109764. continue;
  109765. }
  109766. gameObject.emit(Events.GAMEOBJECT_POINTER_OUT, pointer, _eventContainer);
  109767. manager.resetCursor(gameObject.input);
  109768. totalInteracted++;
  109769. if (_eventData.cancelled)
  109770. {
  109771. aborted = true;
  109772. break;
  109773. }
  109774. this.emit(Events.GAMEOBJECT_OUT, pointer, gameObject, _eventContainer);
  109775. if (_eventData.cancelled)
  109776. {
  109777. aborted = true;
  109778. break;
  109779. }
  109780. }
  109781. if (!aborted)
  109782. {
  109783. this.emit(Events.POINTER_OUT, pointer, justOut);
  109784. }
  109785. }
  109786. // Process the Just Over objects
  109787. total = justOver.length;
  109788. _eventData.cancelled = false;
  109789. aborted = false;
  109790. if (total > 0)
  109791. {
  109792. this.sortGameObjects(justOver);
  109793. // Call onOver for everything in the justOver array
  109794. for (i = 0; i < total; i++)
  109795. {
  109796. gameObject = justOver[i];
  109797. if (!gameObject.input)
  109798. {
  109799. continue;
  109800. }
  109801. gameObject.emit(Events.GAMEOBJECT_POINTER_OVER, pointer, gameObject.input.localX, gameObject.input.localY, _eventContainer);
  109802. manager.setCursor(gameObject.input);
  109803. totalInteracted++;
  109804. if (_eventData.cancelled)
  109805. {
  109806. aborted = true;
  109807. break;
  109808. }
  109809. this.emit(Events.GAMEOBJECT_OVER, pointer, gameObject, _eventContainer);
  109810. if (_eventData.cancelled)
  109811. {
  109812. aborted = true;
  109813. break;
  109814. }
  109815. }
  109816. if (!aborted)
  109817. {
  109818. this.emit(Events.POINTER_OVER, pointer, justOver);
  109819. }
  109820. }
  109821. // Add the contents of justOver to the previously over array
  109822. previouslyOver = stillOver.concat(justOver);
  109823. // Then sort it into display list order
  109824. this._over[pointer.id] = this.sortGameObjects(previouslyOver);
  109825. return totalInteracted;
  109826. },
  109827. /**
  109828. * An internal method that handles the Pointer up events.
  109829. *
  109830. * @method Phaser.Input.InputPlugin#processUpEvents
  109831. * @private
  109832. * @fires Phaser.Input.Events#GAMEOBJECT_POINTER_UP
  109833. * @fires Phaser.Input.Events#GAMEOBJECT_UP
  109834. * @fires Phaser.Input.Events#POINTER_UP
  109835. * @fires Phaser.Input.Events#POINTER_UP_OUTSIDE
  109836. * @since 3.0.0
  109837. *
  109838. * @param {Phaser.Input.Pointer} pointer - The pointer to check for events against.
  109839. *
  109840. * @return {integer} The total number of objects interacted with.
  109841. */
  109842. processUpEvents: function (pointer)
  109843. {
  109844. var currentlyOver = this._temp;
  109845. var _eventData = this._eventData;
  109846. var _eventContainer = this._eventContainer;
  109847. _eventData.cancelled = false;
  109848. var aborted = false;
  109849. // Go through all objects the pointer was over and fire their events / callbacks
  109850. for (var i = 0; i < currentlyOver.length; i++)
  109851. {
  109852. var gameObject = currentlyOver[i];
  109853. if (!gameObject.input)
  109854. {
  109855. continue;
  109856. }
  109857. gameObject.emit(Events.GAMEOBJECT_POINTER_UP, pointer, gameObject.input.localX, gameObject.input.localY, _eventContainer);
  109858. // Clear over and emit 'pointerout' on touch.
  109859. if (pointer.wasTouch)
  109860. {
  109861. this._over[pointer.id] = [];
  109862. gameObject.emit(Events.GAMEOBJECT_POINTER_OUT, pointer, gameObject.input.localX, gameObject.input.localY, _eventContainer);
  109863. }
  109864. if (_eventData.cancelled)
  109865. {
  109866. aborted = true;
  109867. break;
  109868. }
  109869. this.emit(Events.GAMEOBJECT_UP, pointer, gameObject, _eventContainer);
  109870. if (_eventData.cancelled)
  109871. {
  109872. aborted = true;
  109873. break;
  109874. }
  109875. }
  109876. // If they released outside the canvas, but pressed down inside it, we'll still dispatch the event.
  109877. if (!aborted)
  109878. {
  109879. if (pointer.upElement === this.manager.game.canvas)
  109880. {
  109881. this.emit(Events.POINTER_UP, pointer, currentlyOver);
  109882. }
  109883. else
  109884. {
  109885. this.emit(Events.POINTER_UP_OUTSIDE, pointer);
  109886. }
  109887. }
  109888. return currentlyOver.length;
  109889. },
  109890. /**
  109891. * Queues a Game Object for insertion into this Input Plugin on the next update.
  109892. *
  109893. * @method Phaser.Input.InputPlugin#queueForInsertion
  109894. * @private
  109895. * @since 3.0.0
  109896. *
  109897. * @param {Phaser.GameObjects.GameObject} child - The Game Object to add.
  109898. *
  109899. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  109900. */
  109901. queueForInsertion: function (child)
  109902. {
  109903. if (this._pendingInsertion.indexOf(child) === -1 && this._list.indexOf(child) === -1)
  109904. {
  109905. this._pendingInsertion.push(child);
  109906. }
  109907. return this;
  109908. },
  109909. /**
  109910. * Queues a Game Object for removal from this Input Plugin on the next update.
  109911. *
  109912. * @method Phaser.Input.InputPlugin#queueForRemoval
  109913. * @private
  109914. * @since 3.0.0
  109915. *
  109916. * @param {Phaser.GameObjects.GameObject} child - The Game Object to remove.
  109917. *
  109918. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  109919. */
  109920. queueForRemoval: function (child)
  109921. {
  109922. this._pendingRemoval.push(child);
  109923. return this;
  109924. },
  109925. /**
  109926. * Sets the draggable state of the given array of Game Objects.
  109927. *
  109928. * They can either be set to be draggable, or can have their draggable state removed by passing `false`.
  109929. *
  109930. * A Game Object will not fire drag events unless it has been specifically enabled for drag.
  109931. *
  109932. * @method Phaser.Input.InputPlugin#setDraggable
  109933. * @since 3.0.0
  109934. *
  109935. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to change the draggable state on.
  109936. * @param {boolean} [value=true] - Set to `true` if the Game Objects should be made draggable, `false` if they should be unset.
  109937. *
  109938. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  109939. */
  109940. setDraggable: function (gameObjects, value)
  109941. {
  109942. if (value === undefined) { value = true; }
  109943. if (!Array.isArray(gameObjects))
  109944. {
  109945. gameObjects = [ gameObjects ];
  109946. }
  109947. for (var i = 0; i < gameObjects.length; i++)
  109948. {
  109949. var gameObject = gameObjects[i];
  109950. gameObject.input.draggable = value;
  109951. var index = this._draggable.indexOf(gameObject);
  109952. if (value && index === -1)
  109953. {
  109954. this._draggable.push(gameObject);
  109955. }
  109956. else if (!value && index > -1)
  109957. {
  109958. this._draggable.splice(index, 1);
  109959. }
  109960. }
  109961. return this;
  109962. },
  109963. /**
  109964. * Creates a function that can be passed to `setInteractive`, `enable` or `setHitArea` that will handle
  109965. * pixel-perfect input detection on an Image or Sprite based Game Object, or any custom class that extends them.
  109966. *
  109967. * The following will create a sprite that is clickable on any pixel that has an alpha value >= 1.
  109968. *
  109969. * ```javascript
  109970. * this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect());
  109971. * ```
  109972. *
  109973. * The following will create a sprite that is clickable on any pixel that has an alpha value >= 150.
  109974. *
  109975. * ```javascript
  109976. * this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect(150));
  109977. * ```
  109978. *
  109979. * Once you have made an Interactive Object pixel perfect it impacts all input related events for it: down, up,
  109980. * dragstart, drag, etc.
  109981. *
  109982. * As a pointer interacts with the Game Object it will constantly poll the texture, extracting a single pixel from
  109983. * the given coordinates and checking its color values. This is an expensive process, so should only be enabled on
  109984. * Game Objects that really need it.
  109985. *
  109986. * You cannot make non-texture based Game Objects pixel perfect. So this will not work on Graphics, BitmapText,
  109987. * Render Textures, Text, Tilemaps, Containers or Particles.
  109988. *
  109989. * @method Phaser.Input.InputPlugin#makePixelPerfect
  109990. * @since 3.10.0
  109991. *
  109992. * @param {integer} [alphaTolerance=1] - The alpha level that the pixel should be above to be included as a successful interaction.
  109993. *
  109994. * @return {function} A Pixel Perfect Handler for use as a hitArea shape callback.
  109995. */
  109996. makePixelPerfect: function (alphaTolerance)
  109997. {
  109998. if (alphaTolerance === undefined) { alphaTolerance = 1; }
  109999. var textureManager = this.systems.textures;
  110000. return CreatePixelPerfectHandler(textureManager, alphaTolerance);
  110001. },
  110002. /**
  110003. * @typedef {object} Phaser.Input.InputConfiguration
  110004. *
  110005. * @property {any} [hitArea] - The object / shape to use as the Hit Area. If not given it will try to create a Rectangle based on the texture frame.
  110006. * @property {function} [hitAreaCallback] - The callback that determines if the pointer is within the Hit Area shape or not.
  110007. * @property {boolean} [draggable=false] - If `true` the Interactive Object will be set to be draggable and emit drag events.
  110008. * @property {boolean} [dropZone=false] - If `true` the Interactive Object will be set to be a drop zone for draggable objects.
  110009. * @property {boolean} [useHandCursor=false] - If `true` the Interactive Object will set the `pointer` hand cursor when a pointer is over it. This is a short-cut for setting `cursor: 'pointer'`.
  110010. * @property {string} [cursor] - The CSS string to be used when the cursor is over this Interactive Object.
  110011. * @property {boolean} [pixelPerfect=false] - If `true` the a pixel perfect function will be set for the hit area callback. Only works with texture based Game Objects.
  110012. * @property {integer} [alphaTolerance=1] - If `pixelPerfect` is set, this is the alpha tolerance threshold value used in the callback.
  110013. */
  110014. /**
  110015. * Sets the hit area for the given array of Game Objects.
  110016. *
  110017. * A hit area is typically one of the geometric shapes Phaser provides, such as a `Phaser.Geom.Rectangle`
  110018. * or `Phaser.Geom.Circle`. However, it can be any object as long as it works with the provided callback.
  110019. *
  110020. * If no hit area is provided a Rectangle is created based on the size of the Game Object, if possible
  110021. * to calculate.
  110022. *
  110023. * The hit area callback is the function that takes an `x` and `y` coordinate and returns a boolean if
  110024. * those values fall within the area of the shape or not. All of the Phaser geometry objects provide this,
  110025. * such as `Phaser.Geom.Rectangle.Contains`.
  110026. *
  110027. * @method Phaser.Input.InputPlugin#setHitArea
  110028. * @since 3.0.0
  110029. *
  110030. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set the hit area on.
  110031. * @param {(Phaser.Input.InputConfiguration|any)} [shape] - Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not specified a Rectangle will be used.
  110032. * @param {HitAreaCallback} [callback] - The 'contains' function to invoke to check if the pointer is within the hit area.
  110033. *
  110034. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110035. */
  110036. setHitArea: function (gameObjects, shape, callback)
  110037. {
  110038. if (shape === undefined)
  110039. {
  110040. return this.setHitAreaFromTexture(gameObjects);
  110041. }
  110042. if (!Array.isArray(gameObjects))
  110043. {
  110044. gameObjects = [ gameObjects ];
  110045. }
  110046. var draggable = false;
  110047. var dropZone = false;
  110048. var cursor = false;
  110049. var useHandCursor = false;
  110050. // Config object?
  110051. if (IsPlainObject(shape))
  110052. {
  110053. var config = shape;
  110054. shape = GetFastValue(config, 'hitArea', null);
  110055. callback = GetFastValue(config, 'hitAreaCallback', null);
  110056. draggable = GetFastValue(config, 'draggable', false);
  110057. dropZone = GetFastValue(config, 'dropZone', false);
  110058. cursor = GetFastValue(config, 'cursor', false);
  110059. useHandCursor = GetFastValue(config, 'useHandCursor', false);
  110060. var pixelPerfect = GetFastValue(config, 'pixelPerfect', false);
  110061. var alphaTolerance = GetFastValue(config, 'alphaTolerance', 1);
  110062. if (pixelPerfect)
  110063. {
  110064. shape = {};
  110065. callback = this.makePixelPerfect(alphaTolerance);
  110066. }
  110067. // Still no hitArea or callback?
  110068. if (!shape || !callback)
  110069. {
  110070. this.setHitAreaFromTexture(gameObjects);
  110071. }
  110072. }
  110073. else if (typeof shape === 'function' && !callback)
  110074. {
  110075. callback = shape;
  110076. shape = {};
  110077. }
  110078. for (var i = 0; i < gameObjects.length; i++)
  110079. {
  110080. var gameObject = gameObjects[i];
  110081. var io = (!gameObject.input) ? CreateInteractiveObject(gameObject, shape, callback) : gameObject.input;
  110082. io.dropZone = dropZone;
  110083. io.cursor = (useHandCursor) ? 'pointer' : cursor;
  110084. gameObject.input = io;
  110085. if (draggable)
  110086. {
  110087. this.setDraggable(gameObject);
  110088. }
  110089. this.queueForInsertion(gameObject);
  110090. }
  110091. return this;
  110092. },
  110093. /**
  110094. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Circle` shape, using
  110095. * the given coordinates and radius to control its position and size.
  110096. *
  110097. * @method Phaser.Input.InputPlugin#setHitAreaCircle
  110098. * @since 3.0.0
  110099. *
  110100. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having a circle hit area.
  110101. * @param {number} x - The center of the circle.
  110102. * @param {number} y - The center of the circle.
  110103. * @param {number} radius - The radius of the circle.
  110104. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Circle.Contains.
  110105. *
  110106. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110107. */
  110108. setHitAreaCircle: function (gameObjects, x, y, radius, callback)
  110109. {
  110110. if (callback === undefined) { callback = CircleContains; }
  110111. var shape = new Circle(x, y, radius);
  110112. return this.setHitArea(gameObjects, shape, callback);
  110113. },
  110114. /**
  110115. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Ellipse` shape, using
  110116. * the given coordinates and dimensions to control its position and size.
  110117. *
  110118. * @method Phaser.Input.InputPlugin#setHitAreaEllipse
  110119. * @since 3.0.0
  110120. *
  110121. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having an ellipse hit area.
  110122. * @param {number} x - The center of the ellipse.
  110123. * @param {number} y - The center of the ellipse.
  110124. * @param {number} width - The width of the ellipse.
  110125. * @param {number} height - The height of the ellipse.
  110126. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Ellipse.Contains.
  110127. *
  110128. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110129. */
  110130. setHitAreaEllipse: function (gameObjects, x, y, width, height, callback)
  110131. {
  110132. if (callback === undefined) { callback = EllipseContains; }
  110133. var shape = new Ellipse(x, y, width, height);
  110134. return this.setHitArea(gameObjects, shape, callback);
  110135. },
  110136. /**
  110137. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Rectangle` shape, using
  110138. * the Game Objects texture frame to define the position and size of the hit area.
  110139. *
  110140. * @method Phaser.Input.InputPlugin#setHitAreaFromTexture
  110141. * @since 3.0.0
  110142. *
  110143. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having an ellipse hit area.
  110144. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Rectangle.Contains.
  110145. *
  110146. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110147. */
  110148. setHitAreaFromTexture: function (gameObjects, callback)
  110149. {
  110150. if (callback === undefined) { callback = RectangleContains; }
  110151. if (!Array.isArray(gameObjects))
  110152. {
  110153. gameObjects = [ gameObjects ];
  110154. }
  110155. for (var i = 0; i < gameObjects.length; i++)
  110156. {
  110157. var gameObject = gameObjects[i];
  110158. var frame = gameObject.frame;
  110159. var width = 0;
  110160. var height = 0;
  110161. if (gameObject.width)
  110162. {
  110163. width = gameObject.width;
  110164. height = gameObject.height;
  110165. }
  110166. else if (frame)
  110167. {
  110168. width = frame.realWidth;
  110169. height = frame.realHeight;
  110170. }
  110171. if (gameObject.type === 'Container' && (width === 0 || height === 0))
  110172. {
  110173. console.warn('Container.setInteractive must specify a Shape or call setSize() first');
  110174. continue;
  110175. }
  110176. if (width !== 0 && height !== 0)
  110177. {
  110178. gameObject.input = CreateInteractiveObject(gameObject, new Rectangle(0, 0, width, height), callback);
  110179. this.queueForInsertion(gameObject);
  110180. }
  110181. }
  110182. return this;
  110183. },
  110184. /**
  110185. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Rectangle` shape, using
  110186. * the given coordinates and dimensions to control its position and size.
  110187. *
  110188. * @method Phaser.Input.InputPlugin#setHitAreaRectangle
  110189. * @since 3.0.0
  110190. *
  110191. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having a rectangular hit area.
  110192. * @param {number} x - The top-left of the rectangle.
  110193. * @param {number} y - The top-left of the rectangle.
  110194. * @param {number} width - The width of the rectangle.
  110195. * @param {number} height - The height of the rectangle.
  110196. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Rectangle.Contains.
  110197. *
  110198. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110199. */
  110200. setHitAreaRectangle: function (gameObjects, x, y, width, height, callback)
  110201. {
  110202. if (callback === undefined) { callback = RectangleContains; }
  110203. var shape = new Rectangle(x, y, width, height);
  110204. return this.setHitArea(gameObjects, shape, callback);
  110205. },
  110206. /**
  110207. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Triangle` shape, using
  110208. * the given coordinates to control the position of its points.
  110209. *
  110210. * @method Phaser.Input.InputPlugin#setHitAreaTriangle
  110211. * @since 3.0.0
  110212. *
  110213. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having a triangular hit area.
  110214. * @param {number} x1 - The x coordinate of the first point of the triangle.
  110215. * @param {number} y1 - The y coordinate of the first point of the triangle.
  110216. * @param {number} x2 - The x coordinate of the second point of the triangle.
  110217. * @param {number} y2 - The y coordinate of the second point of the triangle.
  110218. * @param {number} x3 - The x coordinate of the third point of the triangle.
  110219. * @param {number} y3 - The y coordinate of the third point of the triangle.
  110220. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Triangle.Contains.
  110221. *
  110222. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110223. */
  110224. setHitAreaTriangle: function (gameObjects, x1, y1, x2, y2, x3, y3, callback)
  110225. {
  110226. if (callback === undefined) { callback = TriangleContains; }
  110227. var shape = new Triangle(x1, y1, x2, y2, x3, y3);
  110228. return this.setHitArea(gameObjects, shape, callback);
  110229. },
  110230. /**
  110231. * Sets the Pointers to always poll.
  110232. *
  110233. * When a pointer is polled it runs a hit test to see which Game Objects are currently below it,
  110234. * or being interacted with it, regardless if the Pointer has actually moved or not.
  110235. *
  110236. * You should enable this if you want objects in your game to fire over / out events, and the objects
  110237. * are constantly moving, but the pointer may not have. Polling every frame has additional computation
  110238. * costs, especially if there are a large number of interactive objects in your game.
  110239. *
  110240. * @method Phaser.Input.InputPlugin#setPollAlways
  110241. * @since 3.0.0
  110242. *
  110243. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110244. */
  110245. setPollAlways: function ()
  110246. {
  110247. this.pollRate = 0;
  110248. this._pollTimer = 0;
  110249. return this;
  110250. },
  110251. /**
  110252. * Sets the Pointers to only poll when they are moved or updated.
  110253. *
  110254. * When a pointer is polled it runs a hit test to see which Game Objects are currently below it,
  110255. * or being interacted with it.
  110256. *
  110257. * @method Phaser.Input.InputPlugin#setPollOnMove
  110258. * @since 3.0.0
  110259. *
  110260. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110261. */
  110262. setPollOnMove: function ()
  110263. {
  110264. this.pollRate = -1;
  110265. this._pollTimer = 0;
  110266. return this;
  110267. },
  110268. /**
  110269. * Sets the poll rate value. This is the amount of time that should have elapsed before a pointer
  110270. * will be polled again. See the `setPollAlways` and `setPollOnMove` methods.
  110271. *
  110272. * @method Phaser.Input.InputPlugin#setPollRate
  110273. * @since 3.0.0
  110274. *
  110275. * @param {number} value - The amount of time, in ms, that should elapsed before re-polling the pointers.
  110276. *
  110277. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110278. */
  110279. setPollRate: function (value)
  110280. {
  110281. this.pollRate = value;
  110282. this._pollTimer = 0;
  110283. return this;
  110284. },
  110285. /**
  110286. * When set to `true` the global Input Manager will emulate DOM behavior by only emitting events from
  110287. * the top-most Game Objects in the Display List.
  110288. *
  110289. * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one.
  110290. *
  110291. * @method Phaser.Input.InputPlugin#setGlobalTopOnly
  110292. * @since 3.0.0
  110293. *
  110294. * @param {boolean} value - `true` to only include the top-most Game Object, or `false` to include all Game Objects in a hit test.
  110295. *
  110296. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110297. */
  110298. setGlobalTopOnly: function (value)
  110299. {
  110300. this.manager.globalTopOnly = value;
  110301. return this;
  110302. },
  110303. /**
  110304. * When set to `true` this Input Plugin will emulate DOM behavior by only emitting events from
  110305. * the top-most Game Objects in the Display List.
  110306. *
  110307. * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one.
  110308. *
  110309. * @method Phaser.Input.InputPlugin#setTopOnly
  110310. * @since 3.0.0
  110311. *
  110312. * @param {boolean} value - `true` to only include the top-most Game Object, or `false` to include all Game Objects in a hit test.
  110313. *
  110314. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110315. */
  110316. setTopOnly: function (value)
  110317. {
  110318. this.topOnly = value;
  110319. return this;
  110320. },
  110321. /**
  110322. * Given an array of Game Objects, sort the array and return it, so that the objects are in depth index order
  110323. * with the lowest at the bottom.
  110324. *
  110325. * @method Phaser.Input.InputPlugin#sortGameObjects
  110326. * @since 3.0.0
  110327. *
  110328. * @param {Phaser.GameObjects.GameObject[]} gameObjects - An array of Game Objects to be sorted.
  110329. *
  110330. * @return {Phaser.GameObjects.GameObject[]} The sorted array of Game Objects.
  110331. */
  110332. sortGameObjects: function (gameObjects)
  110333. {
  110334. if (gameObjects.length < 2)
  110335. {
  110336. return gameObjects;
  110337. }
  110338. this.scene.sys.depthSort();
  110339. return gameObjects.sort(this.sortHandlerGO.bind(this));
  110340. },
  110341. /**
  110342. * Return the child lowest down the display list (with the smallest index)
  110343. * Will iterate through all parent containers, if present.
  110344. *
  110345. * @method Phaser.Input.InputPlugin#sortHandlerGO
  110346. * @private
  110347. * @since 3.0.0
  110348. *
  110349. * @param {Phaser.GameObjects.GameObject} childA - The first Game Object to compare.
  110350. * @param {Phaser.GameObjects.GameObject} childB - The second Game Object to compare.
  110351. *
  110352. * @return {integer} Returns either a negative or positive integer, or zero if they match.
  110353. */
  110354. sortHandlerGO: function (childA, childB)
  110355. {
  110356. if (!childA.parentContainer && !childB.parentContainer)
  110357. {
  110358. // Quick bail out when neither child has a container
  110359. return this.displayList.getIndex(childB) - this.displayList.getIndex(childA);
  110360. }
  110361. else if (childA.parentContainer === childB.parentContainer)
  110362. {
  110363. // Quick bail out when both children have the same container
  110364. return childB.parentContainer.getIndex(childB) - childA.parentContainer.getIndex(childA);
  110365. }
  110366. else if (childA.parentContainer === childB)
  110367. {
  110368. // Quick bail out when childA is a child of childB
  110369. return -1;
  110370. }
  110371. else if (childB.parentContainer === childA)
  110372. {
  110373. // Quick bail out when childA is a child of childB
  110374. return 1;
  110375. }
  110376. else
  110377. {
  110378. // Container index check
  110379. var listA = childA.getIndexList();
  110380. var listB = childB.getIndexList();
  110381. var len = Math.min(listA.length, listB.length);
  110382. for (var i = 0; i < len; i++)
  110383. {
  110384. var indexA = listA[i];
  110385. var indexB = listB[i];
  110386. if (indexA === indexB)
  110387. {
  110388. // Go to the next level down
  110389. continue;
  110390. }
  110391. else
  110392. {
  110393. // Non-matching parents, so return
  110394. return indexB - indexA;
  110395. }
  110396. }
  110397. }
  110398. // Technically this shouldn't happen, but ...
  110399. return 0;
  110400. },
  110401. /**
  110402. * Causes the Input Manager to stop emitting any events for the remainder of this game step.
  110403. *
  110404. * @method Phaser.Input.InputPlugin#stopPropagation
  110405. * @since 3.0.0
  110406. *
  110407. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  110408. */
  110409. stopPropagation: function ()
  110410. {
  110411. if (this.manager.globalTopOnly)
  110412. {
  110413. this.manager.ignoreEvents = true;
  110414. }
  110415. return this;
  110416. },
  110417. /**
  110418. * **Note:** As of Phaser 3.16 this method is no longer required _unless_ you have set `input.queue = true`
  110419. * in your game config, to force it to use the legacy event queue system. This method is deprecated and
  110420. * will be removed in a future version.
  110421. *
  110422. * Adds a callback to be invoked whenever the native DOM `mouseup` or `touchend` events are received.
  110423. * By setting the `isOnce` argument you can control if the callback is called once,
  110424. * or every time the DOM event occurs.
  110425. *
  110426. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  110427. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  110428. * from the perspective of the browser. This means they can be used for tasks such as
  110429. * opening new browser windows, or anything which explicitly requires user input to activate.
  110430. * However, as a result of this, they come with their own risks, and as such should not be used
  110431. * for general game input, but instead be reserved for special circumstances.
  110432. *
  110433. * If all you're trying to do is execute a callback when a pointer is released, then
  110434. * please use the internal Input event system instead.
  110435. *
  110436. * Please understand that these callbacks are invoked when the browser feels like doing so,
  110437. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  110438. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  110439. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  110440. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  110441. * solve.
  110442. *
  110443. * @method Phaser.Input.InputPlugin#addUpCallback
  110444. * @deprecated
  110445. * @since 3.10.0
  110446. *
  110447. * @param {function} callback - The callback to be invoked on this DOM event.
  110448. * @param {boolean} [isOnce=true] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  110449. *
  110450. * @return {this} The Input Plugin.
  110451. */
  110452. addUpCallback: function (callback, isOnce)
  110453. {
  110454. this.manager.addUpCallback(callback, isOnce);
  110455. return this;
  110456. },
  110457. /**
  110458. * **Note:** As of Phaser 3.16 this method is no longer required _unless_ you have set `input.queue = true`
  110459. * in your game config, to force it to use the legacy event queue system. This method is deprecated and
  110460. * will be removed in a future version.
  110461. *
  110462. * Adds a callback to be invoked whenever the native DOM `mousedown` or `touchstart` events are received.
  110463. * By setting the `isOnce` argument you can control if the callback is called once,
  110464. * or every time the DOM event occurs.
  110465. *
  110466. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  110467. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  110468. * from the perspective of the browser. This means they can be used for tasks such as
  110469. * opening new browser windows, or anything which explicitly requires user input to activate.
  110470. * However, as a result of this, they come with their own risks, and as such should not be used
  110471. * for general game input, but instead be reserved for special circumstances.
  110472. *
  110473. * If all you're trying to do is execute a callback when a pointer is down, then
  110474. * please use the internal Input event system instead.
  110475. *
  110476. * Please understand that these callbacks are invoked when the browser feels like doing so,
  110477. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  110478. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  110479. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  110480. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  110481. * solve.
  110482. *
  110483. * @method Phaser.Input.InputPlugin#addDownCallback
  110484. * @deprecated
  110485. * @since 3.10.0
  110486. *
  110487. * @param {function} callback - The callback to be invoked on this dom event.
  110488. * @param {boolean} [isOnce=true] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  110489. *
  110490. * @return {this} The Input Plugin.
  110491. */
  110492. addDownCallback: function (callback, isOnce)
  110493. {
  110494. this.manager.addDownCallback(callback, isOnce);
  110495. return this;
  110496. },
  110497. /**
  110498. * **Note:** As of Phaser 3.16 this method is no longer required _unless_ you have set `input.queue = true`
  110499. * in your game config, to force it to use the legacy event queue system. This method is deprecated and
  110500. * will be removed in a future version.
  110501. *
  110502. * Adds a callback to be invoked whenever the native DOM `mousemove` or `touchmove` events are received.
  110503. * By setting the `isOnce` argument you can control if the callback is called once,
  110504. * or every time the DOM event occurs.
  110505. *
  110506. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  110507. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  110508. * from the perspective of the browser. This means they can be used for tasks such as
  110509. * opening new browser windows, or anything which explicitly requires user input to activate.
  110510. * However, as a result of this, they come with their own risks, and as such should not be used
  110511. * for general game input, but instead be reserved for special circumstances.
  110512. *
  110513. * If all you're trying to do is execute a callback when a pointer is moved, then
  110514. * please use the internal Input event system instead.
  110515. *
  110516. * Please understand that these callbacks are invoked when the browser feels like doing so,
  110517. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  110518. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  110519. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  110520. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  110521. * solve.
  110522. *
  110523. * @method Phaser.Input.InputPlugin#addMoveCallback
  110524. * @deprecated
  110525. * @since 3.10.0
  110526. *
  110527. * @param {function} callback - The callback to be invoked on this dom event.
  110528. * @param {boolean} [isOnce=false] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  110529. *
  110530. * @return {this} The Input Plugin.
  110531. */
  110532. addMoveCallback: function (callback, isOnce)
  110533. {
  110534. this.manager.addMoveCallback(callback, isOnce);
  110535. return this;
  110536. },
  110537. /**
  110538. * Adds new Pointer objects to the Input Manager.
  110539. *
  110540. * By default Phaser creates 2 pointer objects: `mousePointer` and `pointer1`.
  110541. *
  110542. * You can create more either by calling this method, or by setting the `input.activePointers` property
  110543. * in the Game Config, up to a maximum of 10 pointers.
  110544. *
  110545. * The first 10 pointers are available via the `InputPlugin.pointerX` properties, once they have been added
  110546. * via this method.
  110547. *
  110548. * @method Phaser.Input.InputPlugin#addPointer
  110549. * @since 3.10.0
  110550. *
  110551. * @param {integer} [quantity=1] The number of new Pointers to create. A maximum of 10 is allowed in total.
  110552. *
  110553. * @return {Phaser.Input.Pointer[]} An array containing all of the new Pointer objects that were created.
  110554. */
  110555. addPointer: function (quantity)
  110556. {
  110557. return this.manager.addPointer(quantity);
  110558. },
  110559. /**
  110560. * Tells the Input system to set a custom cursor.
  110561. *
  110562. * This cursor will be the default cursor used when interacting with the game canvas.
  110563. *
  110564. * If an Interactive Object also sets a custom cursor, this is the cursor that is reset after its use.
  110565. *
  110566. * Any valid CSS cursor value is allowed, including paths to image files, i.e.:
  110567. *
  110568. * ```javascript
  110569. * this.input.setDefaultCursor('url(assets/cursors/sword.cur), pointer');
  110570. * ```
  110571. *
  110572. * Please read about the differences between browsers when it comes to the file formats and sizes they support:
  110573. *
  110574. * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor
  110575. * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_User_Interface/Using_URL_values_for_the_cursor_property
  110576. *
  110577. * It's up to you to pick a suitable cursor format that works across the range of browsers you need to support.
  110578. *
  110579. * @method Phaser.Input.InputPlugin#setDefaultCursor
  110580. * @since 3.10.0
  110581. *
  110582. * @param {string} cursor - The CSS to be used when setting the default cursor.
  110583. *
  110584. * @return {Phaser.Input.InputPlugin} This Input instance.
  110585. */
  110586. setDefaultCursor: function (cursor)
  110587. {
  110588. this.manager.setDefaultCursor(cursor);
  110589. return this;
  110590. },
  110591. /**
  110592. * The Scene that owns this plugin is transitioning in.
  110593. *
  110594. * @method Phaser.Input.InputPlugin#transitionIn
  110595. * @private
  110596. * @since 3.5.0
  110597. */
  110598. transitionIn: function ()
  110599. {
  110600. this.enabled = this.settings.transitionAllowInput;
  110601. },
  110602. /**
  110603. * The Scene that owns this plugin has finished transitioning in.
  110604. *
  110605. * @method Phaser.Input.InputPlugin#transitionComplete
  110606. * @private
  110607. * @since 3.5.0
  110608. */
  110609. transitionComplete: function ()
  110610. {
  110611. if (!this.settings.transitionAllowInput)
  110612. {
  110613. this.enabled = true;
  110614. }
  110615. },
  110616. /**
  110617. * The Scene that owns this plugin is transitioning out.
  110618. *
  110619. * @method Phaser.Input.InputPlugin#transitionOut
  110620. * @private
  110621. * @since 3.5.0
  110622. */
  110623. transitionOut: function ()
  110624. {
  110625. this.enabled = this.settings.transitionAllowInput;
  110626. },
  110627. /**
  110628. * The Scene that owns this plugin is shutting down.
  110629. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  110630. *
  110631. * @method Phaser.Input.InputPlugin#shutdown
  110632. * @fires Phaser.Input.Events#SHUTDOWN
  110633. * @private
  110634. * @since 3.0.0
  110635. */
  110636. shutdown: function ()
  110637. {
  110638. // Registered input plugins listen for this
  110639. this.pluginEvents.emit(Events.SHUTDOWN);
  110640. this._temp.length = 0;
  110641. this._list.length = 0;
  110642. this._draggable.length = 0;
  110643. this._pendingRemoval.length = 0;
  110644. this._pendingInsertion.length = 0;
  110645. this._dragState.length = 0;
  110646. for (var i = 0; i < 10; i++)
  110647. {
  110648. this._drag[i] = [];
  110649. this._over[i] = [];
  110650. }
  110651. this.removeAllListeners();
  110652. var eventEmitter = this.systems.events;
  110653. eventEmitter.off(SceneEvents.TRANSITION_START, this.transitionIn, this);
  110654. eventEmitter.off(SceneEvents.TRANSITION_OUT, this.transitionOut, this);
  110655. eventEmitter.off(SceneEvents.TRANSITION_COMPLETE, this.transitionComplete, this);
  110656. eventEmitter.off(SceneEvents.PRE_UPDATE, this.preUpdate, this);
  110657. if (this.manager.useQueue)
  110658. {
  110659. eventEmitter.off(SceneEvents.UPDATE, this.update, this);
  110660. }
  110661. this.manager.events.off(Events.GAME_OUT, this.onGameOut, this);
  110662. this.manager.events.off(Events.GAME_OVER, this.onGameOver, this);
  110663. eventEmitter.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  110664. },
  110665. /**
  110666. * The Scene that owns this plugin is being destroyed.
  110667. * We need to shutdown and then kill off all external references.
  110668. *
  110669. * @method Phaser.Input.InputPlugin#destroy
  110670. * @fires Phaser.Input.Events#DESTROY
  110671. * @private
  110672. * @since 3.0.0
  110673. */
  110674. destroy: function ()
  110675. {
  110676. this.shutdown();
  110677. // Registered input plugins listen for this
  110678. this.pluginEvents.emit(Events.DESTROY);
  110679. this.pluginEvents.removeAllListeners();
  110680. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  110681. this.scene = null;
  110682. this.cameras = null;
  110683. this.manager = null;
  110684. this.events = null;
  110685. this.mouse = null;
  110686. },
  110687. /**
  110688. * The x coordinates of the ActivePointer based on the first camera in the camera list.
  110689. * This is only safe to use if your game has just 1 non-transformed camera and doesn't use multi-touch.
  110690. *
  110691. * @name Phaser.Input.InputPlugin#x
  110692. * @type {number}
  110693. * @readonly
  110694. * @since 3.0.0
  110695. */
  110696. x: {
  110697. get: function ()
  110698. {
  110699. return this.manager.activePointer.x;
  110700. }
  110701. },
  110702. /**
  110703. * The y coordinates of the ActivePointer based on the first camera in the camera list.
  110704. * This is only safe to use if your game has just 1 non-transformed camera and doesn't use multi-touch.
  110705. *
  110706. * @name Phaser.Input.InputPlugin#y
  110707. * @type {number}
  110708. * @readonly
  110709. * @since 3.0.0
  110710. */
  110711. y: {
  110712. get: function ()
  110713. {
  110714. return this.manager.activePointer.y;
  110715. }
  110716. },
  110717. /**
  110718. * Are any mouse or touch pointers currently over the game canvas?
  110719. *
  110720. * @name Phaser.Input.InputPlugin#isOver
  110721. * @type {boolean}
  110722. * @readonly
  110723. * @since 3.16.0
  110724. */
  110725. isOver: {
  110726. get: function ()
  110727. {
  110728. return this.manager.isOver;
  110729. }
  110730. },
  110731. /**
  110732. * The mouse has its own unique Pointer object, which you can reference directly if making a _desktop specific game_.
  110733. * If you are supporting both desktop and touch devices then do not use this property, instead use `activePointer`
  110734. * which will always map to the most recently interacted pointer.
  110735. *
  110736. * @name Phaser.Input.InputPlugin#mousePointer
  110737. * @type {Phaser.Input.Pointer}
  110738. * @readonly
  110739. * @since 3.10.0
  110740. */
  110741. mousePointer: {
  110742. get: function ()
  110743. {
  110744. return this.manager.mousePointer;
  110745. }
  110746. },
  110747. /**
  110748. * The current active input Pointer.
  110749. *
  110750. * @name Phaser.Input.InputPlugin#activePointer
  110751. * @type {Phaser.Input.Pointer}
  110752. * @readonly
  110753. * @since 3.0.0
  110754. */
  110755. activePointer: {
  110756. get: function ()
  110757. {
  110758. return this.manager.activePointer;
  110759. }
  110760. },
  110761. /**
  110762. * A touch-based Pointer object.
  110763. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110764. *
  110765. * @name Phaser.Input.InputPlugin#pointer1
  110766. * @type {Phaser.Input.Pointer}
  110767. * @readonly
  110768. * @since 3.10.0
  110769. */
  110770. pointer1: {
  110771. get: function ()
  110772. {
  110773. return this.manager.pointers[1];
  110774. }
  110775. },
  110776. /**
  110777. * A touch-based Pointer object.
  110778. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110779. *
  110780. * @name Phaser.Input.InputPlugin#pointer2
  110781. * @type {Phaser.Input.Pointer}
  110782. * @readonly
  110783. * @since 3.10.0
  110784. */
  110785. pointer2: {
  110786. get: function ()
  110787. {
  110788. return this.manager.pointers[2];
  110789. }
  110790. },
  110791. /**
  110792. * A touch-based Pointer object.
  110793. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110794. *
  110795. * @name Phaser.Input.InputPlugin#pointer3
  110796. * @type {Phaser.Input.Pointer}
  110797. * @readonly
  110798. * @since 3.10.0
  110799. */
  110800. pointer3: {
  110801. get: function ()
  110802. {
  110803. return this.manager.pointers[3];
  110804. }
  110805. },
  110806. /**
  110807. * A touch-based Pointer object.
  110808. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110809. *
  110810. * @name Phaser.Input.InputPlugin#pointer4
  110811. * @type {Phaser.Input.Pointer}
  110812. * @readonly
  110813. * @since 3.10.0
  110814. */
  110815. pointer4: {
  110816. get: function ()
  110817. {
  110818. return this.manager.pointers[4];
  110819. }
  110820. },
  110821. /**
  110822. * A touch-based Pointer object.
  110823. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110824. *
  110825. * @name Phaser.Input.InputPlugin#pointer5
  110826. * @type {Phaser.Input.Pointer}
  110827. * @readonly
  110828. * @since 3.10.0
  110829. */
  110830. pointer5: {
  110831. get: function ()
  110832. {
  110833. return this.manager.pointers[5];
  110834. }
  110835. },
  110836. /**
  110837. * A touch-based Pointer object.
  110838. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110839. *
  110840. * @name Phaser.Input.InputPlugin#pointer6
  110841. * @type {Phaser.Input.Pointer}
  110842. * @readonly
  110843. * @since 3.10.0
  110844. */
  110845. pointer6: {
  110846. get: function ()
  110847. {
  110848. return this.manager.pointers[6];
  110849. }
  110850. },
  110851. /**
  110852. * A touch-based Pointer object.
  110853. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110854. *
  110855. * @name Phaser.Input.InputPlugin#pointer7
  110856. * @type {Phaser.Input.Pointer}
  110857. * @readonly
  110858. * @since 3.10.0
  110859. */
  110860. pointer7: {
  110861. get: function ()
  110862. {
  110863. return this.manager.pointers[7];
  110864. }
  110865. },
  110866. /**
  110867. * A touch-based Pointer object.
  110868. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110869. *
  110870. * @name Phaser.Input.InputPlugin#pointer8
  110871. * @type {Phaser.Input.Pointer}
  110872. * @readonly
  110873. * @since 3.10.0
  110874. */
  110875. pointer8: {
  110876. get: function ()
  110877. {
  110878. return this.manager.pointers[8];
  110879. }
  110880. },
  110881. /**
  110882. * A touch-based Pointer object.
  110883. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110884. *
  110885. * @name Phaser.Input.InputPlugin#pointer9
  110886. * @type {Phaser.Input.Pointer}
  110887. * @readonly
  110888. * @since 3.10.0
  110889. */
  110890. pointer9: {
  110891. get: function ()
  110892. {
  110893. return this.manager.pointers[9];
  110894. }
  110895. },
  110896. /**
  110897. * A touch-based Pointer object.
  110898. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  110899. *
  110900. * @name Phaser.Input.InputPlugin#pointer10
  110901. * @type {Phaser.Input.Pointer}
  110902. * @readonly
  110903. * @since 3.10.0
  110904. */
  110905. pointer10: {
  110906. get: function ()
  110907. {
  110908. return this.manager.pointers[10];
  110909. }
  110910. }
  110911. });
  110912. PluginCache.register('InputPlugin', InputPlugin, 'input');
  110913. module.exports = InputPlugin;
  110914. /***/ }),
  110915. /* 623 */
  110916. /***/ (function(module, exports) {
  110917. /**
  110918. * @author Richard Davey <rich@photonstorm.com>
  110919. * @copyright 2019 Photon Storm Ltd.
  110920. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110921. */
  110922. /**
  110923. * XBox 360 Gamepad Configuration.
  110924. *
  110925. * @name Phaser.Input.Gamepad.Configs.XBOX_360
  110926. * @type {object}
  110927. * @since 3.0.0
  110928. */
  110929. module.exports = {
  110930. UP: 12,
  110931. DOWN: 13,
  110932. LEFT: 14,
  110933. RIGHT: 15,
  110934. MENU: 16,
  110935. A: 0,
  110936. B: 1,
  110937. X: 2,
  110938. Y: 3,
  110939. LB: 4,
  110940. RB: 5,
  110941. LT: 6,
  110942. RT: 7,
  110943. BACK: 8,
  110944. START: 9,
  110945. LS: 10,
  110946. RS: 11,
  110947. LEFT_STICK_H: 0,
  110948. LEFT_STICK_V: 1,
  110949. RIGHT_STICK_H: 2,
  110950. RIGHT_STICK_V: 3
  110951. };
  110952. /***/ }),
  110953. /* 624 */
  110954. /***/ (function(module, exports) {
  110955. /**
  110956. * @author Richard Davey <rich@photonstorm.com>
  110957. * @copyright 2019 Photon Storm Ltd.
  110958. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110959. */
  110960. /**
  110961. * Tatar SNES USB Controller Gamepad Configuration.
  110962. * USB Gamepad (STANDARD GAMEPAD Vendor: 0079 Product: 0011)
  110963. *
  110964. * @name Phaser.Input.Gamepad.Configs.SNES_USB
  110965. * @type {object}
  110966. * @since 3.0.0
  110967. */
  110968. module.exports = {
  110969. UP: 12,
  110970. DOWN: 13,
  110971. LEFT: 14,
  110972. RIGHT: 15,
  110973. SELECT: 8,
  110974. START: 9,
  110975. B: 0,
  110976. A: 1,
  110977. Y: 2,
  110978. X: 3,
  110979. LEFT_SHOULDER: 4,
  110980. RIGHT_SHOULDER: 5
  110981. };
  110982. /***/ }),
  110983. /* 625 */
  110984. /***/ (function(module, exports) {
  110985. /**
  110986. * @author Richard Davey <rich@photonstorm.com>
  110987. * @copyright 2019 Photon Storm Ltd.
  110988. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110989. */
  110990. /**
  110991. * PlayStation DualShock 4 Gamepad Configuration.
  110992. * Sony PlayStation DualShock 4 (v2) wireless controller
  110993. *
  110994. * @name Phaser.Input.Gamepad.Configs.DUALSHOCK_4
  110995. * @type {object}
  110996. * @since 3.0.0
  110997. */
  110998. module.exports = {
  110999. UP: 12,
  111000. DOWN: 13,
  111001. LEFT: 14,
  111002. RIGHT: 15,
  111003. SHARE: 8,
  111004. OPTIONS: 9,
  111005. PS: 16,
  111006. TOUCHBAR: 17,
  111007. X: 0,
  111008. CIRCLE: 1,
  111009. SQUARE: 2,
  111010. TRIANGLE: 3,
  111011. L1: 4,
  111012. R1: 5,
  111013. L2: 6,
  111014. R2: 7,
  111015. L3: 10,
  111016. R3: 11,
  111017. LEFT_STICK_H: 0,
  111018. LEFT_STICK_V: 1,
  111019. RIGHT_STICK_H: 2,
  111020. RIGHT_STICK_V: 3
  111021. };
  111022. /***/ }),
  111023. /* 626 */
  111024. /***/ (function(module, exports, __webpack_require__) {
  111025. /**
  111026. * @author Richard Davey <rich@photonstorm.com>
  111027. * @copyright 2019 Photon Storm Ltd.
  111028. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111029. */
  111030. /**
  111031. * @namespace Phaser.Input.Gamepad.Configs
  111032. */
  111033. module.exports = {
  111034. DUALSHOCK_4: __webpack_require__(625),
  111035. SNES_USB: __webpack_require__(624),
  111036. XBOX_360: __webpack_require__(623)
  111037. };
  111038. /***/ }),
  111039. /* 627 */
  111040. /***/ (function(module, exports, __webpack_require__) {
  111041. /**
  111042. * @author Richard Davey <rich@photonstorm.com>
  111043. * @copyright 2019 Photon Storm Ltd.
  111044. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111045. */
  111046. var Class = __webpack_require__(0);
  111047. var EventEmitter = __webpack_require__(11);
  111048. var Events = __webpack_require__(153);
  111049. var Gamepad = __webpack_require__(262);
  111050. var GetValue = __webpack_require__(4);
  111051. var InputPluginCache = __webpack_require__(114);
  111052. var InputEvents = __webpack_require__(52);
  111053. /**
  111054. * @typedef {object} Pad
  111055. *
  111056. * @property {string} id - The ID of the Gamepad.
  111057. * @property {integer} index - The index of the Gamepad.
  111058. */
  111059. /**
  111060. * @classdesc
  111061. * The Gamepad Plugin is an input plugin that belongs to the Scene-owned Input system.
  111062. *
  111063. * Its role is to listen for native DOM Gamepad Events and then process them.
  111064. *
  111065. * You do not need to create this class directly, the Input system will create an instance of it automatically.
  111066. *
  111067. * You can access it from within a Scene using `this.input.gamepad`.
  111068. *
  111069. * To listen for a gamepad being connected:
  111070. *
  111071. * ```javascript
  111072. * this.input.gamepad.once('connected', function (pad) {
  111073. * // 'pad' is a reference to the gamepad that was just connected
  111074. * });
  111075. * ```
  111076. *
  111077. * Note that the browser may require you to press a button on a gamepad before it will allow you to access it,
  111078. * this is for security reasons. However, it may also trust the page already, in which case you won't get the
  111079. * 'connected' event and instead should check `GamepadPlugin.total` to see if it thinks there are any gamepads
  111080. * already connected.
  111081. *
  111082. * Once you have received the connected event, or polled the gamepads and found them enabled, you can access
  111083. * them via the built-in properties `GamepadPlugin.pad1` to `pad4`, for up to 4 game pads. With a reference
  111084. * to the gamepads you can poll its buttons and axis sticks. See the properties and methods available on
  111085. * the `Gamepad` class for more details.
  111086. *
  111087. * For more information about Gamepad support in browsers see the following resources:
  111088. *
  111089. * https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API
  111090. * https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API
  111091. * https://www.smashingmagazine.com/2015/11/gamepad-api-in-web-games/
  111092. * http://html5gamepad.com/
  111093. *
  111094. * @class GamepadPlugin
  111095. * @extends Phaser.Events.EventEmitter
  111096. * @memberof Phaser.Input.Gamepad
  111097. * @constructor
  111098. * @since 3.10.0
  111099. *
  111100. * @param {Phaser.Input.InputPlugin} sceneInputPlugin - A reference to the Scene Input Plugin that the KeyboardPlugin belongs to.
  111101. */
  111102. var GamepadPlugin = new Class({
  111103. Extends: EventEmitter,
  111104. initialize:
  111105. function GamepadPlugin (sceneInputPlugin)
  111106. {
  111107. EventEmitter.call(this);
  111108. /**
  111109. * A reference to the Scene that this Input Plugin is responsible for.
  111110. *
  111111. * @name Phaser.Input.Gamepad.GamepadPlugin#scene
  111112. * @type {Phaser.Scene}
  111113. * @since 3.10.0
  111114. */
  111115. this.scene = sceneInputPlugin.scene;
  111116. /**
  111117. * A reference to the Scene Systems Settings.
  111118. *
  111119. * @name Phaser.Input.Gamepad.GamepadPlugin#settings
  111120. * @type {Phaser.Scenes.Settings.Object}
  111121. * @since 3.10.0
  111122. */
  111123. this.settings = this.scene.sys.settings;
  111124. /**
  111125. * A reference to the Scene Input Plugin that created this Keyboard Plugin.
  111126. *
  111127. * @name Phaser.Input.Gamepad.GamepadPlugin#sceneInputPlugin
  111128. * @type {Phaser.Input.InputPlugin}
  111129. * @since 3.10.0
  111130. */
  111131. this.sceneInputPlugin = sceneInputPlugin;
  111132. /**
  111133. * A boolean that controls if the Gamepad Manager is enabled or not.
  111134. * Can be toggled on the fly.
  111135. *
  111136. * @name Phaser.Input.Gamepad.GamepadPlugin#enabled
  111137. * @type {boolean}
  111138. * @default true
  111139. * @since 3.10.0
  111140. */
  111141. this.enabled = true;
  111142. /**
  111143. * The Gamepad Event target, as defined in the Game Config.
  111144. * Typically the browser window, but can be any interactive DOM element.
  111145. *
  111146. * @name Phaser.Input.Gamepad.GamepadPlugin#target
  111147. * @type {any}
  111148. * @since 3.10.0
  111149. */
  111150. this.target;
  111151. /**
  111152. * An array of the connected Gamepads.
  111153. *
  111154. * @name Phaser.Input.Gamepad.GamepadPlugin#gamepads
  111155. * @type {Phaser.Input.Gamepad.Gamepad[]}
  111156. * @default []
  111157. * @since 3.10.0
  111158. */
  111159. this.gamepads = [];
  111160. /**
  111161. * An internal event queue.
  111162. *
  111163. * @name Phaser.Input.Gamepad.GamepadPlugin#queue
  111164. * @type {GamepadEvent[]}
  111165. * @private
  111166. * @since 3.10.0
  111167. */
  111168. this.queue = [];
  111169. /**
  111170. * Internal event handler.
  111171. *
  111172. * @name Phaser.Input.Gamepad.GamepadPlugin#onGamepadHandler
  111173. * @type {function}
  111174. * @private
  111175. * @since 3.10.0
  111176. */
  111177. this.onGamepadHandler;
  111178. /**
  111179. * Internal Gamepad reference.
  111180. *
  111181. * @name Phaser.Input.Gamepad.GamepadPlugin#_pad1
  111182. * @type {Phaser.Input.Gamepad.Gamepad}
  111183. * @private
  111184. * @since 3.10.0
  111185. */
  111186. this._pad1;
  111187. /**
  111188. * Internal Gamepad reference.
  111189. *
  111190. * @name Phaser.Input.Gamepad.GamepadPlugin#_pad2
  111191. * @type {Phaser.Input.Gamepad.Gamepad}
  111192. * @private
  111193. * @since 3.10.0
  111194. */
  111195. this._pad2;
  111196. /**
  111197. * Internal Gamepad reference.
  111198. *
  111199. * @name Phaser.Input.Gamepad.GamepadPlugin#_pad3
  111200. * @type {Phaser.Input.Gamepad.Gamepad}
  111201. * @private
  111202. * @since 3.10.0
  111203. */
  111204. this._pad3;
  111205. /**
  111206. * Internal Gamepad reference.
  111207. *
  111208. * @name Phaser.Input.Gamepad.GamepadPlugin#_pad4
  111209. * @type {Phaser.Input.Gamepad.Gamepad}
  111210. * @private
  111211. * @since 3.10.0
  111212. */
  111213. this._pad4;
  111214. sceneInputPlugin.pluginEvents.once(InputEvents.BOOT, this.boot, this);
  111215. sceneInputPlugin.pluginEvents.on(InputEvents.START, this.start, this);
  111216. },
  111217. /**
  111218. * This method is called automatically, only once, when the Scene is first created.
  111219. * Do not invoke it directly.
  111220. *
  111221. * @method Phaser.Input.Gamepad.GamepadPlugin#boot
  111222. * @private
  111223. * @since 3.10.0
  111224. */
  111225. boot: function ()
  111226. {
  111227. var game = this.scene.sys.game;
  111228. var settings = this.settings.input;
  111229. var config = game.config;
  111230. this.enabled = GetValue(settings, 'gamepad', config.inputGamepad) && game.device.input.gamepads;
  111231. this.target = GetValue(settings, 'gamepad.target', config.inputGamepadEventTarget);
  111232. this.sceneInputPlugin.pluginEvents.once(InputEvents.DESTROY, this.destroy, this);
  111233. },
  111234. /**
  111235. * This method is called automatically by the Scene when it is starting up.
  111236. * It is responsible for creating local systems, properties and listening for Scene events.
  111237. * Do not invoke it directly.
  111238. *
  111239. * @method Phaser.Input.Gamepad.GamepadPlugin#start
  111240. * @private
  111241. * @since 3.10.0
  111242. */
  111243. start: function ()
  111244. {
  111245. if (this.enabled)
  111246. {
  111247. this.startListeners();
  111248. }
  111249. this.sceneInputPlugin.pluginEvents.once(InputEvents.SHUTDOWN, this.shutdown, this);
  111250. },
  111251. /**
  111252. * Checks to see if both this plugin and the Scene to which it belongs is active.
  111253. *
  111254. * @method Phaser.Input.Gamepad.GamepadPlugin#isActive
  111255. * @since 3.10.0
  111256. *
  111257. * @return {boolean} `true` if the plugin and the Scene it belongs to is active.
  111258. */
  111259. isActive: function ()
  111260. {
  111261. return (this.enabled && this.scene.sys.isActive());
  111262. },
  111263. /**
  111264. * Starts the Gamepad Event listeners running.
  111265. * This is called automatically and does not need to be manually invoked.
  111266. *
  111267. * @method Phaser.Input.Gamepad.GamepadPlugin#startListeners
  111268. * @private
  111269. * @since 3.10.0
  111270. */
  111271. startListeners: function ()
  111272. {
  111273. var _this = this;
  111274. var target = this.target;
  111275. var handler = function (event)
  111276. {
  111277. // console.log(event);
  111278. if (event.defaultPrevented || !_this.isActive())
  111279. {
  111280. // Do nothing if event already handled
  111281. return;
  111282. }
  111283. _this.refreshPads();
  111284. _this.queue.push(event);
  111285. };
  111286. this.onGamepadHandler = handler;
  111287. target.addEventListener('gamepadconnected', handler, false);
  111288. target.addEventListener('gamepaddisconnected', handler, false);
  111289. // FF also supports gamepadbuttondown, gamepadbuttonup and gamepadaxismove but
  111290. // nothing else does, and we can get those values via the gamepads anyway, so we will
  111291. // until more browsers support this
  111292. // Finally, listen for an update event from the Input Plugin
  111293. this.sceneInputPlugin.pluginEvents.on(InputEvents.UPDATE, this.update, this);
  111294. },
  111295. /**
  111296. * Stops the Gamepad Event listeners.
  111297. * This is called automatically and does not need to be manually invoked.
  111298. *
  111299. * @method Phaser.Input.Gamepad.GamepadPlugin#stopListeners
  111300. * @private
  111301. * @since 3.10.0
  111302. */
  111303. stopListeners: function ()
  111304. {
  111305. this.target.removeEventListener('gamepadconnected', this.onGamepadHandler);
  111306. this.target.removeEventListener('gamepaddisconnected', this.onGamepadHandler);
  111307. this.sceneInputPlugin.pluginEvents.off(InputEvents.UPDATE, this.update);
  111308. },
  111309. /**
  111310. * Disconnects all current Gamepads.
  111311. *
  111312. * @method Phaser.Input.Gamepad.GamepadPlugin#disconnectAll
  111313. * @since 3.10.0
  111314. */
  111315. disconnectAll: function ()
  111316. {
  111317. for (var i = 0; i < this.gamepads.length; i++)
  111318. {
  111319. this.gamepads.connected = false;
  111320. }
  111321. },
  111322. /**
  111323. * Refreshes the list of connected Gamepads.
  111324. *
  111325. * This is called automatically when a gamepad is connected or disconnected,
  111326. * and during the update loop.
  111327. *
  111328. * @method Phaser.Input.Gamepad.GamepadPlugin#refreshPads
  111329. * @private
  111330. * @since 3.10.0
  111331. */
  111332. refreshPads: function ()
  111333. {
  111334. var connectedPads = navigator.getGamepads();
  111335. if (!connectedPads)
  111336. {
  111337. this.disconnectAll();
  111338. }
  111339. else
  111340. {
  111341. var currentPads = this.gamepads;
  111342. for (var i = 0; i < connectedPads.length; i++)
  111343. {
  111344. var livePad = connectedPads[i];
  111345. // Because sometimes they're null (yes, really)
  111346. if (!livePad)
  111347. {
  111348. continue;
  111349. }
  111350. var id = livePad.id;
  111351. var index = livePad.index;
  111352. var currentPad = currentPads[index];
  111353. if (!currentPad)
  111354. {
  111355. // A new Gamepad, not currently stored locally
  111356. var newPad = new Gamepad(this, livePad);
  111357. currentPads[index] = newPad;
  111358. if (!this._pad1)
  111359. {
  111360. this._pad1 = newPad;
  111361. }
  111362. else if (!this._pad2)
  111363. {
  111364. this._pad2 = newPad;
  111365. }
  111366. else if (!this._pad3)
  111367. {
  111368. this._pad3 = newPad;
  111369. }
  111370. else if (!this._pad4)
  111371. {
  111372. this._pad4 = newPad;
  111373. }
  111374. }
  111375. else if (currentPad.id !== id)
  111376. {
  111377. // A new Gamepad with a different vendor string, but it has got the same index as an old one
  111378. currentPad.destroy();
  111379. currentPads[index] = new Gamepad(this, livePad);
  111380. }
  111381. else
  111382. {
  111383. // If neither of these, it's a pad we've already got, so update it
  111384. currentPad.update(livePad);
  111385. }
  111386. }
  111387. }
  111388. },
  111389. /**
  111390. * Returns an array of all currently connected Gamepads.
  111391. *
  111392. * @method Phaser.Input.Gamepad.GamepadPlugin#getAll
  111393. * @since 3.10.0
  111394. *
  111395. * @return {Phaser.Input.Gamepad.Gamepad[]} An array of all currently connected Gamepads.
  111396. */
  111397. getAll: function ()
  111398. {
  111399. var out = [];
  111400. var pads = this.gamepads;
  111401. for (var i = 0; i < pads.length; i++)
  111402. {
  111403. if (pads[i])
  111404. {
  111405. out.push(pads[i]);
  111406. }
  111407. }
  111408. return out;
  111409. },
  111410. /**
  111411. * Looks-up a single Gamepad based on the given index value.
  111412. *
  111413. * @method Phaser.Input.Gamepad.GamepadPlugin#getPad
  111414. * @since 3.10.0
  111415. *
  111416. * @param {number} index - The index of the Gamepad to get.
  111417. *
  111418. * @return {Phaser.Input.Gamepad.Gamepad} The Gamepad matching the given index, or undefined if none were found.
  111419. */
  111420. getPad: function (index)
  111421. {
  111422. var pads = this.gamepads;
  111423. for (var i = 0; i < pads.length; i++)
  111424. {
  111425. if (pads[i] && pads[i].index === index)
  111426. {
  111427. return pads[i];
  111428. }
  111429. }
  111430. },
  111431. /**
  111432. * The internal update loop. Refreshes all connected gamepads and processes their events.
  111433. *
  111434. * Called automatically by the Input Manager, invoked from the Game step.
  111435. *
  111436. * @method Phaser.Input.Gamepad.GamepadPlugin#update
  111437. * @private
  111438. * @fires Phaser.Input.Gamepad.Events#CONNECTED
  111439. * @fires Phaser.Input.Gamepad.Events#DISCONNECTED
  111440. * @since 3.10.0
  111441. */
  111442. update: function ()
  111443. {
  111444. if (!this.enabled)
  111445. {
  111446. return;
  111447. }
  111448. this.refreshPads();
  111449. var len = this.queue.length;
  111450. if (len === 0)
  111451. {
  111452. return;
  111453. }
  111454. var queue = this.queue.splice(0, len);
  111455. // Process the event queue, dispatching all of the events that have stored up
  111456. for (var i = 0; i < len; i++)
  111457. {
  111458. var event = queue[i];
  111459. var pad = this.getPad(event.gamepad.index);
  111460. if (event.type === 'gamepadconnected')
  111461. {
  111462. this.emit(Events.CONNECTED, pad, event);
  111463. }
  111464. else if (event.type === 'gamepaddisconnected')
  111465. {
  111466. this.emit(Events.DISCONNECTED, pad, event);
  111467. }
  111468. }
  111469. },
  111470. /**
  111471. * Shuts the Gamepad Plugin down.
  111472. * All this does is remove any listeners bound to it.
  111473. *
  111474. * @method Phaser.Input.Gamepad.GamepadPlugin#shutdown
  111475. * @private
  111476. * @since 3.10.0
  111477. */
  111478. shutdown: function ()
  111479. {
  111480. this.stopListeners();
  111481. this.disconnectAll();
  111482. this.removeAllListeners();
  111483. },
  111484. /**
  111485. * Destroys this Gamepad Plugin, disconnecting all Gamepads and releasing internal references.
  111486. *
  111487. * @method Phaser.Input.Gamepad.GamepadPlugin#destroy
  111488. * @private
  111489. * @since 3.10.0
  111490. */
  111491. destroy: function ()
  111492. {
  111493. this.shutdown();
  111494. for (var i = 0; i < this.gamepads.length; i++)
  111495. {
  111496. if (this.gamepads[i])
  111497. {
  111498. this.gamepads[i].destroy();
  111499. }
  111500. }
  111501. this.gamepads = [];
  111502. this.scene = null;
  111503. this.settings = null;
  111504. this.sceneInputPlugin = null;
  111505. this.target = null;
  111506. },
  111507. /**
  111508. * The total number of connected game pads.
  111509. *
  111510. * @name Phaser.Input.Gamepad.GamepadPlugin#total
  111511. * @type {integer}
  111512. * @since 3.10.0
  111513. */
  111514. total: {
  111515. get: function ()
  111516. {
  111517. return this.gamepads.length;
  111518. }
  111519. },
  111520. /**
  111521. * A reference to the first connected Gamepad.
  111522. *
  111523. * This will be undefined if either no pads are connected, or the browser
  111524. * has not yet issued a gamepadconnect, which can happen even if a Gamepad
  111525. * is plugged in, but hasn't yet had any buttons pressed on it.
  111526. *
  111527. * @name Phaser.Input.Gamepad.GamepadPlugin#pad1
  111528. * @type {Phaser.Input.Gamepad.Gamepad}
  111529. * @since 3.10.0
  111530. */
  111531. pad1: {
  111532. get: function ()
  111533. {
  111534. return this._pad1;
  111535. }
  111536. },
  111537. /**
  111538. * A reference to the second connected Gamepad.
  111539. *
  111540. * This will be undefined if either no pads are connected, or the browser
  111541. * has not yet issued a gamepadconnect, which can happen even if a Gamepad
  111542. * is plugged in, but hasn't yet had any buttons pressed on it.
  111543. *
  111544. * @name Phaser.Input.Gamepad.GamepadPlugin#pad2
  111545. * @type {Phaser.Input.Gamepad.Gamepad}
  111546. * @since 3.10.0
  111547. */
  111548. pad2: {
  111549. get: function ()
  111550. {
  111551. return this._pad2;
  111552. }
  111553. },
  111554. /**
  111555. * A reference to the third connected Gamepad.
  111556. *
  111557. * This will be undefined if either no pads are connected, or the browser
  111558. * has not yet issued a gamepadconnect, which can happen even if a Gamepad
  111559. * is plugged in, but hasn't yet had any buttons pressed on it.
  111560. *
  111561. * @name Phaser.Input.Gamepad.GamepadPlugin#pad3
  111562. * @type {Phaser.Input.Gamepad.Gamepad}
  111563. * @since 3.10.0
  111564. */
  111565. pad3: {
  111566. get: function ()
  111567. {
  111568. return this._pad3;
  111569. }
  111570. },
  111571. /**
  111572. * A reference to the fourth connected Gamepad.
  111573. *
  111574. * This will be undefined if either no pads are connected, or the browser
  111575. * has not yet issued a gamepadconnect, which can happen even if a Gamepad
  111576. * is plugged in, but hasn't yet had any buttons pressed on it.
  111577. *
  111578. * @name Phaser.Input.Gamepad.GamepadPlugin#pad4
  111579. * @type {Phaser.Input.Gamepad.Gamepad}
  111580. * @since 3.10.0
  111581. */
  111582. pad4: {
  111583. get: function ()
  111584. {
  111585. return this._pad4;
  111586. }
  111587. }
  111588. });
  111589. /**
  111590. * An instance of the Gamepad Plugin class, if enabled via the `input.gamepad` Scene or Game Config property.
  111591. * Use this to create access Gamepads connected to the browser and respond to gamepad buttons.
  111592. *
  111593. * @name Phaser.Input.InputPlugin#gamepad
  111594. * @type {?Phaser.Input.Gamepad.GamepadPlugin}
  111595. * @since 3.10.0
  111596. */
  111597. InputPluginCache.register('GamepadPlugin', GamepadPlugin, 'gamepad', 'gamepad', 'inputGamepad');
  111598. module.exports = GamepadPlugin;
  111599. /***/ }),
  111600. /* 628 */
  111601. /***/ (function(module, exports) {
  111602. /**
  111603. * @author Richard Davey <rich@photonstorm.com>
  111604. * @copyright 2019 Photon Storm Ltd.
  111605. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111606. */
  111607. /**
  111608. * The Gamepad Button Up Event.
  111609. *
  111610. * This event is dispatched by a Gamepad instance when a button has been released on it.
  111611. *
  111612. * Listen to this event from a Gamepad instance. Once way to get this is from the `pad1`, `pad2`, etc properties on the Gamepad Plugin:
  111613. * `this.input.gamepad.pad1.on('up', listener)`.
  111614. *
  111615. * Note that you will not receive any Gamepad button events until the browser considers the Gamepad as being 'connected'.
  111616. *
  111617. * You can also listen for an UP event from the Gamepad Plugin. See the [BUTTON_UP]{@linkcode Phaser.Input.Gamepad.Events#event:BUTTON_UP} event for details.
  111618. *
  111619. * @event Phaser.Input.Gamepad.Events#GAMEPAD_BUTTON_UP
  111620. *
  111621. * @param {integer} index - The index of the button that was released.
  111622. * @param {number} value - The value of the button at the time it was released. Between 0 and 1. Some Gamepads have pressure-sensitive buttons.
  111623. * @param {Phaser.Input.Gamepad.Button} button - A reference to the Button which was released.
  111624. */
  111625. module.exports = 'up';
  111626. /***/ }),
  111627. /* 629 */
  111628. /***/ (function(module, exports) {
  111629. /**
  111630. * @author Richard Davey <rich@photonstorm.com>
  111631. * @copyright 2019 Photon Storm Ltd.
  111632. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111633. */
  111634. /**
  111635. * The Gamepad Button Down Event.
  111636. *
  111637. * This event is dispatched by a Gamepad instance when a button has been pressed on it.
  111638. *
  111639. * Listen to this event from a Gamepad instance. Once way to get this is from the `pad1`, `pad2`, etc properties on the Gamepad Plugin:
  111640. * `this.input.gamepad.pad1.on('down', listener)`.
  111641. *
  111642. * Note that you will not receive any Gamepad button events until the browser considers the Gamepad as being 'connected'.
  111643. *
  111644. * You can also listen for a DOWN event from the Gamepad Plugin. See the [BUTTON_DOWN]{@linkcode Phaser.Input.Gamepad.Events#event:BUTTON_DOWN} event for details.
  111645. *
  111646. * @event Phaser.Input.Gamepad.Events#GAMEPAD_BUTTON_DOWN
  111647. *
  111648. * @param {integer} index - The index of the button that was pressed.
  111649. * @param {number} value - The value of the button at the time it was pressed. Between 0 and 1. Some Gamepads have pressure-sensitive buttons.
  111650. * @param {Phaser.Input.Gamepad.Button} button - A reference to the Button which was pressed.
  111651. */
  111652. module.exports = 'down';
  111653. /***/ }),
  111654. /* 630 */
  111655. /***/ (function(module, exports) {
  111656. /**
  111657. * @author Richard Davey <rich@photonstorm.com>
  111658. * @copyright 2019 Photon Storm Ltd.
  111659. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111660. */
  111661. /**
  111662. * The Gamepad Disconnected Event.
  111663. *
  111664. * This event is dispatched by the Gamepad Plugin when a Gamepad has been disconnected.
  111665. *
  111666. * Listen to this event from within a Scene using: `this.input.gamepad.once('disconnected', listener)`.
  111667. *
  111668. * @event Phaser.Input.Gamepad.Events#DISCONNECTED
  111669. *
  111670. * @param {Phaser.Input.Gamepad} pad - A reference to the Gamepad which was disconnected.
  111671. * @param {Event} event - The native DOM Event that triggered the disconnection.
  111672. */
  111673. module.exports = 'disconnected';
  111674. /***/ }),
  111675. /* 631 */
  111676. /***/ (function(module, exports) {
  111677. /**
  111678. * @author Richard Davey <rich@photonstorm.com>
  111679. * @copyright 2019 Photon Storm Ltd.
  111680. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111681. */
  111682. /**
  111683. * The Gamepad Connected Event.
  111684. *
  111685. * This event is dispatched by the Gamepad Plugin when a Gamepad has been connected.
  111686. *
  111687. * Listen to this event from within a Scene using: `this.input.gamepad.once('connected', listener)`.
  111688. *
  111689. * Note that the browser may require you to press a button on a gamepad before it will allow you to access it,
  111690. * this is for security reasons. However, it may also trust the page already, in which case you won't get the
  111691. * 'connected' event and instead should check `GamepadPlugin.total` to see if it thinks there are any gamepads
  111692. * already connected.
  111693. *
  111694. * @event Phaser.Input.Gamepad.Events#CONNECTED
  111695. *
  111696. * @param {Phaser.Input.Gamepad} pad - A reference to the Gamepad which was connected.
  111697. * @param {Event} event - The native DOM Event that triggered the connection.
  111698. */
  111699. module.exports = 'connected';
  111700. /***/ }),
  111701. /* 632 */
  111702. /***/ (function(module, exports) {
  111703. /**
  111704. * @author Richard Davey <rich@photonstorm.com>
  111705. * @copyright 2019 Photon Storm Ltd.
  111706. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111707. */
  111708. /**
  111709. * The Gamepad Button Up Event.
  111710. *
  111711. * This event is dispatched by the Gamepad Plugin when a button has been released on any active Gamepad.
  111712. *
  111713. * Listen to this event from within a Scene using: `this.input.gamepad.on('up', listener)`.
  111714. *
  111715. * You can also listen for an UP event from a Gamepad instance. See the [GAMEPAD_BUTTON_UP]{@linkcode Phaser.Input.Gamepad.Events#event:GAMEPAD_BUTTON_UP} event for details.
  111716. *
  111717. * @event Phaser.Input.Gamepad.Events#BUTTON_UP
  111718. *
  111719. * @param {Phaser.Input.Gamepad} pad - A reference to the Gamepad on which the button was released.
  111720. * @param {Phaser.Input.Gamepad.Button} button - A reference to the Button which was released.
  111721. * @param {number} value - The value of the button at the time it was released. Between 0 and 1. Some Gamepads have pressure-sensitive buttons.
  111722. */
  111723. module.exports = 'up';
  111724. /***/ }),
  111725. /* 633 */
  111726. /***/ (function(module, exports) {
  111727. /**
  111728. * @author Richard Davey <rich@photonstorm.com>
  111729. * @copyright 2019 Photon Storm Ltd.
  111730. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111731. */
  111732. /**
  111733. * The Gamepad Button Down Event.
  111734. *
  111735. * This event is dispatched by the Gamepad Plugin when a button has been pressed on any active Gamepad.
  111736. *
  111737. * Listen to this event from within a Scene using: `this.input.gamepad.on('down', listener)`.
  111738. *
  111739. * You can also listen for a DOWN event from a Gamepad instance. See the [GAMEPAD_BUTTON_DOWN]{@linkcode Phaser.Input.Gamepad.Events#event:GAMEPAD_BUTTON_DOWN} event for details.
  111740. *
  111741. * @event Phaser.Input.Gamepad.Events#BUTTON_DOWN
  111742. *
  111743. * @param {Phaser.Input.Gamepad} pad - A reference to the Gamepad on which the button was pressed.
  111744. * @param {Phaser.Input.Gamepad.Button} button - A reference to the Button which was pressed.
  111745. * @param {number} value - The value of the button at the time it was pressed. Between 0 and 1. Some Gamepads have pressure-sensitive buttons.
  111746. */
  111747. module.exports = 'down';
  111748. /***/ }),
  111749. /* 634 */
  111750. /***/ (function(module, exports, __webpack_require__) {
  111751. /**
  111752. * @author Richard Davey <rich@photonstorm.com>
  111753. * @copyright 2019 Photon Storm Ltd.
  111754. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111755. */
  111756. /**
  111757. * @namespace Phaser.Input.Gamepad
  111758. */
  111759. module.exports = {
  111760. Axis: __webpack_require__(264),
  111761. Button: __webpack_require__(263),
  111762. Events: __webpack_require__(153),
  111763. Gamepad: __webpack_require__(262),
  111764. GamepadPlugin: __webpack_require__(627),
  111765. Configs: __webpack_require__(626)
  111766. };
  111767. /***/ }),
  111768. /* 635 */
  111769. /***/ (function(module, exports, __webpack_require__) {
  111770. /**
  111771. * @author Richard Davey <rich@photonstorm.com>
  111772. * @copyright 2019 Photon Storm Ltd.
  111773. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111774. */
  111775. var CONST = __webpack_require__(341);
  111776. var Extend = __webpack_require__(19);
  111777. /**
  111778. * @namespace Phaser.Input
  111779. */
  111780. var Input = {
  111781. CreateInteractiveObject: __webpack_require__(265),
  111782. Events: __webpack_require__(52),
  111783. Gamepad: __webpack_require__(634),
  111784. InputManager: __webpack_require__(342),
  111785. InputPlugin: __webpack_require__(622),
  111786. InputPluginCache: __webpack_require__(114),
  111787. Keyboard: __webpack_require__(620),
  111788. Mouse: __webpack_require__(603),
  111789. Pointer: __webpack_require__(338),
  111790. Touch: __webpack_require__(602)
  111791. };
  111792. // Merge in the consts
  111793. Input = Extend(false, Input, CONST);
  111794. module.exports = Input;
  111795. /***/ }),
  111796. /* 636 */
  111797. /***/ (function(module, exports, __webpack_require__) {
  111798. /**
  111799. * @author Richard Davey <rich@photonstorm.com>
  111800. * @copyright 2019 Photon Storm Ltd.
  111801. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111802. */
  111803. var RotateAroundXY = __webpack_require__(154);
  111804. /**
  111805. * Rotates a Triangle at a certain angle about a given Point or object with public `x` and `y` properties.
  111806. *
  111807. * @function Phaser.Geom.Triangle.RotateAroundPoint
  111808. * @since 3.0.0
  111809. *
  111810. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  111811. *
  111812. * @param {Phaser.Geom.Triangle} triangle - The Triangle to rotate.
  111813. * @param {Phaser.Geom.Point} point - The Point to rotate the Triangle about.
  111814. * @param {number} angle - The angle by which to rotate the Triangle, in radians.
  111815. *
  111816. * @return {Phaser.Geom.Triangle} The rotated Triangle.
  111817. */
  111818. var RotateAroundPoint = function (triangle, point, angle)
  111819. {
  111820. return RotateAroundXY(triangle, point.x, point.y, angle);
  111821. };
  111822. module.exports = RotateAroundPoint;
  111823. /***/ }),
  111824. /* 637 */
  111825. /***/ (function(module, exports, __webpack_require__) {
  111826. /**
  111827. * @author Richard Davey <rich@photonstorm.com>
  111828. * @copyright 2019 Photon Storm Ltd.
  111829. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111830. */
  111831. var RotateAroundXY = __webpack_require__(154);
  111832. var InCenter = __webpack_require__(266);
  111833. /**
  111834. * Rotates a Triangle about its incenter, which is the point at which its three angle bisectors meet.
  111835. *
  111836. * @function Phaser.Geom.Triangle.Rotate
  111837. * @since 3.0.0
  111838. *
  111839. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  111840. *
  111841. * @param {Phaser.Geom.Triangle} triangle - The Triangle to rotate.
  111842. * @param {number} angle - The angle by which to rotate the Triangle, in radians.
  111843. *
  111844. * @return {Phaser.Geom.Triangle} The rotated Triangle.
  111845. */
  111846. var Rotate = function (triangle, angle)
  111847. {
  111848. var point = InCenter(triangle);
  111849. return RotateAroundXY(triangle, point.x, point.y, angle);
  111850. };
  111851. module.exports = Rotate;
  111852. /***/ }),
  111853. /* 638 */
  111854. /***/ (function(module, exports, __webpack_require__) {
  111855. /**
  111856. * @author Richard Davey <rich@photonstorm.com>
  111857. * @copyright 2019 Photon Storm Ltd.
  111858. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111859. */
  111860. var Length = __webpack_require__(58);
  111861. // The 2D area of a triangle. The area value is always non-negative.
  111862. /**
  111863. * Gets the length of the perimeter of the given triangle.
  111864. *
  111865. * @function Phaser.Geom.Triangle.Perimeter
  111866. * @since 3.0.0
  111867. *
  111868. * @param {Phaser.Geom.Triangle} triangle - [description]
  111869. *
  111870. * @return {number} [description]
  111871. */
  111872. var Perimeter = function (triangle)
  111873. {
  111874. var line1 = triangle.getLineA();
  111875. var line2 = triangle.getLineB();
  111876. var line3 = triangle.getLineC();
  111877. return (Length(line1) + Length(line2) + Length(line3));
  111878. };
  111879. module.exports = Perimeter;
  111880. /***/ }),
  111881. /* 639 */
  111882. /***/ (function(module, exports) {
  111883. /**
  111884. * @author Richard Davey <rich@photonstorm.com>
  111885. * @copyright 2019 Photon Storm Ltd.
  111886. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111887. */
  111888. /**
  111889. * Returns true if two triangles have the same coordinates.
  111890. *
  111891. * @function Phaser.Geom.Triangle.Equals
  111892. * @since 3.0.0
  111893. *
  111894. * @param {Phaser.Geom.Triangle} triangle - The first triangle to check.
  111895. * @param {Phaser.Geom.Triangle} toCompare - The second triangle to check.
  111896. *
  111897. * @return {boolean} `true` if the two given triangles have the exact same coordinates, otherwise `false`.
  111898. */
  111899. var Equals = function (triangle, toCompare)
  111900. {
  111901. return (
  111902. triangle.x1 === toCompare.x1 &&
  111903. triangle.y1 === toCompare.y1 &&
  111904. triangle.x2 === toCompare.x2 &&
  111905. triangle.y2 === toCompare.y2 &&
  111906. triangle.x3 === toCompare.x3 &&
  111907. triangle.y3 === toCompare.y3
  111908. );
  111909. };
  111910. module.exports = Equals;
  111911. /***/ }),
  111912. /* 640 */
  111913. /***/ (function(module, exports) {
  111914. /**
  111915. * @author Richard Davey <rich@photonstorm.com>
  111916. * @copyright 2019 Photon Storm Ltd.
  111917. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111918. */
  111919. /**
  111920. * Copy the values of one Triangle to a destination Triangle.
  111921. *
  111922. * @function Phaser.Geom.Triangle.CopyFrom
  111923. * @since 3.0.0
  111924. *
  111925. * @generic {Phaser.Geom.Triangle} O - [dest,$return]
  111926. *
  111927. * @param {Phaser.Geom.Triangle} source - The source Triangle to copy the values from.
  111928. * @param {Phaser.Geom.Triangle} dest - The destination Triangle to copy the values to.
  111929. *
  111930. * @return {Phaser.Geom.Triangle} The destination Triangle.
  111931. */
  111932. var CopyFrom = function (source, dest)
  111933. {
  111934. return dest.setTo(source.x1, source.y1, source.x2, source.y2, source.x3, source.y3);
  111935. };
  111936. module.exports = CopyFrom;
  111937. /***/ }),
  111938. /* 641 */
  111939. /***/ (function(module, exports, __webpack_require__) {
  111940. /**
  111941. * @author Richard Davey <rich@photonstorm.com>
  111942. * @copyright 2019 Photon Storm Ltd.
  111943. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111944. */
  111945. var Contains = __webpack_require__(74);
  111946. /**
  111947. * Tests if a triangle contains a point.
  111948. *
  111949. * @function Phaser.Geom.Triangle.ContainsPoint
  111950. * @since 3.0.0
  111951. *
  111952. * @param {Phaser.Geom.Triangle} triangle - The triangle.
  111953. * @param {(Phaser.Geom.Point|Phaser.Math.Vector2|any)} point - The point to test, or any point-like object with public `x` and `y` properties.
  111954. *
  111955. * @return {boolean} `true` if the point is within the triangle, otherwise `false`.
  111956. */
  111957. var ContainsPoint = function (triangle, point)
  111958. {
  111959. return Contains(triangle, point.x, point.y);
  111960. };
  111961. module.exports = ContainsPoint;
  111962. /***/ }),
  111963. /* 642 */
  111964. /***/ (function(module, exports, __webpack_require__) {
  111965. /**
  111966. * @author Richard Davey <rich@photonstorm.com>
  111967. * @copyright 2019 Photon Storm Ltd.
  111968. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111969. */
  111970. var Triangle = __webpack_require__(65);
  111971. /**
  111972. * Clones a Triangle object.
  111973. *
  111974. * @function Phaser.Geom.Triangle.Clone
  111975. * @since 3.0.0
  111976. *
  111977. * @param {Phaser.Geom.Triangle} source - The Triangle to clone.
  111978. *
  111979. * @return {Phaser.Geom.Triangle} A new Triangle identical to the given one but separate from it.
  111980. */
  111981. var Clone = function (source)
  111982. {
  111983. return new Triangle(source.x1, source.y1, source.x2, source.y2, source.x3, source.y3);
  111984. };
  111985. module.exports = Clone;
  111986. /***/ }),
  111987. /* 643 */
  111988. /***/ (function(module, exports, __webpack_require__) {
  111989. /**
  111990. * @author Richard Davey <rich@photonstorm.com>
  111991. * @copyright 2019 Photon Storm Ltd.
  111992. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111993. */
  111994. var Circle = __webpack_require__(77);
  111995. // Adapted from https://gist.github.com/mutoo/5617691
  111996. /**
  111997. * Finds the circumscribed circle (circumcircle) of a Triangle object. The circumcircle is the circle which touches all of the triangle's vertices.
  111998. *
  111999. * @function Phaser.Geom.Triangle.CircumCircle
  112000. * @since 3.0.0
  112001. *
  112002. * @generic {Phaser.Geom.Circle} O - [out,$return]
  112003. *
  112004. * @param {Phaser.Geom.Triangle} triangle - The Triangle to use as input.
  112005. * @param {Phaser.Geom.Circle} [out] - An optional Circle to store the result in.
  112006. *
  112007. * @return {Phaser.Geom.Circle} The updated `out` Circle, or a new Circle if none was provided.
  112008. */
  112009. var CircumCircle = function (triangle, out)
  112010. {
  112011. if (out === undefined) { out = new Circle(); }
  112012. // A
  112013. var x1 = triangle.x1;
  112014. var y1 = triangle.y1;
  112015. // B
  112016. var x2 = triangle.x2;
  112017. var y2 = triangle.y2;
  112018. // C
  112019. var x3 = triangle.x3;
  112020. var y3 = triangle.y3;
  112021. var A = x2 - x1;
  112022. var B = y2 - y1;
  112023. var C = x3 - x1;
  112024. var D = y3 - y1;
  112025. var E = A * (x1 + x2) + B * (y1 + y2);
  112026. var F = C * (x1 + x3) + D * (y1 + y3);
  112027. var G = 2 * (A * (y3 - y2) - B * (x3 - x2));
  112028. var dx;
  112029. var dy;
  112030. // If the points of the triangle are collinear, then just find the
  112031. // extremes and use the midpoint as the center of the circumcircle.
  112032. if (Math.abs(G) < 0.000001)
  112033. {
  112034. var minX = Math.min(x1, x2, x3);
  112035. var minY = Math.min(y1, y2, y3);
  112036. dx = (Math.max(x1, x2, x3) - minX) * 0.5;
  112037. dy = (Math.max(y1, y2, y3) - minY) * 0.5;
  112038. out.x = minX + dx;
  112039. out.y = minY + dy;
  112040. out.radius = Math.sqrt(dx * dx + dy * dy);
  112041. }
  112042. else
  112043. {
  112044. out.x = (D * E - B * F) / G;
  112045. out.y = (A * F - C * E) / G;
  112046. dx = out.x - x1;
  112047. dy = out.y - y1;
  112048. out.radius = Math.sqrt(dx * dx + dy * dy);
  112049. }
  112050. return out;
  112051. };
  112052. module.exports = CircumCircle;
  112053. /***/ }),
  112054. /* 644 */
  112055. /***/ (function(module, exports, __webpack_require__) {
  112056. /**
  112057. * @author Richard Davey <rich@photonstorm.com>
  112058. * @copyright 2019 Photon Storm Ltd.
  112059. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112060. */
  112061. var Vector2 = __webpack_require__(3);
  112062. // Adapted from http://bjornharrtell.github.io/jsts/doc/api/jsts_geom_Triangle.js.html
  112063. /**
  112064. * Computes the determinant of a 2x2 matrix. Uses standard double-precision arithmetic, so is susceptible to round-off error.
  112065. *
  112066. * @function det
  112067. * @private
  112068. * @since 3.0.0
  112069. *
  112070. * @param {number} m00 - The [0,0] entry of the matrix.
  112071. * @param {number} m01 - The [0,1] entry of the matrix.
  112072. * @param {number} m10 - The [1,0] entry of the matrix.
  112073. * @param {number} m11 - The [1,1] entry of the matrix.
  112074. *
  112075. * @return {number} the determinant.
  112076. */
  112077. function det (m00, m01, m10, m11)
  112078. {
  112079. return (m00 * m11) - (m01 * m10);
  112080. }
  112081. /**
  112082. * Computes the circumcentre of a triangle. The circumcentre is the centre of
  112083. * the circumcircle, the smallest circle which encloses the triangle. It is also
  112084. * the common intersection point of the perpendicular bisectors of the sides of
  112085. * the triangle, and is the only point which has equal distance to all three
  112086. * vertices of the triangle.
  112087. *
  112088. * @function Phaser.Geom.Triangle.CircumCenter
  112089. * @since 3.0.0
  112090. *
  112091. * @generic {Phaser.Math.Vector2} O - [out,$return]
  112092. *
  112093. * @param {Phaser.Geom.Triangle} triangle - [description]
  112094. * @param {Phaser.Math.Vector2} [out] - [description]
  112095. *
  112096. * @return {Phaser.Math.Vector2} [description]
  112097. */
  112098. var CircumCenter = function (triangle, out)
  112099. {
  112100. if (out === undefined) { out = new Vector2(); }
  112101. var cx = triangle.x3;
  112102. var cy = triangle.y3;
  112103. var ax = triangle.x1 - cx;
  112104. var ay = triangle.y1 - cy;
  112105. var bx = triangle.x2 - cx;
  112106. var by = triangle.y2 - cy;
  112107. var denom = 2 * det(ax, ay, bx, by);
  112108. var numx = det(ay, ax * ax + ay * ay, by, bx * bx + by * by);
  112109. var numy = det(ax, ax * ax + ay * ay, bx, bx * bx + by * by);
  112110. out.x = cx - numx / denom;
  112111. out.y = cy + numy / denom;
  112112. return out;
  112113. };
  112114. module.exports = CircumCenter;
  112115. /***/ }),
  112116. /* 645 */
  112117. /***/ (function(module, exports, __webpack_require__) {
  112118. /**
  112119. * @author Richard Davey <rich@photonstorm.com>
  112120. * @copyright 2019 Photon Storm Ltd.
  112121. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112122. */
  112123. var Centroid = __webpack_require__(268);
  112124. var Offset = __webpack_require__(267);
  112125. /**
  112126. * @callback CenterFunction
  112127. *
  112128. * @param {Phaser.Geom.Triangle} triangle - The Triangle to return the center coordinates of.
  112129. *
  112130. * @return {Phaser.Math.Vector2} The center point of the Triangle according to the function.
  112131. */
  112132. /**
  112133. * Positions the Triangle so that it is centered on the given coordinates.
  112134. *
  112135. * @function Phaser.Geom.Triangle.CenterOn
  112136. * @since 3.0.0
  112137. *
  112138. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  112139. *
  112140. * @param {Phaser.Geom.Triangle} triangle - The triangle to be positioned.
  112141. * @param {number} x - The horizontal coordinate to center on.
  112142. * @param {number} y - The vertical coordinate to center on.
  112143. * @param {CenterFunction} [centerFunc] - The function used to center the triangle. Defaults to Centroid centering.
  112144. *
  112145. * @return {Phaser.Geom.Triangle} The Triangle that was centered.
  112146. */
  112147. var CenterOn = function (triangle, x, y, centerFunc)
  112148. {
  112149. if (centerFunc === undefined) { centerFunc = Centroid; }
  112150. // Get the center of the triangle
  112151. var center = centerFunc(triangle);
  112152. // Difference
  112153. var diffX = x - center.x;
  112154. var diffY = y - center.y;
  112155. return Offset(triangle, diffX, diffY);
  112156. };
  112157. module.exports = CenterOn;
  112158. /***/ }),
  112159. /* 646 */
  112160. /***/ (function(module, exports, __webpack_require__) {
  112161. /**
  112162. * @author Richard Davey <rich@photonstorm.com>
  112163. * @copyright 2019 Photon Storm Ltd.
  112164. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112165. */
  112166. var Triangle = __webpack_require__(65);
  112167. // Builds a right triangle, with one 90 degree angle and two acute angles
  112168. // The x/y is the coordinate of the 90 degree angle (and will map to x1/y1 in the resulting Triangle)
  112169. // w/h can be positive or negative and represent the length of each side
  112170. /**
  112171. * Builds a right triangle, i.e. one which has a 90-degree angle and two acute angles.
  112172. *
  112173. * @function Phaser.Geom.Triangle.BuildRight
  112174. * @since 3.0.0
  112175. *
  112176. * @param {number} x - The X coordinate of the right angle, which will also be the first X coordinate of the constructed Triangle.
  112177. * @param {number} y - The Y coordinate of the right angle, which will also be the first Y coordinate of the constructed Triangle.
  112178. * @param {number} width - The length of the side which is to the left or to the right of the right angle.
  112179. * @param {number} height - The length of the side which is above or below the right angle.
  112180. *
  112181. * @return {Phaser.Geom.Triangle} The constructed right Triangle.
  112182. */
  112183. var BuildRight = function (x, y, width, height)
  112184. {
  112185. if (height === undefined) { height = width; }
  112186. // 90 degree angle
  112187. var x1 = x;
  112188. var y1 = y;
  112189. var x2 = x;
  112190. var y2 = y - height;
  112191. var x3 = x + width;
  112192. var y3 = y;
  112193. return new Triangle(x1, y1, x2, y2, x3, y3);
  112194. };
  112195. module.exports = BuildRight;
  112196. /***/ }),
  112197. /* 647 */
  112198. /***/ (function(module, exports, __webpack_require__) {
  112199. /**
  112200. * @author Richard Davey <rich@photonstorm.com>
  112201. * @copyright 2019 Photon Storm Ltd.
  112202. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112203. */
  112204. var EarCut = __webpack_require__(71);
  112205. var Triangle = __webpack_require__(65);
  112206. /**
  112207. * [description]
  112208. *
  112209. * @function Phaser.Geom.Triangle.BuildFromPolygon
  112210. * @since 3.0.0
  112211. *
  112212. * @generic {Phaser.Geom.Triangle[]} O - [out,$return]
  112213. *
  112214. * @param {array} data - A flat array of vertice coordinates like [x0,y0, x1,y1, x2,y2, ...]
  112215. * @param {array} [holes=null] - An array of hole indices if any (e.g. [5, 8] for a 12-vertice input would mean one hole with vertices 5–7 and another with 8–11).
  112216. * @param {number} [scaleX=1] - [description]
  112217. * @param {number} [scaleY=1] - [description]
  112218. * @param {(array|Phaser.Geom.Triangle[])} [out] - [description]
  112219. *
  112220. * @return {(array|Phaser.Geom.Triangle[])} [description]
  112221. */
  112222. var BuildFromPolygon = function (data, holes, scaleX, scaleY, out)
  112223. {
  112224. if (holes === undefined) { holes = null; }
  112225. if (scaleX === undefined) { scaleX = 1; }
  112226. if (scaleY === undefined) { scaleY = 1; }
  112227. if (out === undefined) { out = []; }
  112228. var tris = EarCut(data, holes);
  112229. var a;
  112230. var b;
  112231. var c;
  112232. var x1;
  112233. var y1;
  112234. var x2;
  112235. var y2;
  112236. var x3;
  112237. var y3;
  112238. for (var i = 0; i < tris.length; i += 3)
  112239. {
  112240. a = tris[i];
  112241. b = tris[i + 1];
  112242. c = tris[i + 2];
  112243. x1 = data[a * 2] * scaleX;
  112244. y1 = data[(a * 2) + 1] * scaleY;
  112245. x2 = data[b * 2] * scaleX;
  112246. y2 = data[(b * 2) + 1] * scaleY;
  112247. x3 = data[c * 2] * scaleX;
  112248. y3 = data[(c * 2) + 1] * scaleY;
  112249. out.push(new Triangle(x1, y1, x2, y2, x3, y3));
  112250. }
  112251. return out;
  112252. };
  112253. module.exports = BuildFromPolygon;
  112254. /***/ }),
  112255. /* 648 */
  112256. /***/ (function(module, exports, __webpack_require__) {
  112257. /**
  112258. * @author Richard Davey <rich@photonstorm.com>
  112259. * @copyright 2019 Photon Storm Ltd.
  112260. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112261. */
  112262. var Triangle = __webpack_require__(65);
  112263. /**
  112264. * Builds an equilateral triangle. In the equilateral triangle, all the sides are the same length (congruent) and all the angles are the same size (congruent).
  112265. * The x/y specifies the top-middle of the triangle (x1/y1) and length is the length of each side.
  112266. *
  112267. * @function Phaser.Geom.Triangle.BuildEquilateral
  112268. * @since 3.0.0
  112269. *
  112270. * @param {number} x - x coordinate of the top point of the triangle.
  112271. * @param {number} y - y coordinate of the top point of the triangle.
  112272. * @param {number} length - Length of each side of the triangle.
  112273. *
  112274. * @return {Phaser.Geom.Triangle} The Triangle object of the given size.
  112275. */
  112276. var BuildEquilateral = function (x, y, length)
  112277. {
  112278. var height = length * (Math.sqrt(3) / 2);
  112279. var x1 = x;
  112280. var y1 = y;
  112281. var x2 = x + (length / 2);
  112282. var y2 = y + height;
  112283. var x3 = x - (length / 2);
  112284. var y3 = y + height;
  112285. return new Triangle(x1, y1, x2, y2, x3, y3);
  112286. };
  112287. module.exports = BuildEquilateral;
  112288. /***/ }),
  112289. /* 649 */
  112290. /***/ (function(module, exports) {
  112291. /**
  112292. * @author Richard Davey <rich@photonstorm.com>
  112293. * @copyright 2019 Photon Storm Ltd.
  112294. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112295. */
  112296. // The 2D area of a triangle. The area value is always non-negative.
  112297. /**
  112298. * Returns the area of a Triangle.
  112299. *
  112300. * @function Phaser.Geom.Triangle.Area
  112301. * @since 3.0.0
  112302. *
  112303. * @param {Phaser.Geom.Triangle} triangle - The Triangle to use.
  112304. *
  112305. * @return {number} The area of the Triangle, always non-negative.
  112306. */
  112307. var Area = function (triangle)
  112308. {
  112309. var x1 = triangle.x1;
  112310. var y1 = triangle.y1;
  112311. var x2 = triangle.x2;
  112312. var y2 = triangle.y2;
  112313. var x3 = triangle.x3;
  112314. var y3 = triangle.y3;
  112315. return Math.abs(((x3 - x1) * (y2 - y1) - (x2 - x1) * (y3 - y1)) / 2);
  112316. };
  112317. module.exports = Area;
  112318. /***/ }),
  112319. /* 650 */
  112320. /***/ (function(module, exports, __webpack_require__) {
  112321. /**
  112322. * @author Richard Davey <rich@photonstorm.com>
  112323. * @copyright 2019 Photon Storm Ltd.
  112324. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112325. */
  112326. var Triangle = __webpack_require__(65);
  112327. Triangle.Area = __webpack_require__(649);
  112328. Triangle.BuildEquilateral = __webpack_require__(648);
  112329. Triangle.BuildFromPolygon = __webpack_require__(647);
  112330. Triangle.BuildRight = __webpack_require__(646);
  112331. Triangle.CenterOn = __webpack_require__(645);
  112332. Triangle.Centroid = __webpack_require__(268);
  112333. Triangle.CircumCenter = __webpack_require__(644);
  112334. Triangle.CircumCircle = __webpack_require__(643);
  112335. Triangle.Clone = __webpack_require__(642);
  112336. Triangle.Contains = __webpack_require__(74);
  112337. Triangle.ContainsArray = __webpack_require__(157);
  112338. Triangle.ContainsPoint = __webpack_require__(641);
  112339. Triangle.CopyFrom = __webpack_require__(640);
  112340. Triangle.Decompose = __webpack_require__(274);
  112341. Triangle.Equals = __webpack_require__(639);
  112342. Triangle.GetPoint = __webpack_require__(283);
  112343. Triangle.GetPoints = __webpack_require__(282);
  112344. Triangle.InCenter = __webpack_require__(266);
  112345. Triangle.Perimeter = __webpack_require__(638);
  112346. Triangle.Offset = __webpack_require__(267);
  112347. Triangle.Random = __webpack_require__(198);
  112348. Triangle.Rotate = __webpack_require__(637);
  112349. Triangle.RotateAroundPoint = __webpack_require__(636);
  112350. Triangle.RotateAroundXY = __webpack_require__(154);
  112351. module.exports = Triangle;
  112352. /***/ }),
  112353. /* 651 */
  112354. /***/ (function(module, exports) {
  112355. /**
  112356. * @author Richard Davey <rich@photonstorm.com>
  112357. * @copyright 2019 Photon Storm Ltd.
  112358. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112359. */
  112360. // Scales the width and height of this Rectangle by the given amounts.
  112361. /**
  112362. * Scales the width and height of this Rectangle by the given amounts.
  112363. *
  112364. * @function Phaser.Geom.Rectangle.Scale
  112365. * @since 3.0.0
  112366. *
  112367. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  112368. *
  112369. * @param {Phaser.Geom.Rectangle} rect - The `Rectangle` object that will be scaled by the specified amount(s).
  112370. * @param {number} x - The factor by which to scale the rectangle horizontally.
  112371. * @param {number} y - The amount by which to scale the rectangle vertically. If this is not specified, the rectangle will be scaled by the factor `x` in both directions.
  112372. *
  112373. * @return {Phaser.Geom.Rectangle} The rectangle object with updated `width` and `height` properties as calculated from the scaling factor(s).
  112374. */
  112375. var Scale = function (rect, x, y)
  112376. {
  112377. if (y === undefined) { y = x; }
  112378. rect.width *= x;
  112379. rect.height *= y;
  112380. return rect;
  112381. };
  112382. module.exports = Scale;
  112383. /***/ }),
  112384. /* 652 */
  112385. /***/ (function(module, exports) {
  112386. /**
  112387. * @author Richard Davey <rich@photonstorm.com>
  112388. * @copyright 2019 Photon Storm Ltd.
  112389. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112390. */
  112391. /**
  112392. * Determines if the two objects (either Rectangles or Rectangle-like) have the same width and height values under strict equality.
  112393. *
  112394. * @function Phaser.Geom.Rectangle.SameDimensions
  112395. * @since 3.15.0
  112396. *
  112397. * @param {Phaser.Geom.Rectangle} rect - The first Rectangle object.
  112398. * @param {Phaser.Geom.Rectangle} toCompare - The second Rectangle object.
  112399. *
  112400. * @return {boolean} `true` if the objects have equivalent values for the `width` and `height` properties, otherwise `false`.
  112401. */
  112402. var SameDimensions = function (rect, toCompare)
  112403. {
  112404. return (rect.width === toCompare.width && rect.height === toCompare.height);
  112405. };
  112406. module.exports = SameDimensions;
  112407. /***/ }),
  112408. /* 653 */
  112409. /***/ (function(module, exports, __webpack_require__) {
  112410. /**
  112411. * @author Richard Davey <rich@photonstorm.com>
  112412. * @copyright 2019 Photon Storm Ltd.
  112413. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112414. */
  112415. var Between = __webpack_require__(184);
  112416. var ContainsRect = __webpack_require__(269);
  112417. var Point = __webpack_require__(6);
  112418. /**
  112419. * Calculates a random point that lies within the `outer` Rectangle, but outside of the `inner` Rectangle.
  112420. * The inner Rectangle must be fully contained within the outer rectangle.
  112421. *
  112422. * @function Phaser.Geom.Rectangle.RandomOutside
  112423. * @since 3.10.0
  112424. *
  112425. * @generic {Phaser.Geom.Point} O - [out,$return]
  112426. *
  112427. * @param {Phaser.Geom.Rectangle} outer - The outer Rectangle to get the random point within.
  112428. * @param {Phaser.Geom.Rectangle} inner - The inner Rectangle to exclude from the returned point.
  112429. * @param {Phaser.Geom.Point} [out] - A Point, or Point-like object to store the result in. If not specified, a new Point will be created.
  112430. *
  112431. * @return {Phaser.Geom.Point} A Point object containing the random values in its `x` and `y` properties.
  112432. */
  112433. var RandomOutside = function (outer, inner, out)
  112434. {
  112435. if (out === undefined) { out = new Point(); }
  112436. if (ContainsRect(outer, inner))
  112437. {
  112438. // Pick a random quadrant
  112439. //
  112440. // The quadrants don't extend the full widths / heights of the outer rect to give
  112441. // us a better uniformed distribution, otherwise you get clumping in the corners where
  112442. // the 4 quads would overlap
  112443. switch (Between(0, 3))
  112444. {
  112445. case 0: // Top
  112446. out.x = outer.x + (Math.random() * (inner.right - outer.x));
  112447. out.y = outer.y + (Math.random() * (inner.top - outer.y));
  112448. break;
  112449. case 1: // Bottom
  112450. out.x = inner.x + (Math.random() * (outer.right - inner.x));
  112451. out.y = inner.bottom + (Math.random() * (outer.bottom - inner.bottom));
  112452. break;
  112453. case 2: // Left
  112454. out.x = outer.x + (Math.random() * (inner.x - outer.x));
  112455. out.y = inner.y + (Math.random() * (outer.bottom - inner.y));
  112456. break;
  112457. case 3: // Right
  112458. out.x = inner.right + (Math.random() * (outer.right - inner.right));
  112459. out.y = outer.y + (Math.random() * (inner.bottom - outer.y));
  112460. break;
  112461. }
  112462. }
  112463. return out;
  112464. };
  112465. module.exports = RandomOutside;
  112466. /***/ }),
  112467. /* 654 */
  112468. /***/ (function(module, exports, __webpack_require__) {
  112469. /**
  112470. * @author Richard Davey <rich@photonstorm.com>
  112471. * @copyright 2019 Photon Storm Ltd.
  112472. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112473. */
  112474. var Point = __webpack_require__(6);
  112475. var DegToRad = __webpack_require__(34);
  112476. /**
  112477. * [description]
  112478. *
  112479. * @function Phaser.Geom.Rectangle.PerimeterPoint
  112480. * @since 3.0.0
  112481. *
  112482. * @generic {Phaser.Geom.Point} O - [out,$return]
  112483. *
  112484. * @param {Phaser.Geom.Rectangle} rectangle - [description]
  112485. * @param {integer} angle - [description]
  112486. * @param {Phaser.Geom.Point} [out] - [description]
  112487. *
  112488. * @return {Phaser.Geom.Point} [description]
  112489. */
  112490. var PerimeterPoint = function (rectangle, angle, out)
  112491. {
  112492. if (out === undefined) { out = new Point(); }
  112493. angle = DegToRad(angle);
  112494. var s = Math.sin(angle);
  112495. var c = Math.cos(angle);
  112496. var dx = (c > 0) ? rectangle.width / 2 : rectangle.width / -2;
  112497. var dy = (s > 0) ? rectangle.height / 2 : rectangle.height / -2;
  112498. if (Math.abs(dx * s) < Math.abs(dy * c))
  112499. {
  112500. dy = (dx * s) / c;
  112501. }
  112502. else
  112503. {
  112504. dx = (dy * c) / s;
  112505. }
  112506. out.x = dx + rectangle.centerX;
  112507. out.y = dy + rectangle.centerY;
  112508. return out;
  112509. };
  112510. module.exports = PerimeterPoint;
  112511. /***/ }),
  112512. /* 655 */
  112513. /***/ (function(module, exports) {
  112514. /**
  112515. * @author Richard Davey <rich@photonstorm.com>
  112516. * @copyright 2019 Photon Storm Ltd.
  112517. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112518. */
  112519. /**
  112520. * Checks if two Rectangles overlap. If a Rectangle is within another Rectangle, the two will be considered overlapping. Thus, the Rectangles are treated as "solid".
  112521. *
  112522. * @function Phaser.Geom.Rectangle.Overlaps
  112523. * @since 3.0.0
  112524. *
  112525. * @param {Phaser.Geom.Rectangle} rectA - The first Rectangle to check.
  112526. * @param {Phaser.Geom.Rectangle} rectB - The second Rectangle to check.
  112527. *
  112528. * @return {boolean} `true` if the two Rectangles overlap, `false` otherwise.
  112529. */
  112530. var Overlaps = function (rectA, rectB)
  112531. {
  112532. return (
  112533. rectA.x < rectB.right &&
  112534. rectA.right > rectB.x &&
  112535. rectA.y < rectB.bottom &&
  112536. rectA.bottom > rectB.y
  112537. );
  112538. };
  112539. module.exports = Overlaps;
  112540. /***/ }),
  112541. /* 656 */
  112542. /***/ (function(module, exports) {
  112543. /**
  112544. * @author Richard Davey <rich@photonstorm.com>
  112545. * @copyright 2019 Photon Storm Ltd.
  112546. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112547. */
  112548. /**
  112549. * Nudges (translates) the top-left corner of a Rectangle by the coordinates of a point (translation vector).
  112550. *
  112551. * @function Phaser.Geom.Rectangle.OffsetPoint
  112552. * @since 3.0.0
  112553. *
  112554. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  112555. *
  112556. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to adjust.
  112557. * @param {(Phaser.Geom.Point|Phaser.Math.Vector2)} point - The point whose coordinates should be used as an offset.
  112558. *
  112559. * @return {Phaser.Geom.Rectangle} The adjusted Rectangle.
  112560. */
  112561. var OffsetPoint = function (rect, point)
  112562. {
  112563. rect.x += point.x;
  112564. rect.y += point.y;
  112565. return rect;
  112566. };
  112567. module.exports = OffsetPoint;
  112568. /***/ }),
  112569. /* 657 */
  112570. /***/ (function(module, exports) {
  112571. /**
  112572. * @author Richard Davey <rich@photonstorm.com>
  112573. * @copyright 2019 Photon Storm Ltd.
  112574. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112575. */
  112576. /**
  112577. * Nudges (translates) the top left corner of a Rectangle by a given offset.
  112578. *
  112579. * @function Phaser.Geom.Rectangle.Offset
  112580. * @since 3.0.0
  112581. *
  112582. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  112583. *
  112584. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to adjust.
  112585. * @param {number} x - The distance to move the Rectangle horizontally.
  112586. * @param {number} y - The distance to move the Rectangle vertically.
  112587. *
  112588. * @return {Phaser.Geom.Rectangle} The adjusted Rectangle.
  112589. */
  112590. var Offset = function (rect, x, y)
  112591. {
  112592. rect.x += x;
  112593. rect.y += y;
  112594. return rect;
  112595. };
  112596. module.exports = Offset;
  112597. /***/ }),
  112598. /* 658 */
  112599. /***/ (function(module, exports) {
  112600. /**
  112601. * @author Richard Davey <rich@photonstorm.com>
  112602. * @copyright 2019 Photon Storm Ltd.
  112603. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112604. */
  112605. /**
  112606. * Merges a Rectangle with a point by repositioning and/or resizing it so that the point is on or within its bounds.
  112607. *
  112608. * @function Phaser.Geom.Rectangle.MergeXY
  112609. * @since 3.0.0
  112610. *
  112611. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  112612. *
  112613. * @param {Phaser.Geom.Rectangle} target - The Rectangle which should be merged and modified.
  112614. * @param {number} x - The X coordinate of the point which should be merged.
  112615. * @param {number} y - The Y coordinate of the point which should be merged.
  112616. *
  112617. * @return {Phaser.Geom.Rectangle} The modified `target` Rectangle.
  112618. */
  112619. var MergeXY = function (target, x, y)
  112620. {
  112621. var minX = Math.min(target.x, x);
  112622. var maxX = Math.max(target.right, x);
  112623. target.x = minX;
  112624. target.width = maxX - minX;
  112625. var minY = Math.min(target.y, y);
  112626. var maxY = Math.max(target.bottom, y);
  112627. target.y = minY;
  112628. target.height = maxY - minY;
  112629. return target;
  112630. };
  112631. module.exports = MergeXY;
  112632. /***/ }),
  112633. /* 659 */
  112634. /***/ (function(module, exports) {
  112635. /**
  112636. * @author Richard Davey <rich@photonstorm.com>
  112637. * @copyright 2019 Photon Storm Ltd.
  112638. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112639. */
  112640. // Merges source rectangle into target rectangle and returns target
  112641. // Neither rect should have negative widths or heights
  112642. /**
  112643. * Merges the source rectangle into the target rectangle and returns the target.
  112644. * Neither rectangle should have a negative width or height.
  112645. *
  112646. * @function Phaser.Geom.Rectangle.MergeRect
  112647. * @since 3.0.0
  112648. *
  112649. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  112650. *
  112651. * @param {Phaser.Geom.Rectangle} target - Target rectangle. Will be modified to include source rectangle.
  112652. * @param {Phaser.Geom.Rectangle} source - Rectangle that will be merged into target rectangle.
  112653. *
  112654. * @return {Phaser.Geom.Rectangle} Modified target rectangle that contains source rectangle.
  112655. */
  112656. var MergeRect = function (target, source)
  112657. {
  112658. var minX = Math.min(target.x, source.x);
  112659. var maxX = Math.max(target.right, source.right);
  112660. target.x = minX;
  112661. target.width = maxX - minX;
  112662. var minY = Math.min(target.y, source.y);
  112663. var maxY = Math.max(target.bottom, source.bottom);
  112664. target.y = minY;
  112665. target.height = maxY - minY;
  112666. return target;
  112667. };
  112668. module.exports = MergeRect;
  112669. /***/ }),
  112670. /* 660 */
  112671. /***/ (function(module, exports) {
  112672. /**
  112673. * @author Richard Davey <rich@photonstorm.com>
  112674. * @copyright 2019 Photon Storm Ltd.
  112675. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112676. */
  112677. /**
  112678. * Merges a Rectangle with a list of points by repositioning and/or resizing it such that all points are located on or within its bounds.
  112679. *
  112680. * @function Phaser.Geom.Rectangle.MergePoints
  112681. * @since 3.0.0
  112682. *
  112683. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  112684. *
  112685. * @param {Phaser.Geom.Rectangle} target - The Rectangle which should be merged.
  112686. * @param {Phaser.Geom.Point[]} points - An array of Points (or any object with public `x` and `y` properties) which should be merged with the Rectangle.
  112687. *
  112688. * @return {Phaser.Geom.Rectangle} The modified Rectangle.
  112689. */
  112690. var MergePoints = function (target, points)
  112691. {
  112692. var minX = target.x;
  112693. var maxX = target.right;
  112694. var minY = target.y;
  112695. var maxY = target.bottom;
  112696. for (var i = 0; i < points.length; i++)
  112697. {
  112698. minX = Math.min(minX, points[i].x);
  112699. maxX = Math.max(maxX, points[i].x);
  112700. minY = Math.min(minY, points[i].y);
  112701. maxY = Math.max(maxY, points[i].y);
  112702. }
  112703. target.x = minX;
  112704. target.y = minY;
  112705. target.width = maxX - minX;
  112706. target.height = maxY - minY;
  112707. return target;
  112708. };
  112709. module.exports = MergePoints;
  112710. /***/ }),
  112711. /* 661 */
  112712. /***/ (function(module, exports, __webpack_require__) {
  112713. /**
  112714. * @author Richard Davey <rich@photonstorm.com>
  112715. * @copyright 2019 Photon Storm Ltd.
  112716. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112717. */
  112718. var Rectangle = __webpack_require__(10);
  112719. var Intersects = __webpack_require__(158);
  112720. /**
  112721. * Takes two Rectangles and first checks to see if they intersect.
  112722. * If they intersect it will return the area of intersection in the `out` Rectangle.
  112723. * If they do not intersect, the `out` Rectangle will have a width and height of zero.
  112724. *
  112725. * @function Phaser.Geom.Rectangle.Intersection
  112726. * @since 3.11.0
  112727. *
  112728. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  112729. *
  112730. * @param {Phaser.Geom.Rectangle} rectA - The first Rectangle to get the intersection from.
  112731. * @param {Phaser.Geom.Rectangle} rectB - The second Rectangle to get the intersection from.
  112732. * @param {Phaser.Geom.Rectangle} [out] - A Rectangle to store the intersection results in.
  112733. *
  112734. * @return {Phaser.Geom.Rectangle} The intersection result. If the width and height are zero, no intersection occurred.
  112735. */
  112736. var Intersection = function (rectA, rectB, out)
  112737. {
  112738. if (out === undefined) { out = new Rectangle(); }
  112739. if (Intersects(rectA, rectB))
  112740. {
  112741. out.x = Math.max(rectA.x, rectB.x);
  112742. out.y = Math.max(rectA.y, rectB.y);
  112743. out.width = Math.min(rectA.right, rectB.right) - out.x;
  112744. out.height = Math.min(rectA.bottom, rectB.bottom) - out.y;
  112745. }
  112746. else
  112747. {
  112748. out.setEmpty();
  112749. }
  112750. return out;
  112751. };
  112752. module.exports = Intersection;
  112753. /***/ }),
  112754. /* 662 */
  112755. /***/ (function(module, exports, __webpack_require__) {
  112756. /**
  112757. * @author Richard Davey <rich@photonstorm.com>
  112758. * @copyright 2019 Photon Storm Ltd.
  112759. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112760. */
  112761. var CenterOn = __webpack_require__(189);
  112762. /**
  112763. * Increases the size of a Rectangle by a specified amount.
  112764. *
  112765. * The center of the Rectangle stays the same. The amounts are added to each side, so the actual increase in width or height is two times bigger than the respective argument.
  112766. *
  112767. * @function Phaser.Geom.Rectangle.Inflate
  112768. * @since 3.0.0
  112769. *
  112770. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  112771. *
  112772. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to inflate.
  112773. * @param {number} x - How many pixels the left and the right side should be moved by horizontally.
  112774. * @param {number} y - How many pixels the top and the bottom side should be moved by vertically.
  112775. *
  112776. * @return {Phaser.Geom.Rectangle} The inflated Rectangle.
  112777. */
  112778. var Inflate = function (rect, x, y)
  112779. {
  112780. var cx = rect.centerX;
  112781. var cy = rect.centerY;
  112782. rect.setSize(rect.width + (x * 2), rect.height + (y * 2));
  112783. return CenterOn(rect, cx, cy);
  112784. };
  112785. module.exports = Inflate;
  112786. /***/ }),
  112787. /* 663 */
  112788. /***/ (function(module, exports, __webpack_require__) {
  112789. /**
  112790. * @author Richard Davey <rich@photonstorm.com>
  112791. * @copyright 2019 Photon Storm Ltd.
  112792. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112793. */
  112794. var Point = __webpack_require__(6);
  112795. // The size of the Rectangle object, expressed as a Point object
  112796. // with the values of the width and height properties.
  112797. /**
  112798. * [description]
  112799. *
  112800. * @function Phaser.Geom.Rectangle.GetSize
  112801. * @since 3.0.0
  112802. *
  112803. * @generic {Phaser.Geom.Point} O - [out,$return]
  112804. *
  112805. * @param {Phaser.Geom.Rectangle} rect - [description]
  112806. * @param {(Phaser.Geom.Point|object)} [out] - [description]
  112807. *
  112808. * @return {(Phaser.Geom.Point|object)} [description]
  112809. */
  112810. var GetSize = function (rect, out)
  112811. {
  112812. if (out === undefined) { out = new Point(); }
  112813. out.x = rect.width;
  112814. out.y = rect.height;
  112815. return out;
  112816. };
  112817. module.exports = GetSize;
  112818. /***/ }),
  112819. /* 664 */
  112820. /***/ (function(module, exports, __webpack_require__) {
  112821. /**
  112822. * @author Richard Davey <rich@photonstorm.com>
  112823. * @copyright 2019 Photon Storm Ltd.
  112824. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112825. */
  112826. var Point = __webpack_require__(6);
  112827. /**
  112828. * Returns the center of a Rectangle as a Point.
  112829. *
  112830. * @function Phaser.Geom.Rectangle.GetCenter
  112831. * @since 3.0.0
  112832. *
  112833. * @generic {Phaser.Geom.Point} O - [out,$return]
  112834. *
  112835. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to get the center of.
  112836. * @param {(Phaser.Geom.Point|object)} [out] - Optional point-like object to update with the center coordinates.
  112837. *
  112838. * @return {(Phaser.Geom.Point|object)} The modified `out` object, or a new Point if none was provided.
  112839. */
  112840. var GetCenter = function (rect, out)
  112841. {
  112842. if (out === undefined) { out = new Point(); }
  112843. out.x = rect.centerX;
  112844. out.y = rect.centerY;
  112845. return out;
  112846. };
  112847. module.exports = GetCenter;
  112848. /***/ }),
  112849. /* 665 */
  112850. /***/ (function(module, exports) {
  112851. /**
  112852. * @author Richard Davey <rich@photonstorm.com>
  112853. * @copyright 2019 Photon Storm Ltd.
  112854. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112855. */
  112856. /**
  112857. * Rounds a Rectangle's position and size down to the largest integer less than or equal to each current coordinate or dimension.
  112858. *
  112859. * @function Phaser.Geom.Rectangle.FloorAll
  112860. * @since 3.0.0
  112861. *
  112862. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  112863. *
  112864. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to adjust.
  112865. *
  112866. * @return {Phaser.Geom.Rectangle} The adjusted Rectangle.
  112867. */
  112868. var FloorAll = function (rect)
  112869. {
  112870. rect.x = Math.floor(rect.x);
  112871. rect.y = Math.floor(rect.y);
  112872. rect.width = Math.floor(rect.width);
  112873. rect.height = Math.floor(rect.height);
  112874. return rect;
  112875. };
  112876. module.exports = FloorAll;
  112877. /***/ }),
  112878. /* 666 */
  112879. /***/ (function(module, exports) {
  112880. /**
  112881. * @author Richard Davey <rich@photonstorm.com>
  112882. * @copyright 2019 Photon Storm Ltd.
  112883. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112884. */
  112885. /**
  112886. * Rounds down (floors) the top left X and Y co-ordinates of the given Rectangle to the largest integer less than or equal to them
  112887. *
  112888. * @function Phaser.Geom.Rectangle.Floor
  112889. * @since 3.0.0
  112890. *
  112891. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  112892. *
  112893. * @param {Phaser.Geom.Rectangle} rect - The rectangle to floor the top left X and Y co-ordinates of
  112894. *
  112895. * @return {Phaser.Geom.Rectangle} The rectangle that was passed to this function with its co-ordinates floored.
  112896. */
  112897. var Floor = function (rect)
  112898. {
  112899. rect.x = Math.floor(rect.x);
  112900. rect.y = Math.floor(rect.y);
  112901. return rect;
  112902. };
  112903. module.exports = Floor;
  112904. /***/ }),
  112905. /* 667 */
  112906. /***/ (function(module, exports, __webpack_require__) {
  112907. /**
  112908. * @author Richard Davey <rich@photonstorm.com>
  112909. * @copyright 2019 Photon Storm Ltd.
  112910. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112911. */
  112912. var GetAspectRatio = __webpack_require__(155);
  112913. /**
  112914. * Adjusts the target rectangle, changing its width, height and position,
  112915. * so that it fully covers the area of the source rectangle, while maintaining its original
  112916. * aspect ratio.
  112917. *
  112918. * Unlike the `FitInside` function, the target rectangle may extend further out than the source.
  112919. *
  112920. * @function Phaser.Geom.Rectangle.FitOutside
  112921. * @since 3.0.0
  112922. *
  112923. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  112924. *
  112925. * @param {Phaser.Geom.Rectangle} target - The target rectangle to adjust.
  112926. * @param {Phaser.Geom.Rectangle} source - The source rectangle to envlope the target in.
  112927. *
  112928. * @return {Phaser.Geom.Rectangle} The modified target rectangle instance.
  112929. */
  112930. var FitOutside = function (target, source)
  112931. {
  112932. var ratio = GetAspectRatio(target);
  112933. if (ratio > GetAspectRatio(source))
  112934. {
  112935. // Wider than Tall
  112936. target.setSize(source.height * ratio, source.height);
  112937. }
  112938. else
  112939. {
  112940. // Taller than Wide
  112941. target.setSize(source.width, source.width / ratio);
  112942. }
  112943. return target.setPosition(
  112944. source.centerX - target.width / 2,
  112945. source.centerY - target.height / 2
  112946. );
  112947. };
  112948. module.exports = FitOutside;
  112949. /***/ }),
  112950. /* 668 */
  112951. /***/ (function(module, exports, __webpack_require__) {
  112952. /**
  112953. * @author Richard Davey <rich@photonstorm.com>
  112954. * @copyright 2019 Photon Storm Ltd.
  112955. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112956. */
  112957. var GetAspectRatio = __webpack_require__(155);
  112958. /**
  112959. * Adjusts the target rectangle, changing its width, height and position,
  112960. * so that it fits inside the area of the source rectangle, while maintaining its original
  112961. * aspect ratio.
  112962. *
  112963. * Unlike the `FitOutside` function, there may be some space inside the source area not covered.
  112964. *
  112965. * @function Phaser.Geom.Rectangle.FitInside
  112966. * @since 3.0.0
  112967. *
  112968. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  112969. *
  112970. * @param {Phaser.Geom.Rectangle} target - The target rectangle to adjust.
  112971. * @param {Phaser.Geom.Rectangle} source - The source rectangle to envlope the target in.
  112972. *
  112973. * @return {Phaser.Geom.Rectangle} The modified target rectangle instance.
  112974. */
  112975. var FitInside = function (target, source)
  112976. {
  112977. var ratio = GetAspectRatio(target);
  112978. if (ratio < GetAspectRatio(source))
  112979. {
  112980. // Taller than Wide
  112981. target.setSize(source.height * ratio, source.height);
  112982. }
  112983. else
  112984. {
  112985. // Wider than Tall
  112986. target.setSize(source.width, source.width / ratio);
  112987. }
  112988. return target.setPosition(
  112989. source.centerX - (target.width / 2),
  112990. source.centerY - (target.height / 2)
  112991. );
  112992. };
  112993. module.exports = FitInside;
  112994. /***/ }),
  112995. /* 669 */
  112996. /***/ (function(module, exports) {
  112997. /**
  112998. * @author Richard Davey <rich@photonstorm.com>
  112999. * @copyright 2019 Photon Storm Ltd.
  113000. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113001. */
  113002. /**
  113003. * Compares the `x`, `y`, `width` and `height` properties of two rectangles.
  113004. *
  113005. * @function Phaser.Geom.Rectangle.Equals
  113006. * @since 3.0.0
  113007. *
  113008. * @param {Phaser.Geom.Rectangle} rect - Rectangle A
  113009. * @param {Phaser.Geom.Rectangle} toCompare - Rectangle B
  113010. *
  113011. * @return {boolean} `true` if the rectangles' properties are an exact match, otherwise `false`.
  113012. */
  113013. var Equals = function (rect, toCompare)
  113014. {
  113015. return (
  113016. rect.x === toCompare.x &&
  113017. rect.y === toCompare.y &&
  113018. rect.width === toCompare.width &&
  113019. rect.height === toCompare.height
  113020. );
  113021. };
  113022. module.exports = Equals;
  113023. /***/ }),
  113024. /* 670 */
  113025. /***/ (function(module, exports) {
  113026. /**
  113027. * @author Richard Davey <rich@photonstorm.com>
  113028. * @copyright 2019 Photon Storm Ltd.
  113029. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113030. */
  113031. /**
  113032. * Copy the values of one Rectangle to a destination Rectangle.
  113033. *
  113034. * @function Phaser.Geom.Rectangle.CopyFrom
  113035. * @since 3.0.0
  113036. *
  113037. * @generic {Phaser.Geom.Rectangle} O - [dest,$return]
  113038. *
  113039. * @param {Phaser.Geom.Rectangle} source - The source Rectangle to copy the values from.
  113040. * @param {Phaser.Geom.Rectangle} dest - The destination Rectangle to copy the values to.
  113041. *
  113042. * @return {Phaser.Geom.Rectangle} The destination Rectangle.
  113043. */
  113044. var CopyFrom = function (source, dest)
  113045. {
  113046. return dest.setTo(source.x, source.y, source.width, source.height);
  113047. };
  113048. module.exports = CopyFrom;
  113049. /***/ }),
  113050. /* 671 */
  113051. /***/ (function(module, exports, __webpack_require__) {
  113052. /**
  113053. * @author Richard Davey <rich@photonstorm.com>
  113054. * @copyright 2019 Photon Storm Ltd.
  113055. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113056. */
  113057. var Contains = __webpack_require__(42);
  113058. /**
  113059. * Determines whether the specified point is contained within the rectangular region defined by this Rectangle object.
  113060. *
  113061. * @function Phaser.Geom.Rectangle.ContainsPoint
  113062. * @since 3.0.0
  113063. *
  113064. * @param {Phaser.Geom.Rectangle} rect - The Rectangle object.
  113065. * @param {Phaser.Geom.Point} point - The point object to be checked. Can be a Phaser Point object or any object with x and y values.
  113066. *
  113067. * @return {boolean} A value of true if the Rectangle object contains the specified point, otherwise false.
  113068. */
  113069. var ContainsPoint = function (rect, point)
  113070. {
  113071. return Contains(rect, point.x, point.y);
  113072. };
  113073. module.exports = ContainsPoint;
  113074. /***/ }),
  113075. /* 672 */
  113076. /***/ (function(module, exports, __webpack_require__) {
  113077. /**
  113078. * @author Richard Davey <rich@photonstorm.com>
  113079. * @copyright 2019 Photon Storm Ltd.
  113080. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113081. */
  113082. var Rectangle = __webpack_require__(10);
  113083. /**
  113084. * Creates a new Rectangle which is identical to the given one.
  113085. *
  113086. * @function Phaser.Geom.Rectangle.Clone
  113087. * @since 3.0.0
  113088. *
  113089. * @param {Phaser.Geom.Rectangle} source - The Rectangle to clone.
  113090. *
  113091. * @return {Phaser.Geom.Rectangle} The newly created Rectangle, which is separate from the given one.
  113092. */
  113093. var Clone = function (source)
  113094. {
  113095. return new Rectangle(source.x, source.y, source.width, source.height);
  113096. };
  113097. module.exports = Clone;
  113098. /***/ }),
  113099. /* 673 */
  113100. /***/ (function(module, exports) {
  113101. /**
  113102. * @author Richard Davey <rich@photonstorm.com>
  113103. * @copyright 2019 Photon Storm Ltd.
  113104. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113105. */
  113106. /**
  113107. * Rounds a Rectangle's position and size up to the smallest integer greater than or equal to each respective value.
  113108. *
  113109. * @function Phaser.Geom.Rectangle.CeilAll
  113110. * @since 3.0.0
  113111. *
  113112. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  113113. *
  113114. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to modify.
  113115. *
  113116. * @return {Phaser.Geom.Rectangle} The modified Rectangle.
  113117. */
  113118. var CeilAll = function (rect)
  113119. {
  113120. rect.x = Math.ceil(rect.x);
  113121. rect.y = Math.ceil(rect.y);
  113122. rect.width = Math.ceil(rect.width);
  113123. rect.height = Math.ceil(rect.height);
  113124. return rect;
  113125. };
  113126. module.exports = CeilAll;
  113127. /***/ }),
  113128. /* 674 */
  113129. /***/ (function(module, exports) {
  113130. /**
  113131. * @author Richard Davey <rich@photonstorm.com>
  113132. * @copyright 2019 Photon Storm Ltd.
  113133. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113134. */
  113135. /**
  113136. * Rounds a Rectangle's position up to the smallest integer greater than or equal to each current coordinate.
  113137. *
  113138. * @function Phaser.Geom.Rectangle.Ceil
  113139. * @since 3.0.0
  113140. *
  113141. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  113142. *
  113143. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to adjust.
  113144. *
  113145. * @return {Phaser.Geom.Rectangle} The adjusted Rectangle.
  113146. */
  113147. var Ceil = function (rect)
  113148. {
  113149. rect.x = Math.ceil(rect.x);
  113150. rect.y = Math.ceil(rect.y);
  113151. return rect;
  113152. };
  113153. module.exports = Ceil;
  113154. /***/ }),
  113155. /* 675 */
  113156. /***/ (function(module, exports) {
  113157. /**
  113158. * @author Richard Davey <rich@photonstorm.com>
  113159. * @copyright 2019 Photon Storm Ltd.
  113160. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113161. */
  113162. /**
  113163. * Calculates the area of the given Rectangle object.
  113164. *
  113165. * @function Phaser.Geom.Rectangle.Area
  113166. * @since 3.0.0
  113167. *
  113168. * @param {Phaser.Geom.Rectangle} rect - The rectangle to calculate the area of.
  113169. *
  113170. * @return {number} The area of the Rectangle object.
  113171. */
  113172. var Area = function (rect)
  113173. {
  113174. return rect.width * rect.height;
  113175. };
  113176. module.exports = Area;
  113177. /***/ }),
  113178. /* 676 */
  113179. /***/ (function(module, exports) {
  113180. /**
  113181. * @author Richard Davey <rich@photonstorm.com>
  113182. * @copyright 2019 Photon Storm Ltd.
  113183. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113184. */
  113185. /**
  113186. * Reverses the order of the points of a Polygon.
  113187. *
  113188. * @function Phaser.Geom.Polygon.Reverse
  113189. * @since 3.0.0
  113190. *
  113191. * @generic {Phaser.Geom.Polygon} O - [polygon,$return]
  113192. *
  113193. * @param {Phaser.Geom.Polygon} polygon - The Polygon to modify.
  113194. *
  113195. * @return {Phaser.Geom.Polygon} The modified Polygon.
  113196. */
  113197. var Reverse = function (polygon)
  113198. {
  113199. polygon.points.reverse();
  113200. return polygon;
  113201. };
  113202. module.exports = Reverse;
  113203. /***/ }),
  113204. /* 677 */
  113205. /***/ (function(module, exports) {
  113206. /**
  113207. * @author Richard Davey <rich@photonstorm.com>
  113208. * @copyright 2019 Photon Storm Ltd.
  113209. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113210. */
  113211. // Export the points as an array of flat numbers, following the sequence [ x,y, x,y, x,y ]
  113212. /**
  113213. * Stores all of the points of a Polygon into a flat array of numbers following the sequence [ x,y, x,y, x,y ],
  113214. * i.e. each point of the Polygon, in the order it's defined, corresponds to two elements of the resultant
  113215. * array for the point's X and Y coordinate.
  113216. *
  113217. * @function Phaser.Geom.Polygon.GetNumberArray
  113218. * @since 3.0.0
  113219. *
  113220. * @generic {number[]} O - [output,$return]
  113221. *
  113222. * @param {Phaser.Geom.Polygon} polygon - The Polygon whose points to export.
  113223. * @param {(array|number[])} [output] - An array to which the points' coordinates should be appended.
  113224. *
  113225. * @return {(array|number[])} The modified `output` array, or a new array if none was given.
  113226. */
  113227. var GetNumberArray = function (polygon, output)
  113228. {
  113229. if (output === undefined) { output = []; }
  113230. for (var i = 0; i < polygon.points.length; i++)
  113231. {
  113232. output.push(polygon.points[i].x);
  113233. output.push(polygon.points[i].y);
  113234. }
  113235. return output;
  113236. };
  113237. module.exports = GetNumberArray;
  113238. /***/ }),
  113239. /* 678 */
  113240. /***/ (function(module, exports, __webpack_require__) {
  113241. /**
  113242. * @author Richard Davey <rich@photonstorm.com>
  113243. * @copyright 2019 Photon Storm Ltd.
  113244. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113245. */
  113246. var Contains = __webpack_require__(160);
  113247. /**
  113248. * [description]
  113249. *
  113250. * @function Phaser.Geom.Polygon.ContainsPoint
  113251. * @since 3.0.0
  113252. *
  113253. * @param {Phaser.Geom.Polygon} polygon - [description]
  113254. * @param {Phaser.Geom.Point} point - [description]
  113255. *
  113256. * @return {boolean} [description]
  113257. */
  113258. var ContainsPoint = function (polygon, point)
  113259. {
  113260. return Contains(polygon, point.x, point.y);
  113261. };
  113262. module.exports = ContainsPoint;
  113263. /***/ }),
  113264. /* 679 */
  113265. /***/ (function(module, exports, __webpack_require__) {
  113266. /**
  113267. * @author Richard Davey <rich@photonstorm.com>
  113268. * @copyright 2019 Photon Storm Ltd.
  113269. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113270. */
  113271. var Polygon = __webpack_require__(161);
  113272. /**
  113273. * Create a new polygon which is a copy of the specified polygon
  113274. *
  113275. * @function Phaser.Geom.Polygon.Clone
  113276. * @since 3.0.0
  113277. *
  113278. * @param {Phaser.Geom.Polygon} polygon - The polygon to create a clone of
  113279. *
  113280. * @return {Phaser.Geom.Polygon} A new separate Polygon cloned from the specified polygon, based on the same points.
  113281. */
  113282. var Clone = function (polygon)
  113283. {
  113284. return new Polygon(polygon.points);
  113285. };
  113286. module.exports = Clone;
  113287. /***/ }),
  113288. /* 680 */
  113289. /***/ (function(module, exports, __webpack_require__) {
  113290. /**
  113291. * @author Richard Davey <rich@photonstorm.com>
  113292. * @copyright 2019 Photon Storm Ltd.
  113293. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113294. */
  113295. var Polygon = __webpack_require__(161);
  113296. Polygon.Clone = __webpack_require__(679);
  113297. Polygon.Contains = __webpack_require__(160);
  113298. Polygon.ContainsPoint = __webpack_require__(678);
  113299. Polygon.GetAABB = __webpack_require__(290);
  113300. Polygon.GetNumberArray = __webpack_require__(677);
  113301. Polygon.GetPoints = __webpack_require__(289);
  113302. Polygon.Perimeter = __webpack_require__(288);
  113303. Polygon.Reverse = __webpack_require__(676);
  113304. Polygon.Smooth = __webpack_require__(287);
  113305. module.exports = Polygon;
  113306. /***/ }),
  113307. /* 681 */
  113308. /***/ (function(module, exports, __webpack_require__) {
  113309. /**
  113310. * @author Richard Davey <rich@photonstorm.com>
  113311. * @copyright 2019 Photon Storm Ltd.
  113312. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113313. */
  113314. var GetMagnitude = __webpack_require__(272);
  113315. /**
  113316. * Changes the magnitude (length) of a two-dimensional vector without changing its direction.
  113317. *
  113318. * @function Phaser.Geom.Point.SetMagnitude
  113319. * @since 3.0.0
  113320. *
  113321. * @generic {Phaser.Geom.Point} O - [point,$return]
  113322. *
  113323. * @param {Phaser.Geom.Point} point - The Point to treat as the end point of the vector.
  113324. * @param {number} magnitude - The new magnitude of the vector.
  113325. *
  113326. * @return {Phaser.Geom.Point} The modified Point.
  113327. */
  113328. var SetMagnitude = function (point, magnitude)
  113329. {
  113330. if (point.x !== 0 || point.y !== 0)
  113331. {
  113332. var m = GetMagnitude(point);
  113333. point.x /= m;
  113334. point.y /= m;
  113335. }
  113336. point.x *= magnitude;
  113337. point.y *= magnitude;
  113338. return point;
  113339. };
  113340. module.exports = SetMagnitude;
  113341. /***/ }),
  113342. /* 682 */
  113343. /***/ (function(module, exports, __webpack_require__) {
  113344. /**
  113345. * @author Richard Davey <rich@photonstorm.com>
  113346. * @copyright 2019 Photon Storm Ltd.
  113347. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113348. */
  113349. var Point = __webpack_require__(6);
  113350. /**
  113351. * [description]
  113352. *
  113353. * @function Phaser.Geom.Point.ProjectUnit
  113354. * @since 3.0.0
  113355. *
  113356. * @generic {Phaser.Geom.Point} O - [out,$return]
  113357. *
  113358. * @param {Phaser.Geom.Point} pointA - [description]
  113359. * @param {Phaser.Geom.Point} pointB - [description]
  113360. * @param {Phaser.Geom.Point} [out] - [description]
  113361. *
  113362. * @return {Phaser.Geom.Point} [description]
  113363. */
  113364. var ProjectUnit = function (pointA, pointB, out)
  113365. {
  113366. if (out === undefined) { out = new Point(); }
  113367. var amt = ((pointA.x * pointB.x) + (pointA.y * pointB.y));
  113368. if (amt !== 0)
  113369. {
  113370. out.x = amt * pointB.x;
  113371. out.y = amt * pointB.y;
  113372. }
  113373. return out;
  113374. };
  113375. module.exports = ProjectUnit;
  113376. /***/ }),
  113377. /* 683 */
  113378. /***/ (function(module, exports, __webpack_require__) {
  113379. /**
  113380. * @author Richard Davey <rich@photonstorm.com>
  113381. * @copyright 2019 Photon Storm Ltd.
  113382. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113383. */
  113384. var Point = __webpack_require__(6);
  113385. var GetMagnitudeSq = __webpack_require__(271);
  113386. /**
  113387. * [description]
  113388. *
  113389. * @function Phaser.Geom.Point.Project
  113390. * @since 3.0.0
  113391. *
  113392. * @generic {Phaser.Geom.Point} O - [out,$return]
  113393. *
  113394. * @param {Phaser.Geom.Point} pointA - [description]
  113395. * @param {Phaser.Geom.Point} pointB - [description]
  113396. * @param {Phaser.Geom.Point} [out] - [description]
  113397. *
  113398. * @return {Phaser.Geom.Point} [description]
  113399. */
  113400. var Project = function (pointA, pointB, out)
  113401. {
  113402. if (out === undefined) { out = new Point(); }
  113403. var dot = ((pointA.x * pointB.x) + (pointA.y * pointB.y));
  113404. var amt = dot / GetMagnitudeSq(pointB);
  113405. if (amt !== 0)
  113406. {
  113407. out.x = amt * pointB.x;
  113408. out.y = amt * pointB.y;
  113409. }
  113410. return out;
  113411. };
  113412. module.exports = Project;
  113413. /***/ }),
  113414. /* 684 */
  113415. /***/ (function(module, exports, __webpack_require__) {
  113416. /**
  113417. * @author Richard Davey <rich@photonstorm.com>
  113418. * @copyright 2019 Photon Storm Ltd.
  113419. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113420. */
  113421. var Point = __webpack_require__(6);
  113422. /**
  113423. * Inverts a Point's coordinates.
  113424. *
  113425. * @function Phaser.Geom.Point.Negative
  113426. * @since 3.0.0
  113427. *
  113428. * @generic {Phaser.Geom.Point} O - [out,$return]
  113429. *
  113430. * @param {Phaser.Geom.Point} point - The Point to invert.
  113431. * @param {Phaser.Geom.Point} [out] - The Point to return the inverted coordinates in.
  113432. *
  113433. * @return {Phaser.Geom.Point} The modified `out` Point, or a new Point if none was provided.
  113434. */
  113435. var Negative = function (point, out)
  113436. {
  113437. if (out === undefined) { out = new Point(); }
  113438. return out.setTo(-point.x, -point.y);
  113439. };
  113440. module.exports = Negative;
  113441. /***/ }),
  113442. /* 685 */
  113443. /***/ (function(module, exports) {
  113444. /**
  113445. * @author Richard Davey <rich@photonstorm.com>
  113446. * @copyright 2019 Photon Storm Ltd.
  113447. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113448. */
  113449. /**
  113450. * Swaps the X and the Y coordinate of a point.
  113451. *
  113452. * @function Phaser.Geom.Point.Invert
  113453. * @since 3.0.0
  113454. *
  113455. * @generic {Phaser.Geom.Point} O - [point,$return]
  113456. *
  113457. * @param {Phaser.Geom.Point} point - The Point to modify.
  113458. *
  113459. * @return {Phaser.Geom.Point} The modified `point`.
  113460. */
  113461. var Invert = function (point)
  113462. {
  113463. return point.setTo(point.y, point.x);
  113464. };
  113465. module.exports = Invert;
  113466. /***/ }),
  113467. /* 686 */
  113468. /***/ (function(module, exports, __webpack_require__) {
  113469. /**
  113470. * @author Richard Davey <rich@photonstorm.com>
  113471. * @copyright 2019 Photon Storm Ltd.
  113472. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113473. */
  113474. var Point = __webpack_require__(6);
  113475. /**
  113476. * [description]
  113477. *
  113478. * @function Phaser.Geom.Point.Interpolate
  113479. * @since 3.0.0
  113480. *
  113481. * @generic {Phaser.Geom.Point} O - [out,$return]
  113482. *
  113483. * @param {Phaser.Geom.Point} pointA - The starting `Point` for the interpolation.
  113484. * @param {Phaser.Geom.Point} pointB - The target `Point` for the interpolation.
  113485. * @param {number} [t=0] - The amount to interpolate between the two points. Generally, a value between 0 (returns the starting `Point`) and 1 (returns the target `Point`). If omitted, 0 is used.
  113486. * @param {(Phaser.Geom.Point|object)} [out] - An optional `Point` object whose `x` and `y` values will be set to the result of the interpolation (can also be any object with `x` and `y` properties). If omitted, a new `Point` created and returned.
  113487. *
  113488. * @return {(Phaser.Geom.Point|object)} Either the object from the `out` argument with the properties `x` and `y` set to the result of the interpolation or a newly created `Point` object.
  113489. */
  113490. var Interpolate = function (pointA, pointB, t, out)
  113491. {
  113492. if (t === undefined) { t = 0; }
  113493. if (out === undefined) { out = new Point(); }
  113494. out.x = pointA.x + ((pointB.x - pointA.x) * t);
  113495. out.y = pointA.y + ((pointB.y - pointA.y) * t);
  113496. return out;
  113497. };
  113498. module.exports = Interpolate;
  113499. /***/ }),
  113500. /* 687 */
  113501. /***/ (function(module, exports, __webpack_require__) {
  113502. /**
  113503. * @author Richard Davey <rich@photonstorm.com>
  113504. * @copyright 2019 Photon Storm Ltd.
  113505. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113506. */
  113507. var Rectangle = __webpack_require__(10);
  113508. /**
  113509. * Calculates the Axis Aligned Bounding Box (or aabb) from an array of points.
  113510. *
  113511. * @function Phaser.Geom.Point.GetRectangleFromPoints
  113512. * @since 3.0.0
  113513. *
  113514. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  113515. *
  113516. * @param {Phaser.Geom.Point[]} points - [description]
  113517. * @param {Phaser.Geom.Rectangle} [out] - [description]
  113518. *
  113519. * @return {Phaser.Geom.Rectangle} [description]
  113520. */
  113521. var GetRectangleFromPoints = function (points, out)
  113522. {
  113523. if (out === undefined) { out = new Rectangle(); }
  113524. var xMax = Number.NEGATIVE_INFINITY;
  113525. var xMin = Number.POSITIVE_INFINITY;
  113526. var yMax = Number.NEGATIVE_INFINITY;
  113527. var yMin = Number.POSITIVE_INFINITY;
  113528. for (var i = 0; i < points.length; i++)
  113529. {
  113530. var point = points[i];
  113531. if (point.x > xMax)
  113532. {
  113533. xMax = point.x;
  113534. }
  113535. if (point.x < xMin)
  113536. {
  113537. xMin = point.x;
  113538. }
  113539. if (point.y > yMax)
  113540. {
  113541. yMax = point.y;
  113542. }
  113543. if (point.y < yMin)
  113544. {
  113545. yMin = point.y;
  113546. }
  113547. }
  113548. out.x = xMin;
  113549. out.y = yMin;
  113550. out.width = xMax - xMin;
  113551. out.height = yMax - yMin;
  113552. return out;
  113553. };
  113554. module.exports = GetRectangleFromPoints;
  113555. /***/ }),
  113556. /* 688 */
  113557. /***/ (function(module, exports, __webpack_require__) {
  113558. /**
  113559. * @author Richard Davey <rich@photonstorm.com>
  113560. * @copyright 2019 Photon Storm Ltd.
  113561. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113562. */
  113563. var Point = __webpack_require__(6);
  113564. /**
  113565. * Get the centroid or geometric center of a plane figure (the arithmetic mean position of all the points in the figure).
  113566. * Informally, it is the point at which a cutout of the shape could be perfectly balanced on the tip of a pin.
  113567. *
  113568. * @function Phaser.Geom.Point.GetCentroid
  113569. * @since 3.0.0
  113570. *
  113571. * @generic {Phaser.Geom.Point} O - [out,$return]
  113572. *
  113573. * @param {Phaser.Geom.Point[]} points - [description]
  113574. * @param {Phaser.Geom.Point} [out] - [description]
  113575. *
  113576. * @return {Phaser.Geom.Point} [description]
  113577. */
  113578. var GetCentroid = function (points, out)
  113579. {
  113580. if (out === undefined) { out = new Point(); }
  113581. if (!Array.isArray(points))
  113582. {
  113583. throw new Error('GetCentroid points argument must be an array');
  113584. }
  113585. var len = points.length;
  113586. if (len < 1)
  113587. {
  113588. throw new Error('GetCentroid points array must not be empty');
  113589. }
  113590. else if (len === 1)
  113591. {
  113592. out.x = points[0].x;
  113593. out.y = points[0].y;
  113594. }
  113595. else
  113596. {
  113597. for (var i = 0; i < len; i++)
  113598. {
  113599. out.x += points[i].x;
  113600. out.y += points[i].y;
  113601. }
  113602. out.x /= len;
  113603. out.y /= len;
  113604. }
  113605. return out;
  113606. };
  113607. module.exports = GetCentroid;
  113608. /***/ }),
  113609. /* 689 */
  113610. /***/ (function(module, exports) {
  113611. /**
  113612. * @author Richard Davey <rich@photonstorm.com>
  113613. * @copyright 2019 Photon Storm Ltd.
  113614. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113615. */
  113616. /**
  113617. * Apply `Math.ceil()` to each coordinate of the given Point.
  113618. *
  113619. * @function Phaser.Geom.Point.Floor
  113620. * @since 3.0.0
  113621. *
  113622. * @generic {Phaser.Geom.Point} O - [point,$return]
  113623. *
  113624. * @param {Phaser.Geom.Point} point - The Point to floor.
  113625. *
  113626. * @return {Phaser.Geom.Point} The Point with `Math.floor()` applied to its coordinates.
  113627. */
  113628. var Floor = function (point)
  113629. {
  113630. return point.setTo(Math.floor(point.x), Math.floor(point.y));
  113631. };
  113632. module.exports = Floor;
  113633. /***/ }),
  113634. /* 690 */
  113635. /***/ (function(module, exports) {
  113636. /**
  113637. * @author Richard Davey <rich@photonstorm.com>
  113638. * @copyright 2019 Photon Storm Ltd.
  113639. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113640. */
  113641. /**
  113642. * A comparison of two `Point` objects to see if they are equal.
  113643. *
  113644. * @function Phaser.Geom.Point.Equals
  113645. * @since 3.0.0
  113646. *
  113647. * @param {Phaser.Geom.Point} point - The original `Point` to compare against.
  113648. * @param {Phaser.Geom.Point} toCompare - The second `Point` to compare.
  113649. *
  113650. * @return {boolean} Returns true if the both `Point` objects are equal.
  113651. */
  113652. var Equals = function (point, toCompare)
  113653. {
  113654. return (point.x === toCompare.x && point.y === toCompare.y);
  113655. };
  113656. module.exports = Equals;
  113657. /***/ }),
  113658. /* 691 */
  113659. /***/ (function(module, exports) {
  113660. /**
  113661. * @author Richard Davey <rich@photonstorm.com>
  113662. * @copyright 2019 Photon Storm Ltd.
  113663. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113664. */
  113665. /**
  113666. * Copy the values of one Point to a destination Point.
  113667. *
  113668. * @function Phaser.Geom.Point.CopyFrom
  113669. * @since 3.0.0
  113670. *
  113671. * @generic {Phaser.Geom.Point} O - [dest,$return]
  113672. *
  113673. * @param {Phaser.Geom.Point} source - The source Point to copy the values from.
  113674. * @param {Phaser.Geom.Point} dest - The destination Point to copy the values to.
  113675. *
  113676. * @return {Phaser.Geom.Point} The destination Point.
  113677. */
  113678. var CopyFrom = function (source, dest)
  113679. {
  113680. return dest.setTo(source.x, source.y);
  113681. };
  113682. module.exports = CopyFrom;
  113683. /***/ }),
  113684. /* 692 */
  113685. /***/ (function(module, exports, __webpack_require__) {
  113686. /**
  113687. * @author Richard Davey <rich@photonstorm.com>
  113688. * @copyright 2019 Photon Storm Ltd.
  113689. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113690. */
  113691. var Point = __webpack_require__(6);
  113692. /**
  113693. * Clone the given Point.
  113694. *
  113695. * @function Phaser.Geom.Point.Clone
  113696. * @since 3.0.0
  113697. *
  113698. * @param {Phaser.Geom.Point} source - The source Point to clone.
  113699. *
  113700. * @return {Phaser.Geom.Point} The cloned Point.
  113701. */
  113702. var Clone = function (source)
  113703. {
  113704. return new Point(source.x, source.y);
  113705. };
  113706. module.exports = Clone;
  113707. /***/ }),
  113708. /* 693 */
  113709. /***/ (function(module, exports) {
  113710. /**
  113711. * @author Richard Davey <rich@photonstorm.com>
  113712. * @copyright 2019 Photon Storm Ltd.
  113713. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113714. */
  113715. /**
  113716. * Apply `Math.ceil()` to each coordinate of the given Point.
  113717. *
  113718. * @function Phaser.Geom.Point.Ceil
  113719. * @since 3.0.0
  113720. *
  113721. * @generic {Phaser.Geom.Point} O - [point,$return]
  113722. *
  113723. * @param {Phaser.Geom.Point} point - The Point to ceil.
  113724. *
  113725. * @return {Phaser.Geom.Point} The Point with `Math.ceil()` applied to its coordinates.
  113726. */
  113727. var Ceil = function (point)
  113728. {
  113729. return point.setTo(Math.ceil(point.x), Math.ceil(point.y));
  113730. };
  113731. module.exports = Ceil;
  113732. /***/ }),
  113733. /* 694 */
  113734. /***/ (function(module, exports, __webpack_require__) {
  113735. /**
  113736. * @author Richard Davey <rich@photonstorm.com>
  113737. * @copyright 2019 Photon Storm Ltd.
  113738. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113739. */
  113740. var Point = __webpack_require__(6);
  113741. Point.Ceil = __webpack_require__(693);
  113742. Point.Clone = __webpack_require__(692);
  113743. Point.CopyFrom = __webpack_require__(691);
  113744. Point.Equals = __webpack_require__(690);
  113745. Point.Floor = __webpack_require__(689);
  113746. Point.GetCentroid = __webpack_require__(688);
  113747. Point.GetMagnitude = __webpack_require__(272);
  113748. Point.GetMagnitudeSq = __webpack_require__(271);
  113749. Point.GetRectangleFromPoints = __webpack_require__(687);
  113750. Point.Interpolate = __webpack_require__(686);
  113751. Point.Invert = __webpack_require__(685);
  113752. Point.Negative = __webpack_require__(684);
  113753. Point.Project = __webpack_require__(683);
  113754. Point.ProjectUnit = __webpack_require__(682);
  113755. Point.SetMagnitude = __webpack_require__(681);
  113756. module.exports = Point;
  113757. /***/ }),
  113758. /* 695 */
  113759. /***/ (function(module, exports) {
  113760. /**
  113761. * @author Richard Davey <rich@photonstorm.com>
  113762. * @copyright 2019 Photon Storm Ltd.
  113763. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113764. */
  113765. /**
  113766. * Calculate the width of the given line.
  113767. *
  113768. * @function Phaser.Geom.Line.Width
  113769. * @since 3.0.0
  113770. *
  113771. * @param {Phaser.Geom.Line} line - The line to calculate the width of.
  113772. *
  113773. * @return {number} The width of the line.
  113774. */
  113775. var Width = function (line)
  113776. {
  113777. return Math.abs(line.x1 - line.x2);
  113778. };
  113779. module.exports = Width;
  113780. /***/ }),
  113781. /* 696 */
  113782. /***/ (function(module, exports) {
  113783. /**
  113784. * @author Richard Davey <rich@photonstorm.com>
  113785. * @copyright 2019 Photon Storm Ltd.
  113786. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113787. */
  113788. /**
  113789. * Calculate the slope of the given line.
  113790. *
  113791. * @function Phaser.Geom.Line.Slope
  113792. * @since 3.0.0
  113793. *
  113794. * @param {Phaser.Geom.Line} line - The line to calculate the slope of.
  113795. *
  113796. * @return {number} The slope of the line.
  113797. */
  113798. var Slope = function (line)
  113799. {
  113800. return (line.y2 - line.y1) / (line.x2 - line.x1);
  113801. };
  113802. module.exports = Slope;
  113803. /***/ }),
  113804. /* 697 */
  113805. /***/ (function(module, exports) {
  113806. /**
  113807. * @author Richard Davey <rich@photonstorm.com>
  113808. * @copyright 2019 Photon Storm Ltd.
  113809. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113810. */
  113811. /**
  113812. * Set a line to a given position, angle and length.
  113813. *
  113814. * @function Phaser.Geom.Line.SetToAngle
  113815. * @since 3.0.0
  113816. *
  113817. * @generic {Phaser.Geom.Line} O - [line,$return]
  113818. *
  113819. * @param {Phaser.Geom.Line} line - The line to set.
  113820. * @param {number} x - The horizontal start position of the line.
  113821. * @param {number} y - The vertical start position of the line.
  113822. * @param {number} angle - The angle of the line in radians.
  113823. * @param {number} length - The length of the line.
  113824. *
  113825. * @return {Phaser.Geom.Line} The updated line.
  113826. */
  113827. var SetToAngle = function (line, x, y, angle, length)
  113828. {
  113829. line.x1 = x;
  113830. line.y1 = y;
  113831. line.x2 = x + (Math.cos(angle) * length);
  113832. line.y2 = y + (Math.sin(angle) * length);
  113833. return line;
  113834. };
  113835. module.exports = SetToAngle;
  113836. /***/ }),
  113837. /* 698 */
  113838. /***/ (function(module, exports, __webpack_require__) {
  113839. /**
  113840. * @author Richard Davey <rich@photonstorm.com>
  113841. * @copyright 2019 Photon Storm Ltd.
  113842. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113843. */
  113844. var RotateAroundXY = __webpack_require__(156);
  113845. /**
  113846. * Rotate a line around a point by the given angle in radians.
  113847. *
  113848. * @function Phaser.Geom.Line.RotateAroundPoint
  113849. * @since 3.0.0
  113850. *
  113851. * @generic {Phaser.Geom.Line} O - [line,$return]
  113852. *
  113853. * @param {Phaser.Geom.Line} line - The line to rotate.
  113854. * @param {(Phaser.Geom.Point|object)} point - The point to rotate the line around.
  113855. * @param {number} angle - The angle of rotation in radians.
  113856. *
  113857. * @return {Phaser.Geom.Line} The rotated line.
  113858. */
  113859. var RotateAroundPoint = function (line, point, angle)
  113860. {
  113861. return RotateAroundXY(line, point.x, point.y, angle);
  113862. };
  113863. module.exports = RotateAroundPoint;
  113864. /***/ }),
  113865. /* 699 */
  113866. /***/ (function(module, exports, __webpack_require__) {
  113867. /**
  113868. * @author Richard Davey <rich@photonstorm.com>
  113869. * @copyright 2019 Photon Storm Ltd.
  113870. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113871. */
  113872. var RotateAroundXY = __webpack_require__(156);
  113873. /**
  113874. * Rotate a line around its midpoint by the given angle in radians.
  113875. *
  113876. * @function Phaser.Geom.Line.Rotate
  113877. * @since 3.0.0
  113878. *
  113879. * @generic {Phaser.Geom.Line} O - [line,$return]
  113880. *
  113881. * @param {Phaser.Geom.Line} line - The line to rotate.
  113882. * @param {number} angle - The angle of rotation in radians.
  113883. *
  113884. * @return {Phaser.Geom.Line} The rotated line.
  113885. */
  113886. var Rotate = function (line, angle)
  113887. {
  113888. var x = (line.x1 + line.x2) / 2;
  113889. var y = (line.y1 + line.y2) / 2;
  113890. return RotateAroundXY(line, x, y, angle);
  113891. };
  113892. module.exports = Rotate;
  113893. /***/ }),
  113894. /* 700 */
  113895. /***/ (function(module, exports, __webpack_require__) {
  113896. /**
  113897. * @author Richard Davey <rich@photonstorm.com>
  113898. * @copyright 2019 Photon Storm Ltd.
  113899. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113900. */
  113901. var Angle = __webpack_require__(73);
  113902. var NormalAngle = __webpack_require__(273);
  113903. /**
  113904. * Calculate the reflected angle between two lines.
  113905. *
  113906. * This is the outgoing angle based on the angle of Line 1 and the normalAngle of Line 2.
  113907. *
  113908. * @function Phaser.Geom.Line.ReflectAngle
  113909. * @since 3.0.0
  113910. *
  113911. * @param {Phaser.Geom.Line} lineA - The first line.
  113912. * @param {Phaser.Geom.Line} lineB - The second line.
  113913. *
  113914. * @return {number} The reflected angle between each line.
  113915. */
  113916. var ReflectAngle = function (lineA, lineB)
  113917. {
  113918. return (2 * NormalAngle(lineB) - Math.PI - Angle(lineA));
  113919. };
  113920. module.exports = ReflectAngle;
  113921. /***/ }),
  113922. /* 701 */
  113923. /***/ (function(module, exports) {
  113924. /**
  113925. * @author Richard Davey <rich@photonstorm.com>
  113926. * @copyright 2019 Photon Storm Ltd.
  113927. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113928. */
  113929. /**
  113930. * Calculate the perpendicular slope of the given line.
  113931. *
  113932. * @function Phaser.Geom.Line.PerpSlope
  113933. * @since 3.0.0
  113934. *
  113935. * @param {Phaser.Geom.Line} line - The line to calculate the perpendicular slope of.
  113936. *
  113937. * @return {number} The perpendicular slope of the line.
  113938. */
  113939. var PerpSlope = function (line)
  113940. {
  113941. return -((line.x2 - line.x1) / (line.y2 - line.y1));
  113942. };
  113943. module.exports = PerpSlope;
  113944. /***/ }),
  113945. /* 702 */
  113946. /***/ (function(module, exports) {
  113947. /**
  113948. * @author Richard Davey <rich@photonstorm.com>
  113949. * @copyright 2019 Photon Storm Ltd.
  113950. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113951. */
  113952. /**
  113953. * Offset a line by the given amount.
  113954. *
  113955. * @function Phaser.Geom.Line.Offset
  113956. * @since 3.0.0
  113957. *
  113958. * @generic {Phaser.Geom.Line} O - [line,$return]
  113959. *
  113960. * @param {Phaser.Geom.Line} line - The line to offset.
  113961. * @param {number} x - The horizontal offset to add to the line.
  113962. * @param {number} y - The vertical offset to add to the line.
  113963. *
  113964. * @return {Phaser.Geom.Line} The offset line.
  113965. */
  113966. var Offset = function (line, x, y)
  113967. {
  113968. line.x1 += x;
  113969. line.y1 += y;
  113970. line.x2 += x;
  113971. line.y2 += y;
  113972. return line;
  113973. };
  113974. module.exports = Offset;
  113975. /***/ }),
  113976. /* 703 */
  113977. /***/ (function(module, exports, __webpack_require__) {
  113978. /**
  113979. * @author Richard Davey <rich@photonstorm.com>
  113980. * @copyright 2019 Photon Storm Ltd.
  113981. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113982. */
  113983. var MATH_CONST = __webpack_require__(20);
  113984. var Angle = __webpack_require__(73);
  113985. /**
  113986. * The Y value of the normal of the given line.
  113987. * The normal of a line is a vector that points perpendicular from it.
  113988. *
  113989. * @function Phaser.Geom.Line.NormalY
  113990. * @since 3.0.0
  113991. *
  113992. * @param {Phaser.Geom.Line} line - The line to calculate the normal of.
  113993. *
  113994. * @return {number} The Y value of the normal of the Line.
  113995. */
  113996. var NormalY = function (line)
  113997. {
  113998. return Math.sin(Angle(line) - MATH_CONST.TAU);
  113999. };
  114000. module.exports = NormalY;
  114001. /***/ }),
  114002. /* 704 */
  114003. /***/ (function(module, exports, __webpack_require__) {
  114004. /**
  114005. * @author Richard Davey <rich@photonstorm.com>
  114006. * @copyright 2019 Photon Storm Ltd.
  114007. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114008. */
  114009. var MATH_CONST = __webpack_require__(20);
  114010. var Angle = __webpack_require__(73);
  114011. /**
  114012. * [description]
  114013. *
  114014. * @function Phaser.Geom.Line.NormalX
  114015. * @since 3.0.0
  114016. *
  114017. * @param {Phaser.Geom.Line} line - The Line object to get the normal value from.
  114018. *
  114019. * @return {number} [description]
  114020. */
  114021. var NormalX = function (line)
  114022. {
  114023. return Math.cos(Angle(line) - MATH_CONST.TAU);
  114024. };
  114025. module.exports = NormalX;
  114026. /***/ }),
  114027. /* 705 */
  114028. /***/ (function(module, exports) {
  114029. /**
  114030. * @author Richard Davey <rich@photonstorm.com>
  114031. * @copyright 2019 Photon Storm Ltd.
  114032. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114033. */
  114034. /**
  114035. * Calculate the height of the given line.
  114036. *
  114037. * @function Phaser.Geom.Line.Height
  114038. * @since 3.0.0
  114039. *
  114040. * @param {Phaser.Geom.Line} line - The line to calculate the height of.
  114041. *
  114042. * @return {number} The height of the line.
  114043. */
  114044. var Height = function (line)
  114045. {
  114046. return Math.abs(line.y1 - line.y2);
  114047. };
  114048. module.exports = Height;
  114049. /***/ }),
  114050. /* 706 */
  114051. /***/ (function(module, exports) {
  114052. /**
  114053. * @author Richard Davey <rich@photonstorm.com>
  114054. * @author Florian Mertens
  114055. * @copyright 2019 Photon Storm Ltd.
  114056. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114057. */
  114058. /**
  114059. * Get the shortest distance from a Line to the given Point.
  114060. *
  114061. * @function Phaser.Geom.Line.GetShortestDistance
  114062. * @since 3.16.0
  114063. *
  114064. * @generic {Phaser.Geom.Point} O - [out,$return]
  114065. *
  114066. * @param {Phaser.Geom.Line} line - The line to get the distance from.
  114067. * @param {(Phaser.Geom.Point|object)} point - The point to get the shortest distance to.
  114068. *
  114069. * @return {number} The shortest distance from the line to the point.
  114070. */
  114071. var GetShortestDistance = function (line, point)
  114072. {
  114073. var x1 = line.x1;
  114074. var y1 = line.y1;
  114075. var x2 = line.x2;
  114076. var y2 = line.y2;
  114077. var L2 = (((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
  114078. if (L2 === 0)
  114079. {
  114080. return false;
  114081. }
  114082. var s = (((y1 - point.y) * (x2 - x1)) - ((x1 - point.x) * (y2 - y1))) / L2;
  114083. return Math.abs(s) * Math.sqrt(L2);
  114084. };
  114085. module.exports = GetShortestDistance;
  114086. /***/ }),
  114087. /* 707 */
  114088. /***/ (function(module, exports, __webpack_require__) {
  114089. /**
  114090. * @author Richard Davey <rich@photonstorm.com>
  114091. * @copyright 2019 Photon Storm Ltd.
  114092. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114093. */
  114094. var MATH_CONST = __webpack_require__(20);
  114095. var Angle = __webpack_require__(73);
  114096. var Point = __webpack_require__(6);
  114097. /**
  114098. * Calculate the normal of the given line.
  114099. *
  114100. * The normal of a line is a vector that points perpendicular from it.
  114101. *
  114102. * @function Phaser.Geom.Line.GetNormal
  114103. * @since 3.0.0
  114104. *
  114105. * @generic {Phaser.Geom.Point} O - [out,$return]
  114106. *
  114107. * @param {Phaser.Geom.Line} line - The line to calculate the normal of.
  114108. * @param {(Phaser.Geom.Point|object)} [out] - An optional point object to store the normal in.
  114109. *
  114110. * @return {(Phaser.Geom.Point|object)} The normal of the Line.
  114111. */
  114112. var GetNormal = function (line, out)
  114113. {
  114114. if (out === undefined) { out = new Point(); }
  114115. var a = Angle(line) - MATH_CONST.TAU;
  114116. out.x = Math.cos(a);
  114117. out.y = Math.sin(a);
  114118. return out;
  114119. };
  114120. module.exports = GetNormal;
  114121. /***/ }),
  114122. /* 708 */
  114123. /***/ (function(module, exports, __webpack_require__) {
  114124. /**
  114125. * @author Richard Davey <rich@photonstorm.com>
  114126. * @author Florian Mertens
  114127. * @copyright 2019 Photon Storm Ltd.
  114128. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114129. */
  114130. var Point = __webpack_require__(6);
  114131. /**
  114132. * Get the nearest point on a line perpendicular to the given point.
  114133. *
  114134. * @function Phaser.Geom.Line.GetNearestPoint
  114135. * @since 3.16.0
  114136. *
  114137. * @generic {Phaser.Geom.Point} O - [out,$return]
  114138. *
  114139. * @param {Phaser.Geom.Line} line - The line to get the nearest point on.
  114140. * @param {(Phaser.Geom.Point|object)} point - The point to get the nearest point to.
  114141. * @param {(Phaser.Geom.Point|object)} [out] - An optional point, or point-like object, to store the coordinates of the nearest point on the line.
  114142. *
  114143. * @return {(Phaser.Geom.Point|object)} The nearest point on the line.
  114144. */
  114145. var GetNearestPoint = function (line, point, out)
  114146. {
  114147. if (out === undefined) { out = new Point(); }
  114148. var x1 = line.x1;
  114149. var y1 = line.y1;
  114150. var x2 = line.x2;
  114151. var y2 = line.y2;
  114152. var L2 = (((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
  114153. if (L2 === 0)
  114154. {
  114155. return out;
  114156. }
  114157. var r = (((point.x - x1) * (x2 - x1)) + ((point.y - y1) * (y2 - y1))) / L2;
  114158. out.x = x1 + (r * (x2 - x1));
  114159. out.y = y1 + (r * (y2 - y1));
  114160. return out;
  114161. };
  114162. module.exports = GetNearestPoint;
  114163. /***/ }),
  114164. /* 709 */
  114165. /***/ (function(module, exports, __webpack_require__) {
  114166. /**
  114167. * @author Richard Davey <rich@photonstorm.com>
  114168. * @copyright 2019 Photon Storm Ltd.
  114169. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114170. */
  114171. var Point = __webpack_require__(6);
  114172. /**
  114173. * Get the midpoint of the given line.
  114174. *
  114175. * @function Phaser.Geom.Line.GetMidPoint
  114176. * @since 3.0.0
  114177. *
  114178. * @generic {Phaser.Geom.Point} O - [out,$return]
  114179. *
  114180. * @param {Phaser.Geom.Line} line - The line to get the midpoint of.
  114181. * @param {(Phaser.Geom.Point|object)} [out] - An optional point object to store the midpoint in.
  114182. *
  114183. * @return {(Phaser.Geom.Point|object)} The midpoint of the Line.
  114184. */
  114185. var GetMidPoint = function (line, out)
  114186. {
  114187. if (out === undefined) { out = new Point(); }
  114188. out.x = (line.x1 + line.x2) / 2;
  114189. out.y = (line.y1 + line.y2) / 2;
  114190. return out;
  114191. };
  114192. module.exports = GetMidPoint;
  114193. /***/ }),
  114194. /* 710 */
  114195. /***/ (function(module, exports, __webpack_require__) {
  114196. /**
  114197. * @author Richard Davey <rich@photonstorm.com>
  114198. * @copyright 2019 Photon Storm Ltd.
  114199. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114200. */
  114201. var Length = __webpack_require__(58);
  114202. /**
  114203. * Extends the start and end points of a Line by the given amounts.
  114204. *
  114205. * The amounts can be positive or negative. Positive points will increase the length of the line,
  114206. * while negative ones will decrease it.
  114207. *
  114208. * If no `right` value is provided it will extend the length of the line equally in both directions.
  114209. *
  114210. * Pass a value of zero to leave the start or end point unchanged.
  114211. *
  114212. * @function Phaser.Geom.Line.Extend
  114213. * @since 3.16.0
  114214. *
  114215. * @param {Phaser.Geom.Line} line - The line instance to extend.
  114216. * @param {number} left - The amount to extend the start of the line by.
  114217. * @param {number} [right] - The amount to extend the end of the line by. If not given it will be set to the `left` value.
  114218. *
  114219. * @return {Phaser.Geom.Line} The modified Line instance.
  114220. */
  114221. var Extend = function (line, left, right)
  114222. {
  114223. if (right === undefined) { right = left; }
  114224. var length = Length(line);
  114225. var slopX = line.x2 - line.x1;
  114226. var slopY = line.y2 - line.y1;
  114227. if (left)
  114228. {
  114229. line.x1 = line.x1 - slopX / length * left;
  114230. line.y1 = line.y1 - slopY / length * left;
  114231. }
  114232. if (right)
  114233. {
  114234. line.x2 = line.x2 + slopX / length * right;
  114235. line.y2 = line.y2 + slopY / length * right;
  114236. }
  114237. return line;
  114238. };
  114239. module.exports = Extend;
  114240. /***/ }),
  114241. /* 711 */
  114242. /***/ (function(module, exports) {
  114243. /**
  114244. * @author Richard Davey <rich@photonstorm.com>
  114245. * @copyright 2019 Photon Storm Ltd.
  114246. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114247. */
  114248. /**
  114249. * Compare two lines for strict equality.
  114250. *
  114251. * @function Phaser.Geom.Line.Equals
  114252. * @since 3.0.0
  114253. *
  114254. * @param {Phaser.Geom.Line} line - The first line to compare.
  114255. * @param {Phaser.Geom.Line} toCompare - The second line to compare.
  114256. *
  114257. * @return {boolean} Whether the two lines are equal.
  114258. */
  114259. var Equals = function (line, toCompare)
  114260. {
  114261. return (
  114262. line.x1 === toCompare.x1 &&
  114263. line.y1 === toCompare.y1 &&
  114264. line.x2 === toCompare.x2 &&
  114265. line.y2 === toCompare.y2
  114266. );
  114267. };
  114268. module.exports = Equals;
  114269. /***/ }),
  114270. /* 712 */
  114271. /***/ (function(module, exports) {
  114272. /**
  114273. * @author Richard Davey <rich@photonstorm.com>
  114274. * @copyright 2019 Photon Storm Ltd.
  114275. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114276. */
  114277. /**
  114278. * Copy the values of one line to a destination line.
  114279. *
  114280. * @function Phaser.Geom.Line.CopyFrom
  114281. * @since 3.0.0
  114282. *
  114283. * @generic {Phaser.Geom.Line} O - [dest,$return]
  114284. *
  114285. * @param {Phaser.Geom.Line} source - The source line to copy the values from.
  114286. * @param {Phaser.Geom.Line} dest - The destination line to copy the values to.
  114287. *
  114288. * @return {Phaser.Geom.Line} The destination line.
  114289. */
  114290. var CopyFrom = function (source, dest)
  114291. {
  114292. return dest.setTo(source.x1, source.y1, source.x2, source.y2);
  114293. };
  114294. module.exports = CopyFrom;
  114295. /***/ }),
  114296. /* 713 */
  114297. /***/ (function(module, exports, __webpack_require__) {
  114298. /**
  114299. * @author Richard Davey <rich@photonstorm.com>
  114300. * @copyright 2019 Photon Storm Ltd.
  114301. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114302. */
  114303. var Line = __webpack_require__(59);
  114304. /**
  114305. * Clone the given line.
  114306. *
  114307. * @function Phaser.Geom.Line.Clone
  114308. * @since 3.0.0
  114309. *
  114310. * @param {Phaser.Geom.Line} source - The source line to clone.
  114311. *
  114312. * @return {Phaser.Geom.Line} The cloned line.
  114313. */
  114314. var Clone = function (source)
  114315. {
  114316. return new Line(source.x1, source.y1, source.x2, source.y2);
  114317. };
  114318. module.exports = Clone;
  114319. /***/ }),
  114320. /* 714 */
  114321. /***/ (function(module, exports) {
  114322. /**
  114323. * @author Richard Davey <rich@photonstorm.com>
  114324. * @copyright 2019 Photon Storm Ltd.
  114325. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114326. */
  114327. /**
  114328. * Center a line on the given coordinates.
  114329. *
  114330. * @function Phaser.Geom.Line.CenterOn
  114331. * @since 3.0.0
  114332. *
  114333. * @param {Phaser.Geom.Line} line - The line to center.
  114334. * @param {number} x - The horizontal coordinate to center the line on.
  114335. * @param {number} y - The vertical coordinate to center the line on.
  114336. *
  114337. * @return {Phaser.Geom.Line} The centered line.
  114338. */
  114339. var CenterOn = function (line, x, y)
  114340. {
  114341. var tx = x - ((line.x1 + line.x2) / 2);
  114342. var ty = y - ((line.y1 + line.y2) / 2);
  114343. line.x1 += tx;
  114344. line.y1 += ty;
  114345. line.x2 += tx;
  114346. line.y2 += ty;
  114347. return line;
  114348. };
  114349. module.exports = CenterOn;
  114350. /***/ }),
  114351. /* 715 */
  114352. /***/ (function(module, exports, __webpack_require__) {
  114353. /**
  114354. * @author Richard Davey <rich@photonstorm.com>
  114355. * @copyright 2019 Photon Storm Ltd.
  114356. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114357. */
  114358. var Line = __webpack_require__(59);
  114359. Line.Angle = __webpack_require__(73);
  114360. Line.BresenhamPoints = __webpack_require__(416);
  114361. Line.CenterOn = __webpack_require__(714);
  114362. Line.Clone = __webpack_require__(713);
  114363. Line.CopyFrom = __webpack_require__(712);
  114364. Line.Equals = __webpack_require__(711);
  114365. Line.Extend = __webpack_require__(710);
  114366. Line.GetMidPoint = __webpack_require__(709);
  114367. Line.GetNearestPoint = __webpack_require__(708);
  114368. Line.GetNormal = __webpack_require__(707);
  114369. Line.GetPoint = __webpack_require__(429);
  114370. Line.GetPoints = __webpack_require__(203);
  114371. Line.GetShortestDistance = __webpack_require__(706);
  114372. Line.Height = __webpack_require__(705);
  114373. Line.Length = __webpack_require__(58);
  114374. Line.NormalAngle = __webpack_require__(273);
  114375. Line.NormalX = __webpack_require__(704);
  114376. Line.NormalY = __webpack_require__(703);
  114377. Line.Offset = __webpack_require__(702);
  114378. Line.PerpSlope = __webpack_require__(701);
  114379. Line.Random = __webpack_require__(202);
  114380. Line.ReflectAngle = __webpack_require__(700);
  114381. Line.Rotate = __webpack_require__(699);
  114382. Line.RotateAroundPoint = __webpack_require__(698);
  114383. Line.RotateAroundXY = __webpack_require__(156);
  114384. Line.SetToAngle = __webpack_require__(697);
  114385. Line.Slope = __webpack_require__(696);
  114386. Line.Width = __webpack_require__(695);
  114387. module.exports = Line;
  114388. /***/ }),
  114389. /* 716 */
  114390. /***/ (function(module, exports, __webpack_require__) {
  114391. /**
  114392. * @author Richard Davey <rich@photonstorm.com>
  114393. * @copyright 2019 Photon Storm Ltd.
  114394. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114395. */
  114396. var ContainsArray = __webpack_require__(157);
  114397. var Decompose = __webpack_require__(274);
  114398. var LineToLine = __webpack_require__(115);
  114399. /**
  114400. * Checks if two Triangles intersect.
  114401. *
  114402. * A Triangle intersects another Triangle if any pair of their lines intersects or if any point of one Triangle is within the other Triangle. Thus, the Triangles are considered "solid".
  114403. *
  114404. * @function Phaser.Geom.Intersects.TriangleToTriangle
  114405. * @since 3.0.0
  114406. *
  114407. * @param {Phaser.Geom.Triangle} triangleA - The first Triangle to check for intersection.
  114408. * @param {Phaser.Geom.Triangle} triangleB - The second Triangle to check for intersection.
  114409. *
  114410. * @return {boolean} `true` if the Triangles intersect, otherwise `false`.
  114411. */
  114412. var TriangleToTriangle = function (triangleA, triangleB)
  114413. {
  114414. // First the cheapest ones:
  114415. if (
  114416. triangleA.left > triangleB.right ||
  114417. triangleA.right < triangleB.left ||
  114418. triangleA.top > triangleB.bottom ||
  114419. triangleA.bottom < triangleB.top)
  114420. {
  114421. return false;
  114422. }
  114423. var lineAA = triangleA.getLineA();
  114424. var lineAB = triangleA.getLineB();
  114425. var lineAC = triangleA.getLineC();
  114426. var lineBA = triangleB.getLineA();
  114427. var lineBB = triangleB.getLineB();
  114428. var lineBC = triangleB.getLineC();
  114429. // Now check the lines against each line of TriangleB
  114430. if (LineToLine(lineAA, lineBA) || LineToLine(lineAA, lineBB) || LineToLine(lineAA, lineBC))
  114431. {
  114432. return true;
  114433. }
  114434. if (LineToLine(lineAB, lineBA) || LineToLine(lineAB, lineBB) || LineToLine(lineAB, lineBC))
  114435. {
  114436. return true;
  114437. }
  114438. if (LineToLine(lineAC, lineBA) || LineToLine(lineAC, lineBB) || LineToLine(lineAC, lineBC))
  114439. {
  114440. return true;
  114441. }
  114442. // Nope, so check to see if any of the points of triangleA are within triangleB
  114443. var points = Decompose(triangleA);
  114444. var within = ContainsArray(triangleB, points, true);
  114445. if (within.length > 0)
  114446. {
  114447. return true;
  114448. }
  114449. // Finally check to see if any of the points of triangleB are within triangleA
  114450. points = Decompose(triangleB);
  114451. within = ContainsArray(triangleA, points, true);
  114452. if (within.length > 0)
  114453. {
  114454. return true;
  114455. }
  114456. return false;
  114457. };
  114458. module.exports = TriangleToTriangle;
  114459. /***/ }),
  114460. /* 717 */
  114461. /***/ (function(module, exports, __webpack_require__) {
  114462. /**
  114463. * @author Richard Davey <rich@photonstorm.com>
  114464. * @copyright 2019 Photon Storm Ltd.
  114465. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114466. */
  114467. var Contains = __webpack_require__(74);
  114468. var LineToLine = __webpack_require__(115);
  114469. /**
  114470. * Checks if a Triangle and a Line intersect.
  114471. *
  114472. * The Line intersects the Triangle if it starts inside of it, ends inside of it, or crosses any of the Triangle's sides. Thus, the Triangle is considered "solid".
  114473. *
  114474. * @function Phaser.Geom.Intersects.TriangleToLine
  114475. * @since 3.0.0
  114476. *
  114477. * @param {Phaser.Geom.Triangle} triangle - The Triangle to check with.
  114478. * @param {Phaser.Geom.Line} line - The Line to check with.
  114479. *
  114480. * @return {boolean} `true` if the Triangle and the Line intersect, otherwise `false`.
  114481. */
  114482. var TriangleToLine = function (triangle, line)
  114483. {
  114484. // If the Triangle contains either the start or end point of the line, it intersects
  114485. if (Contains(triangle, line.getPointA()) || Contains(triangle, line.getPointB()))
  114486. {
  114487. return true;
  114488. }
  114489. // Now check the line against each line of the Triangle
  114490. if (LineToLine(triangle.getLineA(), line))
  114491. {
  114492. return true;
  114493. }
  114494. if (LineToLine(triangle.getLineB(), line))
  114495. {
  114496. return true;
  114497. }
  114498. if (LineToLine(triangle.getLineC(), line))
  114499. {
  114500. return true;
  114501. }
  114502. return false;
  114503. };
  114504. module.exports = TriangleToLine;
  114505. /***/ }),
  114506. /* 718 */
  114507. /***/ (function(module, exports, __webpack_require__) {
  114508. /**
  114509. * @author Richard Davey <rich@photonstorm.com>
  114510. * @copyright 2019 Photon Storm Ltd.
  114511. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114512. */
  114513. var LineToCircle = __webpack_require__(277);
  114514. var Contains = __webpack_require__(74);
  114515. /**
  114516. * Checks if a Triangle and a Circle intersect.
  114517. *
  114518. * A Circle intersects a Triangle if its center is located within it or if any of the Triangle's sides intersect the Circle. As such, the Triangle and the Circle are considered "solid" for the intersection.
  114519. *
  114520. * @function Phaser.Geom.Intersects.TriangleToCircle
  114521. * @since 3.0.0
  114522. *
  114523. * @param {Phaser.Geom.Triangle} triangle - The Triangle to check for intersection.
  114524. * @param {Phaser.Geom.Circle} circle - The Circle to check for intersection.
  114525. *
  114526. * @return {boolean} `true` if the Triangle and the `Circle` intersect, otherwise `false`.
  114527. */
  114528. var TriangleToCircle = function (triangle, circle)
  114529. {
  114530. // First the cheapest ones:
  114531. if (
  114532. triangle.left > circle.right ||
  114533. triangle.right < circle.left ||
  114534. triangle.top > circle.bottom ||
  114535. triangle.bottom < circle.top)
  114536. {
  114537. return false;
  114538. }
  114539. if (Contains(triangle, circle.x, circle.y))
  114540. {
  114541. return true;
  114542. }
  114543. if (LineToCircle(triangle.getLineA(), circle))
  114544. {
  114545. return true;
  114546. }
  114547. if (LineToCircle(triangle.getLineB(), circle))
  114548. {
  114549. return true;
  114550. }
  114551. if (LineToCircle(triangle.getLineC(), circle))
  114552. {
  114553. return true;
  114554. }
  114555. return false;
  114556. };
  114557. module.exports = TriangleToCircle;
  114558. /***/ }),
  114559. /* 719 */
  114560. /***/ (function(module, exports) {
  114561. /**
  114562. * @author Richard Davey <rich@photonstorm.com>
  114563. * @copyright 2019 Photon Storm Ltd.
  114564. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114565. */
  114566. /**
  114567. * Check if rectangle intersects with values.
  114568. *
  114569. * @function Phaser.Geom.Intersects.RectangleToValues
  114570. * @since 3.0.0
  114571. *
  114572. * @param {Phaser.Geom.Rectangle} rect - The rectangle object
  114573. * @param {number} left - The x coordinate of the left of the Rectangle.
  114574. * @param {number} right - The x coordinate of the right of the Rectangle.
  114575. * @param {number} top - The y coordinate of the top of the Rectangle.
  114576. * @param {number} bottom - The y coordinate of the bottom of the Rectangle.
  114577. * @param {number} [tolerance=0] - Tolerance allowed in the calculation, expressed in pixels.
  114578. *
  114579. * @return {boolean} Returns true if there is an intersection.
  114580. */
  114581. var RectangleToValues = function (rect, left, right, top, bottom, tolerance)
  114582. {
  114583. if (tolerance === undefined) { tolerance = 0; }
  114584. return !(
  114585. left > rect.right + tolerance ||
  114586. right < rect.left - tolerance ||
  114587. top > rect.bottom + tolerance ||
  114588. bottom < rect.top - tolerance
  114589. );
  114590. };
  114591. module.exports = RectangleToValues;
  114592. /***/ }),
  114593. /* 720 */
  114594. /***/ (function(module, exports, __webpack_require__) {
  114595. /**
  114596. * @author Richard Davey <rich@photonstorm.com>
  114597. * @copyright 2019 Photon Storm Ltd.
  114598. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114599. */
  114600. var LineToLine = __webpack_require__(115);
  114601. var Contains = __webpack_require__(42);
  114602. var ContainsArray = __webpack_require__(157);
  114603. var Decompose = __webpack_require__(275);
  114604. /**
  114605. * Checks for intersection between Rectangle shape and Triangle shape.
  114606. *
  114607. * @function Phaser.Geom.Intersects.RectangleToTriangle
  114608. * @since 3.0.0
  114609. *
  114610. * @param {Phaser.Geom.Rectangle} rect - Rectangle object to test.
  114611. * @param {Phaser.Geom.Triangle} triangle - Triangle object to test.
  114612. *
  114613. * @return {boolean} A value of `true` if objects intersect; otherwise `false`.
  114614. */
  114615. var RectangleToTriangle = function (rect, triangle)
  114616. {
  114617. // First the cheapest ones:
  114618. if (
  114619. triangle.left > rect.right ||
  114620. triangle.right < rect.left ||
  114621. triangle.top > rect.bottom ||
  114622. triangle.bottom < rect.top)
  114623. {
  114624. return false;
  114625. }
  114626. var triA = triangle.getLineA();
  114627. var triB = triangle.getLineB();
  114628. var triC = triangle.getLineC();
  114629. // Are any of the triangle points within the rectangle?
  114630. if (Contains(rect, triA.x1, triA.y1) || Contains(rect, triA.x2, triA.y2))
  114631. {
  114632. return true;
  114633. }
  114634. if (Contains(rect, triB.x1, triB.y1) || Contains(rect, triB.x2, triB.y2))
  114635. {
  114636. return true;
  114637. }
  114638. if (Contains(rect, triC.x1, triC.y1) || Contains(rect, triC.x2, triC.y2))
  114639. {
  114640. return true;
  114641. }
  114642. // Cheap tests over, now to see if any of the lines intersect ...
  114643. var rectA = rect.getLineA();
  114644. var rectB = rect.getLineB();
  114645. var rectC = rect.getLineC();
  114646. var rectD = rect.getLineD();
  114647. if (LineToLine(triA, rectA) || LineToLine(triA, rectB) || LineToLine(triA, rectC) || LineToLine(triA, rectD))
  114648. {
  114649. return true;
  114650. }
  114651. if (LineToLine(triB, rectA) || LineToLine(triB, rectB) || LineToLine(triB, rectC) || LineToLine(triB, rectD))
  114652. {
  114653. return true;
  114654. }
  114655. if (LineToLine(triC, rectA) || LineToLine(triC, rectB) || LineToLine(triC, rectC) || LineToLine(triC, rectD))
  114656. {
  114657. return true;
  114658. }
  114659. // None of the lines intersect, so are any rectangle points within the triangle?
  114660. var points = Decompose(rect);
  114661. var within = ContainsArray(triangle, points, true);
  114662. return (within.length > 0);
  114663. };
  114664. module.exports = RectangleToTriangle;
  114665. /***/ }),
  114666. /* 721 */
  114667. /***/ (function(module, exports, __webpack_require__) {
  114668. /**
  114669. * @author Richard Davey <rich@photonstorm.com>
  114670. * @copyright 2019 Photon Storm Ltd.
  114671. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114672. */
  114673. var PointToLine = __webpack_require__(276);
  114674. /**
  114675. * Checks if a Point is located on the given line segment.
  114676. *
  114677. * @function Phaser.Geom.Intersects.PointToLineSegment
  114678. * @since 3.0.0
  114679. *
  114680. * @param {Phaser.Geom.Point} point - The Point to check for intersection.
  114681. * @param {Phaser.Geom.Line} line - The line segment to check for intersection.
  114682. *
  114683. * @return {boolean} `true` if the Point is on the given line segment, otherwise `false`.
  114684. */
  114685. var PointToLineSegment = function (point, line)
  114686. {
  114687. if (!PointToLine(point, line))
  114688. {
  114689. return false;
  114690. }
  114691. var xMin = Math.min(line.x1, line.x2);
  114692. var xMax = Math.max(line.x1, line.x2);
  114693. var yMin = Math.min(line.y1, line.y2);
  114694. var yMax = Math.max(line.y1, line.y2);
  114695. return ((point.x >= xMin && point.x <= xMax) && (point.y >= yMin && point.y <= yMax));
  114696. };
  114697. module.exports = PointToLineSegment;
  114698. /***/ }),
  114699. /* 722 */
  114700. /***/ (function(module, exports) {
  114701. /**
  114702. * @author Richard Davey <rich@photonstorm.com>
  114703. * @copyright 2019 Photon Storm Ltd.
  114704. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114705. */
  114706. /**
  114707. * Checks for intersection between the Line and a Rectangle shape, or a rectangle-like
  114708. * object, with public `x`, `y`, `right` and `bottom` properties, such as a Sprite or Body.
  114709. *
  114710. * An intersection is considered valid if:
  114711. *
  114712. * The line starts within, or ends within, the Rectangle.
  114713. * The line segment intersects one of the 4 rectangle edges.
  114714. *
  114715. * The for the purposes of this function rectangles are considered 'solid'.
  114716. *
  114717. * @function Phaser.Geom.Intersects.LineToRectangle
  114718. * @since 3.0.0
  114719. *
  114720. * @param {Phaser.Geom.Line} line - The Line to check for intersection.
  114721. * @param {(Phaser.Geom.Rectangle|object)} rect - The Rectangle to check for intersection.
  114722. *
  114723. * @return {boolean} `true` if the Line and the Rectangle intersect, `false` otherwise.
  114724. */
  114725. var LineToRectangle = function (line, rect)
  114726. {
  114727. var x1 = line.x1;
  114728. var y1 = line.y1;
  114729. var x2 = line.x2;
  114730. var y2 = line.y2;
  114731. var bx1 = rect.x;
  114732. var by1 = rect.y;
  114733. var bx2 = rect.right;
  114734. var by2 = rect.bottom;
  114735. var t = 0;
  114736. // If the start or end of the line is inside the rect then we assume
  114737. // collision, as rects are solid for our use-case.
  114738. if ((x1 >= bx1 && x1 <= bx2 && y1 >= by1 && y1 <= by2) ||
  114739. (x2 >= bx1 && x2 <= bx2 && y2 >= by1 && y2 <= by2))
  114740. {
  114741. return true;
  114742. }
  114743. if (x1 < bx1 && x2 >= bx1)
  114744. {
  114745. // Left edge
  114746. t = y1 + (y2 - y1) * (bx1 - x1) / (x2 - x1);
  114747. if (t > by1 && t <= by2)
  114748. {
  114749. return true;
  114750. }
  114751. }
  114752. else if (x1 > bx2 && x2 <= bx2)
  114753. {
  114754. // Right edge
  114755. t = y1 + (y2 - y1) * (bx2 - x1) / (x2 - x1);
  114756. if (t >= by1 && t <= by2)
  114757. {
  114758. return true;
  114759. }
  114760. }
  114761. if (y1 < by1 && y2 >= by1)
  114762. {
  114763. // Top edge
  114764. t = x1 + (x2 - x1) * (by1 - y1) / (y2 - y1);
  114765. if (t >= bx1 && t <= bx2)
  114766. {
  114767. return true;
  114768. }
  114769. }
  114770. else if (y1 > by2 && y2 <= by2)
  114771. {
  114772. // Bottom edge
  114773. t = x1 + (x2 - x1) * (by2 - y1) / (y2 - y1);
  114774. if (t >= bx1 && t <= bx2)
  114775. {
  114776. return true;
  114777. }
  114778. }
  114779. return false;
  114780. };
  114781. module.exports = LineToRectangle;
  114782. /***/ }),
  114783. /* 723 */
  114784. /***/ (function(module, exports, __webpack_require__) {
  114785. /**
  114786. * @author Richard Davey <rich@photonstorm.com>
  114787. * @copyright 2019 Photon Storm Ltd.
  114788. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114789. */
  114790. var Rectangle = __webpack_require__(10);
  114791. var RectangleToRectangle = __webpack_require__(158);
  114792. /**
  114793. * Checks if two Rectangle shapes intersect and returns the area of this intersection as Rectangle object.
  114794. *
  114795. * If optional `output` parameter is omitted, new Rectangle object is created and returned. If there is intersection, it will contain intersection area. If there is no intersection, it wil be empty Rectangle (all values set to zero).
  114796. *
  114797. * If Rectangle object is passed as `output` and there is intersection, then intersection area data will be loaded into it and it will be returned. If there is no intersetion, it will be returned without any change.
  114798. *
  114799. * @function Phaser.Geom.Intersects.GetRectangleIntersection
  114800. * @since 3.0.0
  114801. *
  114802. * @generic {Phaser.Geom.Rectangle} O - [output,$return]
  114803. *
  114804. * @param {Phaser.Geom.Rectangle} rectA - The first Rectangle object.
  114805. * @param {Phaser.Geom.Rectangle} rectB - The second Rectangle object.
  114806. * @param {Phaser.Geom.Rectangle} [output] - Optional Rectangle object. If given, the intersection data will be loaded into it (in case of no intersection, it will be left unchanged). Otherwise, new Rectangle object will be created and returned with either intersection data or empty (all values set to zero), if there is no intersection.
  114807. *
  114808. * @return {Phaser.Geom.Rectangle} A rectangle object with intersection data.
  114809. */
  114810. var GetRectangleIntersection = function (rectA, rectB, output)
  114811. {
  114812. if (output === undefined) { output = new Rectangle(); }
  114813. if (RectangleToRectangle(rectA, rectB))
  114814. {
  114815. output.x = Math.max(rectA.x, rectB.x);
  114816. output.y = Math.max(rectA.y, rectB.y);
  114817. output.width = Math.min(rectA.right, rectB.right) - output.x;
  114818. output.height = Math.min(rectA.bottom, rectB.bottom) - output.y;
  114819. }
  114820. return output;
  114821. };
  114822. module.exports = GetRectangleIntersection;
  114823. /***/ }),
  114824. /* 724 */
  114825. /***/ (function(module, exports) {
  114826. /**
  114827. * @author Richard Davey <rich@photonstorm.com>
  114828. * @copyright 2019 Photon Storm Ltd.
  114829. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114830. */
  114831. /**
  114832. * Checks for intersection between a circle and a rectangle.
  114833. *
  114834. * @function Phaser.Geom.Intersects.CircleToRectangle
  114835. * @since 3.0.0
  114836. *
  114837. * @param {Phaser.Geom.Circle} circle - The circle to be checked.
  114838. * @param {Phaser.Geom.Rectangle} rect - The rectangle to be checked.
  114839. *
  114840. * @return {boolean} `true` if the two objects intersect, otherwise `false`.
  114841. */
  114842. var CircleToRectangle = function (circle, rect)
  114843. {
  114844. var halfWidth = rect.width / 2;
  114845. var halfHeight = rect.height / 2;
  114846. var cx = Math.abs(circle.x - rect.x - halfWidth);
  114847. var cy = Math.abs(circle.y - rect.y - halfHeight);
  114848. var xDist = halfWidth + circle.radius;
  114849. var yDist = halfHeight + circle.radius;
  114850. if (cx > xDist || cy > yDist)
  114851. {
  114852. return false;
  114853. }
  114854. else if (cx <= halfWidth || cy <= halfHeight)
  114855. {
  114856. return true;
  114857. }
  114858. else
  114859. {
  114860. var xCornerDist = cx - halfWidth;
  114861. var yCornerDist = cy - halfHeight;
  114862. var xCornerDistSq = xCornerDist * xCornerDist;
  114863. var yCornerDistSq = yCornerDist * yCornerDist;
  114864. var maxCornerDistSq = circle.radius * circle.radius;
  114865. return (xCornerDistSq + yCornerDistSq <= maxCornerDistSq);
  114866. }
  114867. };
  114868. module.exports = CircleToRectangle;
  114869. /***/ }),
  114870. /* 725 */
  114871. /***/ (function(module, exports, __webpack_require__) {
  114872. /**
  114873. * @author Richard Davey <rich@photonstorm.com>
  114874. * @copyright 2019 Photon Storm Ltd.
  114875. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114876. */
  114877. var DistanceBetween = __webpack_require__(56);
  114878. /**
  114879. * Checks if two Circles intersect.
  114880. *
  114881. * @function Phaser.Geom.Intersects.CircleToCircle
  114882. * @since 3.0.0
  114883. *
  114884. * @param {Phaser.Geom.Circle} circleA - The first Circle to check for intersection.
  114885. * @param {Phaser.Geom.Circle} circleB - The second Circle to check for intersection.
  114886. *
  114887. * @return {boolean} `true` if the two Circles intersect, otherwise `false`.
  114888. */
  114889. var CircleToCircle = function (circleA, circleB)
  114890. {
  114891. return (DistanceBetween(circleA.x, circleA.y, circleB.x, circleB.y) <= (circleA.radius + circleB.radius));
  114892. };
  114893. module.exports = CircleToCircle;
  114894. /***/ }),
  114895. /* 726 */
  114896. /***/ (function(module, exports) {
  114897. /**
  114898. * @author Richard Davey <rich@photonstorm.com>
  114899. * @copyright 2019 Photon Storm Ltd.
  114900. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114901. */
  114902. /**
  114903. * Offsets the Ellipse by the values given in the `x` and `y` properties of the Point object.
  114904. *
  114905. * @function Phaser.Geom.Ellipse.OffsetPoint
  114906. * @since 3.0.0
  114907. *
  114908. * @generic {Phaser.Geom.Ellipse} O - [ellipse,$return]
  114909. *
  114910. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to be offset (translated.)
  114911. * @param {(Phaser.Geom.Point|object)} point - The Point object containing the values to offset the Ellipse by.
  114912. *
  114913. * @return {Phaser.Geom.Ellipse} The Ellipse that was offset.
  114914. */
  114915. var OffsetPoint = function (ellipse, point)
  114916. {
  114917. ellipse.x += point.x;
  114918. ellipse.y += point.y;
  114919. return ellipse;
  114920. };
  114921. module.exports = OffsetPoint;
  114922. /***/ }),
  114923. /* 727 */
  114924. /***/ (function(module, exports) {
  114925. /**
  114926. * @author Richard Davey <rich@photonstorm.com>
  114927. * @copyright 2019 Photon Storm Ltd.
  114928. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114929. */
  114930. /**
  114931. * Offsets the Ellipse by the values given.
  114932. *
  114933. * @function Phaser.Geom.Ellipse.Offset
  114934. * @since 3.0.0
  114935. *
  114936. * @generic {Phaser.Geom.Ellipse} O - [ellipse,$return]
  114937. *
  114938. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to be offset (translated.)
  114939. * @param {number} x - The amount to horizontally offset the Ellipse by.
  114940. * @param {number} y - The amount to vertically offset the Ellipse by.
  114941. *
  114942. * @return {Phaser.Geom.Ellipse} The Ellipse that was offset.
  114943. */
  114944. var Offset = function (ellipse, x, y)
  114945. {
  114946. ellipse.x += x;
  114947. ellipse.y += y;
  114948. return ellipse;
  114949. };
  114950. module.exports = Offset;
  114951. /***/ }),
  114952. /* 728 */
  114953. /***/ (function(module, exports, __webpack_require__) {
  114954. /**
  114955. * @author Richard Davey <rich@photonstorm.com>
  114956. * @copyright 2019 Photon Storm Ltd.
  114957. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114958. */
  114959. var Rectangle = __webpack_require__(10);
  114960. /**
  114961. * Returns the bounds of the Ellipse object.
  114962. *
  114963. * @function Phaser.Geom.Ellipse.GetBounds
  114964. * @since 3.0.0
  114965. *
  114966. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  114967. *
  114968. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the bounds from.
  114969. * @param {(Phaser.Geom.Rectangle|object)} [out] - A Rectangle, or rectangle-like object, to store the ellipse bounds in. If not given a new Rectangle will be created.
  114970. *
  114971. * @return {(Phaser.Geom.Rectangle|object)} The Rectangle object containing the Ellipse bounds.
  114972. */
  114973. var GetBounds = function (ellipse, out)
  114974. {
  114975. if (out === undefined) { out = new Rectangle(); }
  114976. out.x = ellipse.left;
  114977. out.y = ellipse.top;
  114978. out.width = ellipse.width;
  114979. out.height = ellipse.height;
  114980. return out;
  114981. };
  114982. module.exports = GetBounds;
  114983. /***/ }),
  114984. /* 729 */
  114985. /***/ (function(module, exports) {
  114986. /**
  114987. * @author Richard Davey <rich@photonstorm.com>
  114988. * @copyright 2019 Photon Storm Ltd.
  114989. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114990. */
  114991. /**
  114992. * Compares the `x`, `y`, `width` and `height` properties of the two given Ellipses.
  114993. * Returns `true` if they all match, otherwise returns `false`.
  114994. *
  114995. * @function Phaser.Geom.Ellipse.Equals
  114996. * @since 3.0.0
  114997. *
  114998. * @param {Phaser.Geom.Ellipse} ellipse - The first Ellipse to compare.
  114999. * @param {Phaser.Geom.Ellipse} toCompare - The second Ellipse to compare.
  115000. *
  115001. * @return {boolean} `true` if the two Ellipse equal each other, otherwise `false`.
  115002. */
  115003. var Equals = function (ellipse, toCompare)
  115004. {
  115005. return (
  115006. ellipse.x === toCompare.x &&
  115007. ellipse.y === toCompare.y &&
  115008. ellipse.width === toCompare.width &&
  115009. ellipse.height === toCompare.height
  115010. );
  115011. };
  115012. module.exports = Equals;
  115013. /***/ }),
  115014. /* 730 */
  115015. /***/ (function(module, exports) {
  115016. /**
  115017. * @author Richard Davey <rich@photonstorm.com>
  115018. * @copyright 2019 Photon Storm Ltd.
  115019. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115020. */
  115021. /**
  115022. * Copies the `x`, `y`, `width` and `height` properties from the `source` Ellipse
  115023. * into the given `dest` Ellipse, then returns the `dest` Ellipse.
  115024. *
  115025. * @function Phaser.Geom.Ellipse.CopyFrom
  115026. * @since 3.0.0
  115027. *
  115028. * @generic {Phaser.Geom.Ellipse} O - [dest,$return]
  115029. *
  115030. * @param {Phaser.Geom.Ellipse} source - The source Ellipse to copy the values from.
  115031. * @param {Phaser.Geom.Ellipse} dest - The destination Ellipse to copy the values to.
  115032. *
  115033. * @return {Phaser.Geom.Ellipse} The destination Ellipse.
  115034. */
  115035. var CopyFrom = function (source, dest)
  115036. {
  115037. return dest.setTo(source.x, source.y, source.width, source.height);
  115038. };
  115039. module.exports = CopyFrom;
  115040. /***/ }),
  115041. /* 731 */
  115042. /***/ (function(module, exports, __webpack_require__) {
  115043. /**
  115044. * @author Richard Davey <rich@photonstorm.com>
  115045. * @copyright 2019 Photon Storm Ltd.
  115046. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115047. */
  115048. var Contains = __webpack_require__(95);
  115049. /**
  115050. * Check to see if the Ellipse contains all four points of the given Rectangle object.
  115051. *
  115052. * @function Phaser.Geom.Ellipse.ContainsRect
  115053. * @since 3.0.0
  115054. *
  115055. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to check.
  115056. * @param {(Phaser.Geom.Rectangle|object)} rect - The Rectangle object to check if it's within the Ellipse or not.
  115057. *
  115058. * @return {boolean} True if all of the Rectangle coordinates are within the ellipse, otherwise false.
  115059. */
  115060. var ContainsRect = function (ellipse, rect)
  115061. {
  115062. return (
  115063. Contains(ellipse, rect.x, rect.y) &&
  115064. Contains(ellipse, rect.right, rect.y) &&
  115065. Contains(ellipse, rect.x, rect.bottom) &&
  115066. Contains(ellipse, rect.right, rect.bottom)
  115067. );
  115068. };
  115069. module.exports = ContainsRect;
  115070. /***/ }),
  115071. /* 732 */
  115072. /***/ (function(module, exports, __webpack_require__) {
  115073. /**
  115074. * @author Richard Davey <rich@photonstorm.com>
  115075. * @copyright 2019 Photon Storm Ltd.
  115076. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115077. */
  115078. var Contains = __webpack_require__(95);
  115079. /**
  115080. * Check to see if the Ellipse contains the given Point object.
  115081. *
  115082. * @function Phaser.Geom.Ellipse.ContainsPoint
  115083. * @since 3.0.0
  115084. *
  115085. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to check.
  115086. * @param {(Phaser.Geom.Point|object)} point - The Point object to check if it's within the Circle or not.
  115087. *
  115088. * @return {boolean} True if the Point coordinates are within the circle, otherwise false.
  115089. */
  115090. var ContainsPoint = function (ellipse, point)
  115091. {
  115092. return Contains(ellipse, point.x, point.y);
  115093. };
  115094. module.exports = ContainsPoint;
  115095. /***/ }),
  115096. /* 733 */
  115097. /***/ (function(module, exports, __webpack_require__) {
  115098. /**
  115099. * @author Richard Davey <rich@photonstorm.com>
  115100. * @copyright 2019 Photon Storm Ltd.
  115101. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115102. */
  115103. var Ellipse = __webpack_require__(96);
  115104. /**
  115105. * Creates a new Ellipse instance based on the values contained in the given source.
  115106. *
  115107. * @function Phaser.Geom.Ellipse.Clone
  115108. * @since 3.0.0
  115109. *
  115110. * @param {Phaser.Geom.Ellipse} source - The Ellipse to be cloned. Can be an instance of an Ellipse or a ellipse-like object, with x, y, width and height properties.
  115111. *
  115112. * @return {Phaser.Geom.Ellipse} A clone of the source Ellipse.
  115113. */
  115114. var Clone = function (source)
  115115. {
  115116. return new Ellipse(source.x, source.y, source.width, source.height);
  115117. };
  115118. module.exports = Clone;
  115119. /***/ }),
  115120. /* 734 */
  115121. /***/ (function(module, exports) {
  115122. /**
  115123. * @author Richard Davey <rich@photonstorm.com>
  115124. * @copyright 2019 Photon Storm Ltd.
  115125. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115126. */
  115127. /**
  115128. * Calculates the area of the Ellipse.
  115129. *
  115130. * @function Phaser.Geom.Ellipse.Area
  115131. * @since 3.0.0
  115132. *
  115133. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the area of.
  115134. *
  115135. * @return {number} The area of the Ellipse.
  115136. */
  115137. var Area = function (ellipse)
  115138. {
  115139. if (ellipse.isEmpty())
  115140. {
  115141. return 0;
  115142. }
  115143. // units squared
  115144. return (ellipse.getMajorRadius() * ellipse.getMinorRadius() * Math.PI);
  115145. };
  115146. module.exports = Area;
  115147. /***/ }),
  115148. /* 735 */
  115149. /***/ (function(module, exports, __webpack_require__) {
  115150. /**
  115151. * @author Richard Davey <rich@photonstorm.com>
  115152. * @copyright 2019 Photon Storm Ltd.
  115153. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115154. */
  115155. var Ellipse = __webpack_require__(96);
  115156. Ellipse.Area = __webpack_require__(734);
  115157. Ellipse.Circumference = __webpack_require__(309);
  115158. Ellipse.CircumferencePoint = __webpack_require__(166);
  115159. Ellipse.Clone = __webpack_require__(733);
  115160. Ellipse.Contains = __webpack_require__(95);
  115161. Ellipse.ContainsPoint = __webpack_require__(732);
  115162. Ellipse.ContainsRect = __webpack_require__(731);
  115163. Ellipse.CopyFrom = __webpack_require__(730);
  115164. Ellipse.Equals = __webpack_require__(729);
  115165. Ellipse.GetBounds = __webpack_require__(728);
  115166. Ellipse.GetPoint = __webpack_require__(311);
  115167. Ellipse.GetPoints = __webpack_require__(310);
  115168. Ellipse.Offset = __webpack_require__(727);
  115169. Ellipse.OffsetPoint = __webpack_require__(726);
  115170. Ellipse.Random = __webpack_require__(199);
  115171. module.exports = Ellipse;
  115172. /***/ }),
  115173. /* 736 */
  115174. /***/ (function(module, exports) {
  115175. /**
  115176. * @author Richard Davey <rich@photonstorm.com>
  115177. * @copyright 2019 Photon Storm Ltd.
  115178. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115179. */
  115180. /**
  115181. * Offsets the Circle by the values given in the `x` and `y` properties of the Point object.
  115182. *
  115183. * @function Phaser.Geom.Circle.OffsetPoint
  115184. * @since 3.0.0
  115185. *
  115186. * @generic {Phaser.Geom.Circle} O - [circle,$return]
  115187. *
  115188. * @param {Phaser.Geom.Circle} circle - The Circle to be offset (translated.)
  115189. * @param {(Phaser.Geom.Point|object)} point - The Point object containing the values to offset the Circle by.
  115190. *
  115191. * @return {Phaser.Geom.Circle} The Circle that was offset.
  115192. */
  115193. var OffsetPoint = function (circle, point)
  115194. {
  115195. circle.x += point.x;
  115196. circle.y += point.y;
  115197. return circle;
  115198. };
  115199. module.exports = OffsetPoint;
  115200. /***/ }),
  115201. /* 737 */
  115202. /***/ (function(module, exports) {
  115203. /**
  115204. * @author Richard Davey <rich@photonstorm.com>
  115205. * @copyright 2019 Photon Storm Ltd.
  115206. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115207. */
  115208. /**
  115209. * Offsets the Circle by the values given.
  115210. *
  115211. * @function Phaser.Geom.Circle.Offset
  115212. * @since 3.0.0
  115213. *
  115214. * @generic {Phaser.Geom.Circle} O - [circle,$return]
  115215. *
  115216. * @param {Phaser.Geom.Circle} circle - The Circle to be offset (translated.)
  115217. * @param {number} x - The amount to horizontally offset the Circle by.
  115218. * @param {number} y - The amount to vertically offset the Circle by.
  115219. *
  115220. * @return {Phaser.Geom.Circle} The Circle that was offset.
  115221. */
  115222. var Offset = function (circle, x, y)
  115223. {
  115224. circle.x += x;
  115225. circle.y += y;
  115226. return circle;
  115227. };
  115228. module.exports = Offset;
  115229. /***/ }),
  115230. /* 738 */
  115231. /***/ (function(module, exports, __webpack_require__) {
  115232. /**
  115233. * @author Richard Davey <rich@photonstorm.com>
  115234. * @copyright 2019 Photon Storm Ltd.
  115235. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115236. */
  115237. var Rectangle = __webpack_require__(10);
  115238. /**
  115239. * Returns the bounds of the Circle object.
  115240. *
  115241. * @function Phaser.Geom.Circle.GetBounds
  115242. * @since 3.0.0
  115243. *
  115244. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  115245. *
  115246. * @param {Phaser.Geom.Circle} circle - The Circle to get the bounds from.
  115247. * @param {(Phaser.Geom.Rectangle|object)} [out] - A Rectangle, or rectangle-like object, to store the circle bounds in. If not given a new Rectangle will be created.
  115248. *
  115249. * @return {(Phaser.Geom.Rectangle|object)} The Rectangle object containing the Circles bounds.
  115250. */
  115251. var GetBounds = function (circle, out)
  115252. {
  115253. if (out === undefined) { out = new Rectangle(); }
  115254. out.x = circle.left;
  115255. out.y = circle.top;
  115256. out.width = circle.diameter;
  115257. out.height = circle.diameter;
  115258. return out;
  115259. };
  115260. module.exports = GetBounds;
  115261. /***/ }),
  115262. /* 739 */
  115263. /***/ (function(module, exports) {
  115264. /**
  115265. * @author Richard Davey <rich@photonstorm.com>
  115266. * @copyright 2019 Photon Storm Ltd.
  115267. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115268. */
  115269. /**
  115270. * Compares the `x`, `y` and `radius` properties of the two given Circles.
  115271. * Returns `true` if they all match, otherwise returns `false`.
  115272. *
  115273. * @function Phaser.Geom.Circle.Equals
  115274. * @since 3.0.0
  115275. *
  115276. * @param {Phaser.Geom.Circle} circle - The first Circle to compare.
  115277. * @param {Phaser.Geom.Circle} toCompare - The second Circle to compare.
  115278. *
  115279. * @return {boolean} `true` if the two Circles equal each other, otherwise `false`.
  115280. */
  115281. var Equals = function (circle, toCompare)
  115282. {
  115283. return (
  115284. circle.x === toCompare.x &&
  115285. circle.y === toCompare.y &&
  115286. circle.radius === toCompare.radius
  115287. );
  115288. };
  115289. module.exports = Equals;
  115290. /***/ }),
  115291. /* 740 */
  115292. /***/ (function(module, exports) {
  115293. /**
  115294. * @author Richard Davey <rich@photonstorm.com>
  115295. * @copyright 2019 Photon Storm Ltd.
  115296. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115297. */
  115298. /**
  115299. * Copies the `x`, `y` and `radius` properties from the `source` Circle
  115300. * into the given `dest` Circle, then returns the `dest` Circle.
  115301. *
  115302. * @function Phaser.Geom.Circle.CopyFrom
  115303. * @since 3.0.0
  115304. *
  115305. * @generic {Phaser.Geom.Circle} O - [dest,$return]
  115306. *
  115307. * @param {Phaser.Geom.Circle} source - The source Circle to copy the values from.
  115308. * @param {Phaser.Geom.Circle} dest - The destination Circle to copy the values to.
  115309. *
  115310. * @return {Phaser.Geom.Circle} The destination Circle.
  115311. */
  115312. var CopyFrom = function (source, dest)
  115313. {
  115314. return dest.setTo(source.x, source.y, source.radius);
  115315. };
  115316. module.exports = CopyFrom;
  115317. /***/ }),
  115318. /* 741 */
  115319. /***/ (function(module, exports, __webpack_require__) {
  115320. /**
  115321. * @author Richard Davey <rich@photonstorm.com>
  115322. * @copyright 2019 Photon Storm Ltd.
  115323. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115324. */
  115325. var Contains = __webpack_require__(43);
  115326. /**
  115327. * Check to see if the Circle contains all four points of the given Rectangle object.
  115328. *
  115329. * @function Phaser.Geom.Circle.ContainsRect
  115330. * @since 3.0.0
  115331. *
  115332. * @param {Phaser.Geom.Circle} circle - The Circle to check.
  115333. * @param {(Phaser.Geom.Rectangle|object)} rect - The Rectangle object to check if it's within the Circle or not.
  115334. *
  115335. * @return {boolean} True if all of the Rectangle coordinates are within the circle, otherwise false.
  115336. */
  115337. var ContainsRect = function (circle, rect)
  115338. {
  115339. return (
  115340. Contains(circle, rect.x, rect.y) &&
  115341. Contains(circle, rect.right, rect.y) &&
  115342. Contains(circle, rect.x, rect.bottom) &&
  115343. Contains(circle, rect.right, rect.bottom)
  115344. );
  115345. };
  115346. module.exports = ContainsRect;
  115347. /***/ }),
  115348. /* 742 */
  115349. /***/ (function(module, exports, __webpack_require__) {
  115350. /**
  115351. * @author Richard Davey <rich@photonstorm.com>
  115352. * @copyright 2019 Photon Storm Ltd.
  115353. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115354. */
  115355. var Contains = __webpack_require__(43);
  115356. /**
  115357. * Check to see if the Circle contains the given Point object.
  115358. *
  115359. * @function Phaser.Geom.Circle.ContainsPoint
  115360. * @since 3.0.0
  115361. *
  115362. * @param {Phaser.Geom.Circle} circle - The Circle to check.
  115363. * @param {(Phaser.Geom.Point|object)} point - The Point object to check if it's within the Circle or not.
  115364. *
  115365. * @return {boolean} True if the Point coordinates are within the circle, otherwise false.
  115366. */
  115367. var ContainsPoint = function (circle, point)
  115368. {
  115369. return Contains(circle, point.x, point.y);
  115370. };
  115371. module.exports = ContainsPoint;
  115372. /***/ }),
  115373. /* 743 */
  115374. /***/ (function(module, exports, __webpack_require__) {
  115375. /**
  115376. * @author Richard Davey <rich@photonstorm.com>
  115377. * @copyright 2019 Photon Storm Ltd.
  115378. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115379. */
  115380. var Circle = __webpack_require__(77);
  115381. /**
  115382. * Creates a new Circle instance based on the values contained in the given source.
  115383. *
  115384. * @function Phaser.Geom.Circle.Clone
  115385. * @since 3.0.0
  115386. *
  115387. * @param {(Phaser.Geom.Circle|object)} source - The Circle to be cloned. Can be an instance of a Circle or a circle-like object, with x, y and radius properties.
  115388. *
  115389. * @return {Phaser.Geom.Circle} A clone of the source Circle.
  115390. */
  115391. var Clone = function (source)
  115392. {
  115393. return new Circle(source.x, source.y, source.radius);
  115394. };
  115395. module.exports = Clone;
  115396. /***/ }),
  115397. /* 744 */
  115398. /***/ (function(module, exports) {
  115399. /**
  115400. * @author Richard Davey <rich@photonstorm.com>
  115401. * @copyright 2019 Photon Storm Ltd.
  115402. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115403. */
  115404. /**
  115405. * Calculates the area of the circle.
  115406. *
  115407. * @function Phaser.Geom.Circle.Area
  115408. * @since 3.0.0
  115409. *
  115410. * @param {Phaser.Geom.Circle} circle - The Circle to get the area of.
  115411. *
  115412. * @return {number} The area of the Circle.
  115413. */
  115414. var Area = function (circle)
  115415. {
  115416. return (circle.radius > 0) ? Math.PI * circle.radius * circle.radius : 0;
  115417. };
  115418. module.exports = Area;
  115419. /***/ }),
  115420. /* 745 */
  115421. /***/ (function(module, exports, __webpack_require__) {
  115422. /**
  115423. * @author Richard Davey <rich@photonstorm.com>
  115424. * @copyright 2019 Photon Storm Ltd.
  115425. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115426. */
  115427. var Circle = __webpack_require__(77);
  115428. Circle.Area = __webpack_require__(744);
  115429. Circle.Circumference = __webpack_require__(436);
  115430. Circle.CircumferencePoint = __webpack_require__(207);
  115431. Circle.Clone = __webpack_require__(743);
  115432. Circle.Contains = __webpack_require__(43);
  115433. Circle.ContainsPoint = __webpack_require__(742);
  115434. Circle.ContainsRect = __webpack_require__(741);
  115435. Circle.CopyFrom = __webpack_require__(740);
  115436. Circle.Equals = __webpack_require__(739);
  115437. Circle.GetBounds = __webpack_require__(738);
  115438. Circle.GetPoint = __webpack_require__(438);
  115439. Circle.GetPoints = __webpack_require__(437);
  115440. Circle.Offset = __webpack_require__(737);
  115441. Circle.OffsetPoint = __webpack_require__(736);
  115442. Circle.Random = __webpack_require__(206);
  115443. module.exports = Circle;
  115444. /***/ }),
  115445. /* 746 */
  115446. /***/ (function(module, exports, __webpack_require__) {
  115447. /**
  115448. * @author Richard Davey <rich@photonstorm.com>
  115449. * @copyright 2019 Photon Storm Ltd.
  115450. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115451. */
  115452. var Class = __webpack_require__(0);
  115453. var LightsManager = __webpack_require__(280);
  115454. var PluginCache = __webpack_require__(17);
  115455. var SceneEvents = __webpack_require__(16);
  115456. /**
  115457. * @classdesc
  115458. * A Scene plugin that provides a {@link Phaser.GameObjects.LightsManager} for the Light2D pipeline.
  115459. *
  115460. * Available from within a Scene via `this.lights`.
  115461. *
  115462. * Add Lights using the {@link Phaser.GameObjects.LightsManager#addLight} method:
  115463. *
  115464. * ```javascript
  115465. * // Enable the Lights Manager because it is disabled by default
  115466. * this.lights.enable();
  115467. *
  115468. * // Create a Light at [400, 300] with a radius of 200
  115469. * this.lights.addLight(400, 300, 200);
  115470. * ```
  115471. *
  115472. * For Game Objects to be affected by the Lights when rendered, you will need to set them to use the `Light2D` pipeline like so:
  115473. *
  115474. * ```javascript
  115475. * sprite.setPipeline('Light2D');
  115476. * ```
  115477. *
  115478. * @class LightsPlugin
  115479. * @extends Phaser.GameObjects.LightsManager
  115480. * @memberof Phaser.GameObjects
  115481. * @constructor
  115482. * @since 3.0.0
  115483. *
  115484. * @param {Phaser.Scene} scene - The Scene that this Lights Plugin belongs to.
  115485. */
  115486. var LightsPlugin = new Class({
  115487. Extends: LightsManager,
  115488. initialize:
  115489. function LightsPlugin (scene)
  115490. {
  115491. /**
  115492. * A reference to the Scene that this Lights Plugin belongs to.
  115493. *
  115494. * @name Phaser.GameObjects.LightsPlugin#scene
  115495. * @type {Phaser.Scene}
  115496. * @since 3.0.0
  115497. */
  115498. this.scene = scene;
  115499. /**
  115500. * A reference to the Scene's systems.
  115501. *
  115502. * @name Phaser.GameObjects.LightsPlugin#systems
  115503. * @type {Phaser.Scenes.Systems}
  115504. * @since 3.0.0
  115505. */
  115506. this.systems = scene.sys;
  115507. if (!scene.sys.settings.isBooted)
  115508. {
  115509. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  115510. }
  115511. LightsManager.call(this);
  115512. },
  115513. /**
  115514. * Boot the Lights Plugin.
  115515. *
  115516. * @method Phaser.GameObjects.LightsPlugin#boot
  115517. * @since 3.0.0
  115518. */
  115519. boot: function ()
  115520. {
  115521. var eventEmitter = this.systems.events;
  115522. eventEmitter.on(SceneEvents.SHUTDOWN, this.shutdown, this);
  115523. eventEmitter.on(SceneEvents.DESTROY, this.destroy, this);
  115524. },
  115525. /**
  115526. * Destroy the Lights Plugin.
  115527. *
  115528. * Cleans up all references.
  115529. *
  115530. * @method Phaser.GameObjects.LightsPlugin#destroy
  115531. * @since 3.0.0
  115532. */
  115533. destroy: function ()
  115534. {
  115535. this.shutdown();
  115536. this.scene = undefined;
  115537. this.systems = undefined;
  115538. }
  115539. });
  115540. PluginCache.register('LightsPlugin', LightsPlugin, 'lights');
  115541. module.exports = LightsPlugin;
  115542. /***/ }),
  115543. /* 747 */
  115544. /***/ (function(module, exports, __webpack_require__) {
  115545. /**
  115546. * @author Richard Davey <rich@photonstorm.com>
  115547. * @copyright 2019 Photon Storm Ltd.
  115548. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115549. */
  115550. var BuildGameObject = __webpack_require__(30);
  115551. var GameObjectCreator = __webpack_require__(14);
  115552. var GetAdvancedValue = __webpack_require__(12);
  115553. var Quad = __webpack_require__(159);
  115554. /**
  115555. * Creates a new Quad Game Object and returns it.
  115556. *
  115557. * Note: This method will only be available if the Quad Game Object and WebGL support have been built into Phaser.
  115558. *
  115559. * @method Phaser.GameObjects.GameObjectCreator#quad
  115560. * @since 3.0.0
  115561. *
  115562. * @param {object} config - The configuration object this Game Object will use to create itself.
  115563. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  115564. *
  115565. * @return {Phaser.GameObjects.Quad} The Game Object that was created.
  115566. */
  115567. GameObjectCreator.register('quad', function (config, addToScene)
  115568. {
  115569. if (config === undefined) { config = {}; }
  115570. var x = GetAdvancedValue(config, 'x', 0);
  115571. var y = GetAdvancedValue(config, 'y', 0);
  115572. var key = GetAdvancedValue(config, 'key', null);
  115573. var frame = GetAdvancedValue(config, 'frame', null);
  115574. var quad = new Quad(this.scene, x, y, key, frame);
  115575. if (addToScene !== undefined)
  115576. {
  115577. config.add = addToScene;
  115578. }
  115579. BuildGameObject(this.scene, quad, config);
  115580. return quad;
  115581. });
  115582. /***/ }),
  115583. /* 748 */
  115584. /***/ (function(module, exports, __webpack_require__) {
  115585. /**
  115586. * @author Richard Davey <rich@photonstorm.com>
  115587. * @copyright 2019 Photon Storm Ltd.
  115588. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115589. */
  115590. var BuildGameObject = __webpack_require__(30);
  115591. var GameObjectCreator = __webpack_require__(14);
  115592. var GetAdvancedValue = __webpack_require__(12);
  115593. var GetValue = __webpack_require__(4);
  115594. var Mesh = __webpack_require__(116);
  115595. /**
  115596. * Creates a new Mesh Game Object and returns it.
  115597. *
  115598. * Note: This method will only be available if the Mesh Game Object and WebGL support have been built into Phaser.
  115599. *
  115600. * @method Phaser.GameObjects.GameObjectCreator#mesh
  115601. * @since 3.0.0
  115602. *
  115603. * @param {object} config - The configuration object this Game Object will use to create itself.
  115604. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  115605. *
  115606. * @return {Phaser.GameObjects.Mesh} The Game Object that was created.
  115607. */
  115608. GameObjectCreator.register('mesh', function (config, addToScene)
  115609. {
  115610. if (config === undefined) { config = {}; }
  115611. var key = GetAdvancedValue(config, 'key', null);
  115612. var frame = GetAdvancedValue(config, 'frame', null);
  115613. var vertices = GetValue(config, 'vertices', []);
  115614. var colors = GetValue(config, 'colors', []);
  115615. var alphas = GetValue(config, 'alphas', []);
  115616. var uv = GetValue(config, 'uv', []);
  115617. var mesh = new Mesh(this.scene, 0, 0, vertices, uv, colors, alphas, key, frame);
  115618. if (addToScene !== undefined)
  115619. {
  115620. config.add = addToScene;
  115621. }
  115622. BuildGameObject(this.scene, mesh, config);
  115623. return mesh;
  115624. });
  115625. // When registering a factory function 'this' refers to the GameObjectCreator context.
  115626. /***/ }),
  115627. /* 749 */
  115628. /***/ (function(module, exports, __webpack_require__) {
  115629. /**
  115630. * @author Richard Davey <rich@photonstorm.com>
  115631. * @copyright 2019 Photon Storm Ltd.
  115632. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115633. */
  115634. var Quad = __webpack_require__(159);
  115635. var GameObjectFactory = __webpack_require__(5);
  115636. /**
  115637. * Creates a new Quad Game Object and adds it to the Scene.
  115638. *
  115639. * Note: This method will only be available if the Quad Game Object and WebGL support have been built into Phaser.
  115640. *
  115641. * @method Phaser.GameObjects.GameObjectFactory#quad
  115642. * @webglOnly
  115643. * @since 3.0.0
  115644. *
  115645. * @param {number} x - The horizontal position of this Game Object in the world.
  115646. * @param {number} y - The vertical position of this Game Object in the world.
  115647. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  115648. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  115649. *
  115650. * @return {Phaser.GameObjects.Quad} The Game Object that was created.
  115651. */
  115652. if (true)
  115653. {
  115654. GameObjectFactory.register('quad', function (x, y, key, frame)
  115655. {
  115656. return this.displayList.add(new Quad(this.scene, x, y, key, frame));
  115657. });
  115658. }
  115659. // When registering a factory function 'this' refers to the GameObjectFactory context.
  115660. //
  115661. // There are several properties available to use:
  115662. //
  115663. // this.scene - a reference to the Scene that owns the GameObjectFactory
  115664. // this.displayList - a reference to the Display List the Scene owns
  115665. // this.updateList - a reference to the Update List the Scene owns
  115666. /***/ }),
  115667. /* 750 */
  115668. /***/ (function(module, exports, __webpack_require__) {
  115669. /**
  115670. * @author Richard Davey <rich@photonstorm.com>
  115671. * @copyright 2019 Photon Storm Ltd.
  115672. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115673. */
  115674. var Mesh = __webpack_require__(116);
  115675. var GameObjectFactory = __webpack_require__(5);
  115676. /**
  115677. * Creates a new Mesh Game Object and adds it to the Scene.
  115678. *
  115679. * Note: This method will only be available if the Mesh Game Object and WebGL support have been built into Phaser.
  115680. *
  115681. * @method Phaser.GameObjects.GameObjectFactory#mesh
  115682. * @webglOnly
  115683. * @since 3.0.0
  115684. *
  115685. * @param {number} x - The horizontal position of this Game Object in the world.
  115686. * @param {number} y - The vertical position of this Game Object in the world.
  115687. * @param {number[]} vertices - An array containing the vertices data for this Mesh.
  115688. * @param {number[]} uv - An array containing the uv data for this Mesh.
  115689. * @param {number[]} colors - An array containing the color data for this Mesh.
  115690. * @param {number[]} alphas - An array containing the alpha data for this Mesh.
  115691. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  115692. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  115693. *
  115694. * @return {Phaser.GameObjects.Mesh} The Game Object that was created.
  115695. */
  115696. if (true)
  115697. {
  115698. GameObjectFactory.register('mesh', function (x, y, vertices, uv, colors, alphas, texture, frame)
  115699. {
  115700. return this.displayList.add(new Mesh(this.scene, x, y, vertices, uv, colors, alphas, texture, frame));
  115701. });
  115702. }
  115703. // When registering a factory function 'this' refers to the GameObjectFactory context.
  115704. //
  115705. // There are several properties available to use:
  115706. //
  115707. // this.scene - a reference to the Scene that owns the GameObjectFactory
  115708. // this.displayList - a reference to the Display List the Scene owns
  115709. // this.updateList - a reference to the Update List the Scene owns
  115710. /***/ }),
  115711. /* 751 */
  115712. /***/ (function(module, exports) {
  115713. /**
  115714. * @author Richard Davey <rich@photonstorm.com>
  115715. * @copyright 2019 Photon Storm Ltd.
  115716. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115717. */
  115718. /**
  115719. * This is a stub function for Mesh.Render. There is no Canvas renderer for Mesh objects.
  115720. *
  115721. * @method Phaser.GameObjects.Mesh#renderCanvas
  115722. * @since 3.0.0
  115723. * @private
  115724. *
  115725. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  115726. * @param {Phaser.GameObjects.Mesh} src - The Game Object being rendered in this call.
  115727. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  115728. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  115729. */
  115730. var MeshCanvasRenderer = function ()
  115731. {
  115732. };
  115733. module.exports = MeshCanvasRenderer;
  115734. /***/ }),
  115735. /* 752 */
  115736. /***/ (function(module, exports, __webpack_require__) {
  115737. /**
  115738. * @author Richard Davey <rich@photonstorm.com>
  115739. * @copyright 2019 Photon Storm Ltd.
  115740. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115741. */
  115742. var Utils = __webpack_require__(9);
  115743. /**
  115744. * Renders this Game Object with the WebGL Renderer to the given Camera.
  115745. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  115746. * This method should not be called directly. It is a utility function of the Render module.
  115747. *
  115748. * @method Phaser.GameObjects.Mesh#renderWebGL
  115749. * @since 3.0.0
  115750. * @private
  115751. *
  115752. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  115753. * @param {Phaser.GameObjects.Mesh} src - The Game Object being rendered in this call.
  115754. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  115755. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  115756. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  115757. */
  115758. var MeshWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  115759. {
  115760. var pipeline = this.pipeline;
  115761. renderer.setPipeline(pipeline, src);
  115762. var camMatrix = pipeline._tempMatrix1;
  115763. var spriteMatrix = pipeline._tempMatrix2;
  115764. var calcMatrix = pipeline._tempMatrix3;
  115765. spriteMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  115766. camMatrix.copyFrom(camera.matrix);
  115767. if (parentMatrix)
  115768. {
  115769. // Multiply the camera by the parent matrix
  115770. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  115771. // Undo the camera scroll
  115772. spriteMatrix.e = src.x;
  115773. spriteMatrix.f = src.y;
  115774. // Multiply by the Sprite matrix, store result in calcMatrix
  115775. camMatrix.multiply(spriteMatrix, calcMatrix);
  115776. }
  115777. else
  115778. {
  115779. spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
  115780. spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
  115781. // Multiply by the Sprite matrix, store result in calcMatrix
  115782. camMatrix.multiply(spriteMatrix, calcMatrix);
  115783. }
  115784. var frame = src.frame;
  115785. var texture = frame.glTexture;
  115786. var vertices = src.vertices;
  115787. var uvs = src.uv;
  115788. var colors = src.colors;
  115789. var alphas = src.alphas;
  115790. var meshVerticesLength = vertices.length;
  115791. var vertexCount = Math.floor(meshVerticesLength * 0.5);
  115792. if (pipeline.vertexCount + vertexCount > pipeline.vertexCapacity)
  115793. {
  115794. pipeline.flush();
  115795. }
  115796. pipeline.setTexture2D(texture, 0);
  115797. var vertexViewF32 = pipeline.vertexViewF32;
  115798. var vertexViewU32 = pipeline.vertexViewU32;
  115799. var vertexOffset = (pipeline.vertexCount * pipeline.vertexComponentCount) - 1;
  115800. var colorIndex = 0;
  115801. var tintEffect = src.tintFill;
  115802. for (var i = 0; i < meshVerticesLength; i += 2)
  115803. {
  115804. var x = vertices[i + 0];
  115805. var y = vertices[i + 1];
  115806. var tx = x * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  115807. var ty = x * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  115808. if (camera.roundPixels)
  115809. {
  115810. tx = Math.round(tx);
  115811. ty = Math.round(ty);
  115812. }
  115813. vertexViewF32[++vertexOffset] = tx;
  115814. vertexViewF32[++vertexOffset] = ty;
  115815. vertexViewF32[++vertexOffset] = uvs[i + 0];
  115816. vertexViewF32[++vertexOffset] = uvs[i + 1];
  115817. vertexViewF32[++vertexOffset] = tintEffect;
  115818. vertexViewU32[++vertexOffset] = Utils.getTintAppendFloatAlpha(colors[colorIndex], camera.alpha * alphas[colorIndex]);
  115819. colorIndex++;
  115820. }
  115821. pipeline.vertexCount += vertexCount;
  115822. };
  115823. module.exports = MeshWebGLRenderer;
  115824. /***/ }),
  115825. /* 753 */
  115826. /***/ (function(module, exports, __webpack_require__) {
  115827. /**
  115828. * @author Richard Davey <rich@photonstorm.com>
  115829. * @copyright 2019 Photon Storm Ltd.
  115830. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115831. */
  115832. var renderWebGL = __webpack_require__(1);
  115833. var renderCanvas = __webpack_require__(1);
  115834. if (true)
  115835. {
  115836. renderWebGL = __webpack_require__(752);
  115837. }
  115838. if (true)
  115839. {
  115840. renderCanvas = __webpack_require__(751);
  115841. }
  115842. module.exports = {
  115843. renderWebGL: renderWebGL,
  115844. renderCanvas: renderCanvas
  115845. };
  115846. /***/ }),
  115847. /* 754 */
  115848. /***/ (function(module, exports, __webpack_require__) {
  115849. /**
  115850. * @author Richard Davey <rich@photonstorm.com>
  115851. * @copyright 2019 Photon Storm Ltd.
  115852. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115853. */
  115854. var GameObjectCreator = __webpack_require__(14);
  115855. var GetAdvancedValue = __webpack_require__(12);
  115856. var Zone = __webpack_require__(137);
  115857. /**
  115858. * Creates a new Zone Game Object and returns it.
  115859. *
  115860. * Note: This method will only be available if the Zone Game Object has been built into Phaser.
  115861. *
  115862. * @method Phaser.GameObjects.GameObjectCreator#zone
  115863. * @since 3.0.0
  115864. *
  115865. * @param {object} config - The configuration object this Game Object will use to create itself.
  115866. *
  115867. * @return {Phaser.GameObjects.Zone} The Game Object that was created.
  115868. */
  115869. GameObjectCreator.register('zone', function (config)
  115870. {
  115871. var x = GetAdvancedValue(config, 'x', 0);
  115872. var y = GetAdvancedValue(config, 'y', 0);
  115873. var width = GetAdvancedValue(config, 'width', 1);
  115874. var height = GetAdvancedValue(config, 'height', width);
  115875. return new Zone(this.scene, x, y, width, height);
  115876. });
  115877. // When registering a factory function 'this' refers to the GameObjectCreator context.
  115878. /***/ }),
  115879. /* 755 */
  115880. /***/ (function(module, exports, __webpack_require__) {
  115881. /**
  115882. * @author Richard Davey <rich@photonstorm.com>
  115883. * @copyright 2019 Photon Storm Ltd.
  115884. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115885. */
  115886. var BuildGameObject = __webpack_require__(30);
  115887. var GameObjectCreator = __webpack_require__(14);
  115888. var GetAdvancedValue = __webpack_require__(12);
  115889. var TileSprite = __webpack_require__(162);
  115890. /**
  115891. * @typedef {object} TileSprite
  115892. * @extends GameObjectConfig
  115893. *
  115894. * @property {number} [x=0] - The x coordinate of the Tile Sprite.
  115895. * @property {number} [y=0] - The y coordinate of the Tile Sprite.
  115896. * @property {integer} [width=512] - The width of the Tile Sprite. If zero it will use the size of the texture frame.
  115897. * @property {integer} [height=512] - The height of the Tile Sprite. If zero it will use the size of the texture frame.
  115898. * @property {string} [key=''] - The key of the Texture this Tile Sprite will use to render with, as stored in the Texture Manager.
  115899. * @property {string} [frame=''] - An optional frame from the Texture this Tile Sprite is rendering with.
  115900. */
  115901. /**
  115902. * Creates a new TileSprite Game Object and returns it.
  115903. *
  115904. * Note: This method will only be available if the TileSprite Game Object has been built into Phaser.
  115905. *
  115906. * @method Phaser.GameObjects.GameObjectCreator#tileSprite
  115907. * @since 3.0.0
  115908. *
  115909. * @param {TileSprite} config - The configuration object this Game Object will use to create itself.
  115910. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  115911. *
  115912. * @return {Phaser.GameObjects.TileSprite} The Game Object that was created.
  115913. */
  115914. GameObjectCreator.register('tileSprite', function (config, addToScene)
  115915. {
  115916. if (config === undefined) { config = {}; }
  115917. var x = GetAdvancedValue(config, 'x', 0);
  115918. var y = GetAdvancedValue(config, 'y', 0);
  115919. var width = GetAdvancedValue(config, 'width', 512);
  115920. var height = GetAdvancedValue(config, 'height', 512);
  115921. var key = GetAdvancedValue(config, 'key', '');
  115922. var frame = GetAdvancedValue(config, 'frame', '');
  115923. var tile = new TileSprite(this.scene, x, y, width, height, key, frame);
  115924. if (addToScene !== undefined)
  115925. {
  115926. config.add = addToScene;
  115927. }
  115928. BuildGameObject(this.scene, tile, config);
  115929. return tile;
  115930. });
  115931. // When registering a factory function 'this' refers to the GameObjectCreator context.
  115932. /***/ }),
  115933. /* 756 */
  115934. /***/ (function(module, exports, __webpack_require__) {
  115935. /**
  115936. * @author Richard Davey <rich@photonstorm.com>
  115937. * @copyright 2019 Photon Storm Ltd.
  115938. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115939. */
  115940. var BuildGameObject = __webpack_require__(30);
  115941. var GameObjectCreator = __webpack_require__(14);
  115942. var GetAdvancedValue = __webpack_require__(12);
  115943. var Text = __webpack_require__(163);
  115944. /**
  115945. * Creates a new Text Game Object and returns it.
  115946. *
  115947. * Note: This method will only be available if the Text Game Object has been built into Phaser.
  115948. *
  115949. * @method Phaser.GameObjects.GameObjectCreator#text
  115950. * @since 3.0.0
  115951. *
  115952. * @param {object} config - The configuration object this Game Object will use to create itself.
  115953. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  115954. *
  115955. * @return {Phaser.GameObjects.Text} The Game Object that was created.
  115956. */
  115957. GameObjectCreator.register('text', function (config, addToScene)
  115958. {
  115959. if (config === undefined) { config = {}; }
  115960. // style Object = {
  115961. // font: [ 'font', '16px Courier' ],
  115962. // backgroundColor: [ 'backgroundColor', null ],
  115963. // fill: [ 'fill', '#fff' ],
  115964. // stroke: [ 'stroke', '#fff' ],
  115965. // strokeThickness: [ 'strokeThickness', 0 ],
  115966. // shadowOffsetX: [ 'shadow.offsetX', 0 ],
  115967. // shadowOffsetY: [ 'shadow.offsetY', 0 ],
  115968. // shadowColor: [ 'shadow.color', '#000' ],
  115969. // shadowBlur: [ 'shadow.blur', 0 ],
  115970. // shadowStroke: [ 'shadow.stroke', false ],
  115971. // shadowFill: [ 'shadow.fill', false ],
  115972. // align: [ 'align', 'left' ],
  115973. // maxLines: [ 'maxLines', 0 ],
  115974. // fixedWidth: [ 'fixedWidth', false ],
  115975. // fixedHeight: [ 'fixedHeight', false ],
  115976. // rtl: [ 'rtl', false ]
  115977. // }
  115978. var content = GetAdvancedValue(config, 'text', '');
  115979. var style = GetAdvancedValue(config, 'style', null);
  115980. // Padding
  115981. // { padding: 2 }
  115982. // { padding: { x: , y: }}
  115983. // { padding: { left: , top: }}
  115984. // { padding: { left: , right: , top: , bottom: }}
  115985. var padding = GetAdvancedValue(config, 'padding', null);
  115986. if (padding !== null)
  115987. {
  115988. style.padding = padding;
  115989. }
  115990. var text = new Text(this.scene, 0, 0, content, style);
  115991. if (addToScene !== undefined)
  115992. {
  115993. config.add = addToScene;
  115994. }
  115995. BuildGameObject(this.scene, text, config);
  115996. // Text specific config options:
  115997. text.autoRound = GetAdvancedValue(config, 'autoRound', true);
  115998. text.resolution = GetAdvancedValue(config, 'resolution', 1);
  115999. return text;
  116000. });
  116001. // When registering a factory function 'this' refers to the GameObjectCreator context.
  116002. /***/ }),
  116003. /* 757 */
  116004. /***/ (function(module, exports, __webpack_require__) {
  116005. /**
  116006. * @author Richard Davey <rich@photonstorm.com>
  116007. * @copyright 2019 Photon Storm Ltd.
  116008. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116009. */
  116010. var BitmapText = __webpack_require__(117);
  116011. var BuildGameObject = __webpack_require__(30);
  116012. var GameObjectCreator = __webpack_require__(14);
  116013. var GetAdvancedValue = __webpack_require__(12);
  116014. var GetValue = __webpack_require__(4);
  116015. /**
  116016. * Creates a new Bitmap Text Game Object and returns it.
  116017. *
  116018. * Note: This method will only be available if the Bitmap Text Game Object has been built into Phaser.
  116019. *
  116020. * @method Phaser.GameObjects.GameObjectCreator#bitmapText
  116021. * @since 3.0.0
  116022. *
  116023. * @param {BitmapTextConfig} config - The configuration object this Game Object will use to create itself.
  116024. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  116025. *
  116026. * @return {Phaser.GameObjects.BitmapText} The Game Object that was created.
  116027. */
  116028. GameObjectCreator.register('bitmapText', function (config, addToScene)
  116029. {
  116030. if (config === undefined) { config = {}; }
  116031. var font = GetValue(config, 'font', '');
  116032. var text = GetAdvancedValue(config, 'text', '');
  116033. var size = GetAdvancedValue(config, 'size', false);
  116034. var align = GetValue(config, 'align', 0);
  116035. var bitmapText = new BitmapText(this.scene, 0, 0, font, text, size, align);
  116036. if (addToScene !== undefined)
  116037. {
  116038. config.add = addToScene;
  116039. }
  116040. BuildGameObject(this.scene, bitmapText, config);
  116041. return bitmapText;
  116042. });
  116043. // When registering a factory function 'this' refers to the GameObjectCreator context.
  116044. /***/ }),
  116045. /* 758 */
  116046. /***/ (function(module, exports, __webpack_require__) {
  116047. /**
  116048. * @author Richard Davey <rich@photonstorm.com>
  116049. * @copyright 2019 Photon Storm Ltd.
  116050. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116051. */
  116052. var BuildGameObject = __webpack_require__(30);
  116053. var BuildGameObjectAnimation = __webpack_require__(315);
  116054. var GameObjectCreator = __webpack_require__(14);
  116055. var GetAdvancedValue = __webpack_require__(12);
  116056. var Sprite = __webpack_require__(67);
  116057. /**
  116058. * @typedef {object} SpriteConfig
  116059. * @extends GameObjectConfig
  116060. *
  116061. * @property {string} [key] - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  116062. * @property {(number|string)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  116063. */
  116064. /**
  116065. * Creates a new Sprite Game Object and returns it.
  116066. *
  116067. * Note: This method will only be available if the Sprite Game Object has been built into Phaser.
  116068. *
  116069. * @method Phaser.GameObjects.GameObjectCreator#sprite
  116070. * @since 3.0.0
  116071. *
  116072. * @param {SpriteConfig} config - The configuration object this Game Object will use to create itself.
  116073. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  116074. *
  116075. * @return {Phaser.GameObjects.Sprite} The Game Object that was created.
  116076. */
  116077. GameObjectCreator.register('sprite', function (config, addToScene)
  116078. {
  116079. if (config === undefined) { config = {}; }
  116080. var key = GetAdvancedValue(config, 'key', null);
  116081. var frame = GetAdvancedValue(config, 'frame', null);
  116082. var sprite = new Sprite(this.scene, 0, 0, key, frame);
  116083. if (addToScene !== undefined)
  116084. {
  116085. config.add = addToScene;
  116086. }
  116087. BuildGameObject(this.scene, sprite, config);
  116088. // Sprite specific config options:
  116089. BuildGameObjectAnimation(sprite, config);
  116090. return sprite;
  116091. });
  116092. /***/ }),
  116093. /* 759 */
  116094. /***/ (function(module, exports, __webpack_require__) {
  116095. /**
  116096. * @author Richard Davey <rich@photonstorm.com>
  116097. * @copyright 2019 Photon Storm Ltd.
  116098. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116099. */
  116100. var BuildGameObject = __webpack_require__(30);
  116101. var GameObjectCreator = __webpack_require__(14);
  116102. var GetAdvancedValue = __webpack_require__(12);
  116103. var RenderTexture = __webpack_require__(164);
  116104. /**
  116105. * @typedef {object} RenderTextureConfig
  116106. *
  116107. * @property {number} [x=0] - The x coordinate of the RenderTexture's position.
  116108. * @property {number} [y=0] - The y coordinate of the RenderTexture's position.
  116109. * @property {number} [width=32] - The width of the RenderTexture.
  116110. * @property {number} [height=32] - The height of the RenderTexture.
  116111. */
  116112. /**
  116113. * Creates a new Render Texture Game Object and returns it.
  116114. *
  116115. * Note: This method will only be available if the Render Texture Game Object has been built into Phaser.
  116116. *
  116117. * @method Phaser.GameObjects.GameObjectCreator#renderTexture
  116118. * @since 3.2.0
  116119. *
  116120. * @param {RenderTextureConfig} config - The configuration object this Game Object will use to create itself.
  116121. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  116122. *
  116123. * @return {Phaser.GameObjects.RenderTexture} The Game Object that was created.
  116124. */
  116125. GameObjectCreator.register('renderTexture', function (config, addToScene)
  116126. {
  116127. if (config === undefined) { config = {}; }
  116128. var x = GetAdvancedValue(config, 'x', 0);
  116129. var y = GetAdvancedValue(config, 'y', 0);
  116130. var width = GetAdvancedValue(config, 'width', 32);
  116131. var height = GetAdvancedValue(config, 'height', 32);
  116132. var renderTexture = new RenderTexture(this.scene, x, y, width, height);
  116133. if (addToScene !== undefined)
  116134. {
  116135. config.add = addToScene;
  116136. }
  116137. BuildGameObject(this.scene, renderTexture, config);
  116138. return renderTexture;
  116139. });
  116140. /***/ }),
  116141. /* 760 */
  116142. /***/ (function(module, exports, __webpack_require__) {
  116143. /**
  116144. * @author Richard Davey <rich@photonstorm.com>
  116145. * @copyright 2019 Photon Storm Ltd.
  116146. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116147. */
  116148. var GameObjectCreator = __webpack_require__(14);
  116149. var GetAdvancedValue = __webpack_require__(12);
  116150. var GetFastValue = __webpack_require__(2);
  116151. var ParticleEmitterManager = __webpack_require__(165);
  116152. /**
  116153. * Creates a new Particle Emitter Manager Game Object and returns it.
  116154. *
  116155. * Note: This method will only be available if the Particles Game Object has been built into Phaser.
  116156. *
  116157. * @method Phaser.GameObjects.GameObjectCreator#particles
  116158. * @since 3.0.0
  116159. *
  116160. * @param {object} config - The configuration object this Game Object will use to create itself.
  116161. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  116162. *
  116163. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} The Game Object that was created.
  116164. */
  116165. GameObjectCreator.register('particles', function (config, addToScene)
  116166. {
  116167. if (config === undefined) { config = {}; }
  116168. var key = GetAdvancedValue(config, 'key', null);
  116169. var frame = GetAdvancedValue(config, 'frame', null);
  116170. var emitters = GetFastValue(config, 'emitters', null);
  116171. // frame is optional and can contain the emitters array or object if skipped
  116172. var manager = new ParticleEmitterManager(this.scene, key, frame, emitters);
  116173. if (addToScene !== undefined)
  116174. {
  116175. config.add = addToScene;
  116176. }
  116177. var add = GetFastValue(config, 'add', false);
  116178. if (add)
  116179. {
  116180. this.displayList.add(manager);
  116181. }
  116182. this.updateList.add(manager);
  116183. return manager;
  116184. });
  116185. /***/ }),
  116186. /* 761 */
  116187. /***/ (function(module, exports, __webpack_require__) {
  116188. /**
  116189. * @author Richard Davey <rich@photonstorm.com>
  116190. * @copyright 2019 Photon Storm Ltd.
  116191. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116192. */
  116193. var BuildGameObject = __webpack_require__(30);
  116194. var GameObjectCreator = __webpack_require__(14);
  116195. var GetAdvancedValue = __webpack_require__(12);
  116196. var Image = __webpack_require__(93);
  116197. /**
  116198. * Creates a new Image Game Object and returns it.
  116199. *
  116200. * Note: This method will only be available if the Image Game Object has been built into Phaser.
  116201. *
  116202. * @method Phaser.GameObjects.GameObjectCreator#image
  116203. * @since 3.0.0
  116204. *
  116205. * @param {object} config - The configuration object this Game Object will use to create itself.
  116206. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  116207. *
  116208. * @return {Phaser.GameObjects.Image} The Game Object that was created.
  116209. */
  116210. GameObjectCreator.register('image', function (config, addToScene)
  116211. {
  116212. if (config === undefined) { config = {}; }
  116213. var key = GetAdvancedValue(config, 'key', null);
  116214. var frame = GetAdvancedValue(config, 'frame', null);
  116215. var image = new Image(this.scene, 0, 0, key, frame);
  116216. if (addToScene !== undefined)
  116217. {
  116218. config.add = addToScene;
  116219. }
  116220. BuildGameObject(this.scene, image, config);
  116221. return image;
  116222. });
  116223. // When registering a factory function 'this' refers to the GameObjectCreator context.
  116224. /***/ }),
  116225. /* 762 */
  116226. /***/ (function(module, exports, __webpack_require__) {
  116227. /**
  116228. * @author Richard Davey <rich@photonstorm.com>
  116229. * @copyright 2019 Photon Storm Ltd.
  116230. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116231. */
  116232. var GameObjectCreator = __webpack_require__(14);
  116233. var Group = __webpack_require__(94);
  116234. /**
  116235. * Creates a new Group Game Object and returns it.
  116236. *
  116237. * Note: This method will only be available if the Group Game Object has been built into Phaser.
  116238. *
  116239. * @method Phaser.GameObjects.GameObjectCreator#group
  116240. * @since 3.0.0
  116241. *
  116242. * @param {GroupConfig|GroupCreateConfig} config - The configuration object this Game Object will use to create itself.
  116243. *
  116244. * @return {Phaser.GameObjects.Group} The Game Object that was created.
  116245. */
  116246. GameObjectCreator.register('group', function (config)
  116247. {
  116248. return new Group(this.scene, null, config);
  116249. });
  116250. // When registering a factory function 'this' refers to the GameObjectCreator context.
  116251. /***/ }),
  116252. /* 763 */
  116253. /***/ (function(module, exports, __webpack_require__) {
  116254. /**
  116255. * @author Richard Davey <rich@photonstorm.com>
  116256. * @copyright 2019 Photon Storm Ltd.
  116257. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116258. */
  116259. var GameObjectCreator = __webpack_require__(14);
  116260. var Graphics = __webpack_require__(168);
  116261. /**
  116262. * Creates a new Graphics Game Object and returns it.
  116263. *
  116264. * Note: This method will only be available if the Graphics Game Object has been built into Phaser.
  116265. *
  116266. * @method Phaser.GameObjects.GameObjectCreator#graphics
  116267. * @since 3.0.0
  116268. *
  116269. * @param {object} config - The configuration object this Game Object will use to create itself.
  116270. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  116271. *
  116272. * @return {Phaser.GameObjects.Graphics} The Game Object that was created.
  116273. */
  116274. GameObjectCreator.register('graphics', function (config, addToScene)
  116275. {
  116276. if (config === undefined) { config = {}; }
  116277. if (addToScene !== undefined)
  116278. {
  116279. config.add = addToScene;
  116280. }
  116281. var graphics = new Graphics(this.scene, config);
  116282. if (config.add)
  116283. {
  116284. this.scene.sys.displayList.add(graphics);
  116285. }
  116286. return graphics;
  116287. });
  116288. // When registering a factory function 'this' refers to the GameObjectCreator context.
  116289. /***/ }),
  116290. /* 764 */
  116291. /***/ (function(module, exports, __webpack_require__) {
  116292. /**
  116293. * @author Richard Davey <rich@photonstorm.com>
  116294. * @copyright 2019 Photon Storm Ltd.
  116295. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116296. */
  116297. var BitmapText = __webpack_require__(169);
  116298. var BuildGameObject = __webpack_require__(30);
  116299. var GameObjectCreator = __webpack_require__(14);
  116300. var GetAdvancedValue = __webpack_require__(12);
  116301. /**
  116302. * @typedef {object} BitmapTextConfig
  116303. * @extends GameObjectConfig
  116304. *
  116305. * @property {string} [font=''] - The key of the font to use from the BitmapFont cache.
  116306. * @property {string} [text=''] - The string, or array of strings, to be set as the content of this Bitmap Text.
  116307. * @property {(number|false)} [size=false] - The font size to set.
  116308. */
  116309. /**
  116310. * Creates a new Dynamic Bitmap Text Game Object and returns it.
  116311. *
  116312. * Note: This method will only be available if the Dynamic Bitmap Text Game Object has been built into Phaser.
  116313. *
  116314. * @method Phaser.GameObjects.GameObjectCreator#dynamicBitmapText
  116315. * @since 3.0.0
  116316. * @param {BitmapTextConfig} config - The configuration object this Game Object will use to create itself.
  116317. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  116318. *
  116319. * @return {Phaser.GameObjects.DynamicBitmapText} The Game Object that was created.
  116320. */
  116321. GameObjectCreator.register('dynamicBitmapText', function (config, addToScene)
  116322. {
  116323. if (config === undefined) { config = {}; }
  116324. var font = GetAdvancedValue(config, 'font', '');
  116325. var text = GetAdvancedValue(config, 'text', '');
  116326. var size = GetAdvancedValue(config, 'size', false);
  116327. var bitmapText = new BitmapText(this.scene, 0, 0, font, text, size);
  116328. if (addToScene !== undefined)
  116329. {
  116330. config.add = addToScene;
  116331. }
  116332. BuildGameObject(this.scene, bitmapText, config);
  116333. return bitmapText;
  116334. });
  116335. // When registering a factory function 'this' refers to the GameObjectCreator context.
  116336. /***/ }),
  116337. /* 765 */
  116338. /***/ (function(module, exports, __webpack_require__) {
  116339. /**
  116340. * @author Richard Davey <rich@photonstorm.com>
  116341. * @author Felipe Alfonso <@bitnenfer>
  116342. * @copyright 2019 Photon Storm Ltd.
  116343. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116344. */
  116345. var BuildGameObject = __webpack_require__(30);
  116346. var Container = __webpack_require__(170);
  116347. var GameObjectCreator = __webpack_require__(14);
  116348. var GetAdvancedValue = __webpack_require__(12);
  116349. /**
  116350. * Creates a new Container Game Object and returns it.
  116351. *
  116352. * Note: This method will only be available if the Container Game Object has been built into Phaser.
  116353. *
  116354. * @method Phaser.GameObjects.GameObjectCreator#container
  116355. * @since 3.4.0
  116356. *
  116357. * @param {object} config - The configuration object this Game Object will use to create itself.
  116358. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  116359. *
  116360. * @return {Phaser.GameObjects.Container} The Game Object that was created.
  116361. */
  116362. GameObjectCreator.register('container', function (config, addToScene)
  116363. {
  116364. if (config === undefined) { config = {}; }
  116365. var x = GetAdvancedValue(config, 'x', 0);
  116366. var y = GetAdvancedValue(config, 'y', 0);
  116367. var container = new Container(this.scene, x, y);
  116368. if (addToScene !== undefined)
  116369. {
  116370. config.add = addToScene;
  116371. }
  116372. BuildGameObject(this.scene, container, config);
  116373. return container;
  116374. });
  116375. /***/ }),
  116376. /* 766 */
  116377. /***/ (function(module, exports, __webpack_require__) {
  116378. /**
  116379. * @author Richard Davey <rich@photonstorm.com>
  116380. * @copyright 2019 Photon Storm Ltd.
  116381. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116382. */
  116383. var Blitter = __webpack_require__(171);
  116384. var BuildGameObject = __webpack_require__(30);
  116385. var GameObjectCreator = __webpack_require__(14);
  116386. var GetAdvancedValue = __webpack_require__(12);
  116387. /**
  116388. * Creates a new Blitter Game Object and returns it.
  116389. *
  116390. * Note: This method will only be available if the Blitter Game Object has been built into Phaser.
  116391. *
  116392. * @method Phaser.GameObjects.GameObjectCreator#blitter
  116393. * @since 3.0.0
  116394. *
  116395. * @param {object} config - The configuration object this Game Object will use to create itself.
  116396. * @param {boolean} [addToScene] - Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object.
  116397. *
  116398. * @return {Phaser.GameObjects.Blitter} The Game Object that was created.
  116399. */
  116400. GameObjectCreator.register('blitter', function (config, addToScene)
  116401. {
  116402. if (config === undefined) { config = {}; }
  116403. var key = GetAdvancedValue(config, 'key', null);
  116404. var frame = GetAdvancedValue(config, 'frame', null);
  116405. var blitter = new Blitter(this.scene, 0, 0, key, frame);
  116406. if (addToScene !== undefined)
  116407. {
  116408. config.add = addToScene;
  116409. }
  116410. BuildGameObject(this.scene, blitter, config);
  116411. return blitter;
  116412. });
  116413. // When registering a factory function 'this' refers to the GameObjectCreator context.
  116414. /***/ }),
  116415. /* 767 */
  116416. /***/ (function(module, exports, __webpack_require__) {
  116417. /**
  116418. * @author Richard Davey <rich@photonstorm.com>
  116419. * @copyright 2019 Photon Storm Ltd.
  116420. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116421. */
  116422. var GameObjectFactory = __webpack_require__(5);
  116423. var Triangle = __webpack_require__(284);
  116424. /**
  116425. * Creates a new Triangle Shape Game Object and adds it to the Scene.
  116426. *
  116427. * Note: This method will only be available if the Triangle Game Object has been built into Phaser.
  116428. *
  116429. * The Triangle Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116430. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116431. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116432. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116433. *
  116434. * This shape supports both fill and stroke colors.
  116435. *
  116436. * The Triangle consists of 3 lines, joining up to form a triangular shape. You can control the
  116437. * position of each point of these lines. The triangle is always closed and cannot have an open
  116438. * face. If you require that, consider using a Polygon instead.
  116439. *
  116440. * @method Phaser.GameObjects.GameObjectFactory#triangle
  116441. * @since 3.13.0
  116442. *
  116443. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116444. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116445. * @param {number} [x1=0] - The horizontal position of the first point in the triangle.
  116446. * @param {number} [y1=128] - The vertical position of the first point in the triangle.
  116447. * @param {number} [x2=64] - The horizontal position of the second point in the triangle.
  116448. * @param {number} [y2=0] - The vertical position of the second point in the triangle.
  116449. * @param {number} [x3=128] - The horizontal position of the third point in the triangle.
  116450. * @param {number} [y3=128] - The vertical position of the third point in the triangle.
  116451. * @param {number} [fillColor] - The color the triangle will be filled with, i.e. 0xff0000 for red.
  116452. * @param {number} [fillAlpha] - The alpha the triangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  116453. *
  116454. * @return {Phaser.GameObjects.Triangle} The Game Object that was created.
  116455. */
  116456. GameObjectFactory.register('triangle', function (x, y, x1, y1, x2, y2, x3, y3, fillColor, fillAlpha)
  116457. {
  116458. return this.displayList.add(new Triangle(this.scene, x, y, x1, y1, x2, y2, x3, y3, fillColor, fillAlpha));
  116459. });
  116460. /***/ }),
  116461. /* 768 */
  116462. /***/ (function(module, exports, __webpack_require__) {
  116463. /**
  116464. * @author Richard Davey <rich@photonstorm.com>
  116465. * @copyright 2019 Photon Storm Ltd.
  116466. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116467. */
  116468. var Star = __webpack_require__(285);
  116469. var GameObjectFactory = __webpack_require__(5);
  116470. /**
  116471. * Creates a new Star Shape Game Object and adds it to the Scene.
  116472. *
  116473. * Note: This method will only be available if the Star Game Object has been built into Phaser.
  116474. *
  116475. * The Star Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116476. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116477. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116478. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116479. *
  116480. * This shape supports both fill and stroke colors.
  116481. *
  116482. * As the name implies, the Star shape will display a star in your game. You can control several
  116483. * aspects of it including the number of points that constitute the star. The default is 5. If
  116484. * you change it to 4 it will render as a diamond. If you increase them, you'll get a more spiky
  116485. * star shape.
  116486. *
  116487. * You can also control the inner and outer radius, which is how 'long' each point of the star is.
  116488. * Modify these values to create more interesting shapes.
  116489. *
  116490. * @method Phaser.GameObjects.GameObjectFactory#star
  116491. * @since 3.13.0
  116492. *
  116493. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116494. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116495. * @param {number} [points=5] - The number of points on the star.
  116496. * @param {number} [innerRadius=32] - The inner radius of the star.
  116497. * @param {number} [outerRadius=64] - The outer radius of the star.
  116498. * @param {number} [fillColor] - The color the star will be filled with, i.e. 0xff0000 for red.
  116499. * @param {number} [fillAlpha] - The alpha the star will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  116500. *
  116501. * @return {Phaser.GameObjects.Star} The Game Object that was created.
  116502. */
  116503. GameObjectFactory.register('star', function (x, y, points, innerRadius, outerRadius, fillColor, fillAlpha)
  116504. {
  116505. return this.displayList.add(new Star(this.scene, x, y, points, innerRadius, outerRadius, fillColor, fillAlpha));
  116506. });
  116507. /***/ }),
  116508. /* 769 */
  116509. /***/ (function(module, exports, __webpack_require__) {
  116510. /**
  116511. * @author Richard Davey <rich@photonstorm.com>
  116512. * @copyright 2019 Photon Storm Ltd.
  116513. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116514. */
  116515. var GameObjectFactory = __webpack_require__(5);
  116516. var Rectangle = __webpack_require__(286);
  116517. /**
  116518. * Creates a new Rectangle Shape Game Object and adds it to the Scene.
  116519. *
  116520. * Note: This method will only be available if the Rectangle Game Object has been built into Phaser.
  116521. *
  116522. * The Rectangle Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116523. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116524. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116525. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116526. *
  116527. * This shape supports both fill and stroke colors.
  116528. *
  116529. * You can change the size of the rectangle by changing the `width` and `height` properties.
  116530. *
  116531. * @method Phaser.GameObjects.GameObjectFactory#rectangle
  116532. * @since 3.13.0
  116533. *
  116534. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116535. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116536. * @param {number} [width=128] - The width of the rectangle.
  116537. * @param {number} [height=128] - The height of the rectangle.
  116538. * @param {number} [fillColor] - The color the rectangle will be filled with, i.e. 0xff0000 for red.
  116539. * @param {number} [fillAlpha] - The alpha the rectangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  116540. *
  116541. * @return {Phaser.GameObjects.Rectangle} The Game Object that was created.
  116542. */
  116543. GameObjectFactory.register('rectangle', function (x, y, width, height, fillColor, fillAlpha)
  116544. {
  116545. return this.displayList.add(new Rectangle(this.scene, x, y, width, height, fillColor, fillAlpha));
  116546. });
  116547. /***/ }),
  116548. /* 770 */
  116549. /***/ (function(module, exports, __webpack_require__) {
  116550. /**
  116551. * @author Richard Davey <rich@photonstorm.com>
  116552. * @copyright 2019 Photon Storm Ltd.
  116553. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116554. */
  116555. var GameObjectFactory = __webpack_require__(5);
  116556. var Polygon = __webpack_require__(291);
  116557. /**
  116558. * Creates a new Polygon Shape Game Object and adds it to the Scene.
  116559. *
  116560. * Note: This method will only be available if the Polygon Game Object has been built into Phaser.
  116561. *
  116562. * The Polygon Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116563. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116564. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116565. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116566. *
  116567. * This shape supports both fill and stroke colors.
  116568. *
  116569. * The Polygon Shape is created by providing a list of points, which are then used to create an
  116570. * internal Polygon geometry object. The points can be set from a variety of formats:
  116571. *
  116572. * - An array of Point or Vector2 objects: `[new Phaser.Math.Vec2(x1, y1), ...]`
  116573. * - An array of objects with public x/y properties: `[obj1, obj2, ...]`
  116574. * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]`
  116575. * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]`
  116576. *
  116577. * By default the `x` and `y` coordinates of this Shape refer to the center of it. However, depending
  116578. * on the coordinates of the points provided, the final shape may be rendered offset from its origin.
  116579. *
  116580. * @method Phaser.GameObjects.GameObjectFactory#polygon
  116581. * @since 3.13.0
  116582. *
  116583. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116584. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116585. * @param {any} [points] - The points that make up the polygon.
  116586. * @param {number} [fillColor] - The color the polygon will be filled with, i.e. 0xff0000 for red.
  116587. * @param {number} [fillAlpha] - The alpha the polygon will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  116588. *
  116589. * @return {Phaser.GameObjects.Polygon} The Game Object that was created.
  116590. */
  116591. GameObjectFactory.register('polygon', function (x, y, points, fillColor, fillAlpha)
  116592. {
  116593. return this.displayList.add(new Polygon(this.scene, x, y, points, fillColor, fillAlpha));
  116594. });
  116595. /***/ }),
  116596. /* 771 */
  116597. /***/ (function(module, exports, __webpack_require__) {
  116598. /**
  116599. * @author Richard Davey <rich@photonstorm.com>
  116600. * @copyright 2019 Photon Storm Ltd.
  116601. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116602. */
  116603. var GameObjectFactory = __webpack_require__(5);
  116604. var Line = __webpack_require__(292);
  116605. /**
  116606. * Creates a new Line Shape Game Object and adds it to the Scene.
  116607. *
  116608. * Note: This method will only be available if the Line Game Object has been built into Phaser.
  116609. *
  116610. * The Line Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116611. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116612. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116613. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116614. *
  116615. * This shape supports only stroke colors and cannot be filled.
  116616. *
  116617. * A Line Shape allows you to draw a line between two points in your game. You can control the
  116618. * stroke color and thickness of the line. In WebGL only you can also specify a different
  116619. * thickness for the start and end of the line, allowing you to render lines that taper-off.
  116620. *
  116621. * If you need to draw multiple lines in a sequence you may wish to use the Polygon Shape instead.
  116622. *
  116623. * @method Phaser.GameObjects.GameObjectFactory#line
  116624. * @since 3.13.0
  116625. *
  116626. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116627. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116628. * @param {number} [x1=0] - The horizontal position of the start of the line.
  116629. * @param {number} [y1=0] - The vertical position of the start of the line.
  116630. * @param {number} [x2=128] - The horizontal position of the end of the line.
  116631. * @param {number} [y2=0] - The vertical position of the end of the line.
  116632. * @param {number} [strokeColor] - The color the line will be drawn in, i.e. 0xff0000 for red.
  116633. * @param {number} [strokeAlpha] - The alpha the line will be drawn in. You can also set the alpha of the overall Shape using its `alpha` property.
  116634. *
  116635. * @return {Phaser.GameObjects.Line} The Game Object that was created.
  116636. */
  116637. GameObjectFactory.register('line', function (x, y, x1, y1, x2, y2, strokeColor, strokeAlpha)
  116638. {
  116639. return this.displayList.add(new Line(this.scene, x, y, x1, y1, x2, y2, strokeColor, strokeAlpha));
  116640. });
  116641. /***/ }),
  116642. /* 772 */
  116643. /***/ (function(module, exports, __webpack_require__) {
  116644. /**
  116645. * @author Richard Davey <rich@photonstorm.com>
  116646. * @copyright 2019 Photon Storm Ltd.
  116647. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116648. */
  116649. var GameObjectFactory = __webpack_require__(5);
  116650. var IsoTriangle = __webpack_require__(293);
  116651. /**
  116652. * Creates a new IsoTriangle Shape Game Object and adds it to the Scene.
  116653. *
  116654. * Note: This method will only be available if the IsoTriangle Game Object has been built into Phaser.
  116655. *
  116656. * The IsoTriangle Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116657. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116658. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116659. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116660. *
  116661. * This shape supports only fill colors and cannot be stroked.
  116662. *
  116663. * An IsoTriangle is an 'isometric' triangle. Think of it like a pyramid. Each face has a different
  116664. * fill color. You can set the color of the top, left and right faces of the triangle respectively
  116665. * You can also choose which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties.
  116666. *
  116667. * You cannot view an IsoTriangle from under-neath, however you can change the 'angle' by setting
  116668. * the `projection` property. The `reversed` property controls if the IsoTriangle is rendered upside
  116669. * down or not.
  116670. *
  116671. * @method Phaser.GameObjects.GameObjectFactory#isotriangle
  116672. * @since 3.13.0
  116673. *
  116674. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116675. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116676. * @param {number} [size=48] - The width of the iso triangle in pixels. The left and right faces will be exactly half this value.
  116677. * @param {number} [height=32] - The height of the iso triangle. The left and right faces will be this tall. The overall height of the iso triangle will be this value plus half the `size` value.
  116678. * @param {boolean} [reversed=false] - Is the iso triangle upside down?
  116679. * @param {number} [fillTop=0xeeeeee] - The fill color of the top face of the iso triangle.
  116680. * @param {number} [fillLeft=0x999999] - The fill color of the left face of the iso triangle.
  116681. * @param {number} [fillRight=0xcccccc] - The fill color of the right face of the iso triangle.
  116682. *
  116683. * @return {Phaser.GameObjects.IsoTriangle} The Game Object that was created.
  116684. */
  116685. GameObjectFactory.register('isotriangle', function (x, y, size, height, reversed, fillTop, fillLeft, fillRight)
  116686. {
  116687. return this.displayList.add(new IsoTriangle(this.scene, x, y, size, height, reversed, fillTop, fillLeft, fillRight));
  116688. });
  116689. /***/ }),
  116690. /* 773 */
  116691. /***/ (function(module, exports, __webpack_require__) {
  116692. /**
  116693. * @author Richard Davey <rich@photonstorm.com>
  116694. * @copyright 2019 Photon Storm Ltd.
  116695. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116696. */
  116697. var GameObjectFactory = __webpack_require__(5);
  116698. var IsoBox = __webpack_require__(294);
  116699. /**
  116700. * Creates a new IsoBox Shape Game Object and adds it to the Scene.
  116701. *
  116702. * Note: This method will only be available if the IsoBox Game Object has been built into Phaser.
  116703. *
  116704. * The IsoBox Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116705. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116706. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116707. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116708. *
  116709. * This shape supports only fill colors and cannot be stroked.
  116710. *
  116711. * An IsoBox is an 'isometric' rectangle. Each face of it has a different fill color. You can set
  116712. * the color of the top, left and right faces of the rectangle respectively. You can also choose
  116713. * which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties.
  116714. *
  116715. * You cannot view an IsoBox from under-neath, however you can change the 'angle' by setting
  116716. * the `projection` property.
  116717. *
  116718. * @method Phaser.GameObjects.GameObjectFactory#isobox
  116719. * @since 3.13.0
  116720. *
  116721. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116722. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116723. * @param {number} [size=48] - The width of the iso box in pixels. The left and right faces will be exactly half this value.
  116724. * @param {number} [height=32] - The height of the iso box. The left and right faces will be this tall. The overall height of the isobox will be this value plus half the `size` value.
  116725. * @param {number} [fillTop=0xeeeeee] - The fill color of the top face of the iso box.
  116726. * @param {number} [fillLeft=0x999999] - The fill color of the left face of the iso box.
  116727. * @param {number} [fillRight=0xcccccc] - The fill color of the right face of the iso box.
  116728. *
  116729. * @return {Phaser.GameObjects.IsoBox} The Game Object that was created.
  116730. */
  116731. GameObjectFactory.register('isobox', function (x, y, size, height, fillTop, fillLeft, fillRight)
  116732. {
  116733. return this.displayList.add(new IsoBox(this.scene, x, y, size, height, fillTop, fillLeft, fillRight));
  116734. });
  116735. /***/ }),
  116736. /* 774 */
  116737. /***/ (function(module, exports, __webpack_require__) {
  116738. /**
  116739. * @author Richard Davey <rich@photonstorm.com>
  116740. * @copyright 2019 Photon Storm Ltd.
  116741. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116742. */
  116743. var GameObjectFactory = __webpack_require__(5);
  116744. var Grid = __webpack_require__(295);
  116745. /**
  116746. * Creates a new Grid Shape Game Object and adds it to the Scene.
  116747. *
  116748. * Note: This method will only be available if the Grid Game Object has been built into Phaser.
  116749. *
  116750. * The Grid Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116751. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116752. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116753. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116754. *
  116755. * This shape supports only fill colors and cannot be stroked.
  116756. *
  116757. * A Grid Shape allows you to display a grid in your game, where you can control the size of the
  116758. * grid as well as the width and height of the grid cells. You can set a fill color for each grid
  116759. * cell as well as an alternate fill color. When the alternate fill color is set then the grid
  116760. * cells will alternate the fill colors as they render, creating a chess-board effect. You can
  116761. * also optionally have an outline fill color. If set, this draws lines between the grid cells
  116762. * in the given color. If you specify an outline color with an alpha of zero, then it will draw
  116763. * the cells spaced out, but without the lines between them.
  116764. *
  116765. * @method Phaser.GameObjects.GameObjectFactory#grid
  116766. * @since 3.13.0
  116767. *
  116768. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116769. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116770. * @param {number} [width=128] - The width of the grid.
  116771. * @param {number} [height=128] - The height of the grid.
  116772. * @param {number} [cellWidth=32] - The width of one cell in the grid.
  116773. * @param {number} [cellHeight=32] - The height of one cell in the grid.
  116774. * @param {number} [fillColor] - The color the grid cells will be filled with, i.e. 0xff0000 for red.
  116775. * @param {number} [fillAlpha] - The alpha the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  116776. * @param {number} [outlineFillColor] - The color of the lines between the grid cells.
  116777. * @param {number} [outlineFillAlpha] - The alpha of the lines between the grid cells.
  116778. *
  116779. * @return {Phaser.GameObjects.Grid} The Game Object that was created.
  116780. */
  116781. GameObjectFactory.register('grid', function (x, y, width, height, cellWidth, cellHeight, fillColor, fillAlpha, outlineFillColor, outlineFillAlpha)
  116782. {
  116783. return this.displayList.add(new Grid(this.scene, x, y, width, height, cellWidth, cellHeight, fillColor, fillAlpha, outlineFillColor, outlineFillAlpha));
  116784. });
  116785. /***/ }),
  116786. /* 775 */
  116787. /***/ (function(module, exports, __webpack_require__) {
  116788. /**
  116789. * @author Richard Davey <rich@photonstorm.com>
  116790. * @copyright 2019 Photon Storm Ltd.
  116791. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116792. */
  116793. var Ellipse = __webpack_require__(296);
  116794. var GameObjectFactory = __webpack_require__(5);
  116795. /**
  116796. * Creates a new Ellipse Shape Game Object and adds it to the Scene.
  116797. *
  116798. * Note: This method will only be available if the Ellipse Game Object has been built into Phaser.
  116799. *
  116800. * The Ellipse Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116801. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116802. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116803. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116804. *
  116805. * This shape supports both fill and stroke colors.
  116806. *
  116807. * When it renders it displays an ellipse shape. You can control the width and height of the ellipse.
  116808. * If the width and height match it will render as a circle. If the width is less than the height,
  116809. * it will look more like an egg shape.
  116810. *
  116811. * The Ellipse shape also has a `smoothness` property and corresponding `setSmoothness` method.
  116812. * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations
  116813. * that take place during construction. Increase and decrease the default value for smoother, or more
  116814. * jagged, shapes.
  116815. *
  116816. * @method Phaser.GameObjects.GameObjectFactory#ellipse
  116817. * @since 3.13.0
  116818. *
  116819. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116820. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116821. * @param {number} [width=128] - The width of the ellipse. An ellipse with equal width and height renders as a circle.
  116822. * @param {number} [height=128] - The height of the ellipse. An ellipse with equal width and height renders as a circle.
  116823. * @param {number} [fillColor] - The color the ellipse will be filled with, i.e. 0xff0000 for red.
  116824. * @param {number} [fillAlpha] - The alpha the ellipse will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  116825. *
  116826. * @return {Phaser.GameObjects.Ellipse} The Game Object that was created.
  116827. */
  116828. GameObjectFactory.register('ellipse', function (x, y, width, height, fillColor, fillAlpha)
  116829. {
  116830. return this.displayList.add(new Ellipse(this.scene, x, y, width, height, fillColor, fillAlpha));
  116831. });
  116832. /***/ }),
  116833. /* 776 */
  116834. /***/ (function(module, exports, __webpack_require__) {
  116835. /**
  116836. * @author Richard Davey <rich@photonstorm.com>
  116837. * @copyright 2019 Photon Storm Ltd.
  116838. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116839. */
  116840. var GameObjectFactory = __webpack_require__(5);
  116841. var Curve = __webpack_require__(297);
  116842. /**
  116843. * Creates a new Curve Shape Game Object and adds it to the Scene.
  116844. *
  116845. * Note: This method will only be available if the Curve Game Object has been built into Phaser.
  116846. *
  116847. * The Curve Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116848. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116849. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116850. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116851. *
  116852. * This shape supports both fill and stroke colors.
  116853. *
  116854. * To render a Curve Shape you must first create a `Phaser.Curves.Curve` object, then pass it to
  116855. * the Curve Shape in the constructor.
  116856. *
  116857. * The Curve shape also has a `smoothness` property and corresponding `setSmoothness` method.
  116858. * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations
  116859. * that take place during construction. Increase and decrease the default value for smoother, or more
  116860. * jagged, shapes.
  116861. *
  116862. * @method Phaser.GameObjects.GameObjectFactory#curve
  116863. * @since 3.13.0
  116864. *
  116865. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116866. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116867. * @param {Phaser.Curves.Curve} [curve] - The Curve object to use to create the Shape.
  116868. * @param {number} [fillColor] - The color the curve will be filled with, i.e. 0xff0000 for red.
  116869. * @param {number} [fillAlpha] - The alpha the curve will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  116870. *
  116871. * @return {Phaser.GameObjects.Curve} The Game Object that was created.
  116872. */
  116873. GameObjectFactory.register('curve', function (x, y, curve, fillColor, fillAlpha)
  116874. {
  116875. return this.displayList.add(new Curve(this.scene, x, y, curve, fillColor, fillAlpha));
  116876. });
  116877. /***/ }),
  116878. /* 777 */
  116879. /***/ (function(module, exports, __webpack_require__) {
  116880. /**
  116881. * @author Richard Davey <rich@photonstorm.com>
  116882. * @copyright 2019 Photon Storm Ltd.
  116883. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116884. */
  116885. var Arc = __webpack_require__(298);
  116886. var GameObjectFactory = __webpack_require__(5);
  116887. /**
  116888. * Creates a new Arc Shape Game Object and adds it to the Scene.
  116889. *
  116890. * Note: This method will only be available if the Arc Game Object has been built into Phaser.
  116891. *
  116892. * The Arc Shape is a Game Object that can be added to a Scene, Group or Container. You can
  116893. * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling
  116894. * it for input or physics. It provides a quick and easy way for you to render this shape in your
  116895. * game without using a texture, while still taking advantage of being fully batched in WebGL.
  116896. *
  116897. * This shape supports both fill and stroke colors.
  116898. *
  116899. * When it renders it displays an arc shape. You can control the start and end angles of the arc,
  116900. * as well as if the angles are winding clockwise or anti-clockwise. With the default settings
  116901. * it renders as a complete circle. By changing the angles you can create other arc shapes,
  116902. * such as half-circles.
  116903. *
  116904. * @method Phaser.GameObjects.GameObjectFactory#arc
  116905. * @since 3.13.0
  116906. *
  116907. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116908. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116909. * @param {number} [radius=128] - The radius of the arc.
  116910. * @param {integer} [startAngle=0] - The start angle of the arc, in degrees.
  116911. * @param {integer} [endAngle=360] - The end angle of the arc, in degrees.
  116912. * @param {boolean} [anticlockwise=false] - The winding order of the start and end angles.
  116913. * @param {number} [fillColor] - The color the arc will be filled with, i.e. 0xff0000 for red.
  116914. * @param {number} [fillAlpha] - The alpha the arc will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  116915. *
  116916. * @return {Phaser.GameObjects.Arc} The Game Object that was created.
  116917. */
  116918. GameObjectFactory.register('arc', function (x, y, radius, startAngle, endAngle, anticlockwise, fillColor, fillAlpha)
  116919. {
  116920. return this.displayList.add(new Arc(this.scene, x, y, radius, startAngle, endAngle, anticlockwise, fillColor, fillAlpha));
  116921. });
  116922. /**
  116923. * Creates a new Circle Shape Game Object and adds it to the Scene.
  116924. *
  116925. * A Circle is an Arc with no defined start and end angle, making it render as a complete circle.
  116926. *
  116927. * Note: This method will only be available if the Arc Game Object has been built into Phaser.
  116928. *
  116929. * @method Phaser.GameObjects.GameObjectFactory#circle
  116930. * @since 3.13.0
  116931. *
  116932. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  116933. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  116934. * @param {number} [radius=128] - The radius of the circle.
  116935. * @param {number} [fillColor] - The color the circle will be filled with, i.e. 0xff0000 for red.
  116936. * @param {number} [fillAlpha] - The alpha the circle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property.
  116937. *
  116938. * @return {Phaser.GameObjects.Arc} The Game Object that was created.
  116939. */
  116940. GameObjectFactory.register('circle', function (x, y, radius, fillColor, fillAlpha)
  116941. {
  116942. return this.displayList.add(new Arc(this.scene, x, y, radius, 0, 360, false, fillColor, fillAlpha));
  116943. });
  116944. /***/ }),
  116945. /* 778 */
  116946. /***/ (function(module, exports, __webpack_require__) {
  116947. /**
  116948. * @author Richard Davey <rich@photonstorm.com>
  116949. * @copyright 2019 Photon Storm Ltd.
  116950. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116951. */
  116952. var Zone = __webpack_require__(137);
  116953. var GameObjectFactory = __webpack_require__(5);
  116954. /**
  116955. * Creates a new Zone Game Object and adds it to the Scene.
  116956. *
  116957. * Note: This method will only be available if the Zone Game Object has been built into Phaser.
  116958. *
  116959. * @method Phaser.GameObjects.GameObjectFactory#zone
  116960. * @since 3.0.0
  116961. *
  116962. * @param {number} x - The horizontal position of this Game Object in the world.
  116963. * @param {number} y - The vertical position of this Game Object in the world.
  116964. * @param {number} width - The width of the Game Object.
  116965. * @param {number} height - The height of the Game Object.
  116966. *
  116967. * @return {Phaser.GameObjects.Zone} The Game Object that was created.
  116968. */
  116969. GameObjectFactory.register('zone', function (x, y, width, height)
  116970. {
  116971. return this.displayList.add(new Zone(this.scene, x, y, width, height));
  116972. });
  116973. // When registering a factory function 'this' refers to the GameObjectFactory context.
  116974. //
  116975. // There are several properties available to use:
  116976. //
  116977. // this.scene - a reference to the Scene that owns the GameObjectFactory
  116978. // this.displayList - a reference to the Display List the Scene owns
  116979. // this.updateList - a reference to the Update List the Scene owns
  116980. /***/ }),
  116981. /* 779 */
  116982. /***/ (function(module, exports, __webpack_require__) {
  116983. /**
  116984. * @author Richard Davey <rich@photonstorm.com>
  116985. * @copyright 2019 Photon Storm Ltd.
  116986. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116987. */
  116988. var TileSprite = __webpack_require__(162);
  116989. var GameObjectFactory = __webpack_require__(5);
  116990. /**
  116991. * Creates a new TileSprite Game Object and adds it to the Scene.
  116992. *
  116993. * Note: This method will only be available if the TileSprite Game Object has been built into Phaser.
  116994. *
  116995. * @method Phaser.GameObjects.GameObjectFactory#tileSprite
  116996. * @since 3.0.0
  116997. *
  116998. * @param {number} x - The horizontal position of this Game Object in the world.
  116999. * @param {number} y - The vertical position of this Game Object in the world.
  117000. * @param {integer} width - The width of the Game Object. If zero it will use the size of the texture frame.
  117001. * @param {integer} height - The height of the Game Object. If zero it will use the size of the texture frame.
  117002. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  117003. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  117004. *
  117005. * @return {Phaser.GameObjects.TileSprite} The Game Object that was created.
  117006. */
  117007. GameObjectFactory.register('tileSprite', function (x, y, width, height, key, frame)
  117008. {
  117009. return this.displayList.add(new TileSprite(this.scene, x, y, width, height, key, frame));
  117010. });
  117011. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117012. //
  117013. // There are several properties available to use:
  117014. //
  117015. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117016. // this.displayList - a reference to the Display List the Scene owns
  117017. // this.updateList - a reference to the Update List the Scene owns
  117018. /***/ }),
  117019. /* 780 */
  117020. /***/ (function(module, exports, __webpack_require__) {
  117021. /**
  117022. * @author Richard Davey <rich@photonstorm.com>
  117023. * @copyright 2019 Photon Storm Ltd.
  117024. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117025. */
  117026. var Text = __webpack_require__(163);
  117027. var GameObjectFactory = __webpack_require__(5);
  117028. /**
  117029. * Creates a new Text Game Object and adds it to the Scene.
  117030. *
  117031. * A Text Game Object.
  117032. *
  117033. * Text objects work by creating their own internal hidden Canvas and then renders text to it using
  117034. * the standard Canvas `fillText` API. It then creates a texture from this canvas which is rendered
  117035. * to your game during the render pass.
  117036. *
  117037. * Because it uses the Canvas API you can take advantage of all the features this offers, such as
  117038. * applying gradient fills to the text, or strokes, shadows and more. You can also use custom fonts
  117039. * loaded externally, such as Google or TypeKit Web fonts.
  117040. *
  117041. * You can only display fonts that are currently loaded and available to the browser: therefore fonts must
  117042. * be pre-loaded. Phaser does not do ths for you, so you will require the use of a 3rd party font loader,
  117043. * or have the fonts ready available in the CSS on the page in which your Phaser game resides.
  117044. *
  117045. * See {@link http://www.jordanm.co.uk/tinytype this compatibility table} for the available default fonts
  117046. * across mobile browsers.
  117047. *
  117048. * A note on performance: Every time the contents of a Text object changes, i.e. changing the text being
  117049. * displayed, or the style of the text, it needs to remake the Text canvas, and if on WebGL, re-upload the
  117050. * new texture to the GPU. This can be an expensive operation if used often, or with large quantities of
  117051. * Text objects in your game. If you run into performance issues you would be better off using Bitmap Text
  117052. * instead, as it benefits from batching and avoids expensive Canvas API calls.
  117053. *
  117054. * Note: This method will only be available if the Text Game Object has been built into Phaser.
  117055. *
  117056. * @method Phaser.GameObjects.GameObjectFactory#text
  117057. * @since 3.0.0
  117058. *
  117059. * @param {number} x - The horizontal position of this Game Object in the world.
  117060. * @param {number} y - The vertical position of this Game Object in the world.
  117061. * @param {(string|string[])} text - The text this Text object will display.
  117062. * @param {object} [style] - The Text style configuration object.
  117063. *
  117064. * @return {Phaser.GameObjects.Text} The Game Object that was created.
  117065. */
  117066. GameObjectFactory.register('text', function (x, y, text, style)
  117067. {
  117068. return this.displayList.add(new Text(this.scene, x, y, text, style));
  117069. });
  117070. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117071. //
  117072. // There are several properties available to use:
  117073. //
  117074. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117075. // this.displayList - a reference to the Display List the Scene owns
  117076. // this.updateList - a reference to the Update List the Scene owns
  117077. /***/ }),
  117078. /* 781 */
  117079. /***/ (function(module, exports, __webpack_require__) {
  117080. /**
  117081. * @author Richard Davey <rich@photonstorm.com>
  117082. * @copyright 2019 Photon Storm Ltd.
  117083. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117084. */
  117085. var BitmapText = __webpack_require__(117);
  117086. var GameObjectFactory = __webpack_require__(5);
  117087. /**
  117088. * Creates a new Bitmap Text Game Object and adds it to the Scene.
  117089. *
  117090. * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure.
  117091. *
  117092. * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to
  117093. * match the font structure.
  117094. *
  117095. * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability
  117096. * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by
  117097. * processing the font texture in an image editor, applying fills and any other effects required.
  117098. *
  117099. * To create multi-line text insert \r, \n or \r\n escape codes into the text string.
  117100. *
  117101. * To create a BitmapText data files you need a 3rd party app such as:
  117102. *
  117103. * BMFont (Windows, free): http://www.angelcode.com/products/bmfont/
  117104. * Glyph Designer (OS X, commercial): http://www.71squared.com/en/glyphdesigner
  117105. * Littera (Web-based, free): http://kvazars.com/littera/
  117106. *
  117107. * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of
  117108. * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: http://codebeautify.org/xmltojson
  117109. *
  117110. * Note: This method will only be available if the Bitmap Text Game Object has been built into Phaser.
  117111. *
  117112. * @method Phaser.GameObjects.GameObjectFactory#bitmapText
  117113. * @since 3.0.0
  117114. *
  117115. * @param {number} x - The x position of the Game Object.
  117116. * @param {number} y - The y position of the Game Object.
  117117. * @param {string} font - The key of the font to use from the BitmapFont cache.
  117118. * @param {(string|string[])} [text] - The string, or array of strings, to be set as the content of this Bitmap Text.
  117119. * @param {number} [size] - The font size to set.
  117120. * @param {integer} [align=0] - The alignment of the text in a multi-line BitmapText object.
  117121. *
  117122. * @return {Phaser.GameObjects.BitmapText} The Game Object that was created.
  117123. */
  117124. GameObjectFactory.register('bitmapText', function (x, y, font, text, size, align)
  117125. {
  117126. return this.displayList.add(new BitmapText(this.scene, x, y, font, text, size, align));
  117127. });
  117128. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117129. //
  117130. // There are several properties available to use:
  117131. //
  117132. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117133. // this.displayList - a reference to the Display List the Scene owns
  117134. // this.updateList - a reference to the Update List the Scene owns
  117135. /***/ }),
  117136. /* 782 */
  117137. /***/ (function(module, exports, __webpack_require__) {
  117138. /**
  117139. * @author Richard Davey <rich@photonstorm.com>
  117140. * @copyright 2019 Photon Storm Ltd.
  117141. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117142. */
  117143. var GameObjectFactory = __webpack_require__(5);
  117144. var Sprite = __webpack_require__(67);
  117145. /**
  117146. * Creates a new Sprite Game Object and adds it to the Scene.
  117147. *
  117148. * Note: This method will only be available if the Sprite Game Object has been built into Phaser.
  117149. *
  117150. * @method Phaser.GameObjects.GameObjectFactory#sprite
  117151. * @since 3.0.0
  117152. *
  117153. * @param {number} x - The horizontal position of this Game Object in the world.
  117154. * @param {number} y - The vertical position of this Game Object in the world.
  117155. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  117156. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  117157. *
  117158. * @return {Phaser.GameObjects.Sprite} The Game Object that was created.
  117159. */
  117160. GameObjectFactory.register('sprite', function (x, y, key, frame)
  117161. {
  117162. var sprite = new Sprite(this.scene, x, y, key, frame);
  117163. this.displayList.add(sprite);
  117164. this.updateList.add(sprite);
  117165. return sprite;
  117166. });
  117167. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117168. //
  117169. // There are several properties available to use:
  117170. //
  117171. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117172. // this.displayList - a reference to the Display List the Scene owns
  117173. // this.updateList - a reference to the Update List the Scene owns
  117174. /***/ }),
  117175. /* 783 */
  117176. /***/ (function(module, exports, __webpack_require__) {
  117177. /**
  117178. * @author Richard Davey <rich@photonstorm.com>
  117179. * @copyright 2019 Photon Storm Ltd.
  117180. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117181. */
  117182. var GameObjectFactory = __webpack_require__(5);
  117183. var RenderTexture = __webpack_require__(164);
  117184. /**
  117185. * Creates a new Render Texture Game Object and adds it to the Scene.
  117186. *
  117187. * Note: This method will only be available if the Render Texture Game Object has been built into Phaser.
  117188. *
  117189. * A Render Texture is a special texture that allows any number of Game Objects to be drawn to it. You can take many complex objects and
  117190. * draw them all to this one texture, which can they be used as the texture for other Game Object's. It's a way to generate dynamic
  117191. * textures at run-time that are WebGL friendly and don't invoke expensive GPU uploads.
  117192. *
  117193. * @method Phaser.GameObjects.GameObjectFactory#renderTexture
  117194. * @since 3.2.0
  117195. *
  117196. * @param {number} x - The horizontal position of this Game Object in the world.
  117197. * @param {number} y - The vertical position of this Game Object in the world.
  117198. * @param {integer} [width=32] - The width of the Render Texture.
  117199. * @param {integer} [height=32] - The height of the Render Texture.
  117200. *
  117201. * @return {Phaser.GameObjects.RenderTexture} The Game Object that was created.
  117202. */
  117203. GameObjectFactory.register('renderTexture', function (x, y, width, height)
  117204. {
  117205. return this.displayList.add(new RenderTexture(this.scene, x, y, width, height));
  117206. });
  117207. /***/ }),
  117208. /* 784 */
  117209. /***/ (function(module, exports, __webpack_require__) {
  117210. /**
  117211. * @author Richard Davey <rich@photonstorm.com>
  117212. * @copyright 2019 Photon Storm Ltd.
  117213. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117214. */
  117215. var GameObjectFactory = __webpack_require__(5);
  117216. var PathFollower = __webpack_require__(300);
  117217. /**
  117218. * Creates a new PathFollower Game Object and adds it to the Scene.
  117219. *
  117220. * Note: This method will only be available if the PathFollower Game Object has been built into Phaser.
  117221. *
  117222. * @method Phaser.GameObjects.GameObjectFactory#follower
  117223. * @since 3.0.0
  117224. *
  117225. * @param {Phaser.Curves.Path} path - The Path this PathFollower is connected to.
  117226. * @param {number} x - The horizontal position of this Game Object in the world.
  117227. * @param {number} y - The vertical position of this Game Object in the world.
  117228. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  117229. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  117230. *
  117231. * @return {Phaser.GameObjects.PathFollower} The Game Object that was created.
  117232. */
  117233. GameObjectFactory.register('follower', function (path, x, y, key, frame)
  117234. {
  117235. var sprite = new PathFollower(this.scene, path, x, y, key, frame);
  117236. this.displayList.add(sprite);
  117237. this.updateList.add(sprite);
  117238. return sprite;
  117239. });
  117240. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117241. //
  117242. // There are several properties available to use:
  117243. //
  117244. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117245. // this.displayList - a reference to the Display List the Scene owns
  117246. // this.updateList - a reference to the Update List the Scene owns
  117247. /***/ }),
  117248. /* 785 */
  117249. /***/ (function(module, exports, __webpack_require__) {
  117250. /**
  117251. * @author Richard Davey <rich@photonstorm.com>
  117252. * @copyright 2019 Photon Storm Ltd.
  117253. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117254. */
  117255. var GameObjectFactory = __webpack_require__(5);
  117256. var ParticleEmitterManager = __webpack_require__(165);
  117257. /**
  117258. * Creates a new Particle Emitter Manager Game Object and adds it to the Scene.
  117259. *
  117260. * Note: This method will only be available if the Particles Game Object has been built into Phaser.
  117261. *
  117262. * @method Phaser.GameObjects.GameObjectFactory#particles
  117263. * @since 3.0.0
  117264. *
  117265. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  117266. * @param {(string|integer|object)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  117267. * @param {ParticleEmitterConfig|ParticleEmitterConfig[]} [emitters] - Configuration settings for one or more emitters to create.
  117268. *
  117269. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} The Game Object that was created.
  117270. */
  117271. GameObjectFactory.register('particles', function (key, frame, emitters)
  117272. {
  117273. var manager = new ParticleEmitterManager(this.scene, key, frame, emitters);
  117274. this.displayList.add(manager);
  117275. this.updateList.add(manager);
  117276. return manager;
  117277. });
  117278. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117279. //
  117280. // There are several properties available to use:
  117281. //
  117282. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117283. // this.displayList - a reference to the Display List the Scene owns
  117284. // this.updateList - a reference to the Update List the Scene owns
  117285. /***/ }),
  117286. /* 786 */
  117287. /***/ (function(module, exports, __webpack_require__) {
  117288. /**
  117289. * @author Richard Davey <rich@photonstorm.com>
  117290. * @copyright 2019 Photon Storm Ltd.
  117291. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117292. */
  117293. var Image = __webpack_require__(93);
  117294. var GameObjectFactory = __webpack_require__(5);
  117295. /**
  117296. * Creates a new Image Game Object and adds it to the Scene.
  117297. *
  117298. * Note: This method will only be available if the Image Game Object has been built into Phaser.
  117299. *
  117300. * @method Phaser.GameObjects.GameObjectFactory#image
  117301. * @since 3.0.0
  117302. *
  117303. * @param {number} x - The horizontal position of this Game Object in the world.
  117304. * @param {number} y - The vertical position of this Game Object in the world.
  117305. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  117306. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  117307. *
  117308. * @return {Phaser.GameObjects.Image} The Game Object that was created.
  117309. */
  117310. GameObjectFactory.register('image', function (x, y, key, frame)
  117311. {
  117312. return this.displayList.add(new Image(this.scene, x, y, key, frame));
  117313. });
  117314. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117315. //
  117316. // There are several properties available to use:
  117317. //
  117318. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117319. // this.displayList - a reference to the Display List the Scene owns
  117320. // this.updateList - a reference to the Update List the Scene owns
  117321. /***/ }),
  117322. /* 787 */
  117323. /***/ (function(module, exports, __webpack_require__) {
  117324. /**
  117325. * @author Richard Davey <rich@photonstorm.com>
  117326. * @copyright 2019 Photon Storm Ltd.
  117327. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117328. */
  117329. var Group = __webpack_require__(94);
  117330. var GameObjectFactory = __webpack_require__(5);
  117331. /**
  117332. * Creates a new Group Game Object and adds it to the Scene.
  117333. *
  117334. * Note: This method will only be available if the Group Game Object has been built into Phaser.
  117335. *
  117336. * @method Phaser.GameObjects.GameObjectFactory#group
  117337. * @since 3.0.0
  117338. *
  117339. * @param {(Phaser.GameObjects.GameObject[]|GroupConfig|GroupConfig[])} [children] - Game Objects to add to this Group; or the `config` argument.
  117340. * @param {GroupConfig|GroupCreateConfig} [config] - A Group Configuration object.
  117341. *
  117342. * @return {Phaser.GameObjects.Group} The Game Object that was created.
  117343. */
  117344. GameObjectFactory.register('group', function (children, config)
  117345. {
  117346. return this.updateList.add(new Group(this.scene, children, config));
  117347. });
  117348. /***/ }),
  117349. /* 788 */
  117350. /***/ (function(module, exports, __webpack_require__) {
  117351. /**
  117352. * @author Richard Davey <rich@photonstorm.com>
  117353. * @copyright 2019 Photon Storm Ltd.
  117354. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117355. */
  117356. var Graphics = __webpack_require__(168);
  117357. var GameObjectFactory = __webpack_require__(5);
  117358. /**
  117359. * Creates a new Graphics Game Object and adds it to the Scene.
  117360. *
  117361. * Note: This method will only be available if the Graphics Game Object has been built into Phaser.
  117362. *
  117363. * @method Phaser.GameObjects.GameObjectFactory#graphics
  117364. * @since 3.0.0
  117365. *
  117366. * @param {GraphicsOptions} [config] - The Graphics configuration.
  117367. *
  117368. * @return {Phaser.GameObjects.Graphics} The Game Object that was created.
  117369. */
  117370. GameObjectFactory.register('graphics', function (config)
  117371. {
  117372. return this.displayList.add(new Graphics(this.scene, config));
  117373. });
  117374. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117375. //
  117376. // There are several properties available to use:
  117377. //
  117378. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117379. // this.displayList - a reference to the Display List the Scene owns
  117380. // this.updateList - a reference to the Update List the Scene owns
  117381. /***/ }),
  117382. /* 789 */
  117383. /***/ (function(module, exports, __webpack_require__) {
  117384. /**
  117385. * @author Richard Davey <rich@photonstorm.com>
  117386. * @copyright 2019 Photon Storm Ltd.
  117387. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117388. */
  117389. var Extern = __webpack_require__(312);
  117390. var GameObjectFactory = __webpack_require__(5);
  117391. /**
  117392. * Creates a new Extern Game Object and adds it to the Scene.
  117393. *
  117394. * Note: This method will only be available if the Extern Game Object has been built into Phaser.
  117395. *
  117396. * @method Phaser.GameObjects.GameObjectFactory#extern
  117397. * @since 3.16.0
  117398. *
  117399. * @return {Phaser.GameObjects.Extern} The Game Object that was created.
  117400. */
  117401. GameObjectFactory.register('extern', function ()
  117402. {
  117403. var extern = new Extern(this.scene);
  117404. this.displayList.add(extern);
  117405. this.updateList.add(extern);
  117406. return extern;
  117407. });
  117408. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117409. //
  117410. // There are several properties available to use:
  117411. //
  117412. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117413. // this.displayList - a reference to the Display List the Scene owns
  117414. // this.updateList - a reference to the Update List the Scene owns
  117415. /***/ }),
  117416. /* 790 */
  117417. /***/ (function(module, exports, __webpack_require__) {
  117418. /**
  117419. * @author Richard Davey <rich@photonstorm.com>
  117420. * @copyright 2019 Photon Storm Ltd.
  117421. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117422. */
  117423. var DynamicBitmapText = __webpack_require__(169);
  117424. var GameObjectFactory = __webpack_require__(5);
  117425. /**
  117426. * Creates a new Dynamic Bitmap Text Game Object and adds it to the Scene.
  117427. *
  117428. * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure.
  117429. *
  117430. * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to
  117431. * match the font structure.
  117432. *
  117433. * Dynamic Bitmap Text objects are different from Static Bitmap Text in that they invoke a callback for each
  117434. * letter being rendered during the render pass. This callback allows you to manipulate the properties of
  117435. * each letter being rendered, such as its position, scale or tint, allowing you to create interesting effects
  117436. * like jiggling text, which can't be done with Static text. This means that Dynamic Text takes more processing
  117437. * time, so only use them if you require the callback ability they have.
  117438. *
  117439. * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability
  117440. * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by
  117441. * processing the font texture in an image editor, applying fills and any other effects required.
  117442. *
  117443. * To create multi-line text insert \r, \n or \r\n escape codes into the text string.
  117444. *
  117445. * To create a BitmapText data files you need a 3rd party app such as:
  117446. *
  117447. * BMFont (Windows, free): http://www.angelcode.com/products/bmfont/
  117448. * Glyph Designer (OS X, commercial): http://www.71squared.com/en/glyphdesigner
  117449. * Littera (Web-based, free): http://kvazars.com/littera/
  117450. *
  117451. * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of
  117452. * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: http://codebeautify.org/xmltojson
  117453. *
  117454. * Note: This method will only be available if the Dynamic Bitmap Text Game Object has been built into Phaser.
  117455. *
  117456. * @method Phaser.GameObjects.GameObjectFactory#dynamicBitmapText
  117457. * @since 3.0.0
  117458. *
  117459. * @param {number} x - The x position of the Game Object.
  117460. * @param {number} y - The y position of the Game Object.
  117461. * @param {string} font - The key of the font to use from the BitmapFont cache.
  117462. * @param {(string|string[])} [text] - The string, or array of strings, to be set as the content of this Bitmap Text.
  117463. * @param {number} [size] - The font size to set.
  117464. *
  117465. * @return {Phaser.GameObjects.DynamicBitmapText} The Game Object that was created.
  117466. */
  117467. GameObjectFactory.register('dynamicBitmapText', function (x, y, font, text, size)
  117468. {
  117469. return this.displayList.add(new DynamicBitmapText(this.scene, x, y, font, text, size));
  117470. });
  117471. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117472. //
  117473. // There are several properties available to use:
  117474. //
  117475. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117476. // this.displayList - a reference to the Display List the Scene owns
  117477. // this.updateList - a reference to the Update List the Scene owns
  117478. /***/ }),
  117479. /* 791 */
  117480. /***/ (function(module, exports, __webpack_require__) {
  117481. /**
  117482. * @author Richard Davey <rich@photonstorm.com>
  117483. * @author Felipe Alfonso <@bitnenfer>
  117484. * @copyright 2019 Photon Storm Ltd.
  117485. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117486. */
  117487. var Container = __webpack_require__(170);
  117488. var GameObjectFactory = __webpack_require__(5);
  117489. /**
  117490. * Creates a new Container Game Object and adds it to the Scene.
  117491. *
  117492. * Note: This method will only be available if the Container Game Object has been built into Phaser.
  117493. *
  117494. * @method Phaser.GameObjects.GameObjectFactory#container
  117495. * @since 3.4.0
  117496. *
  117497. * @param {number} x - The horizontal position of this Game Object in the world.
  117498. * @param {number} y - The vertical position of this Game Object in the world.
  117499. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} [children] - An optional array of Game Objects to add to this Container.
  117500. *
  117501. * @return {Phaser.GameObjects.Container} The Game Object that was created.
  117502. */
  117503. GameObjectFactory.register('container', function (x, y, children)
  117504. {
  117505. return this.displayList.add(new Container(this.scene, x, y, children));
  117506. });
  117507. /***/ }),
  117508. /* 792 */
  117509. /***/ (function(module, exports, __webpack_require__) {
  117510. /**
  117511. * @author Richard Davey <rich@photonstorm.com>
  117512. * @copyright 2019 Photon Storm Ltd.
  117513. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117514. */
  117515. var Blitter = __webpack_require__(171);
  117516. var GameObjectFactory = __webpack_require__(5);
  117517. /**
  117518. * Creates a new Blitter Game Object and adds it to the Scene.
  117519. *
  117520. * Note: This method will only be available if the Blitter Game Object has been built into Phaser.
  117521. *
  117522. * @method Phaser.GameObjects.GameObjectFactory#blitter
  117523. * @since 3.0.0
  117524. *
  117525. * @param {number} x - The x position of the Game Object.
  117526. * @param {number} y - The y position of the Game Object.
  117527. * @param {string} key - The key of the Texture the Blitter object will use.
  117528. * @param {(string|integer)} [frame] - The default Frame children of the Blitter will use.
  117529. *
  117530. * @return {Phaser.GameObjects.Blitter} The Game Object that was created.
  117531. */
  117532. GameObjectFactory.register('blitter', function (x, y, key, frame)
  117533. {
  117534. return this.displayList.add(new Blitter(this.scene, x, y, key, frame));
  117535. });
  117536. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117537. //
  117538. // There are several properties available to use:
  117539. //
  117540. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117541. // this.displayList - a reference to the Display List the Scene owns
  117542. // this.updateList - a reference to the Update List the Scene owns
  117543. /***/ }),
  117544. /* 793 */
  117545. /***/ (function(module, exports, __webpack_require__) {
  117546. /**
  117547. * @author Richard Davey <rich@photonstorm.com>
  117548. * @copyright 2019 Photon Storm Ltd.
  117549. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117550. */
  117551. var FillStyleCanvas = __webpack_require__(33);
  117552. var LineStyleCanvas = __webpack_require__(39);
  117553. var SetTransform = __webpack_require__(25);
  117554. /**
  117555. * Renders this Game Object with the Canvas Renderer to the given Camera.
  117556. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  117557. * This method should not be called directly. It is a utility function of the Render module.
  117558. *
  117559. * @method Phaser.GameObjects.Triangle#renderCanvas
  117560. * @since 3.13.0
  117561. * @private
  117562. *
  117563. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  117564. * @param {Phaser.GameObjects.Triangle} src - The Game Object being rendered in this call.
  117565. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  117566. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  117567. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  117568. */
  117569. var TriangleCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  117570. {
  117571. var ctx = renderer.currentContext;
  117572. if (SetTransform(renderer, ctx, src, camera, parentMatrix))
  117573. {
  117574. var dx = src._displayOriginX;
  117575. var dy = src._displayOriginY;
  117576. var x1 = src.geom.x1 - dx;
  117577. var y1 = src.geom.y1 - dy;
  117578. var x2 = src.geom.x2 - dx;
  117579. var y2 = src.geom.y2 - dy;
  117580. var x3 = src.geom.x3 - dx;
  117581. var y3 = src.geom.y3 - dy;
  117582. ctx.beginPath();
  117583. ctx.moveTo(x1, y1);
  117584. ctx.lineTo(x2, y2);
  117585. ctx.lineTo(x3, y3);
  117586. ctx.closePath();
  117587. if (src.isFilled)
  117588. {
  117589. FillStyleCanvas(ctx, src);
  117590. ctx.fill();
  117591. }
  117592. if (src.isStroked)
  117593. {
  117594. LineStyleCanvas(ctx, src);
  117595. ctx.stroke();
  117596. }
  117597. // Restore the context saved in SetTransform
  117598. ctx.restore();
  117599. }
  117600. };
  117601. module.exports = TriangleCanvasRenderer;
  117602. /***/ }),
  117603. /* 794 */
  117604. /***/ (function(module, exports, __webpack_require__) {
  117605. /**
  117606. * @author Richard Davey <rich@photonstorm.com>
  117607. * @copyright 2019 Photon Storm Ltd.
  117608. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117609. */
  117610. var StrokePathWebGL = __webpack_require__(66);
  117611. var Utils = __webpack_require__(9);
  117612. /**
  117613. * Renders this Game Object with the WebGL Renderer to the given Camera.
  117614. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  117615. * This method should not be called directly. It is a utility function of the Render module.
  117616. *
  117617. * @method Phaser.GameObjects.Triangle#renderWebGL
  117618. * @since 3.13.0
  117619. * @private
  117620. *
  117621. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  117622. * @param {Phaser.GameObjects.Triangle} src - The Game Object being rendered in this call.
  117623. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  117624. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  117625. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  117626. */
  117627. var TriangleWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  117628. {
  117629. var pipeline = this.pipeline;
  117630. var camMatrix = pipeline._tempMatrix1;
  117631. var shapeMatrix = pipeline._tempMatrix2;
  117632. var calcMatrix = pipeline._tempMatrix3;
  117633. renderer.setPipeline(pipeline);
  117634. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  117635. camMatrix.copyFrom(camera.matrix);
  117636. if (parentMatrix)
  117637. {
  117638. // Multiply the camera by the parent matrix
  117639. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  117640. // Undo the camera scroll
  117641. shapeMatrix.e = src.x;
  117642. shapeMatrix.f = src.y;
  117643. }
  117644. else
  117645. {
  117646. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  117647. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  117648. }
  117649. camMatrix.multiply(shapeMatrix, calcMatrix);
  117650. var dx = src._displayOriginX;
  117651. var dy = src._displayOriginY;
  117652. var alpha = camera.alpha * src.alpha;
  117653. if (src.isFilled)
  117654. {
  117655. var fillTint = pipeline.fillTint;
  117656. var fillTintColor = Utils.getTintAppendFloatAlphaAndSwap(src.fillColor, src.fillAlpha * alpha);
  117657. fillTint.TL = fillTintColor;
  117658. fillTint.TR = fillTintColor;
  117659. fillTint.BL = fillTintColor;
  117660. fillTint.BR = fillTintColor;
  117661. var x1 = src.geom.x1 - dx;
  117662. var y1 = src.geom.y1 - dy;
  117663. var x2 = src.geom.x2 - dx;
  117664. var y2 = src.geom.y2 - dy;
  117665. var x3 = src.geom.x3 - dx;
  117666. var y3 = src.geom.y3 - dy;
  117667. pipeline.setTexture2D();
  117668. pipeline.batchFillTriangle(
  117669. x1,
  117670. y1,
  117671. x2,
  117672. y2,
  117673. x3,
  117674. y3,
  117675. shapeMatrix,
  117676. camMatrix
  117677. );
  117678. }
  117679. if (src.isStroked)
  117680. {
  117681. StrokePathWebGL(pipeline, src, alpha, dx, dy);
  117682. }
  117683. };
  117684. module.exports = TriangleWebGLRenderer;
  117685. /***/ }),
  117686. /* 795 */
  117687. /***/ (function(module, exports, __webpack_require__) {
  117688. /**
  117689. * @author Richard Davey <rich@photonstorm.com>
  117690. * @copyright 2019 Photon Storm Ltd.
  117691. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117692. */
  117693. var renderWebGL = __webpack_require__(1);
  117694. var renderCanvas = __webpack_require__(1);
  117695. if (true)
  117696. {
  117697. renderWebGL = __webpack_require__(794);
  117698. }
  117699. if (true)
  117700. {
  117701. renderCanvas = __webpack_require__(793);
  117702. }
  117703. module.exports = {
  117704. renderWebGL: renderWebGL,
  117705. renderCanvas: renderCanvas
  117706. };
  117707. /***/ }),
  117708. /* 796 */
  117709. /***/ (function(module, exports, __webpack_require__) {
  117710. /**
  117711. * @author Richard Davey <rich@photonstorm.com>
  117712. * @copyright 2019 Photon Storm Ltd.
  117713. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117714. */
  117715. var FillStyleCanvas = __webpack_require__(33);
  117716. var LineStyleCanvas = __webpack_require__(39);
  117717. var SetTransform = __webpack_require__(25);
  117718. /**
  117719. * Renders this Game Object with the Canvas Renderer to the given Camera.
  117720. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  117721. * This method should not be called directly. It is a utility function of the Render module.
  117722. *
  117723. * @method Phaser.GameObjects.Star#renderCanvas
  117724. * @since 3.13.0
  117725. * @private
  117726. *
  117727. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  117728. * @param {Phaser.GameObjects.Star} src - The Game Object being rendered in this call.
  117729. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  117730. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  117731. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  117732. */
  117733. var StarCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  117734. {
  117735. var ctx = renderer.currentContext;
  117736. if (SetTransform(renderer, ctx, src, camera, parentMatrix))
  117737. {
  117738. var dx = src._displayOriginX;
  117739. var dy = src._displayOriginY;
  117740. var path = src.pathData;
  117741. var pathLength = path.length - 1;
  117742. var px1 = path[0] - dx;
  117743. var py1 = path[1] - dy;
  117744. ctx.beginPath();
  117745. ctx.moveTo(px1, py1);
  117746. if (!src.closePath)
  117747. {
  117748. pathLength -= 2;
  117749. }
  117750. for (var i = 2; i < pathLength; i += 2)
  117751. {
  117752. var px2 = path[i] - dx;
  117753. var py2 = path[i + 1] - dy;
  117754. ctx.lineTo(px2, py2);
  117755. }
  117756. ctx.closePath();
  117757. if (src.isFilled)
  117758. {
  117759. FillStyleCanvas(ctx, src);
  117760. ctx.fill();
  117761. }
  117762. if (src.isStroked)
  117763. {
  117764. LineStyleCanvas(ctx, src);
  117765. ctx.stroke();
  117766. }
  117767. // Restore the context saved in SetTransform
  117768. ctx.restore();
  117769. }
  117770. };
  117771. module.exports = StarCanvasRenderer;
  117772. /***/ }),
  117773. /* 797 */
  117774. /***/ (function(module, exports, __webpack_require__) {
  117775. /**
  117776. * @author Richard Davey <rich@photonstorm.com>
  117777. * @copyright 2019 Photon Storm Ltd.
  117778. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117779. */
  117780. var FillPathWebGL = __webpack_require__(88);
  117781. var StrokePathWebGL = __webpack_require__(66);
  117782. /**
  117783. * Renders this Game Object with the WebGL Renderer to the given Camera.
  117784. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  117785. * This method should not be called directly. It is a utility function of the Render module.
  117786. *
  117787. * @method Phaser.GameObjects.Star#renderWebGL
  117788. * @since 3.13.0
  117789. * @private
  117790. *
  117791. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  117792. * @param {Phaser.GameObjects.Star} src - The Game Object being rendered in this call.
  117793. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  117794. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  117795. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  117796. */
  117797. var StarWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  117798. {
  117799. var pipeline = this.pipeline;
  117800. var camMatrix = pipeline._tempMatrix1;
  117801. var shapeMatrix = pipeline._tempMatrix2;
  117802. var calcMatrix = pipeline._tempMatrix3;
  117803. renderer.setPipeline(pipeline);
  117804. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  117805. camMatrix.copyFrom(camera.matrix);
  117806. if (parentMatrix)
  117807. {
  117808. // Multiply the camera by the parent matrix
  117809. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  117810. // Undo the camera scroll
  117811. shapeMatrix.e = src.x;
  117812. shapeMatrix.f = src.y;
  117813. }
  117814. else
  117815. {
  117816. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  117817. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  117818. }
  117819. camMatrix.multiply(shapeMatrix, calcMatrix);
  117820. var dx = src._displayOriginX;
  117821. var dy = src._displayOriginY;
  117822. var alpha = camera.alpha * src.alpha;
  117823. if (src.isFilled)
  117824. {
  117825. FillPathWebGL(pipeline, calcMatrix, src, alpha, dx, dy);
  117826. }
  117827. if (src.isStroked)
  117828. {
  117829. StrokePathWebGL(pipeline, src, alpha, dx, dy);
  117830. }
  117831. };
  117832. module.exports = StarWebGLRenderer;
  117833. /***/ }),
  117834. /* 798 */
  117835. /***/ (function(module, exports, __webpack_require__) {
  117836. /**
  117837. * @author Richard Davey <rich@photonstorm.com>
  117838. * @copyright 2019 Photon Storm Ltd.
  117839. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117840. */
  117841. var renderWebGL = __webpack_require__(1);
  117842. var renderCanvas = __webpack_require__(1);
  117843. if (true)
  117844. {
  117845. renderWebGL = __webpack_require__(797);
  117846. }
  117847. if (true)
  117848. {
  117849. renderCanvas = __webpack_require__(796);
  117850. }
  117851. module.exports = {
  117852. renderWebGL: renderWebGL,
  117853. renderCanvas: renderCanvas
  117854. };
  117855. /***/ }),
  117856. /* 799 */
  117857. /***/ (function(module, exports, __webpack_require__) {
  117858. /**
  117859. * @author Richard Davey <rich@photonstorm.com>
  117860. * @copyright 2019 Photon Storm Ltd.
  117861. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117862. */
  117863. var FillStyleCanvas = __webpack_require__(33);
  117864. var LineStyleCanvas = __webpack_require__(39);
  117865. var SetTransform = __webpack_require__(25);
  117866. /**
  117867. * Renders this Game Object with the Canvas Renderer to the given Camera.
  117868. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  117869. * This method should not be called directly. It is a utility function of the Render module.
  117870. *
  117871. * @method Phaser.GameObjects.Rectangle#renderCanvas
  117872. * @since 3.13.0
  117873. * @private
  117874. *
  117875. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  117876. * @param {Phaser.GameObjects.Rectangle} src - The Game Object being rendered in this call.
  117877. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  117878. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  117879. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  117880. */
  117881. var RectangleCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  117882. {
  117883. var ctx = renderer.currentContext;
  117884. if (SetTransform(renderer, ctx, src, camera, parentMatrix))
  117885. {
  117886. var dx = src._displayOriginX;
  117887. var dy = src._displayOriginY;
  117888. if (src.isFilled)
  117889. {
  117890. FillStyleCanvas(ctx, src);
  117891. ctx.fillRect(
  117892. -dx,
  117893. -dy,
  117894. src.width,
  117895. src.height
  117896. );
  117897. }
  117898. if (src.isStroked)
  117899. {
  117900. LineStyleCanvas(ctx, src);
  117901. ctx.beginPath();
  117902. ctx.rect(
  117903. -dx,
  117904. -dy,
  117905. src.width,
  117906. src.height
  117907. );
  117908. ctx.stroke();
  117909. }
  117910. // Restore the context saved in SetTransform
  117911. ctx.restore();
  117912. }
  117913. };
  117914. module.exports = RectangleCanvasRenderer;
  117915. /***/ }),
  117916. /* 800 */
  117917. /***/ (function(module, exports, __webpack_require__) {
  117918. /**
  117919. * @author Richard Davey <rich@photonstorm.com>
  117920. * @copyright 2019 Photon Storm Ltd.
  117921. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117922. */
  117923. var StrokePathWebGL = __webpack_require__(66);
  117924. var Utils = __webpack_require__(9);
  117925. /**
  117926. * Renders this Game Object with the WebGL Renderer to the given Camera.
  117927. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  117928. * This method should not be called directly. It is a utility function of the Render module.
  117929. *
  117930. * @method Phaser.GameObjects.Rectangle#renderWebGL
  117931. * @since 3.13.0
  117932. * @private
  117933. *
  117934. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  117935. * @param {Phaser.GameObjects.Rectangle} src - The Game Object being rendered in this call.
  117936. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  117937. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  117938. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  117939. */
  117940. var RectangleWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  117941. {
  117942. var pipeline = this.pipeline;
  117943. var camMatrix = pipeline._tempMatrix1;
  117944. var shapeMatrix = pipeline._tempMatrix2;
  117945. var calcMatrix = pipeline._tempMatrix3;
  117946. renderer.setPipeline(pipeline);
  117947. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  117948. camMatrix.copyFrom(camera.matrix);
  117949. if (parentMatrix)
  117950. {
  117951. // Multiply the camera by the parent matrix
  117952. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  117953. // Undo the camera scroll
  117954. shapeMatrix.e = src.x;
  117955. shapeMatrix.f = src.y;
  117956. }
  117957. else
  117958. {
  117959. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  117960. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  117961. }
  117962. camMatrix.multiply(shapeMatrix, calcMatrix);
  117963. var dx = src._displayOriginX;
  117964. var dy = src._displayOriginY;
  117965. var alpha = camera.alpha * src.alpha;
  117966. if (src.isFilled)
  117967. {
  117968. var fillTint = pipeline.fillTint;
  117969. var fillTintColor = Utils.getTintAppendFloatAlphaAndSwap(src.fillColor, src.fillAlpha * alpha);
  117970. fillTint.TL = fillTintColor;
  117971. fillTint.TR = fillTintColor;
  117972. fillTint.BL = fillTintColor;
  117973. fillTint.BR = fillTintColor;
  117974. pipeline.setTexture2D();
  117975. pipeline.batchFillRect(
  117976. -dx,
  117977. -dy,
  117978. src.width,
  117979. src.height
  117980. );
  117981. }
  117982. if (src.isStroked)
  117983. {
  117984. StrokePathWebGL(pipeline, src, alpha, dx, dy);
  117985. }
  117986. };
  117987. module.exports = RectangleWebGLRenderer;
  117988. /***/ }),
  117989. /* 801 */
  117990. /***/ (function(module, exports, __webpack_require__) {
  117991. /**
  117992. * @author Richard Davey <rich@photonstorm.com>
  117993. * @copyright 2019 Photon Storm Ltd.
  117994. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117995. */
  117996. var renderWebGL = __webpack_require__(1);
  117997. var renderCanvas = __webpack_require__(1);
  117998. if (true)
  117999. {
  118000. renderWebGL = __webpack_require__(800);
  118001. }
  118002. if (true)
  118003. {
  118004. renderCanvas = __webpack_require__(799);
  118005. }
  118006. module.exports = {
  118007. renderWebGL: renderWebGL,
  118008. renderCanvas: renderCanvas
  118009. };
  118010. /***/ }),
  118011. /* 802 */
  118012. /***/ (function(module, exports, __webpack_require__) {
  118013. /**
  118014. * @author Richard Davey <rich@photonstorm.com>
  118015. * @copyright 2019 Photon Storm Ltd.
  118016. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118017. */
  118018. var FillStyleCanvas = __webpack_require__(33);
  118019. var LineStyleCanvas = __webpack_require__(39);
  118020. var SetTransform = __webpack_require__(25);
  118021. /**
  118022. * Renders this Game Object with the Canvas Renderer to the given Camera.
  118023. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118024. * This method should not be called directly. It is a utility function of the Render module.
  118025. *
  118026. * @method Phaser.GameObjects.Polygon#renderCanvas
  118027. * @since 3.13.0
  118028. * @private
  118029. *
  118030. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  118031. * @param {Phaser.GameObjects.Polygon} src - The Game Object being rendered in this call.
  118032. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118033. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118034. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118035. */
  118036. var PolygonCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118037. {
  118038. var ctx = renderer.currentContext;
  118039. if (SetTransform(renderer, ctx, src, camera, parentMatrix))
  118040. {
  118041. var dx = src._displayOriginX;
  118042. var dy = src._displayOriginY;
  118043. var path = src.pathData;
  118044. var pathLength = path.length - 1;
  118045. var px1 = path[0] - dx;
  118046. var py1 = path[1] - dy;
  118047. ctx.beginPath();
  118048. ctx.moveTo(px1, py1);
  118049. if (!src.closePath)
  118050. {
  118051. pathLength -= 2;
  118052. }
  118053. for (var i = 2; i < pathLength; i += 2)
  118054. {
  118055. var px2 = path[i] - dx;
  118056. var py2 = path[i + 1] - dy;
  118057. ctx.lineTo(px2, py2);
  118058. }
  118059. ctx.closePath();
  118060. if (src.isFilled)
  118061. {
  118062. FillStyleCanvas(ctx, src);
  118063. ctx.fill();
  118064. }
  118065. if (src.isStroked)
  118066. {
  118067. LineStyleCanvas(ctx, src);
  118068. ctx.stroke();
  118069. }
  118070. // Restore the context saved in SetTransform
  118071. ctx.restore();
  118072. }
  118073. };
  118074. module.exports = PolygonCanvasRenderer;
  118075. /***/ }),
  118076. /* 803 */
  118077. /***/ (function(module, exports, __webpack_require__) {
  118078. /**
  118079. * @author Richard Davey <rich@photonstorm.com>
  118080. * @copyright 2019 Photon Storm Ltd.
  118081. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118082. */
  118083. var FillPathWebGL = __webpack_require__(88);
  118084. var StrokePathWebGL = __webpack_require__(66);
  118085. /**
  118086. * Renders this Game Object with the WebGL Renderer to the given Camera.
  118087. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118088. * This method should not be called directly. It is a utility function of the Render module.
  118089. *
  118090. * @method Phaser.GameObjects.Polygon#renderWebGL
  118091. * @since 3.13.0
  118092. * @private
  118093. *
  118094. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  118095. * @param {Phaser.GameObjects.Polygon} src - The Game Object being rendered in this call.
  118096. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118097. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118098. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118099. */
  118100. var PolygonWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118101. {
  118102. var pipeline = this.pipeline;
  118103. var camMatrix = pipeline._tempMatrix1;
  118104. var shapeMatrix = pipeline._tempMatrix2;
  118105. var calcMatrix = pipeline._tempMatrix3;
  118106. renderer.setPipeline(pipeline);
  118107. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  118108. camMatrix.copyFrom(camera.matrix);
  118109. if (parentMatrix)
  118110. {
  118111. // Multiply the camera by the parent matrix
  118112. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  118113. // Undo the camera scroll
  118114. shapeMatrix.e = src.x;
  118115. shapeMatrix.f = src.y;
  118116. }
  118117. else
  118118. {
  118119. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  118120. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  118121. }
  118122. camMatrix.multiply(shapeMatrix, calcMatrix);
  118123. var dx = src._displayOriginX;
  118124. var dy = src._displayOriginY;
  118125. var alpha = camera.alpha * src.alpha;
  118126. if (src.isFilled)
  118127. {
  118128. FillPathWebGL(pipeline, calcMatrix, src, alpha, dx, dy);
  118129. }
  118130. if (src.isStroked)
  118131. {
  118132. StrokePathWebGL(pipeline, src, alpha, dx, dy);
  118133. }
  118134. };
  118135. module.exports = PolygonWebGLRenderer;
  118136. /***/ }),
  118137. /* 804 */
  118138. /***/ (function(module, exports, __webpack_require__) {
  118139. /**
  118140. * @author Richard Davey <rich@photonstorm.com>
  118141. * @copyright 2019 Photon Storm Ltd.
  118142. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118143. */
  118144. var renderWebGL = __webpack_require__(1);
  118145. var renderCanvas = __webpack_require__(1);
  118146. if (true)
  118147. {
  118148. renderWebGL = __webpack_require__(803);
  118149. }
  118150. if (true)
  118151. {
  118152. renderCanvas = __webpack_require__(802);
  118153. }
  118154. module.exports = {
  118155. renderWebGL: renderWebGL,
  118156. renderCanvas: renderCanvas
  118157. };
  118158. /***/ }),
  118159. /* 805 */
  118160. /***/ (function(module, exports, __webpack_require__) {
  118161. /**
  118162. * @author Richard Davey <rich@photonstorm.com>
  118163. * @copyright 2019 Photon Storm Ltd.
  118164. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118165. */
  118166. var LineStyleCanvas = __webpack_require__(39);
  118167. var SetTransform = __webpack_require__(25);
  118168. /**
  118169. * Renders this Game Object with the Canvas Renderer to the given Camera.
  118170. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118171. * This method should not be called directly. It is a utility function of the Render module.
  118172. *
  118173. * @method Phaser.GameObjects.Line#renderCanvas
  118174. * @since 3.13.0
  118175. * @private
  118176. *
  118177. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  118178. * @param {Phaser.GameObjects.Line} src - The Game Object being rendered in this call.
  118179. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118180. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118181. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118182. */
  118183. var LineCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118184. {
  118185. var ctx = renderer.currentContext;
  118186. if (SetTransform(renderer, ctx, src, camera, parentMatrix))
  118187. {
  118188. var dx = src._displayOriginX;
  118189. var dy = src._displayOriginY;
  118190. if (src.isStroked)
  118191. {
  118192. LineStyleCanvas(ctx, src);
  118193. ctx.beginPath();
  118194. ctx.moveTo(src.geom.x1 - dx, src.geom.y1 - dy);
  118195. ctx.lineTo(src.geom.x2 - dx, src.geom.y2 - dy);
  118196. ctx.stroke();
  118197. }
  118198. // Restore the context saved in SetTransform
  118199. ctx.restore();
  118200. }
  118201. };
  118202. module.exports = LineCanvasRenderer;
  118203. /***/ }),
  118204. /* 806 */
  118205. /***/ (function(module, exports, __webpack_require__) {
  118206. /**
  118207. * @author Richard Davey <rich@photonstorm.com>
  118208. * @copyright 2019 Photon Storm Ltd.
  118209. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118210. */
  118211. var Utils = __webpack_require__(9);
  118212. /**
  118213. * Renders this Game Object with the WebGL Renderer to the given Camera.
  118214. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118215. * This method should not be called directly. It is a utility function of the Render module.
  118216. *
  118217. * @method Phaser.GameObjects.Line#renderWebGL
  118218. * @since 3.13.0
  118219. * @private
  118220. *
  118221. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  118222. * @param {Phaser.GameObjects.Line} src - The Game Object being rendered in this call.
  118223. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118224. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118225. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118226. */
  118227. var LineWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118228. {
  118229. var pipeline = this.pipeline;
  118230. var camMatrix = pipeline._tempMatrix1;
  118231. var shapeMatrix = pipeline._tempMatrix2;
  118232. renderer.setPipeline(pipeline);
  118233. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  118234. camMatrix.copyFrom(camera.matrix);
  118235. if (parentMatrix)
  118236. {
  118237. // Multiply the camera by the parent matrix
  118238. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  118239. // Undo the camera scroll
  118240. shapeMatrix.e = src.x;
  118241. shapeMatrix.f = src.y;
  118242. }
  118243. else
  118244. {
  118245. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  118246. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  118247. }
  118248. var dx = src._displayOriginX;
  118249. var dy = src._displayOriginY;
  118250. var alpha = camera.alpha * src.alpha;
  118251. if (src.isStroked)
  118252. {
  118253. var strokeTint = pipeline.strokeTint;
  118254. var color = Utils.getTintAppendFloatAlphaAndSwap(src.strokeColor, src.strokeAlpha * alpha);
  118255. strokeTint.TL = color;
  118256. strokeTint.TR = color;
  118257. strokeTint.BL = color;
  118258. strokeTint.BR = color;
  118259. var startWidth = src._startWidth;
  118260. var endWidth = src._endWidth;
  118261. pipeline.setTexture2D();
  118262. pipeline.batchLine(
  118263. src.geom.x1 - dx,
  118264. src.geom.y1 - dy,
  118265. src.geom.x2 - dx,
  118266. src.geom.y2 - dy,
  118267. startWidth,
  118268. endWidth,
  118269. 1,
  118270. 0,
  118271. false,
  118272. shapeMatrix,
  118273. camMatrix
  118274. );
  118275. }
  118276. };
  118277. module.exports = LineWebGLRenderer;
  118278. /***/ }),
  118279. /* 807 */
  118280. /***/ (function(module, exports, __webpack_require__) {
  118281. /**
  118282. * @author Richard Davey <rich@photonstorm.com>
  118283. * @copyright 2019 Photon Storm Ltd.
  118284. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118285. */
  118286. var renderWebGL = __webpack_require__(1);
  118287. var renderCanvas = __webpack_require__(1);
  118288. if (true)
  118289. {
  118290. renderWebGL = __webpack_require__(806);
  118291. }
  118292. if (true)
  118293. {
  118294. renderCanvas = __webpack_require__(805);
  118295. }
  118296. module.exports = {
  118297. renderWebGL: renderWebGL,
  118298. renderCanvas: renderCanvas
  118299. };
  118300. /***/ }),
  118301. /* 808 */
  118302. /***/ (function(module, exports, __webpack_require__) {
  118303. /**
  118304. * @author Richard Davey <rich@photonstorm.com>
  118305. * @copyright 2019 Photon Storm Ltd.
  118306. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118307. */
  118308. var FillStyleCanvas = __webpack_require__(33);
  118309. var SetTransform = __webpack_require__(25);
  118310. /**
  118311. * Renders this Game Object with the Canvas Renderer to the given Camera.
  118312. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118313. * This method should not be called directly. It is a utility function of the Render module.
  118314. *
  118315. * @method Phaser.GameObjects.IsoTriangle#renderCanvas
  118316. * @since 3.13.0
  118317. * @private
  118318. *
  118319. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  118320. * @param {Phaser.GameObjects.IsoTriangle} src - The Game Object being rendered in this call.
  118321. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118322. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118323. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118324. */
  118325. var IsoTriangleCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118326. {
  118327. var ctx = renderer.currentContext;
  118328. if (SetTransform(renderer, ctx, src, camera, parentMatrix) && src.isFilled)
  118329. {
  118330. var size = src.width;
  118331. var height = src.height;
  118332. var sizeA = size / 2;
  118333. var sizeB = size / src.projection;
  118334. var reversed = src.isReversed;
  118335. // Top Face
  118336. if (src.showTop && reversed)
  118337. {
  118338. FillStyleCanvas(ctx, src, src.fillTop);
  118339. ctx.beginPath();
  118340. ctx.moveTo(-sizeA, -height);
  118341. ctx.lineTo(0, -sizeB - height);
  118342. ctx.lineTo(sizeA, -height);
  118343. ctx.lineTo(0, sizeB - height);
  118344. ctx.fill();
  118345. }
  118346. // Left Face
  118347. if (src.showLeft)
  118348. {
  118349. FillStyleCanvas(ctx, src, src.fillLeft);
  118350. ctx.beginPath();
  118351. if (reversed)
  118352. {
  118353. ctx.moveTo(-sizeA, -height);
  118354. ctx.lineTo(0, sizeB);
  118355. ctx.lineTo(0, sizeB - height);
  118356. }
  118357. else
  118358. {
  118359. ctx.moveTo(-sizeA, 0);
  118360. ctx.lineTo(0, sizeB);
  118361. ctx.lineTo(0, sizeB - height);
  118362. }
  118363. ctx.fill();
  118364. }
  118365. // Right Face
  118366. if (src.showRight)
  118367. {
  118368. FillStyleCanvas(ctx, src, src.fillRight);
  118369. ctx.beginPath();
  118370. if (reversed)
  118371. {
  118372. ctx.moveTo(sizeA, -height);
  118373. ctx.lineTo(0, sizeB);
  118374. ctx.lineTo(0, sizeB - height);
  118375. }
  118376. else
  118377. {
  118378. ctx.moveTo(sizeA, 0);
  118379. ctx.lineTo(0, sizeB);
  118380. ctx.lineTo(0, sizeB - height);
  118381. }
  118382. ctx.fill();
  118383. }
  118384. // Restore the context saved in SetTransform
  118385. ctx.restore();
  118386. }
  118387. };
  118388. module.exports = IsoTriangleCanvasRenderer;
  118389. /***/ }),
  118390. /* 809 */
  118391. /***/ (function(module, exports, __webpack_require__) {
  118392. /**
  118393. * @author Richard Davey <rich@photonstorm.com>
  118394. * @copyright 2019 Photon Storm Ltd.
  118395. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118396. */
  118397. var Utils = __webpack_require__(9);
  118398. /**
  118399. * Renders this Game Object with the WebGL Renderer to the given Camera.
  118400. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118401. * This method should not be called directly. It is a utility function of the Render module.
  118402. *
  118403. * @method Phaser.GameObjects.IsoTriangle#renderWebGL
  118404. * @since 3.13.0
  118405. * @private
  118406. *
  118407. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  118408. * @param {Phaser.GameObjects.IsoTriangle} src - The Game Object being rendered in this call.
  118409. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118410. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118411. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118412. */
  118413. var IsoTriangleWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118414. {
  118415. var pipeline = this.pipeline;
  118416. var camMatrix = pipeline._tempMatrix1;
  118417. var shapeMatrix = pipeline._tempMatrix2;
  118418. var calcMatrix = pipeline._tempMatrix3;
  118419. renderer.setPipeline(pipeline);
  118420. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  118421. camMatrix.copyFrom(camera.matrix);
  118422. if (parentMatrix)
  118423. {
  118424. // Multiply the camera by the parent matrix
  118425. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  118426. // Undo the camera scroll
  118427. shapeMatrix.e = src.x;
  118428. shapeMatrix.f = src.y;
  118429. }
  118430. else
  118431. {
  118432. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  118433. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  118434. }
  118435. camMatrix.multiply(shapeMatrix, calcMatrix);
  118436. var size = src.width;
  118437. var height = src.height;
  118438. var sizeA = size / 2;
  118439. var sizeB = size / src.projection;
  118440. var reversed = src.isReversed;
  118441. var alpha = camera.alpha * src.alpha;
  118442. if (!src.isFilled)
  118443. {
  118444. return;
  118445. }
  118446. var tint;
  118447. var x0;
  118448. var y0;
  118449. var x1;
  118450. var y1;
  118451. var x2;
  118452. var y2;
  118453. // Top Face
  118454. if (src.showTop && reversed)
  118455. {
  118456. tint = Utils.getTintAppendFloatAlphaAndSwap(src.fillTop, alpha);
  118457. x0 = calcMatrix.getX(-sizeA, -height);
  118458. y0 = calcMatrix.getY(-sizeA, -height);
  118459. x1 = calcMatrix.getX(0, -sizeB - height);
  118460. y1 = calcMatrix.getY(0, -sizeB - height);
  118461. x2 = calcMatrix.getX(sizeA, -height);
  118462. y2 = calcMatrix.getY(sizeA, -height);
  118463. var x3 = calcMatrix.getX(0, sizeB - height);
  118464. var y3 = calcMatrix.getY(0, sizeB - height);
  118465. pipeline.setTexture2D();
  118466. pipeline.batchQuad(x0, y0, x1, y1, x2, y2, x3, y3, 0, 0, 1, 1, tint, tint, tint, tint, 2);
  118467. }
  118468. // Left Face
  118469. if (src.showLeft)
  118470. {
  118471. tint = Utils.getTintAppendFloatAlphaAndSwap(src.fillLeft, alpha);
  118472. if (reversed)
  118473. {
  118474. x0 = calcMatrix.getX(-sizeA, -height);
  118475. y0 = calcMatrix.getY(-sizeA, -height);
  118476. x1 = calcMatrix.getX(0, sizeB);
  118477. y1 = calcMatrix.getY(0, sizeB);
  118478. x2 = calcMatrix.getX(0, sizeB - height);
  118479. y2 = calcMatrix.getY(0, sizeB - height);
  118480. }
  118481. else
  118482. {
  118483. x0 = calcMatrix.getX(-sizeA, 0);
  118484. y0 = calcMatrix.getY(-sizeA, 0);
  118485. x1 = calcMatrix.getX(0, sizeB);
  118486. y1 = calcMatrix.getY(0, sizeB);
  118487. x2 = calcMatrix.getX(0, sizeB - height);
  118488. y2 = calcMatrix.getY(0, sizeB - height);
  118489. }
  118490. pipeline.batchTri(x0, y0, x1, y1, x2, y2, 0, 0, 1, 1, tint, tint, tint, 2);
  118491. }
  118492. // Right Face
  118493. if (src.showRight)
  118494. {
  118495. tint = Utils.getTintAppendFloatAlphaAndSwap(src.fillRight, alpha);
  118496. if (reversed)
  118497. {
  118498. x0 = calcMatrix.getX(sizeA, -height);
  118499. y0 = calcMatrix.getY(sizeA, -height);
  118500. x1 = calcMatrix.getX(0, sizeB);
  118501. y1 = calcMatrix.getY(0, sizeB);
  118502. x2 = calcMatrix.getX(0, sizeB - height);
  118503. y2 = calcMatrix.getY(0, sizeB - height);
  118504. }
  118505. else
  118506. {
  118507. x0 = calcMatrix.getX(sizeA, 0);
  118508. y0 = calcMatrix.getY(sizeA, 0);
  118509. x1 = calcMatrix.getX(0, sizeB);
  118510. y1 = calcMatrix.getY(0, sizeB);
  118511. x2 = calcMatrix.getX(0, sizeB - height);
  118512. y2 = calcMatrix.getY(0, sizeB - height);
  118513. }
  118514. pipeline.setTexture2D();
  118515. pipeline.batchTri(x0, y0, x1, y1, x2, y2, 0, 0, 1, 1, tint, tint, tint, 2);
  118516. }
  118517. };
  118518. module.exports = IsoTriangleWebGLRenderer;
  118519. /***/ }),
  118520. /* 810 */
  118521. /***/ (function(module, exports, __webpack_require__) {
  118522. /**
  118523. * @author Richard Davey <rich@photonstorm.com>
  118524. * @copyright 2019 Photon Storm Ltd.
  118525. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118526. */
  118527. var renderWebGL = __webpack_require__(1);
  118528. var renderCanvas = __webpack_require__(1);
  118529. if (true)
  118530. {
  118531. renderWebGL = __webpack_require__(809);
  118532. }
  118533. if (true)
  118534. {
  118535. renderCanvas = __webpack_require__(808);
  118536. }
  118537. module.exports = {
  118538. renderWebGL: renderWebGL,
  118539. renderCanvas: renderCanvas
  118540. };
  118541. /***/ }),
  118542. /* 811 */
  118543. /***/ (function(module, exports, __webpack_require__) {
  118544. /**
  118545. * @author Richard Davey <rich@photonstorm.com>
  118546. * @copyright 2019 Photon Storm Ltd.
  118547. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118548. */
  118549. var FillStyleCanvas = __webpack_require__(33);
  118550. var SetTransform = __webpack_require__(25);
  118551. /**
  118552. * Renders this Game Object with the Canvas Renderer to the given Camera.
  118553. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118554. * This method should not be called directly. It is a utility function of the Render module.
  118555. *
  118556. * @method Phaser.GameObjects.IsoBox#renderCanvas
  118557. * @since 3.13.0
  118558. * @private
  118559. *
  118560. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  118561. * @param {Phaser.GameObjects.IsoBox} src - The Game Object being rendered in this call.
  118562. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118563. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118564. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118565. */
  118566. var IsoBoxCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118567. {
  118568. var ctx = renderer.currentContext;
  118569. if (SetTransform(renderer, ctx, src, camera, parentMatrix) && src.isFilled)
  118570. {
  118571. var size = src.width;
  118572. var height = src.height;
  118573. var sizeA = size / 2;
  118574. var sizeB = size / src.projection;
  118575. // Top Face
  118576. if (src.showTop)
  118577. {
  118578. FillStyleCanvas(ctx, src, src.fillTop);
  118579. ctx.beginPath();
  118580. ctx.moveTo(-sizeA, -height);
  118581. ctx.lineTo(0, -sizeB - height);
  118582. ctx.lineTo(sizeA, -height);
  118583. ctx.lineTo(sizeA, -1);
  118584. ctx.lineTo(0, sizeB - 1);
  118585. ctx.lineTo(-sizeA, -1);
  118586. ctx.lineTo(-sizeA, -height);
  118587. ctx.fill();
  118588. }
  118589. // Left Face
  118590. if (src.showLeft)
  118591. {
  118592. FillStyleCanvas(ctx, src, src.fillLeft);
  118593. ctx.beginPath();
  118594. ctx.moveTo(-sizeA, 0);
  118595. ctx.lineTo(0, sizeB);
  118596. ctx.lineTo(0, sizeB - height);
  118597. ctx.lineTo(-sizeA, -height);
  118598. ctx.lineTo(-sizeA, 0);
  118599. ctx.fill();
  118600. }
  118601. // Right Face
  118602. if (src.showRight)
  118603. {
  118604. FillStyleCanvas(ctx, src, src.fillRight);
  118605. ctx.beginPath();
  118606. ctx.moveTo(sizeA, 0);
  118607. ctx.lineTo(0, sizeB);
  118608. ctx.lineTo(0, sizeB - height);
  118609. ctx.lineTo(sizeA, -height);
  118610. ctx.lineTo(sizeA, 0);
  118611. ctx.fill();
  118612. }
  118613. // Restore the context saved in SetTransform
  118614. ctx.restore();
  118615. }
  118616. };
  118617. module.exports = IsoBoxCanvasRenderer;
  118618. /***/ }),
  118619. /* 812 */
  118620. /***/ (function(module, exports, __webpack_require__) {
  118621. /**
  118622. * @author Richard Davey <rich@photonstorm.com>
  118623. * @copyright 2019 Photon Storm Ltd.
  118624. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118625. */
  118626. var Utils = __webpack_require__(9);
  118627. /**
  118628. * Renders this Game Object with the WebGL Renderer to the given Camera.
  118629. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118630. * This method should not be called directly. It is a utility function of the Render module.
  118631. *
  118632. * @method Phaser.GameObjects.IsoBox#renderWebGL
  118633. * @since 3.13.0
  118634. * @private
  118635. *
  118636. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  118637. * @param {Phaser.GameObjects.IsoBox} src - The Game Object being rendered in this call.
  118638. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118639. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118640. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118641. */
  118642. var IsoBoxWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118643. {
  118644. var pipeline = this.pipeline;
  118645. var camMatrix = pipeline._tempMatrix1;
  118646. var shapeMatrix = pipeline._tempMatrix2;
  118647. var calcMatrix = pipeline._tempMatrix3;
  118648. renderer.setPipeline(pipeline);
  118649. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  118650. camMatrix.copyFrom(camera.matrix);
  118651. if (parentMatrix)
  118652. {
  118653. // Multiply the camera by the parent matrix
  118654. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  118655. // Undo the camera scroll
  118656. shapeMatrix.e = src.x;
  118657. shapeMatrix.f = src.y;
  118658. }
  118659. else
  118660. {
  118661. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  118662. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  118663. }
  118664. camMatrix.multiply(shapeMatrix, calcMatrix);
  118665. var size = src.width;
  118666. var height = src.height;
  118667. var sizeA = size / 2;
  118668. var sizeB = size / src.projection;
  118669. var alpha = camera.alpha * src.alpha;
  118670. if (!src.isFilled)
  118671. {
  118672. return;
  118673. }
  118674. var tint;
  118675. var x0;
  118676. var y0;
  118677. var x1;
  118678. var y1;
  118679. var x2;
  118680. var y2;
  118681. var x3;
  118682. var y3;
  118683. // Top Face
  118684. if (src.showTop)
  118685. {
  118686. tint = Utils.getTintAppendFloatAlphaAndSwap(src.fillTop, alpha);
  118687. x0 = calcMatrix.getX(-sizeA, -height);
  118688. y0 = calcMatrix.getY(-sizeA, -height);
  118689. x1 = calcMatrix.getX(0, -sizeB - height);
  118690. y1 = calcMatrix.getY(0, -sizeB - height);
  118691. x2 = calcMatrix.getX(sizeA, -height);
  118692. y2 = calcMatrix.getY(sizeA, -height);
  118693. x3 = calcMatrix.getX(0, sizeB - height);
  118694. y3 = calcMatrix.getY(0, sizeB - height);
  118695. pipeline.setTexture2D();
  118696. pipeline.batchQuad(x0, y0, x1, y1, x2, y2, x3, y3, 0, 0, 1, 1, tint, tint, tint, tint, 2);
  118697. }
  118698. // Left Face
  118699. if (src.showLeft)
  118700. {
  118701. tint = Utils.getTintAppendFloatAlphaAndSwap(src.fillLeft, alpha);
  118702. x0 = calcMatrix.getX(-sizeA, 0);
  118703. y0 = calcMatrix.getY(-sizeA, 0);
  118704. x1 = calcMatrix.getX(0, sizeB);
  118705. y1 = calcMatrix.getY(0, sizeB);
  118706. x2 = calcMatrix.getX(0, sizeB - height);
  118707. y2 = calcMatrix.getY(0, sizeB - height);
  118708. x3 = calcMatrix.getX(-sizeA, -height);
  118709. y3 = calcMatrix.getY(-sizeA, -height);
  118710. pipeline.setTexture2D();
  118711. pipeline.batchQuad(x0, y0, x1, y1, x2, y2, x3, y3, 0, 0, 1, 1, tint, tint, tint, tint, 2);
  118712. }
  118713. // Right Face
  118714. if (src.showRight)
  118715. {
  118716. tint = Utils.getTintAppendFloatAlphaAndSwap(src.fillRight, alpha);
  118717. x0 = calcMatrix.getX(sizeA, 0);
  118718. y0 = calcMatrix.getY(sizeA, 0);
  118719. x1 = calcMatrix.getX(0, sizeB);
  118720. y1 = calcMatrix.getY(0, sizeB);
  118721. x2 = calcMatrix.getX(0, sizeB - height);
  118722. y2 = calcMatrix.getY(0, sizeB - height);
  118723. x3 = calcMatrix.getX(sizeA, -height);
  118724. y3 = calcMatrix.getY(sizeA, -height);
  118725. pipeline.setTexture2D();
  118726. pipeline.batchQuad(x0, y0, x1, y1, x2, y2, x3, y3, 0, 0, 1, 1, tint, tint, tint, tint, 2);
  118727. }
  118728. };
  118729. module.exports = IsoBoxWebGLRenderer;
  118730. /***/ }),
  118731. /* 813 */
  118732. /***/ (function(module, exports, __webpack_require__) {
  118733. /**
  118734. * @author Richard Davey <rich@photonstorm.com>
  118735. * @copyright 2019 Photon Storm Ltd.
  118736. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118737. */
  118738. var renderWebGL = __webpack_require__(1);
  118739. var renderCanvas = __webpack_require__(1);
  118740. if (true)
  118741. {
  118742. renderWebGL = __webpack_require__(812);
  118743. }
  118744. if (true)
  118745. {
  118746. renderCanvas = __webpack_require__(811);
  118747. }
  118748. module.exports = {
  118749. renderWebGL: renderWebGL,
  118750. renderCanvas: renderCanvas
  118751. };
  118752. /***/ }),
  118753. /* 814 */
  118754. /***/ (function(module, exports, __webpack_require__) {
  118755. /**
  118756. * @author Richard Davey <rich@photonstorm.com>
  118757. * @copyright 2019 Photon Storm Ltd.
  118758. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118759. */
  118760. var FillStyleCanvas = __webpack_require__(33);
  118761. var LineStyleCanvas = __webpack_require__(39);
  118762. var SetTransform = __webpack_require__(25);
  118763. /**
  118764. * Renders this Game Object with the Canvas Renderer to the given Camera.
  118765. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118766. * This method should not be called directly. It is a utility function of the Render module.
  118767. *
  118768. * @method Phaser.GameObjects.Rectangle#renderCanvas
  118769. * @since 3.13.0
  118770. * @private
  118771. *
  118772. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  118773. * @param {Phaser.GameObjects.Rectangle} src - The Game Object being rendered in this call.
  118774. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118775. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118776. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118777. */
  118778. var RectangleCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118779. {
  118780. var ctx = renderer.currentContext;
  118781. if (SetTransform(renderer, ctx, src, camera, parentMatrix))
  118782. {
  118783. var dx = src._displayOriginX;
  118784. var dy = src._displayOriginY;
  118785. if (src.isFilled)
  118786. {
  118787. FillStyleCanvas(ctx, src);
  118788. ctx.fillRect(
  118789. -dx,
  118790. -dy,
  118791. src.width,
  118792. src.height
  118793. );
  118794. }
  118795. if (src.isStroked)
  118796. {
  118797. LineStyleCanvas(ctx, src);
  118798. ctx.beginPath();
  118799. ctx.rect(
  118800. -dx,
  118801. -dy,
  118802. src.width,
  118803. src.height
  118804. );
  118805. ctx.stroke();
  118806. }
  118807. // Restore the context saved in SetTransform
  118808. ctx.restore();
  118809. }
  118810. };
  118811. module.exports = RectangleCanvasRenderer;
  118812. /***/ }),
  118813. /* 815 */
  118814. /***/ (function(module, exports, __webpack_require__) {
  118815. /**
  118816. * @author Richard Davey <rich@photonstorm.com>
  118817. * @copyright 2019 Photon Storm Ltd.
  118818. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118819. */
  118820. var Utils = __webpack_require__(9);
  118821. /**
  118822. * Renders this Game Object with the WebGL Renderer to the given Camera.
  118823. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118824. * This method should not be called directly. It is a utility function of the Render module.
  118825. *
  118826. * @method Phaser.GameObjects.Grid#renderWebGL
  118827. * @since 3.13.0
  118828. * @private
  118829. *
  118830. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  118831. * @param {Phaser.GameObjects.Grid} src - The Game Object being rendered in this call.
  118832. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118833. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118834. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118835. */
  118836. var GridWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118837. {
  118838. var pipeline = this.pipeline;
  118839. var camMatrix = pipeline._tempMatrix1;
  118840. var shapeMatrix = pipeline._tempMatrix2;
  118841. var calcMatrix = pipeline._tempMatrix3;
  118842. renderer.setPipeline(pipeline);
  118843. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  118844. camMatrix.copyFrom(camera.matrix);
  118845. if (parentMatrix)
  118846. {
  118847. // Multiply the camera by the parent matrix
  118848. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  118849. // Undo the camera scroll
  118850. shapeMatrix.e = src.x;
  118851. shapeMatrix.f = src.y;
  118852. }
  118853. else
  118854. {
  118855. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  118856. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  118857. }
  118858. camMatrix.multiply(shapeMatrix, calcMatrix);
  118859. calcMatrix.translate(-src._displayOriginX, -src._displayOriginY);
  118860. var alpha = camera.alpha * src.alpha;
  118861. // Work out the grid size
  118862. var width = src.width;
  118863. var height = src.height;
  118864. var cellWidth = src.cellWidth;
  118865. var cellHeight = src.cellHeight;
  118866. var gridWidth = Math.ceil(width / cellWidth);
  118867. var gridHeight = Math.ceil(height / cellHeight);
  118868. var cellWidthA = cellWidth;
  118869. var cellHeightA = cellHeight;
  118870. var cellWidthB = cellWidth - ((gridWidth * cellWidth) - width);
  118871. var cellHeightB = cellHeight - ((gridHeight * cellHeight) - height);
  118872. var fillTint;
  118873. var fillTintColor;
  118874. var showCells = src.showCells;
  118875. var showAltCells = src.showAltCells;
  118876. var showOutline = src.showOutline;
  118877. var x = 0;
  118878. var y = 0;
  118879. var r = 0;
  118880. var cw = 0;
  118881. var ch = 0;
  118882. if (showOutline)
  118883. {
  118884. // To make room for the grid lines (in case alpha < 1)
  118885. cellWidthA--;
  118886. cellHeightA--;
  118887. if (cellWidthB === cellWidth)
  118888. {
  118889. cellWidthB--;
  118890. }
  118891. if (cellHeightB === cellHeight)
  118892. {
  118893. cellHeightB--;
  118894. }
  118895. }
  118896. if (showCells && src.fillAlpha > 0)
  118897. {
  118898. fillTint = pipeline.fillTint;
  118899. fillTintColor = Utils.getTintAppendFloatAlphaAndSwap(src.fillColor, src.fillAlpha * alpha);
  118900. fillTint.TL = fillTintColor;
  118901. fillTint.TR = fillTintColor;
  118902. fillTint.BL = fillTintColor;
  118903. fillTint.BR = fillTintColor;
  118904. for (y = 0; y < gridHeight; y++)
  118905. {
  118906. if (showAltCells)
  118907. {
  118908. r = y % 2;
  118909. }
  118910. for (x = 0; x < gridWidth; x++)
  118911. {
  118912. if (showAltCells && r)
  118913. {
  118914. r = 0;
  118915. continue;
  118916. }
  118917. r++;
  118918. cw = (x < gridWidth - 1) ? cellWidthA : cellWidthB;
  118919. ch = (y < gridHeight - 1) ? cellHeightA : cellHeightB;
  118920. pipeline.setTexture2D();
  118921. pipeline.batchFillRect(
  118922. x * cellWidth,
  118923. y * cellHeight,
  118924. cw,
  118925. ch
  118926. );
  118927. }
  118928. }
  118929. }
  118930. if (showAltCells && src.altFillAlpha > 0)
  118931. {
  118932. fillTint = pipeline.fillTint;
  118933. fillTintColor = Utils.getTintAppendFloatAlphaAndSwap(src.altFillColor, src.altFillAlpha * alpha);
  118934. fillTint.TL = fillTintColor;
  118935. fillTint.TR = fillTintColor;
  118936. fillTint.BL = fillTintColor;
  118937. fillTint.BR = fillTintColor;
  118938. for (y = 0; y < gridHeight; y++)
  118939. {
  118940. if (showAltCells)
  118941. {
  118942. r = y % 2;
  118943. }
  118944. for (x = 0; x < gridWidth; x++)
  118945. {
  118946. if (showAltCells && !r)
  118947. {
  118948. r = 1;
  118949. continue;
  118950. }
  118951. r = 0;
  118952. cw = (x < gridWidth - 1) ? cellWidthA : cellWidthB;
  118953. ch = (y < gridHeight - 1) ? cellHeightA : cellHeightB;
  118954. pipeline.setTexture2D();
  118955. pipeline.batchFillRect(
  118956. x * cellWidth,
  118957. y * cellHeight,
  118958. cw,
  118959. ch
  118960. );
  118961. }
  118962. }
  118963. }
  118964. if (showOutline && src.outlineFillAlpha > 0)
  118965. {
  118966. var strokeTint = pipeline.strokeTint;
  118967. var color = Utils.getTintAppendFloatAlphaAndSwap(src.outlineFillColor, src.outlineFillAlpha * alpha);
  118968. strokeTint.TL = color;
  118969. strokeTint.TR = color;
  118970. strokeTint.BL = color;
  118971. strokeTint.BR = color;
  118972. for (x = 1; x < gridWidth; x++)
  118973. {
  118974. var x1 = x * cellWidth;
  118975. pipeline.setTexture2D();
  118976. pipeline.batchLine(x1, 0, x1, height, 1, 1, 1, 0, false);
  118977. }
  118978. for (y = 1; y < gridHeight; y++)
  118979. {
  118980. var y1 = y * cellHeight;
  118981. pipeline.setTexture2D();
  118982. pipeline.batchLine(0, y1, width, y1, 1, 1, 1, 0, false);
  118983. }
  118984. }
  118985. };
  118986. module.exports = GridWebGLRenderer;
  118987. /***/ }),
  118988. /* 816 */
  118989. /***/ (function(module, exports, __webpack_require__) {
  118990. /**
  118991. * @author Richard Davey <rich@photonstorm.com>
  118992. * @copyright 2019 Photon Storm Ltd.
  118993. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118994. */
  118995. var renderWebGL = __webpack_require__(1);
  118996. var renderCanvas = __webpack_require__(1);
  118997. if (true)
  118998. {
  118999. renderWebGL = __webpack_require__(815);
  119000. }
  119001. if (true)
  119002. {
  119003. renderCanvas = __webpack_require__(814);
  119004. }
  119005. module.exports = {
  119006. renderWebGL: renderWebGL,
  119007. renderCanvas: renderCanvas
  119008. };
  119009. /***/ }),
  119010. /* 817 */
  119011. /***/ (function(module, exports, __webpack_require__) {
  119012. /**
  119013. * @author Richard Davey <rich@photonstorm.com>
  119014. * @copyright 2019 Photon Storm Ltd.
  119015. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119016. */
  119017. var FillStyleCanvas = __webpack_require__(33);
  119018. var LineStyleCanvas = __webpack_require__(39);
  119019. var SetTransform = __webpack_require__(25);
  119020. /**
  119021. * Renders this Game Object with the Canvas Renderer to the given Camera.
  119022. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119023. * This method should not be called directly. It is a utility function of the Render module.
  119024. *
  119025. * @method Phaser.GameObjects.Ellipse#renderCanvas
  119026. * @since 3.13.0
  119027. * @private
  119028. *
  119029. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  119030. * @param {Phaser.GameObjects.Ellipse} src - The Game Object being rendered in this call.
  119031. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119032. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119033. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119034. */
  119035. var EllipseCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119036. {
  119037. var ctx = renderer.currentContext;
  119038. if (SetTransform(renderer, ctx, src, camera, parentMatrix))
  119039. {
  119040. var dx = src._displayOriginX;
  119041. var dy = src._displayOriginY;
  119042. var path = src.pathData;
  119043. var pathLength = path.length - 1;
  119044. var px1 = path[0] - dx;
  119045. var py1 = path[1] - dy;
  119046. ctx.beginPath();
  119047. ctx.moveTo(px1, py1);
  119048. if (!src.closePath)
  119049. {
  119050. pathLength -= 2;
  119051. }
  119052. for (var i = 2; i < pathLength; i += 2)
  119053. {
  119054. var px2 = path[i] - dx;
  119055. var py2 = path[i + 1] - dy;
  119056. ctx.lineTo(px2, py2);
  119057. }
  119058. ctx.closePath();
  119059. if (src.isFilled)
  119060. {
  119061. FillStyleCanvas(ctx, src);
  119062. ctx.fill();
  119063. }
  119064. if (src.isStroked)
  119065. {
  119066. LineStyleCanvas(ctx, src);
  119067. ctx.stroke();
  119068. }
  119069. // Restore the context saved in SetTransform
  119070. ctx.restore();
  119071. }
  119072. };
  119073. module.exports = EllipseCanvasRenderer;
  119074. /***/ }),
  119075. /* 818 */
  119076. /***/ (function(module, exports, __webpack_require__) {
  119077. /**
  119078. * @author Richard Davey <rich@photonstorm.com>
  119079. * @copyright 2019 Photon Storm Ltd.
  119080. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119081. */
  119082. var FillPathWebGL = __webpack_require__(88);
  119083. var StrokePathWebGL = __webpack_require__(66);
  119084. /**
  119085. * Renders this Game Object with the WebGL Renderer to the given Camera.
  119086. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119087. * This method should not be called directly. It is a utility function of the Render module.
  119088. *
  119089. * @method Phaser.GameObjects.Ellipse#renderWebGL
  119090. * @since 3.13.0
  119091. * @private
  119092. *
  119093. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  119094. * @param {Phaser.GameObjects.Ellipse} src - The Game Object being rendered in this call.
  119095. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119096. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119097. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119098. */
  119099. var EllipseWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119100. {
  119101. var pipeline = this.pipeline;
  119102. var camMatrix = pipeline._tempMatrix1;
  119103. var shapeMatrix = pipeline._tempMatrix2;
  119104. var calcMatrix = pipeline._tempMatrix3;
  119105. renderer.setPipeline(pipeline);
  119106. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  119107. camMatrix.copyFrom(camera.matrix);
  119108. if (parentMatrix)
  119109. {
  119110. // Multiply the camera by the parent matrix
  119111. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  119112. // Undo the camera scroll
  119113. shapeMatrix.e = src.x;
  119114. shapeMatrix.f = src.y;
  119115. }
  119116. else
  119117. {
  119118. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  119119. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  119120. }
  119121. camMatrix.multiply(shapeMatrix, calcMatrix);
  119122. var dx = src._displayOriginX;
  119123. var dy = src._displayOriginY;
  119124. var alpha = camera.alpha * src.alpha;
  119125. if (src.isFilled)
  119126. {
  119127. FillPathWebGL(pipeline, calcMatrix, src, alpha, dx, dy);
  119128. }
  119129. if (src.isStroked)
  119130. {
  119131. StrokePathWebGL(pipeline, src, alpha, dx, dy);
  119132. }
  119133. };
  119134. module.exports = EllipseWebGLRenderer;
  119135. /***/ }),
  119136. /* 819 */
  119137. /***/ (function(module, exports, __webpack_require__) {
  119138. /**
  119139. * @author Richard Davey <rich@photonstorm.com>
  119140. * @copyright 2019 Photon Storm Ltd.
  119141. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119142. */
  119143. var renderWebGL = __webpack_require__(1);
  119144. var renderCanvas = __webpack_require__(1);
  119145. if (true)
  119146. {
  119147. renderWebGL = __webpack_require__(818);
  119148. }
  119149. if (true)
  119150. {
  119151. renderCanvas = __webpack_require__(817);
  119152. }
  119153. module.exports = {
  119154. renderWebGL: renderWebGL,
  119155. renderCanvas: renderCanvas
  119156. };
  119157. /***/ }),
  119158. /* 820 */
  119159. /***/ (function(module, exports, __webpack_require__) {
  119160. /**
  119161. * @author Richard Davey <rich@photonstorm.com>
  119162. * @copyright 2019 Photon Storm Ltd.
  119163. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119164. */
  119165. var FillStyleCanvas = __webpack_require__(33);
  119166. var LineStyleCanvas = __webpack_require__(39);
  119167. var SetTransform = __webpack_require__(25);
  119168. /**
  119169. * Renders this Game Object with the Canvas Renderer to the given Camera.
  119170. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119171. * This method should not be called directly. It is a utility function of the Render module.
  119172. *
  119173. * @method Phaser.GameObjects.Curve#renderCanvas
  119174. * @since 3.13.0
  119175. * @private
  119176. *
  119177. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  119178. * @param {Phaser.GameObjects.Curve} src - The Game Object being rendered in this call.
  119179. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119180. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119181. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119182. */
  119183. var CurveCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119184. {
  119185. var ctx = renderer.currentContext;
  119186. if (SetTransform(renderer, ctx, src, camera, parentMatrix))
  119187. {
  119188. var dx = src._displayOriginX + src._curveBounds.x;
  119189. var dy = src._displayOriginY + src._curveBounds.y;
  119190. var path = src.pathData;
  119191. var pathLength = path.length - 1;
  119192. var px1 = path[0] - dx;
  119193. var py1 = path[1] - dy;
  119194. ctx.beginPath();
  119195. ctx.moveTo(px1, py1);
  119196. if (!src.closePath)
  119197. {
  119198. pathLength -= 2;
  119199. }
  119200. for (var i = 2; i < pathLength; i += 2)
  119201. {
  119202. var px2 = path[i] - dx;
  119203. var py2 = path[i + 1] - dy;
  119204. ctx.lineTo(px2, py2);
  119205. }
  119206. if (src.closePath)
  119207. {
  119208. ctx.closePath();
  119209. }
  119210. if (src.isFilled)
  119211. {
  119212. FillStyleCanvas(ctx, src);
  119213. ctx.fill();
  119214. }
  119215. if (src.isStroked)
  119216. {
  119217. LineStyleCanvas(ctx, src);
  119218. ctx.stroke();
  119219. }
  119220. // Restore the context saved in SetTransform
  119221. ctx.restore();
  119222. }
  119223. };
  119224. module.exports = CurveCanvasRenderer;
  119225. /***/ }),
  119226. /* 821 */
  119227. /***/ (function(module, exports, __webpack_require__) {
  119228. /**
  119229. * @author Richard Davey <rich@photonstorm.com>
  119230. * @copyright 2019 Photon Storm Ltd.
  119231. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119232. */
  119233. var FillPathWebGL = __webpack_require__(88);
  119234. var StrokePathWebGL = __webpack_require__(66);
  119235. /**
  119236. * Renders this Game Object with the WebGL Renderer to the given Camera.
  119237. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119238. * This method should not be called directly. It is a utility function of the Render module.
  119239. *
  119240. * @method Phaser.GameObjects.Curve#renderWebGL
  119241. * @since 3.13.0
  119242. * @private
  119243. *
  119244. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  119245. * @param {Phaser.GameObjects.Curve} src - The Game Object being rendered in this call.
  119246. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119247. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119248. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119249. */
  119250. var CurveWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119251. {
  119252. var pipeline = this.pipeline;
  119253. var camMatrix = pipeline._tempMatrix1;
  119254. var shapeMatrix = pipeline._tempMatrix2;
  119255. var calcMatrix = pipeline._tempMatrix3;
  119256. renderer.setPipeline(pipeline);
  119257. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  119258. camMatrix.copyFrom(camera.matrix);
  119259. if (parentMatrix)
  119260. {
  119261. // Multiply the camera by the parent matrix
  119262. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  119263. // Undo the camera scroll
  119264. shapeMatrix.e = src.x;
  119265. shapeMatrix.f = src.y;
  119266. }
  119267. else
  119268. {
  119269. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  119270. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  119271. }
  119272. camMatrix.multiply(shapeMatrix, calcMatrix);
  119273. var dx = src._displayOriginX + src._curveBounds.x;
  119274. var dy = src._displayOriginY + src._curveBounds.y;
  119275. var alpha = camera.alpha * src.alpha;
  119276. if (src.isFilled)
  119277. {
  119278. FillPathWebGL(pipeline, calcMatrix, src, alpha, dx, dy);
  119279. }
  119280. if (src.isStroked)
  119281. {
  119282. StrokePathWebGL(pipeline, src, alpha, dx, dy);
  119283. }
  119284. };
  119285. module.exports = CurveWebGLRenderer;
  119286. /***/ }),
  119287. /* 822 */
  119288. /***/ (function(module, exports, __webpack_require__) {
  119289. /**
  119290. * @author Richard Davey <rich@photonstorm.com>
  119291. * @copyright 2019 Photon Storm Ltd.
  119292. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119293. */
  119294. var renderWebGL = __webpack_require__(1);
  119295. var renderCanvas = __webpack_require__(1);
  119296. if (true)
  119297. {
  119298. renderWebGL = __webpack_require__(821);
  119299. }
  119300. if (true)
  119301. {
  119302. renderCanvas = __webpack_require__(820);
  119303. }
  119304. module.exports = {
  119305. renderWebGL: renderWebGL,
  119306. renderCanvas: renderCanvas
  119307. };
  119308. /***/ }),
  119309. /* 823 */
  119310. /***/ (function(module, exports, __webpack_require__) {
  119311. /**
  119312. * @author Richard Davey <rich@photonstorm.com>
  119313. * @copyright 2019 Photon Storm Ltd.
  119314. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119315. */
  119316. var DegToRad = __webpack_require__(34);
  119317. var FillStyleCanvas = __webpack_require__(33);
  119318. var LineStyleCanvas = __webpack_require__(39);
  119319. var SetTransform = __webpack_require__(25);
  119320. /**
  119321. * Renders this Game Object with the Canvas Renderer to the given Camera.
  119322. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119323. * This method should not be called directly. It is a utility function of the Render module.
  119324. *
  119325. * @method Phaser.GameObjects.Arc#renderCanvas
  119326. * @since 3.13.0
  119327. * @private
  119328. *
  119329. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  119330. * @param {Phaser.GameObjects.Arc} src - The Game Object being rendered in this call.
  119331. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119332. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119333. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119334. */
  119335. var ArcCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119336. {
  119337. var ctx = renderer.currentContext;
  119338. if (SetTransform(renderer, ctx, src, camera, parentMatrix))
  119339. {
  119340. var radius = src.radius;
  119341. ctx.beginPath();
  119342. ctx.arc(
  119343. (radius) - src.originX * (radius * 2),
  119344. (radius) - src.originY * (radius * 2),
  119345. radius,
  119346. DegToRad(src._startAngle),
  119347. DegToRad(src._endAngle),
  119348. src.anticlockwise
  119349. );
  119350. if (src.closePath)
  119351. {
  119352. ctx.closePath();
  119353. }
  119354. if (src.isFilled)
  119355. {
  119356. FillStyleCanvas(ctx, src);
  119357. ctx.fill();
  119358. }
  119359. if (src.isStroked)
  119360. {
  119361. LineStyleCanvas(ctx, src);
  119362. ctx.stroke();
  119363. }
  119364. // Restore the context saved in SetTransform
  119365. ctx.restore();
  119366. }
  119367. };
  119368. module.exports = ArcCanvasRenderer;
  119369. /***/ }),
  119370. /* 824 */
  119371. /***/ (function(module, exports, __webpack_require__) {
  119372. /**
  119373. * @author Richard Davey <rich@photonstorm.com>
  119374. * @copyright 2019 Photon Storm Ltd.
  119375. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119376. */
  119377. var FillPathWebGL = __webpack_require__(88);
  119378. var StrokePathWebGL = __webpack_require__(66);
  119379. /**
  119380. * Renders this Game Object with the WebGL Renderer to the given Camera.
  119381. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119382. * This method should not be called directly. It is a utility function of the Render module.
  119383. *
  119384. * @method Phaser.GameObjects.Arc#renderWebGL
  119385. * @since 3.13.0
  119386. * @private
  119387. *
  119388. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  119389. * @param {Phaser.GameObjects.Arc} src - The Game Object being rendered in this call.
  119390. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119391. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119392. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119393. */
  119394. var ArcWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119395. {
  119396. var pipeline = this.pipeline;
  119397. var camMatrix = pipeline._tempMatrix1;
  119398. var shapeMatrix = pipeline._tempMatrix2;
  119399. var calcMatrix = pipeline._tempMatrix3;
  119400. renderer.setPipeline(pipeline);
  119401. shapeMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  119402. camMatrix.copyFrom(camera.matrix);
  119403. if (parentMatrix)
  119404. {
  119405. // Multiply the camera by the parent matrix
  119406. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  119407. // Undo the camera scroll
  119408. shapeMatrix.e = src.x;
  119409. shapeMatrix.f = src.y;
  119410. }
  119411. else
  119412. {
  119413. shapeMatrix.e -= camera.scrollX * src.scrollFactorX;
  119414. shapeMatrix.f -= camera.scrollY * src.scrollFactorY;
  119415. }
  119416. camMatrix.multiply(shapeMatrix, calcMatrix);
  119417. var dx = src._displayOriginX;
  119418. var dy = src._displayOriginY;
  119419. var alpha = camera.alpha * src.alpha;
  119420. if (src.isFilled)
  119421. {
  119422. FillPathWebGL(pipeline, calcMatrix, src, alpha, dx, dy);
  119423. }
  119424. if (src.isStroked)
  119425. {
  119426. StrokePathWebGL(pipeline, src, alpha, dx, dy);
  119427. }
  119428. };
  119429. module.exports = ArcWebGLRenderer;
  119430. /***/ }),
  119431. /* 825 */
  119432. /***/ (function(module, exports, __webpack_require__) {
  119433. /**
  119434. * @author Richard Davey <rich@photonstorm.com>
  119435. * @copyright 2019 Photon Storm Ltd.
  119436. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119437. */
  119438. var renderWebGL = __webpack_require__(1);
  119439. var renderCanvas = __webpack_require__(1);
  119440. if (true)
  119441. {
  119442. renderWebGL = __webpack_require__(824);
  119443. }
  119444. if (true)
  119445. {
  119446. renderCanvas = __webpack_require__(823);
  119447. }
  119448. module.exports = {
  119449. renderWebGL: renderWebGL,
  119450. renderCanvas: renderCanvas
  119451. };
  119452. /***/ }),
  119453. /* 826 */
  119454. /***/ (function(module, exports) {
  119455. /**
  119456. * @author Richard Davey <rich@photonstorm.com>
  119457. * @copyright 2019 Photon Storm Ltd.
  119458. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119459. */
  119460. /**
  119461. * Renders this Game Object with the Canvas Renderer to the given Camera.
  119462. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119463. * This method should not be called directly. It is a utility function of the Render module.
  119464. *
  119465. * @method Phaser.GameObjects.TileSprite#renderCanvas
  119466. * @since 3.0.0
  119467. * @private
  119468. *
  119469. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  119470. * @param {Phaser.GameObjects.TileSprite} src - The Game Object being rendered in this call.
  119471. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119472. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119473. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119474. */
  119475. var TileSpriteCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119476. {
  119477. src.updateCanvas();
  119478. renderer.batchSprite(src, src.frame, camera, parentMatrix);
  119479. };
  119480. module.exports = TileSpriteCanvasRenderer;
  119481. /***/ }),
  119482. /* 827 */
  119483. /***/ (function(module, exports, __webpack_require__) {
  119484. /**
  119485. * @author Richard Davey <rich@photonstorm.com>
  119486. * @copyright 2019 Photon Storm Ltd.
  119487. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119488. */
  119489. var Utils = __webpack_require__(9);
  119490. /**
  119491. * Renders this Game Object with the WebGL Renderer to the given Camera.
  119492. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119493. * This method should not be called directly. It is a utility function of the Render module.
  119494. *
  119495. * @method Phaser.GameObjects.TileSprite#renderWebGL
  119496. * @since 3.0.0
  119497. * @private
  119498. *
  119499. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  119500. * @param {Phaser.GameObjects.TileSprite} src - The Game Object being rendered in this call.
  119501. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119502. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119503. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119504. */
  119505. var TileSpriteWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119506. {
  119507. src.updateCanvas();
  119508. var getTint = Utils.getTintAppendFloatAlpha;
  119509. this.pipeline.batchTexture(
  119510. src,
  119511. src.fillPattern,
  119512. src.displayFrame.width * src.tileScaleX, src.displayFrame.height * src.tileScaleY,
  119513. src.x, src.y,
  119514. src.width, src.height,
  119515. src.scaleX, src.scaleY,
  119516. src.rotation,
  119517. src.flipX, src.flipY,
  119518. src.scrollFactorX, src.scrollFactorY,
  119519. src.originX * src.width, src.originY * src.height,
  119520. 0, 0, src.width, src.height,
  119521. getTint(src._tintTL, camera.alpha * src._alphaTL),
  119522. getTint(src._tintTR, camera.alpha * src._alphaTR),
  119523. getTint(src._tintBL, camera.alpha * src._alphaBL),
  119524. getTint(src._tintBR, camera.alpha * src._alphaBR),
  119525. (src._isTinted && src.tintFill),
  119526. (src.tilePositionX % src.displayFrame.width) / src.displayFrame.width,
  119527. (src.tilePositionY % src.displayFrame.height) / src.displayFrame.height,
  119528. camera,
  119529. parentMatrix
  119530. );
  119531. };
  119532. module.exports = TileSpriteWebGLRenderer;
  119533. /***/ }),
  119534. /* 828 */
  119535. /***/ (function(module, exports, __webpack_require__) {
  119536. /**
  119537. * @author Richard Davey <rich@photonstorm.com>
  119538. * @copyright 2019 Photon Storm Ltd.
  119539. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119540. */
  119541. var renderWebGL = __webpack_require__(1);
  119542. var renderCanvas = __webpack_require__(1);
  119543. if (true)
  119544. {
  119545. renderWebGL = __webpack_require__(827);
  119546. }
  119547. if (true)
  119548. {
  119549. renderCanvas = __webpack_require__(826);
  119550. }
  119551. module.exports = {
  119552. renderWebGL: renderWebGL,
  119553. renderCanvas: renderCanvas
  119554. };
  119555. /***/ }),
  119556. /* 829 */
  119557. /***/ (function(module, exports, __webpack_require__) {
  119558. /**
  119559. * @author Richard Davey <rich@photonstorm.com>
  119560. * @copyright 2019 Photon Storm Ltd.
  119561. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119562. */
  119563. var CanvasPool = __webpack_require__(24);
  119564. /**
  119565. * Calculates the ascent, descent and fontSize of a given font style.
  119566. *
  119567. * @function Phaser.GameObjects.Text.MeasureText
  119568. * @since 3.0.0
  119569. *
  119570. * @param {Phaser.GameObjects.TextStyle} textStyle - The TextStyle object to measure.
  119571. *
  119572. * @return {object} An object containing the ascent, descent and fontSize of the TextStyle.
  119573. */
  119574. var MeasureText = function (textStyle)
  119575. {
  119576. // @property {HTMLCanvasElement} canvas - The canvas element that the text is rendered.
  119577. var canvas = CanvasPool.create(this);
  119578. // @property {HTMLCanvasElement} context - The context of the canvas element that the text is rendered to.
  119579. var context = canvas.getContext('2d');
  119580. textStyle.syncFont(canvas, context);
  119581. var width = Math.ceil(context.measureText(textStyle.testString).width * textStyle.baselineX);
  119582. var baseline = width;
  119583. var height = 2 * baseline;
  119584. baseline = baseline * textStyle.baselineY | 0;
  119585. canvas.width = width;
  119586. canvas.height = height;
  119587. context.fillStyle = '#f00';
  119588. context.fillRect(0, 0, width, height);
  119589. context.font = textStyle._font;
  119590. context.textBaseline = 'alphabetic';
  119591. context.fillStyle = '#000';
  119592. context.fillText(textStyle.testString, 0, baseline);
  119593. var output = {
  119594. ascent: 0,
  119595. descent: 0,
  119596. fontSize: 0
  119597. };
  119598. if (!context.getImageData(0, 0, width, height))
  119599. {
  119600. output.ascent = baseline;
  119601. output.descent = baseline + 6;
  119602. output.fontSize = output.ascent + output.descent;
  119603. CanvasPool.remove(canvas);
  119604. return output;
  119605. }
  119606. var imagedata = context.getImageData(0, 0, width, height).data;
  119607. var pixels = imagedata.length;
  119608. var line = width * 4;
  119609. var i;
  119610. var j;
  119611. var idx = 0;
  119612. var stop = false;
  119613. // ascent. scan from top to bottom until we find a non red pixel
  119614. for (i = 0; i < baseline; i++)
  119615. {
  119616. for (j = 0; j < line; j += 4)
  119617. {
  119618. if (imagedata[idx + j] !== 255)
  119619. {
  119620. stop = true;
  119621. break;
  119622. }
  119623. }
  119624. if (!stop)
  119625. {
  119626. idx += line;
  119627. }
  119628. else
  119629. {
  119630. break;
  119631. }
  119632. }
  119633. output.ascent = baseline - i;
  119634. idx = pixels - line;
  119635. stop = false;
  119636. // descent. scan from bottom to top until we find a non red pixel
  119637. for (i = height; i > baseline; i--)
  119638. {
  119639. for (j = 0; j < line; j += 4)
  119640. {
  119641. if (imagedata[idx + j] !== 255)
  119642. {
  119643. stop = true;
  119644. break;
  119645. }
  119646. }
  119647. if (!stop)
  119648. {
  119649. idx -= line;
  119650. }
  119651. else
  119652. {
  119653. break;
  119654. }
  119655. }
  119656. output.descent = (i - baseline);
  119657. output.fontSize = output.ascent + output.descent;
  119658. CanvasPool.remove(canvas);
  119659. return output;
  119660. };
  119661. module.exports = MeasureText;
  119662. /***/ }),
  119663. /* 830 */
  119664. /***/ (function(module, exports, __webpack_require__) {
  119665. /**
  119666. * @author Richard Davey <rich@photonstorm.com>
  119667. * @copyright 2019 Photon Storm Ltd.
  119668. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119669. */
  119670. var Class = __webpack_require__(0);
  119671. var GetAdvancedValue = __webpack_require__(12);
  119672. var GetValue = __webpack_require__(4);
  119673. var MeasureText = __webpack_require__(829);
  119674. // Key: [ Object Key, Default Value ]
  119675. /**
  119676. * A custom function that will be responsible for wrapping the text.
  119677. * @callback TextStyleWordWrapCallback
  119678. *
  119679. * @param {string} text - The string to wrap.
  119680. * @param {Phaser.GameObjects.Text} textObject - The Text instance.
  119681. *
  119682. * @return {(string|string[])} Should return the wrapped lines either as an array of lines or as a string with
  119683. * newline characters in place to indicate where breaks should happen.
  119684. */
  119685. var propertyMap = {
  119686. fontFamily: [ 'fontFamily', 'Courier' ],
  119687. fontSize: [ 'fontSize', '16px' ],
  119688. fontStyle: [ 'fontStyle', '' ],
  119689. backgroundColor: [ 'backgroundColor', null ],
  119690. color: [ 'color', '#fff' ],
  119691. stroke: [ 'stroke', '#fff' ],
  119692. strokeThickness: [ 'strokeThickness', 0 ],
  119693. shadowOffsetX: [ 'shadow.offsetX', 0 ],
  119694. shadowOffsetY: [ 'shadow.offsetY', 0 ],
  119695. shadowColor: [ 'shadow.color', '#000' ],
  119696. shadowBlur: [ 'shadow.blur', 0 ],
  119697. shadowStroke: [ 'shadow.stroke', false ],
  119698. shadowFill: [ 'shadow.fill', false ],
  119699. align: [ 'align', 'left' ],
  119700. maxLines: [ 'maxLines', 0 ],
  119701. fixedWidth: [ 'fixedWidth', 0 ],
  119702. fixedHeight: [ 'fixedHeight', 0 ],
  119703. resolution: [ 'resolution', 0 ],
  119704. rtl: [ 'rtl', false ],
  119705. testString: [ 'testString', '|MÉqgy' ],
  119706. baselineX: [ 'baselineX', 1.2 ],
  119707. baselineY: [ 'baselineY', 1.4 ],
  119708. wordWrapWidth: [ 'wordWrap.width', null ],
  119709. wordWrapCallback: [ 'wordWrap.callback', null ],
  119710. wordWrapCallbackScope: [ 'wordWrap.callbackScope', null ],
  119711. wordWrapUseAdvanced: [ 'wordWrap.useAdvancedWrap', false ]
  119712. };
  119713. /**
  119714. * Font metrics for a Text Style object.
  119715. *
  119716. * @typedef {object} BitmapTextMetrics
  119717. *
  119718. * @property {number} ascent - The ascent of the font.
  119719. * @property {number} descent - The descent of the font.
  119720. * @property {number} fontSize - The size of the font.
  119721. */
  119722. /**
  119723. * @classdesc
  119724. * A TextStyle class manages all of the style settings for a Text object.
  119725. *
  119726. * Text Game Objects create a TextStyle instance automatically, which is
  119727. * accessed via the `Text.style` property. You do not normally need to
  119728. * instantiate one yourself.
  119729. *
  119730. * @class TextStyle
  119731. * @memberof Phaser.GameObjects
  119732. * @constructor
  119733. * @since 3.0.0
  119734. *
  119735. * @param {Phaser.GameObjects.Text} text - The Text object that this TextStyle is styling.
  119736. * @param {object} style - The style settings to set.
  119737. */
  119738. var TextStyle = new Class({
  119739. initialize:
  119740. function TextStyle (text, style)
  119741. {
  119742. /**
  119743. * The Text object that this TextStyle is styling.
  119744. *
  119745. * @name Phaser.GameObjects.TextStyle#parent
  119746. * @type {Phaser.GameObjects.Text}
  119747. * @since 3.0.0
  119748. */
  119749. this.parent = text;
  119750. /**
  119751. * The font family.
  119752. *
  119753. * @name Phaser.GameObjects.TextStyle#fontFamily
  119754. * @type {string}
  119755. * @default 'Courier'
  119756. * @since 3.0.0
  119757. */
  119758. this.fontFamily;
  119759. /**
  119760. * The font size.
  119761. *
  119762. * @name Phaser.GameObjects.TextStyle#fontSize
  119763. * @type {string}
  119764. * @default '16px'
  119765. * @since 3.0.0
  119766. */
  119767. this.fontSize;
  119768. /**
  119769. * The font style.
  119770. *
  119771. * @name Phaser.GameObjects.TextStyle#fontStyle
  119772. * @type {string}
  119773. * @since 3.0.0
  119774. */
  119775. this.fontStyle;
  119776. /**
  119777. * The background color.
  119778. *
  119779. * @name Phaser.GameObjects.TextStyle#backgroundColor
  119780. * @type {string}
  119781. * @since 3.0.0
  119782. */
  119783. this.backgroundColor;
  119784. /**
  119785. * The text fill color.
  119786. *
  119787. * @name Phaser.GameObjects.TextStyle#color
  119788. * @type {string}
  119789. * @default '#fff'
  119790. * @since 3.0.0
  119791. */
  119792. this.color;
  119793. /**
  119794. * The text stroke color.
  119795. *
  119796. * @name Phaser.GameObjects.TextStyle#stroke
  119797. * @type {string}
  119798. * @default '#fff'
  119799. * @since 3.0.0
  119800. */
  119801. this.stroke;
  119802. /**
  119803. * The text stroke thickness.
  119804. *
  119805. * @name Phaser.GameObjects.TextStyle#strokeThickness
  119806. * @type {number}
  119807. * @default 0
  119808. * @since 3.0.0
  119809. */
  119810. this.strokeThickness;
  119811. /**
  119812. * The horizontal shadow offset.
  119813. *
  119814. * @name Phaser.GameObjects.TextStyle#shadowOffsetX
  119815. * @type {number}
  119816. * @default 0
  119817. * @since 3.0.0
  119818. */
  119819. this.shadowOffsetX;
  119820. /**
  119821. * The vertical shadow offset.
  119822. *
  119823. * @name Phaser.GameObjects.TextStyle#shadowOffsetY
  119824. * @type {number}
  119825. * @default 0
  119826. * @since 3.0.0
  119827. */
  119828. this.shadowOffsetY;
  119829. /**
  119830. * The shadow color.
  119831. *
  119832. * @name Phaser.GameObjects.TextStyle#shadowColor
  119833. * @type {string}
  119834. * @default '#000'
  119835. * @since 3.0.0
  119836. */
  119837. this.shadowColor;
  119838. /**
  119839. * The shadow blur radius.
  119840. *
  119841. * @name Phaser.GameObjects.TextStyle#shadowBlur
  119842. * @type {number}
  119843. * @default 0
  119844. * @since 3.0.0
  119845. */
  119846. this.shadowBlur;
  119847. /**
  119848. * Whether shadow stroke is enabled or not.
  119849. *
  119850. * @name Phaser.GameObjects.TextStyle#shadowStroke
  119851. * @type {boolean}
  119852. * @default false
  119853. * @since 3.0.0
  119854. */
  119855. this.shadowStroke;
  119856. /**
  119857. * Whether shadow fill is enabled or not.
  119858. *
  119859. * @name Phaser.GameObjects.TextStyle#shadowFill
  119860. * @type {boolean}
  119861. * @default false
  119862. * @since 3.0.0
  119863. */
  119864. this.shadowFill;
  119865. /**
  119866. * The text alignment.
  119867. *
  119868. * @name Phaser.GameObjects.TextStyle#align
  119869. * @type {string}
  119870. * @default 'left'
  119871. * @since 3.0.0
  119872. */
  119873. this.align;
  119874. /**
  119875. * The maximum number of lines to draw.
  119876. *
  119877. * @name Phaser.GameObjects.TextStyle#maxLines
  119878. * @type {integer}
  119879. * @default 0
  119880. * @since 3.0.0
  119881. */
  119882. this.maxLines;
  119883. /**
  119884. * The fixed width of the text.
  119885. *
  119886. * `0` means no fixed with.
  119887. *
  119888. * @name Phaser.GameObjects.TextStyle#fixedWidth
  119889. * @type {number}
  119890. * @default 0
  119891. * @since 3.0.0
  119892. */
  119893. this.fixedWidth;
  119894. /**
  119895. * The fixed height of the text.
  119896. *
  119897. * `0` means no fixed height.
  119898. *
  119899. * @name Phaser.GameObjects.TextStyle#fixedHeight
  119900. * @type {number}
  119901. * @default 0
  119902. * @since 3.0.0
  119903. */
  119904. this.fixedHeight;
  119905. /**
  119906. * The resolution the text is rendered to its internal canvas at.
  119907. * The default is 0, which means it will use the resolution set in the Game Config.
  119908. *
  119909. * @name Phaser.GameObjects.TextStyle#resolution
  119910. * @type {number}
  119911. * @default 0
  119912. * @since 3.12.0
  119913. */
  119914. this.resolution;
  119915. /**
  119916. * Whether the text should render right to left.
  119917. *
  119918. * @name Phaser.GameObjects.TextStyle#rtl
  119919. * @type {boolean}
  119920. * @default false
  119921. * @since 3.0.0
  119922. */
  119923. this.rtl;
  119924. /**
  119925. * The test string to use when measuring the font.
  119926. *
  119927. * @name Phaser.GameObjects.TextStyle#testString
  119928. * @type {string}
  119929. * @default '|MÉqgy'
  119930. * @since 3.0.0
  119931. */
  119932. this.testString;
  119933. /**
  119934. * The amount of horizontal padding adding to the width of the text when calculating the font metrics.
  119935. *
  119936. * @name Phaser.GameObjects.TextStyle#baselineX
  119937. * @type {number}
  119938. * @default 1.2
  119939. * @since 3.3.0
  119940. */
  119941. this.baselineX;
  119942. /**
  119943. * The amount of vertical padding adding to the width of the text when calculating the font metrics.
  119944. *
  119945. * @name Phaser.GameObjects.TextStyle#baselineY
  119946. * @type {number}
  119947. * @default 1.4
  119948. * @since 3.3.0
  119949. */
  119950. this.baselineY;
  119951. /**
  119952. * The font style, size and family.
  119953. *
  119954. * @name Phaser.GameObjects.TextStyle#_font
  119955. * @type {string}
  119956. * @private
  119957. * @since 3.0.0
  119958. */
  119959. this._font;
  119960. // Set to defaults + user style
  119961. this.setStyle(style, false, true);
  119962. var metrics = GetValue(style, 'metrics', false);
  119963. // Provide optional TextMetrics in the style object to avoid the canvas look-up / scanning
  119964. // Doing this is reset if you then change the font of this TextStyle after creation
  119965. if (metrics)
  119966. {
  119967. this.metrics = {
  119968. ascent: GetValue(metrics, 'ascent', 0),
  119969. descent: GetValue(metrics, 'descent', 0),
  119970. fontSize: GetValue(metrics, 'fontSize', 0)
  119971. };
  119972. }
  119973. else
  119974. {
  119975. this.metrics = MeasureText(this);
  119976. }
  119977. },
  119978. /**
  119979. * Set the text style.
  119980. *
  119981. * @example
  119982. * text.setStyle({
  119983. * fontSize: '64px',
  119984. * fontFamily: 'Arial',
  119985. * color: '#ffffff',
  119986. * align: 'center',
  119987. * backgroundColor: '#ff00ff'
  119988. * });
  119989. *
  119990. * @method Phaser.GameObjects.TextStyle#setStyle
  119991. * @since 3.0.0
  119992. *
  119993. * @param {object} style - The style settings to set.
  119994. * @param {boolean} [updateText=true] - Whether to update the text immediately.
  119995. * @param {boolean} [setDefaults=false] - Use the default values is not set, or the local values.
  119996. *
  119997. * @return {Phaser.GameObjects.Text} The parent Text object.
  119998. */
  119999. setStyle: function (style, updateText, setDefaults)
  120000. {
  120001. if (updateText === undefined) { updateText = true; }
  120002. if (setDefaults === undefined) { setDefaults = false; }
  120003. // Avoid type mutation
  120004. if (style && style.hasOwnProperty('fontSize') && typeof style.fontSize === 'number')
  120005. {
  120006. style.fontSize = style.fontSize.toString() + 'px';
  120007. }
  120008. for (var key in propertyMap)
  120009. {
  120010. var value = (setDefaults) ? propertyMap[key][1] : this[key];
  120011. if (key === 'wordWrapCallback' || key === 'wordWrapCallbackScope')
  120012. {
  120013. // Callback & scope should be set without processing the values
  120014. this[key] = GetValue(style, propertyMap[key][0], value);
  120015. }
  120016. else
  120017. {
  120018. this[key] = GetAdvancedValue(style, propertyMap[key][0], value);
  120019. }
  120020. }
  120021. // Allow for 'font' override
  120022. var font = GetValue(style, 'font', null);
  120023. if (font !== null)
  120024. {
  120025. this.setFont(font, false);
  120026. }
  120027. this._font = [ this.fontStyle, this.fontSize, this.fontFamily ].join(' ').trim();
  120028. // Allow for 'fill' to be used in place of 'color'
  120029. var fill = GetValue(style, 'fill', null);
  120030. if (fill !== null)
  120031. {
  120032. this.color = fill;
  120033. }
  120034. if (updateText)
  120035. {
  120036. return this.update(true);
  120037. }
  120038. else
  120039. {
  120040. return this.parent;
  120041. }
  120042. },
  120043. /**
  120044. * Synchronize the font settings to the given Canvas Rendering Context.
  120045. *
  120046. * @method Phaser.GameObjects.TextStyle#syncFont
  120047. * @since 3.0.0
  120048. *
  120049. * @param {HTMLCanvasElement} canvas - The Canvas Element.
  120050. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  120051. */
  120052. syncFont: function (canvas, context)
  120053. {
  120054. context.font = this._font;
  120055. },
  120056. /**
  120057. * Synchronize the text style settings to the given Canvas Rendering Context.
  120058. *
  120059. * @method Phaser.GameObjects.TextStyle#syncStyle
  120060. * @since 3.0.0
  120061. *
  120062. * @param {HTMLCanvasElement} canvas - The Canvas Element.
  120063. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  120064. */
  120065. syncStyle: function (canvas, context)
  120066. {
  120067. context.textBaseline = 'alphabetic';
  120068. context.fillStyle = this.color;
  120069. context.strokeStyle = this.stroke;
  120070. context.lineWidth = this.strokeThickness;
  120071. context.lineCap = 'round';
  120072. context.lineJoin = 'round';
  120073. },
  120074. /**
  120075. * Synchronize the shadow settings to the given Canvas Rendering Context.
  120076. *
  120077. * @method Phaser.GameObjects.TextStyle#syncShadow
  120078. * @since 3.0.0
  120079. *
  120080. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  120081. * @param {boolean} enabled - Whether shadows are enabled or not.
  120082. */
  120083. syncShadow: function (context, enabled)
  120084. {
  120085. if (enabled)
  120086. {
  120087. context.shadowOffsetX = this.shadowOffsetX;
  120088. context.shadowOffsetY = this.shadowOffsetY;
  120089. context.shadowColor = this.shadowColor;
  120090. context.shadowBlur = this.shadowBlur;
  120091. }
  120092. else
  120093. {
  120094. context.shadowOffsetX = 0;
  120095. context.shadowOffsetY = 0;
  120096. context.shadowColor = 0;
  120097. context.shadowBlur = 0;
  120098. }
  120099. },
  120100. /**
  120101. * Update the style settings for the parent Text object.
  120102. *
  120103. * @method Phaser.GameObjects.TextStyle#update
  120104. * @since 3.0.0
  120105. *
  120106. * @param {boolean} recalculateMetrics - Whether to recalculate font and text metrics.
  120107. *
  120108. * @return {Phaser.GameObjects.Text} The parent Text object.
  120109. */
  120110. update: function (recalculateMetrics)
  120111. {
  120112. if (recalculateMetrics)
  120113. {
  120114. this._font = [ this.fontStyle, this.fontSize, this.fontFamily ].join(' ').trim();
  120115. this.metrics = MeasureText(this);
  120116. }
  120117. return this.parent.updateText();
  120118. },
  120119. /**
  120120. * Set the font.
  120121. *
  120122. * If a string is given, the font family is set.
  120123. *
  120124. * If an object is given, the `fontFamily`, `fontSize` and `fontStyle`
  120125. * properties of that object are set.
  120126. *
  120127. * @method Phaser.GameObjects.TextStyle#setFont
  120128. * @since 3.0.0
  120129. *
  120130. * @param {(string|object)} font - The font family or font settings to set.
  120131. * @param {boolean} [updateText=true] - Whether to update the text immediately.
  120132. *
  120133. * @return {Phaser.GameObjects.Text} The parent Text object.
  120134. */
  120135. setFont: function (font, updateText)
  120136. {
  120137. if (updateText === undefined) { updateText = true; }
  120138. var fontFamily = font;
  120139. var fontSize = '';
  120140. var fontStyle = '';
  120141. if (typeof font !== 'string')
  120142. {
  120143. fontFamily = GetValue(font, 'fontFamily', 'Courier');
  120144. fontSize = GetValue(font, 'fontSize', '16px');
  120145. fontStyle = GetValue(font, 'fontStyle', '');
  120146. }
  120147. else
  120148. {
  120149. var fontSplit = font.split(' ');
  120150. var i = 0;
  120151. fontStyle = (fontSplit.length > 2) ? fontSplit[i++] : '';
  120152. fontSize = fontSplit[i++] || '16px';
  120153. fontFamily = fontSplit[i++] || 'Courier';
  120154. }
  120155. if (fontFamily !== this.fontFamily || fontSize !== this.fontSize || fontStyle !== this.fontStyle)
  120156. {
  120157. this.fontFamily = fontFamily;
  120158. this.fontSize = fontSize;
  120159. this.fontStyle = fontStyle;
  120160. if (updateText)
  120161. {
  120162. this.update(true);
  120163. }
  120164. }
  120165. return this.parent;
  120166. },
  120167. /**
  120168. * Set the font family.
  120169. *
  120170. * @method Phaser.GameObjects.TextStyle#setFontFamily
  120171. * @since 3.0.0
  120172. *
  120173. * @param {string} family - The font family.
  120174. *
  120175. * @return {Phaser.GameObjects.Text} The parent Text object.
  120176. */
  120177. setFontFamily: function (family)
  120178. {
  120179. if (this.fontFamily !== family)
  120180. {
  120181. this.fontFamily = family;
  120182. this.update(true);
  120183. }
  120184. return this.parent;
  120185. },
  120186. /**
  120187. * Set the font style.
  120188. *
  120189. * @method Phaser.GameObjects.TextStyle#setFontStyle
  120190. * @since 3.0.0
  120191. *
  120192. * @param {string} style - The font style.
  120193. *
  120194. * @return {Phaser.GameObjects.Text} The parent Text object.
  120195. */
  120196. setFontStyle: function (style)
  120197. {
  120198. if (this.fontStyle !== style)
  120199. {
  120200. this.fontStyle = style;
  120201. this.update(true);
  120202. }
  120203. return this.parent;
  120204. },
  120205. /**
  120206. * Set the font size.
  120207. *
  120208. * @method Phaser.GameObjects.TextStyle#setFontSize
  120209. * @since 3.0.0
  120210. *
  120211. * @param {(number|string)} size - The font size.
  120212. *
  120213. * @return {Phaser.GameObjects.Text} The parent Text object.
  120214. */
  120215. setFontSize: function (size)
  120216. {
  120217. if (typeof size === 'number')
  120218. {
  120219. size = size.toString() + 'px';
  120220. }
  120221. if (this.fontSize !== size)
  120222. {
  120223. this.fontSize = size;
  120224. this.update(true);
  120225. }
  120226. return this.parent;
  120227. },
  120228. /**
  120229. * Set the test string to use when measuring the font.
  120230. *
  120231. * @method Phaser.GameObjects.TextStyle#setTestString
  120232. * @since 3.0.0
  120233. *
  120234. * @param {string} string - The test string to use when measuring the font.
  120235. *
  120236. * @return {Phaser.GameObjects.Text} The parent Text object.
  120237. */
  120238. setTestString: function (string)
  120239. {
  120240. this.testString = string;
  120241. return this.update(true);
  120242. },
  120243. /**
  120244. * Set a fixed width and height for the text.
  120245. *
  120246. * Pass in `0` for either of these parameters to disable fixed width or height respectively.
  120247. *
  120248. * @method Phaser.GameObjects.TextStyle#setFixedSize
  120249. * @since 3.0.0
  120250. *
  120251. * @param {number} width - The fixed width to set.
  120252. * @param {number} height - The fixed height to set.
  120253. *
  120254. * @return {Phaser.GameObjects.Text} The parent Text object.
  120255. */
  120256. setFixedSize: function (width, height)
  120257. {
  120258. this.fixedWidth = width;
  120259. this.fixedHeight = height;
  120260. if (width)
  120261. {
  120262. this.parent.width = width;
  120263. }
  120264. if (height)
  120265. {
  120266. this.parent.height = height;
  120267. }
  120268. return this.update(false);
  120269. },
  120270. /**
  120271. * Set the background color.
  120272. *
  120273. * @method Phaser.GameObjects.TextStyle#setBackgroundColor
  120274. * @since 3.0.0
  120275. *
  120276. * @param {string} color - The background color.
  120277. *
  120278. * @return {Phaser.GameObjects.Text} The parent Text object.
  120279. */
  120280. setBackgroundColor: function (color)
  120281. {
  120282. this.backgroundColor = color;
  120283. return this.update(false);
  120284. },
  120285. /**
  120286. * Set the text fill color.
  120287. *
  120288. * @method Phaser.GameObjects.TextStyle#setFill
  120289. * @since 3.0.0
  120290. *
  120291. * @param {string} color - The text fill color.
  120292. *
  120293. * @return {Phaser.GameObjects.Text} The parent Text object.
  120294. */
  120295. setFill: function (color)
  120296. {
  120297. this.color = color;
  120298. return this.update(false);
  120299. },
  120300. /**
  120301. * Set the text fill color.
  120302. *
  120303. * @method Phaser.GameObjects.TextStyle#setColor
  120304. * @since 3.0.0
  120305. *
  120306. * @param {string} color - The text fill color.
  120307. *
  120308. * @return {Phaser.GameObjects.Text} The parent Text object.
  120309. */
  120310. setColor: function (color)
  120311. {
  120312. this.color = color;
  120313. return this.update(false);
  120314. },
  120315. /**
  120316. * Set the resolution used by the Text object.
  120317. *
  120318. * By default it will be set to match the resolution set in the Game Config,
  120319. * but you can override it via this method. It allows for much clearer text on High DPI devices,
  120320. * at the cost of memory because it uses larger internal Canvas textures for the Text.
  120321. *
  120322. * Please use with caution, as the more high res Text you have, the more memory it uses up.
  120323. *
  120324. * @method Phaser.GameObjects.TextStyle#setResolution
  120325. * @since 3.12.0
  120326. *
  120327. * @param {number} value - The resolution for this Text object to use.
  120328. *
  120329. * @return {Phaser.GameObjects.Text} The parent Text object.
  120330. */
  120331. setResolution: function (value)
  120332. {
  120333. this.resolution = value;
  120334. return this.update(false);
  120335. },
  120336. /**
  120337. * Set the stroke settings.
  120338. *
  120339. * @method Phaser.GameObjects.TextStyle#setStroke
  120340. * @since 3.0.0
  120341. *
  120342. * @param {string} color - The stroke color.
  120343. * @param {number} thickness - The stroke thickness.
  120344. *
  120345. * @return {Phaser.GameObjects.Text} The parent Text object.
  120346. */
  120347. setStroke: function (color, thickness)
  120348. {
  120349. if (thickness === undefined) { thickness = this.strokeThickness; }
  120350. if (color === undefined && this.strokeThickness !== 0)
  120351. {
  120352. // Reset the stroke to zero (disabling it)
  120353. this.strokeThickness = 0;
  120354. this.update(true);
  120355. }
  120356. else if (this.stroke !== color || this.strokeThickness !== thickness)
  120357. {
  120358. this.stroke = color;
  120359. this.strokeThickness = thickness;
  120360. this.update(true);
  120361. }
  120362. return this.parent;
  120363. },
  120364. /**
  120365. * Set the shadow settings.
  120366. *
  120367. * Calling this method always re-measures the parent Text object,
  120368. * so only call it when you actually change the shadow settings.
  120369. *
  120370. * @method Phaser.GameObjects.TextStyle#setShadow
  120371. * @since 3.0.0
  120372. *
  120373. * @param {number} [x=0] - The horizontal shadow offset.
  120374. * @param {number} [y=0] - The vertical shadow offset.
  120375. * @param {string} [color='#000'] - The shadow color.
  120376. * @param {number} [blur=0] - The shadow blur radius.
  120377. * @param {boolean} [shadowStroke=false] - Whether to stroke the shadow.
  120378. * @param {boolean} [shadowFill=true] - Whether to fill the shadow.
  120379. *
  120380. * @return {Phaser.GameObjects.Text} The parent Text object.
  120381. */
  120382. setShadow: function (x, y, color, blur, shadowStroke, shadowFill)
  120383. {
  120384. if (x === undefined) { x = 0; }
  120385. if (y === undefined) { y = 0; }
  120386. if (color === undefined) { color = '#000'; }
  120387. if (blur === undefined) { blur = 0; }
  120388. if (shadowStroke === undefined) { shadowStroke = false; }
  120389. if (shadowFill === undefined) { shadowFill = true; }
  120390. this.shadowOffsetX = x;
  120391. this.shadowOffsetY = y;
  120392. this.shadowColor = color;
  120393. this.shadowBlur = blur;
  120394. this.shadowStroke = shadowStroke;
  120395. this.shadowFill = shadowFill;
  120396. return this.update(false);
  120397. },
  120398. /**
  120399. * Set the shadow offset.
  120400. *
  120401. * @method Phaser.GameObjects.TextStyle#setShadowOffset
  120402. * @since 3.0.0
  120403. *
  120404. * @param {number} [x=0] - The horizontal shadow offset.
  120405. * @param {number} [y=0] - The vertical shadow offset.
  120406. *
  120407. * @return {Phaser.GameObjects.Text} The parent Text object.
  120408. */
  120409. setShadowOffset: function (x, y)
  120410. {
  120411. if (x === undefined) { x = 0; }
  120412. if (y === undefined) { y = x; }
  120413. this.shadowOffsetX = x;
  120414. this.shadowOffsetY = y;
  120415. return this.update(false);
  120416. },
  120417. /**
  120418. * Set the shadow color.
  120419. *
  120420. * @method Phaser.GameObjects.TextStyle#setShadowColor
  120421. * @since 3.0.0
  120422. *
  120423. * @param {string} [color='#000'] - The shadow color.
  120424. *
  120425. * @return {Phaser.GameObjects.Text} The parent Text object.
  120426. */
  120427. setShadowColor: function (color)
  120428. {
  120429. if (color === undefined) { color = '#000'; }
  120430. this.shadowColor = color;
  120431. return this.update(false);
  120432. },
  120433. /**
  120434. * Set the shadow blur radius.
  120435. *
  120436. * @method Phaser.GameObjects.TextStyle#setShadowBlur
  120437. * @since 3.0.0
  120438. *
  120439. * @param {number} [blur=0] - The shadow blur radius.
  120440. *
  120441. * @return {Phaser.GameObjects.Text} The parent Text object.
  120442. */
  120443. setShadowBlur: function (blur)
  120444. {
  120445. if (blur === undefined) { blur = 0; }
  120446. this.shadowBlur = blur;
  120447. return this.update(false);
  120448. },
  120449. /**
  120450. * Enable or disable shadow stroke.
  120451. *
  120452. * @method Phaser.GameObjects.TextStyle#setShadowStroke
  120453. * @since 3.0.0
  120454. *
  120455. * @param {boolean} enabled - Whether shadow stroke is enabled or not.
  120456. *
  120457. * @return {Phaser.GameObjects.Text} The parent Text object.
  120458. */
  120459. setShadowStroke: function (enabled)
  120460. {
  120461. this.shadowStroke = enabled;
  120462. return this.update(false);
  120463. },
  120464. /**
  120465. * Enable or disable shadow fill.
  120466. *
  120467. * @method Phaser.GameObjects.TextStyle#setShadowFill
  120468. * @since 3.0.0
  120469. *
  120470. * @param {boolean} enabled - Whether shadow fill is enabled or not.
  120471. *
  120472. * @return {Phaser.GameObjects.Text} The parent Text object.
  120473. */
  120474. setShadowFill: function (enabled)
  120475. {
  120476. this.shadowFill = enabled;
  120477. return this.update(false);
  120478. },
  120479. /**
  120480. * Set the width (in pixels) to use for wrapping lines.
  120481. *
  120482. * Pass in null to remove wrapping by width.
  120483. *
  120484. * @method Phaser.GameObjects.TextStyle#setWordWrapWidth
  120485. * @since 3.0.0
  120486. *
  120487. * @param {number} width - The maximum width of a line in pixels. Set to null to remove wrapping.
  120488. * @param {boolean} [useAdvancedWrap=false] - Whether or not to use the advanced wrapping
  120489. * algorithm. If true, spaces are collapsed and whitespace is trimmed from lines. If false,
  120490. * spaces and whitespace are left as is.
  120491. *
  120492. * @return {Phaser.GameObjects.Text} The parent Text object.
  120493. */
  120494. setWordWrapWidth: function (width, useAdvancedWrap)
  120495. {
  120496. if (useAdvancedWrap === undefined) { useAdvancedWrap = false; }
  120497. this.wordWrapWidth = width;
  120498. this.wordWrapUseAdvanced = useAdvancedWrap;
  120499. return this.update(false);
  120500. },
  120501. /**
  120502. * Set a custom callback for wrapping lines.
  120503. *
  120504. * Pass in null to remove wrapping by callback.
  120505. *
  120506. * @method Phaser.GameObjects.TextStyle#setWordWrapCallback
  120507. * @since 3.0.0
  120508. *
  120509. * @param {TextStyleWordWrapCallback} callback - A custom function that will be responsible for wrapping the
  120510. * text. It will receive two arguments: text (the string to wrap), textObject (this Text
  120511. * instance). It should return the wrapped lines either as an array of lines or as a string with
  120512. * newline characters in place to indicate where breaks should happen.
  120513. * @param {object} [scope=null] - The scope that will be applied when the callback is invoked.
  120514. *
  120515. * @return {Phaser.GameObjects.Text} The parent Text object.
  120516. */
  120517. setWordWrapCallback: function (callback, scope)
  120518. {
  120519. if (scope === undefined) { scope = null; }
  120520. this.wordWrapCallback = callback;
  120521. this.wordWrapCallbackScope = scope;
  120522. return this.update(false);
  120523. },
  120524. /**
  120525. * Set the text alignment.
  120526. *
  120527. * Expects values like `'left'`, `'right'`, `'center'` or `'justified'`.
  120528. *
  120529. * @method Phaser.GameObjects.TextStyle#setAlign
  120530. * @since 3.0.0
  120531. *
  120532. * @param {string} align - The text alignment.
  120533. *
  120534. * @return {Phaser.GameObjects.Text} The parent Text object.
  120535. */
  120536. setAlign: function (align)
  120537. {
  120538. if (align === undefined) { align = 'left'; }
  120539. this.align = align;
  120540. return this.update(false);
  120541. },
  120542. /**
  120543. * Set the maximum number of lines to draw.
  120544. *
  120545. * @method Phaser.GameObjects.TextStyle#setMaxLines
  120546. * @since 3.0.0
  120547. *
  120548. * @param {integer} [max=0] - The maximum number of lines to draw.
  120549. *
  120550. * @return {Phaser.GameObjects.Text} The parent Text object.
  120551. */
  120552. setMaxLines: function (max)
  120553. {
  120554. if (max === undefined) { max = 0; }
  120555. this.maxLines = max;
  120556. return this.update(false);
  120557. },
  120558. /**
  120559. * Get the current text metrics.
  120560. *
  120561. * @method Phaser.GameObjects.TextStyle#getTextMetrics
  120562. * @since 3.0.0
  120563. *
  120564. * @return {BitmapTextMetrics} The text metrics.
  120565. */
  120566. getTextMetrics: function ()
  120567. {
  120568. var metrics = this.metrics;
  120569. return {
  120570. ascent: metrics.ascent,
  120571. descent: metrics.descent,
  120572. fontSize: metrics.fontSize
  120573. };
  120574. },
  120575. /**
  120576. * Build a JSON representation of this Text Style.
  120577. *
  120578. * @method Phaser.GameObjects.TextStyle#toJSON
  120579. * @since 3.0.0
  120580. *
  120581. * @return {object} A JSON representation of this Text Style.
  120582. */
  120583. toJSON: function ()
  120584. {
  120585. var output = {};
  120586. for (var key in propertyMap)
  120587. {
  120588. output[key] = this[key];
  120589. }
  120590. output.metrics = this.getTextMetrics();
  120591. return output;
  120592. },
  120593. /**
  120594. * Destroy this Text Style.
  120595. *
  120596. * @method Phaser.GameObjects.TextStyle#destroy
  120597. * @since 3.0.0
  120598. */
  120599. destroy: function ()
  120600. {
  120601. this.parent = undefined;
  120602. }
  120603. });
  120604. module.exports = TextStyle;
  120605. /***/ }),
  120606. /* 831 */
  120607. /***/ (function(module, exports) {
  120608. /**
  120609. * @author Richard Davey <rich@photonstorm.com>
  120610. * @copyright 2019 Photon Storm Ltd.
  120611. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120612. */
  120613. /**
  120614. * Renders this Game Object with the Canvas Renderer to the given Camera.
  120615. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  120616. * This method should not be called directly. It is a utility function of the Render module.
  120617. *
  120618. * @method Phaser.GameObjects.Text#renderCanvas
  120619. * @since 3.0.0
  120620. * @private
  120621. *
  120622. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  120623. * @param {Phaser.GameObjects.Text} src - The Game Object being rendered in this call.
  120624. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  120625. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  120626. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  120627. */
  120628. var TextCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  120629. {
  120630. if (src.text !== '')
  120631. {
  120632. renderer.batchSprite(src, src.frame, camera, parentMatrix);
  120633. }
  120634. };
  120635. module.exports = TextCanvasRenderer;
  120636. /***/ }),
  120637. /* 832 */
  120638. /***/ (function(module, exports, __webpack_require__) {
  120639. /**
  120640. * @author Richard Davey <rich@photonstorm.com>
  120641. * @copyright 2019 Photon Storm Ltd.
  120642. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120643. */
  120644. var Utils = __webpack_require__(9);
  120645. /**
  120646. * Renders this Game Object with the WebGL Renderer to the given Camera.
  120647. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  120648. * This method should not be called directly. It is a utility function of the Render module.
  120649. *
  120650. * @method Phaser.GameObjects.Text#renderWebGL
  120651. * @since 3.0.0
  120652. * @private
  120653. *
  120654. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  120655. * @param {Phaser.GameObjects.Text} src - The Game Object being rendered in this call.
  120656. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  120657. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  120658. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  120659. */
  120660. var TextWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  120661. {
  120662. if (src.text === '')
  120663. {
  120664. return;
  120665. }
  120666. var frame = src.frame;
  120667. var width = frame.width;
  120668. var height = frame.height;
  120669. var getTint = Utils.getTintAppendFloatAlpha;
  120670. this.pipeline.batchTexture(
  120671. src,
  120672. frame.glTexture,
  120673. width, height,
  120674. src.x, src.y,
  120675. width / src.style.resolution, height / src.style.resolution,
  120676. src.scaleX, src.scaleY,
  120677. src.rotation,
  120678. src.flipX, src.flipY,
  120679. src.scrollFactorX, src.scrollFactorY,
  120680. src.displayOriginX, src.displayOriginY,
  120681. 0, 0, width, height,
  120682. getTint(src._tintTL, camera.alpha * src._alphaTL),
  120683. getTint(src._tintTR, camera.alpha * src._alphaTR),
  120684. getTint(src._tintBL, camera.alpha * src._alphaBL),
  120685. getTint(src._tintBR, camera.alpha * src._alphaBR),
  120686. (src._isTinted && src.tintFill),
  120687. 0, 0,
  120688. camera,
  120689. parentMatrix
  120690. );
  120691. };
  120692. module.exports = TextWebGLRenderer;
  120693. /***/ }),
  120694. /* 833 */
  120695. /***/ (function(module, exports, __webpack_require__) {
  120696. /**
  120697. * @author Richard Davey <rich@photonstorm.com>
  120698. * @copyright 2019 Photon Storm Ltd.
  120699. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120700. */
  120701. var renderWebGL = __webpack_require__(1);
  120702. var renderCanvas = __webpack_require__(1);
  120703. if (true)
  120704. {
  120705. renderWebGL = __webpack_require__(832);
  120706. }
  120707. if (true)
  120708. {
  120709. renderCanvas = __webpack_require__(831);
  120710. }
  120711. module.exports = {
  120712. renderWebGL: renderWebGL,
  120713. renderCanvas: renderCanvas
  120714. };
  120715. /***/ }),
  120716. /* 834 */
  120717. /***/ (function(module, exports) {
  120718. /**
  120719. * @author Richard Davey <rich@photonstorm.com>
  120720. * @copyright 2019 Photon Storm Ltd.
  120721. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120722. */
  120723. /**
  120724. * Returns an object containing dimensions of the Text object.
  120725. *
  120726. * @function Phaser.GameObjects.Text.GetTextSize
  120727. * @since 3.0.0
  120728. *
  120729. * @param {Phaser.GameObjects.Text} text - The Text object to calculate the size from.
  120730. * @param {BitmapTextMetrics} size - The Text metrics to use when calculating the size.
  120731. * @param {array} lines - The lines of text to calculate the size from.
  120732. *
  120733. * @return {object} An object containing dimensions of the Text object.
  120734. */
  120735. var GetTextSize = function (text, size, lines)
  120736. {
  120737. var canvas = text.canvas;
  120738. var context = text.context;
  120739. var style = text.style;
  120740. var lineWidths = [];
  120741. var maxLineWidth = 0;
  120742. var drawnLines = lines.length;
  120743. if (style.maxLines > 0 && style.maxLines < lines.length)
  120744. {
  120745. drawnLines = style.maxLines;
  120746. }
  120747. style.syncFont(canvas, context);
  120748. // Text Width
  120749. for (var i = 0; i < drawnLines; i++)
  120750. {
  120751. var lineWidth = style.strokeThickness;
  120752. lineWidth += context.measureText(lines[i]).width;
  120753. // Adjust for wrapped text
  120754. if (style.wordWrap)
  120755. {
  120756. lineWidth -= context.measureText(' ').width;
  120757. }
  120758. lineWidths[i] = Math.ceil(lineWidth);
  120759. maxLineWidth = Math.max(maxLineWidth, lineWidths[i]);
  120760. }
  120761. // Text Height
  120762. var lineHeight = size.fontSize + style.strokeThickness;
  120763. var height = lineHeight * drawnLines;
  120764. var lineSpacing = text.lineSpacing;
  120765. // Adjust for line spacing
  120766. if (lines.length > 1)
  120767. {
  120768. height += lineSpacing * (lines.length - 1);
  120769. }
  120770. return {
  120771. width: maxLineWidth,
  120772. height: height,
  120773. lines: drawnLines,
  120774. lineWidths: lineWidths,
  120775. lineSpacing: lineSpacing,
  120776. lineHeight: lineHeight
  120777. };
  120778. };
  120779. module.exports = GetTextSize;
  120780. /***/ }),
  120781. /* 835 */
  120782. /***/ (function(module, exports, __webpack_require__) {
  120783. /**
  120784. * @author Richard Davey <rich@photonstorm.com>
  120785. * @copyright 2019 Photon Storm Ltd.
  120786. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120787. */
  120788. var GetValue = __webpack_require__(4);
  120789. /**
  120790. * Parses a Retro Font configuration object so you can pass it to the BitmapText constructor
  120791. * and create a BitmapText object using a fixed-width retro font.
  120792. *
  120793. * @function Phaser.GameObjects.RetroFont.Parse
  120794. * @since 3.0.0
  120795. *
  120796. * @param {Phaser.Scene} scene - A reference to the Phaser Scene.
  120797. * @param {Phaser.GameObjects.RetroFont.Config} config - The font configuration object.
  120798. *
  120799. * @return {object} A parsed Bitmap Font data entry for the Bitmap Font cache.
  120800. */
  120801. var ParseRetroFont = function (scene, config)
  120802. {
  120803. var w = config.width;
  120804. var h = config.height;
  120805. var cx = Math.floor(w / 2);
  120806. var cy = Math.floor(h / 2);
  120807. var letters = GetValue(config, 'chars', '');
  120808. if (letters === '')
  120809. {
  120810. return;
  120811. }
  120812. var key = GetValue(config, 'image', '');
  120813. var offsetX = GetValue(config, 'offset.x', 0);
  120814. var offsetY = GetValue(config, 'offset.y', 0);
  120815. var spacingX = GetValue(config, 'spacing.x', 0);
  120816. var spacingY = GetValue(config, 'spacing.y', 0);
  120817. var lineSpacing = GetValue(config, 'lineSpacing', 0);
  120818. var charsPerRow = GetValue(config, 'charsPerRow', null);
  120819. if (charsPerRow === null)
  120820. {
  120821. charsPerRow = scene.sys.textures.getFrame(key).width / w;
  120822. if (charsPerRow > letters.length)
  120823. {
  120824. charsPerRow = letters.length;
  120825. }
  120826. }
  120827. var x = offsetX;
  120828. var y = offsetY;
  120829. var data = {
  120830. retroFont: true,
  120831. font: key,
  120832. size: w,
  120833. lineHeight: h + lineSpacing,
  120834. chars: {}
  120835. };
  120836. var r = 0;
  120837. for (var i = 0; i < letters.length; i++)
  120838. {
  120839. // var node = letters[i];
  120840. var charCode = letters.charCodeAt(i);
  120841. data.chars[charCode] =
  120842. {
  120843. x: x,
  120844. y: y,
  120845. width: w,
  120846. height: h,
  120847. centerX: cx,
  120848. centerY: cy,
  120849. xOffset: 0,
  120850. yOffset: 0,
  120851. xAdvance: w,
  120852. data: {},
  120853. kerning: {}
  120854. };
  120855. r++;
  120856. if (r === charsPerRow)
  120857. {
  120858. r = 0;
  120859. x = offsetX;
  120860. y += h + spacingY;
  120861. }
  120862. else
  120863. {
  120864. x += w + spacingX;
  120865. }
  120866. }
  120867. var entry = {
  120868. data: data,
  120869. frame: null,
  120870. texture: key
  120871. };
  120872. return entry;
  120873. };
  120874. module.exports = ParseRetroFont;
  120875. /***/ }),
  120876. /* 836 */
  120877. /***/ (function(module, exports) {
  120878. /**
  120879. * @author Richard Davey <rich@photonstorm.com>
  120880. * @copyright 2019 Photon Storm Ltd.
  120881. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120882. */
  120883. var RETRO_FONT_CONST = {
  120884. /**
  120885. * Text Set 1 = !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~
  120886. *
  120887. * @name Phaser.GameObjects.RetroFont.TEXT_SET1
  120888. * @type {string}
  120889. * @since 3.6.0
  120890. */
  120891. TEXT_SET1: ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~',
  120892. /**
  120893. * Text Set 2 = !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
  120894. *
  120895. * @name Phaser.GameObjects.RetroFont.TEXT_SET2
  120896. * @type {string}
  120897. * @since 3.6.0
  120898. */
  120899. TEXT_SET2: ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  120900. /**
  120901. * Text Set 3 = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
  120902. *
  120903. * @name Phaser.GameObjects.RetroFont.TEXT_SET3
  120904. * @type {string}
  120905. * @since 3.6.0
  120906. */
  120907. TEXT_SET3: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ',
  120908. /**
  120909. * Text Set 4 = ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789
  120910. *
  120911. * @name Phaser.GameObjects.RetroFont.TEXT_SET4
  120912. * @type {string}
  120913. * @since 3.6.0
  120914. */
  120915. TEXT_SET4: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789',
  120916. /**
  120917. * Text Set 5 = ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/() '!?-*:0123456789
  120918. *
  120919. * @name Phaser.GameObjects.RetroFont.TEXT_SET5
  120920. * @type {string}
  120921. * @since 3.6.0
  120922. */
  120923. TEXT_SET5: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/() \'!?-*:0123456789',
  120924. /**
  120925. * Text Set 6 = ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789"(),-.'
  120926. *
  120927. * @name Phaser.GameObjects.RetroFont.TEXT_SET6
  120928. * @type {string}
  120929. * @since 3.6.0
  120930. */
  120931. TEXT_SET6: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789"(),-.\' ',
  120932. /**
  120933. * Text Set 7 = AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW")28FLRX-'39
  120934. *
  120935. * @name Phaser.GameObjects.RetroFont.TEXT_SET7
  120936. * @type {string}
  120937. * @since 3.6.0
  120938. */
  120939. TEXT_SET7: 'AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW")28FLRX-\'39',
  120940. /**
  120941. * Text Set 8 = 0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ
  120942. *
  120943. * @name Phaser.GameObjects.RetroFont.TEXT_SET8
  120944. * @type {string}
  120945. * @since 3.6.0
  120946. */
  120947. TEXT_SET8: '0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  120948. /**
  120949. * Text Set 9 = ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'"?!
  120950. *
  120951. * @name Phaser.GameObjects.RetroFont.TEXT_SET9
  120952. * @type {string}
  120953. * @since 3.6.0
  120954. */
  120955. TEXT_SET9: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,\'"?!',
  120956. /**
  120957. * Text Set 10 = ABCDEFGHIJKLMNOPQRSTUVWXYZ
  120958. *
  120959. * @name Phaser.GameObjects.RetroFont.TEXT_SET10
  120960. * @type {string}
  120961. * @since 3.6.0
  120962. */
  120963. TEXT_SET10: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  120964. /**
  120965. * Text Set 11 = ABCDEFGHIJKLMNOPQRSTUVWXYZ.,"-+!?()':;0123456789
  120966. *
  120967. * @name Phaser.GameObjects.RetroFont.TEXT_SET11
  120968. * @since 3.6.0
  120969. * @type {string}
  120970. */
  120971. TEXT_SET11: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ.,"-+!?()\':;0123456789'
  120972. };
  120973. module.exports = RETRO_FONT_CONST;
  120974. /***/ }),
  120975. /* 837 */
  120976. /***/ (function(module, exports, __webpack_require__) {
  120977. /**
  120978. * @author Richard Davey <rich@photonstorm.com>
  120979. * @copyright 2019 Photon Storm Ltd.
  120980. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120981. */
  120982. var RETRO_FONT_CONST = __webpack_require__(836);
  120983. var Extend = __webpack_require__(19);
  120984. /**
  120985. * @typedef {object} Phaser.GameObjects.RetroFont.Config
  120986. *
  120987. * @property {string} image - The key of the image containing the font.
  120988. * @property {number} offset.x - If the font set doesn't start at the top left of the given image, specify the X coordinate offset here.
  120989. * @property {number} offset.y - If the font set doesn't start at the top left of the given image, specify the Y coordinate offset here.
  120990. * @property {number} width - The width of each character in the font set.
  120991. * @property {number} height - The height of each character in the font set.
  120992. * @property {string} chars - The characters used in the font set, in display order. You can use the TEXT_SET consts for common font set arrangements.
  120993. * @property {number} charsPerRow - The number of characters per row in the font set. If not given charsPerRow will be the image width / characterWidth.
  120994. * @property {number} spacing.x - If the characters in the font set have horizontal spacing between them set the required amount here.
  120995. * @property {number} spacing.y - If the characters in the font set have vertical spacing between them set the required amount here.
  120996. * @property {number} lineSpacing - The amount of vertical space to add to the line height of the font.
  120997. */
  120998. /**
  120999. * @namespace Phaser.GameObjects.RetroFont
  121000. * @since 3.6.0
  121001. */
  121002. var RetroFont = { Parse: __webpack_require__(835) };
  121003. // Merge in the consts
  121004. RetroFont = Extend(false, RetroFont, RETRO_FONT_CONST);
  121005. module.exports = RetroFont;
  121006. /***/ }),
  121007. /* 838 */
  121008. /***/ (function(module, exports) {
  121009. /**
  121010. * @author Richard Davey <rich@photonstorm.com>
  121011. * @copyright 2019 Photon Storm Ltd.
  121012. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121013. */
  121014. /**
  121015. * Renders this Game Object with the Canvas Renderer to the given Camera.
  121016. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  121017. * This method should not be called directly. It is a utility function of the Render module.
  121018. *
  121019. * @method Phaser.GameObjects.RenderTexture#renderCanvas
  121020. * @since 3.2.0
  121021. * @private
  121022. *
  121023. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  121024. * @param {Phaser.GameObjects.RenderTexture} src - The Game Object being rendered in this call.
  121025. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  121026. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  121027. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  121028. */
  121029. var RenderTextureCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  121030. {
  121031. renderer.batchSprite(src, src.frame, camera, parentMatrix);
  121032. };
  121033. module.exports = RenderTextureCanvasRenderer;
  121034. /***/ }),
  121035. /* 839 */
  121036. /***/ (function(module, exports, __webpack_require__) {
  121037. /**
  121038. * @author Richard Davey <rich@photonstorm.com>
  121039. * @copyright 2019 Photon Storm Ltd.
  121040. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121041. */
  121042. var Utils = __webpack_require__(9);
  121043. /**
  121044. * Renders this Game Object with the WebGL Renderer to the given Camera.
  121045. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  121046. * This method should not be called directly. It is a utility function of the Render module.
  121047. *
  121048. * @method Phaser.GameObjects.RenderTexture#renderWebGL
  121049. * @since 3.2.0
  121050. * @private
  121051. *
  121052. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active Canvas renderer.
  121053. * @param {Phaser.GameObjects.RenderTexture} src - The Game Object being rendered in this call.
  121054. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  121055. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  121056. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  121057. */
  121058. var RenderTextureWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  121059. {
  121060. var frame = src.frame;
  121061. var width = frame.width;
  121062. var height = frame.height;
  121063. var getTint = Utils.getTintAppendFloatAlpha;
  121064. this.pipeline.batchTexture(
  121065. src,
  121066. frame.glTexture,
  121067. width, height,
  121068. src.x, src.y,
  121069. width, height,
  121070. src.scaleX, src.scaleY,
  121071. src.rotation,
  121072. src.flipX, !src.flipY,
  121073. src.scrollFactorX, src.scrollFactorY,
  121074. src.displayOriginX, src.displayOriginY,
  121075. 0, 0, width, height,
  121076. getTint(src._tintTL, camera.alpha * src._alphaTL),
  121077. getTint(src._tintTR, camera.alpha * src._alphaTR),
  121078. getTint(src._tintBL, camera.alpha * src._alphaBL),
  121079. getTint(src._tintBR, camera.alpha * src._alphaBR),
  121080. (src._isTinted && src.tintFill),
  121081. 0, 0,
  121082. camera,
  121083. parentMatrix
  121084. );
  121085. // Force clear the current texture so that items next in the batch (like Graphics) don't try and use it
  121086. renderer.setBlankTexture(true);
  121087. };
  121088. module.exports = RenderTextureWebGLRenderer;
  121089. /***/ }),
  121090. /* 840 */
  121091. /***/ (function(module, exports, __webpack_require__) {
  121092. /**
  121093. * @author Richard Davey <rich@photonstorm.com>
  121094. * @copyright 2019 Photon Storm Ltd.
  121095. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121096. */
  121097. var renderWebGL = __webpack_require__(1);
  121098. var renderCanvas = __webpack_require__(1);
  121099. if (true)
  121100. {
  121101. renderWebGL = __webpack_require__(839);
  121102. }
  121103. if (true)
  121104. {
  121105. renderCanvas = __webpack_require__(838);
  121106. }
  121107. module.exports = {
  121108. renderWebGL: renderWebGL,
  121109. renderCanvas: renderCanvas
  121110. };
  121111. /***/ }),
  121112. /* 841 */
  121113. /***/ (function(module, exports, __webpack_require__) {
  121114. /**
  121115. * @author Richard Davey <rich@photonstorm.com>
  121116. * @copyright 2019 Photon Storm Ltd.
  121117. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121118. */
  121119. /**
  121120. * @namespace Phaser.GameObjects.Particles.Zones
  121121. */
  121122. module.exports = {
  121123. DeathZone: __webpack_require__(304),
  121124. EdgeZone: __webpack_require__(303),
  121125. RandomZone: __webpack_require__(301)
  121126. };
  121127. /***/ }),
  121128. /* 842 */
  121129. /***/ (function(module, exports) {
  121130. /**
  121131. * @author Richard Davey <rich@photonstorm.com>
  121132. * @copyright 2019 Photon Storm Ltd.
  121133. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121134. */
  121135. /**
  121136. * Renders this Game Object with the Canvas Renderer to the given Camera.
  121137. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  121138. * This method should not be called directly. It is a utility function of the Render module.
  121139. *
  121140. * @method Phaser.GameObjects.Particles.EmitterManager#renderCanvas
  121141. * @since 3.0.0
  121142. * @private
  121143. *
  121144. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  121145. * @param {Phaser.GameObjects.Particles.ParticleEmitterManager} emitterManager - The Game Object being rendered in this call.
  121146. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  121147. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  121148. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  121149. */
  121150. var ParticleManagerCanvasRenderer = function (renderer, emitterManager, interpolationPercentage, camera, parentMatrix)
  121151. {
  121152. var emitters = emitterManager.emitters.list;
  121153. var emittersLength = emitters.length;
  121154. if (emittersLength === 0)
  121155. {
  121156. return;
  121157. }
  121158. var camMatrix = renderer._tempMatrix1.copyFrom(camera.matrix);
  121159. var calcMatrix = renderer._tempMatrix2;
  121160. var particleMatrix = renderer._tempMatrix3;
  121161. var managerMatrix = renderer._tempMatrix4.applyITRS(emitterManager.x, emitterManager.y, emitterManager.rotation, emitterManager.scaleX, emitterManager.scaleY);
  121162. camMatrix.multiply(managerMatrix);
  121163. var roundPixels = camera.roundPixels;
  121164. var ctx = renderer.currentContext;
  121165. ctx.save();
  121166. for (var e = 0; e < emittersLength; e++)
  121167. {
  121168. var emitter = emitters[e];
  121169. var particles = emitter.alive;
  121170. var particleCount = particles.length;
  121171. if (!emitter.visible || particleCount === 0)
  121172. {
  121173. continue;
  121174. }
  121175. var scrollX = camera.scrollX * emitter.scrollFactorX;
  121176. var scrollY = camera.scrollY * emitter.scrollFactorY;
  121177. if (parentMatrix)
  121178. {
  121179. // Multiply the camera by the parent matrix
  121180. camMatrix.multiplyWithOffset(parentMatrix, -scrollX, -scrollY);
  121181. scrollX = 0;
  121182. scrollY = 0;
  121183. }
  121184. ctx.globalCompositeOperation = renderer.blendModes[emitter.blendMode];
  121185. for (var i = 0; i < particleCount; i++)
  121186. {
  121187. var particle = particles[i];
  121188. var alpha = particle.alpha * camera.alpha;
  121189. if (alpha <= 0)
  121190. {
  121191. continue;
  121192. }
  121193. var frame = particle.frame;
  121194. var cd = frame.canvasData;
  121195. var x = -(frame.halfWidth);
  121196. var y = -(frame.halfHeight);
  121197. particleMatrix.applyITRS(0, 0, particle.rotation, particle.scaleX, particle.scaleY);
  121198. particleMatrix.e = particle.x - scrollX;
  121199. particleMatrix.f = particle.y - scrollY;
  121200. camMatrix.multiply(particleMatrix, calcMatrix);
  121201. ctx.globalAlpha = alpha;
  121202. ctx.save();
  121203. calcMatrix.copyToContext(ctx);
  121204. if (roundPixels)
  121205. {
  121206. x = Math.round(x);
  121207. y = Math.round(y);
  121208. }
  121209. ctx.drawImage(frame.source.image, cd.x, cd.y, cd.width, cd.height, x, y, cd.width, cd.height);
  121210. ctx.restore();
  121211. }
  121212. }
  121213. ctx.restore();
  121214. };
  121215. module.exports = ParticleManagerCanvasRenderer;
  121216. /***/ }),
  121217. /* 843 */
  121218. /***/ (function(module, exports, __webpack_require__) {
  121219. /**
  121220. * @author Richard Davey <rich@photonstorm.com>
  121221. * @copyright 2019 Photon Storm Ltd.
  121222. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121223. */
  121224. var Utils = __webpack_require__(9);
  121225. /**
  121226. * Renders this Game Object with the WebGL Renderer to the given Camera.
  121227. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  121228. * This method should not be called directly. It is a utility function of the Render module.
  121229. *
  121230. * @method Phaser.GameObjects.Particles.EmitterManager#renderWebGL
  121231. * @since 3.0.0
  121232. * @private
  121233. *
  121234. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  121235. * @param {Phaser.GameObjects.Particles.ParticleEmitterManager} emitterManager - The Game Object being rendered in this call.
  121236. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  121237. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  121238. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  121239. */
  121240. var ParticleManagerWebGLRenderer = function (renderer, emitterManager, interpolationPercentage, camera, parentMatrix)
  121241. {
  121242. var emitters = emitterManager.emitters.list;
  121243. var emittersLength = emitters.length;
  121244. if (emittersLength === 0)
  121245. {
  121246. return;
  121247. }
  121248. var pipeline = this.pipeline;
  121249. var camMatrix = pipeline._tempMatrix1.copyFrom(camera.matrix);
  121250. var calcMatrix = pipeline._tempMatrix2;
  121251. var particleMatrix = pipeline._tempMatrix3;
  121252. var managerMatrix = pipeline._tempMatrix4.applyITRS(emitterManager.x, emitterManager.y, emitterManager.rotation, emitterManager.scaleX, emitterManager.scaleY);
  121253. camMatrix.multiply(managerMatrix);
  121254. renderer.setPipeline(pipeline);
  121255. var roundPixels = camera.roundPixels;
  121256. var texture = emitterManager.defaultFrame.glTexture;
  121257. var getTint = Utils.getTintAppendFloatAlphaAndSwap;
  121258. pipeline.setTexture2D(texture, 0);
  121259. for (var e = 0; e < emittersLength; e++)
  121260. {
  121261. var emitter = emitters[e];
  121262. var particles = emitter.alive;
  121263. var particleCount = particles.length;
  121264. if (!emitter.visible || particleCount === 0)
  121265. {
  121266. continue;
  121267. }
  121268. var scrollX = camera.scrollX * emitter.scrollFactorX;
  121269. var scrollY = camera.scrollY * emitter.scrollFactorY;
  121270. if (parentMatrix)
  121271. {
  121272. // Multiply the camera by the parent matrix
  121273. camMatrix.multiplyWithOffset(parentMatrix, -scrollX, -scrollY);
  121274. scrollX = 0;
  121275. scrollY = 0;
  121276. }
  121277. if (renderer.setBlendMode(emitter.blendMode))
  121278. {
  121279. // Rebind the texture if we've flushed
  121280. pipeline.setTexture2D(texture, 0);
  121281. }
  121282. var tintEffect = 0;
  121283. for (var i = 0; i < particleCount; i++)
  121284. {
  121285. var particle = particles[i];
  121286. var alpha = particle.alpha * camera.alpha;
  121287. if (alpha <= 0)
  121288. {
  121289. continue;
  121290. }
  121291. var frame = particle.frame;
  121292. var x = -(frame.halfWidth);
  121293. var y = -(frame.halfHeight);
  121294. var xw = x + frame.width;
  121295. var yh = y + frame.height;
  121296. particleMatrix.applyITRS(0, 0, particle.rotation, particle.scaleX, particle.scaleY);
  121297. particleMatrix.e = particle.x - scrollX;
  121298. particleMatrix.f = particle.y - scrollY;
  121299. camMatrix.multiply(particleMatrix, calcMatrix);
  121300. var tx0 = calcMatrix.getX(x, y);
  121301. var ty0 = calcMatrix.getY(x, y);
  121302. var tx1 = calcMatrix.getX(x, yh);
  121303. var ty1 = calcMatrix.getY(x, yh);
  121304. var tx2 = calcMatrix.getX(xw, yh);
  121305. var ty2 = calcMatrix.getY(xw, yh);
  121306. var tx3 = calcMatrix.getX(xw, y);
  121307. var ty3 = calcMatrix.getY(xw, y);
  121308. if (roundPixels)
  121309. {
  121310. tx0 = Math.round(tx0);
  121311. ty0 = Math.round(ty0);
  121312. tx1 = Math.round(tx1);
  121313. ty1 = Math.round(ty1);
  121314. tx2 = Math.round(tx2);
  121315. ty2 = Math.round(ty2);
  121316. tx3 = Math.round(tx3);
  121317. ty3 = Math.round(ty3);
  121318. }
  121319. var tint = getTint(particle.tint, alpha);
  121320. pipeline.batchQuad(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, frame.u0, frame.v0, frame.u1, frame.v1, tint, tint, tint, tint, tintEffect, texture, 0);
  121321. }
  121322. }
  121323. };
  121324. module.exports = ParticleManagerWebGLRenderer;
  121325. /***/ }),
  121326. /* 844 */
  121327. /***/ (function(module, exports, __webpack_require__) {
  121328. /**
  121329. * @author Richard Davey <rich@photonstorm.com>
  121330. * @copyright 2019 Photon Storm Ltd.
  121331. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121332. */
  121333. var renderWebGL = __webpack_require__(1);
  121334. var renderCanvas = __webpack_require__(1);
  121335. if (true)
  121336. {
  121337. renderWebGL = __webpack_require__(843);
  121338. }
  121339. if (true)
  121340. {
  121341. renderCanvas = __webpack_require__(842);
  121342. }
  121343. module.exports = {
  121344. renderWebGL: renderWebGL,
  121345. renderCanvas: renderCanvas
  121346. };
  121347. /***/ }),
  121348. /* 845 */
  121349. /***/ (function(module, exports, __webpack_require__) {
  121350. /**
  121351. * @author Richard Davey <rich@photonstorm.com>
  121352. * @copyright 2019 Photon Storm Ltd.
  121353. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121354. */
  121355. var Class = __webpack_require__(0);
  121356. var FloatBetween = __webpack_require__(374);
  121357. var GetEaseFunction = __webpack_require__(92);
  121358. var GetFastValue = __webpack_require__(2);
  121359. var Wrap = __webpack_require__(57);
  121360. /**
  121361. * The returned value sets what the property will be at the START of the particle's life, on emit.
  121362. * @callback EmitterOpOnEmitCallback
  121363. *
  121364. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  121365. * @param {string} key - The name of the property.
  121366. * @param {number} value - The current value of the property.
  121367. *
  121368. * @return {number} The new value of the property.
  121369. */
  121370. /**
  121371. * The returned value updates the property for the duration of the particle's life.
  121372. * @callback EmitterOpOnUpdateCallback
  121373. *
  121374. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  121375. * @param {string} key - The name of the property.
  121376. * @param {number} t - The normalized lifetime of the particle, between 0 (start) and 1 (end).
  121377. * @param {number} value - The current value of the property.
  121378. *
  121379. * @return {number} The new value of the property.
  121380. */
  121381. /**
  121382. * Defines an operation yielding a random value within a range.
  121383. * @typedef {object} EmitterOpRandomConfig
  121384. *
  121385. * @property {number[]} random - The minimum and maximum values, as [min, max].
  121386. */
  121387. /**
  121388. * Defines an operation yielding a random value within a range.
  121389. * @typedef {object} EmitterOpRandomMinMaxConfig
  121390. *
  121391. * @property {number} min - The minimum value.
  121392. * @property {number} max - The maximum value.
  121393. */
  121394. /**
  121395. * Defines an operation yielding a random value within a range.
  121396. * @typedef {object} EmitterOpRandomStartEndConfig
  121397. *
  121398. * @property {number} start - The starting value.
  121399. * @property {number} end - The ending value.
  121400. * @property {boolean} random - If false, this becomes {@link EmitterOpEaseConfig}.
  121401. */
  121402. /**
  121403. * Defines an operation yielding a value incremented continuously across a range.
  121404. * @typedef {object} EmitterOpEaseConfig
  121405. *
  121406. * @property {number} start - The starting value.
  121407. * @property {number} end - The ending value.
  121408. * @property {string} [ease='Linear'] - The name of the easing function.
  121409. */
  121410. /**
  121411. * Defines an operation yielding a value incremented by steps across a range.
  121412. * @typedef {object} EmitterOpSteppedConfig
  121413. *
  121414. * @property {number} start - The starting value.
  121415. * @property {number} end - The ending value.
  121416. * @property {number} steps - The number of steps between start and end.
  121417. */
  121418. /**
  121419. * @typedef {object} EmitterOpCustomEmitConfig
  121420. *
  121421. * @property {EmitterOpOnEmitCallback} onEmit - A callback that is invoked each time the emitter emits a particle.
  121422. */
  121423. /**
  121424. * @typedef {object} EmitterOpCustomUpdateConfig
  121425. *
  121426. * @property {EmitterOpOnEmitCallback} [onEmit] - A callback that is invoked each time the emitter emits a particle.
  121427. * @property {EmitterOpOnUpdateCallback} onUpdate - A callback that is invoked each time the emitter updates.
  121428. */
  121429. /**
  121430. * @classdesc
  121431. * A Particle Emitter property.
  121432. *
  121433. * Facilitates changing Particle properties as they are emitted and throughout their lifetime.
  121434. *
  121435. * @class EmitterOp
  121436. * @memberof Phaser.GameObjects.Particles
  121437. * @constructor
  121438. * @since 3.0.0
  121439. *
  121440. * @param {ParticleEmitterConfig} config - Settings for the Particle Emitter that owns this property.
  121441. * @param {string} key - The name of the property.
  121442. * @param {number} defaultValue - The default value of the property.
  121443. * @param {boolean} [emitOnly=false] - Whether the property can only be modified when a Particle is emitted.
  121444. */
  121445. var EmitterOp = new Class({
  121446. initialize:
  121447. function EmitterOp (config, key, defaultValue, emitOnly)
  121448. {
  121449. if (emitOnly === undefined)
  121450. {
  121451. emitOnly = false;
  121452. }
  121453. /**
  121454. * The name of this property.
  121455. *
  121456. * @name Phaser.GameObjects.Particles.EmitterOp#propertyKey
  121457. * @type {string}
  121458. * @since 3.0.0
  121459. */
  121460. this.propertyKey = key;
  121461. /**
  121462. * The value of this property.
  121463. *
  121464. * @name Phaser.GameObjects.Particles.EmitterOp#propertyValue
  121465. * @type {number}
  121466. * @since 3.0.0
  121467. */
  121468. this.propertyValue = defaultValue;
  121469. /**
  121470. * The default value of this property.
  121471. *
  121472. * @name Phaser.GameObjects.Particles.EmitterOp#defaultValue
  121473. * @type {number}
  121474. * @since 3.0.0
  121475. */
  121476. this.defaultValue = defaultValue;
  121477. /**
  121478. * The number of steps for stepped easing between {@link Phaser.GameObjects.Particles.EmitterOp#start} and
  121479. * {@link Phaser.GameObjects.Particles.EmitterOp#end} values, per emit.
  121480. *
  121481. * @name Phaser.GameObjects.Particles.EmitterOp#steps
  121482. * @type {number}
  121483. * @default 0
  121484. * @since 3.0.0
  121485. */
  121486. this.steps = 0;
  121487. /**
  121488. * The step counter for stepped easing, per emit.
  121489. *
  121490. * @name Phaser.GameObjects.Particles.EmitterOp#counter
  121491. * @type {number}
  121492. * @default 0
  121493. * @since 3.0.0
  121494. */
  121495. this.counter = 0;
  121496. /**
  121497. * The start value for this property to ease between.
  121498. *
  121499. * @name Phaser.GameObjects.Particles.EmitterOp#start
  121500. * @type {number}
  121501. * @default 0
  121502. * @since 3.0.0
  121503. */
  121504. this.start = 0;
  121505. /**
  121506. * The end value for this property to ease between.
  121507. *
  121508. * @name Phaser.GameObjects.Particles.EmitterOp#end
  121509. * @type {number}
  121510. * @default 0
  121511. * @since 3.0.0
  121512. */
  121513. this.end = 0;
  121514. /**
  121515. * The easing function to use for updating this property.
  121516. *
  121517. * @name Phaser.GameObjects.Particles.EmitterOp#ease
  121518. * @type {?function}
  121519. * @since 3.0.0
  121520. */
  121521. this.ease;
  121522. /**
  121523. * Whether this property can only be modified when a Particle is emitted.
  121524. *
  121525. * Set to `true` to allow only {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} callbacks to be set and
  121526. * affect this property.
  121527. *
  121528. * Set to `false` to allow both {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} and
  121529. * {@link Phaser.GameObjects.Particles.EmitterOp#onUpdate} callbacks to be set and affect this property.
  121530. *
  121531. * @name Phaser.GameObjects.Particles.EmitterOp#emitOnly
  121532. * @type {boolean}
  121533. * @since 3.0.0
  121534. */
  121535. this.emitOnly = emitOnly;
  121536. /**
  121537. * The callback to run for Particles when they are emitted from the Particle Emitter.
  121538. *
  121539. * @name Phaser.GameObjects.Particles.EmitterOp#onEmit
  121540. * @type {EmitterOpOnEmitCallback}
  121541. * @since 3.0.0
  121542. */
  121543. this.onEmit = this.defaultEmit;
  121544. /**
  121545. * The callback to run for Particles when they are updated.
  121546. *
  121547. * @name Phaser.GameObjects.Particles.EmitterOp#onUpdate
  121548. * @type {EmitterOpOnUpdateCallback}
  121549. * @since 3.0.0
  121550. */
  121551. this.onUpdate = this.defaultUpdate;
  121552. this.loadConfig(config);
  121553. },
  121554. /**
  121555. * Load the property from a Particle Emitter configuration object.
  121556. *
  121557. * Optionally accepts a new property key to use, replacing the current one.
  121558. *
  121559. * @method Phaser.GameObjects.Particles.EmitterOp#loadConfig
  121560. * @since 3.0.0
  121561. *
  121562. * @param {ParticleEmitterConfig} [config] - Settings for the Particle Emitter that owns this property.
  121563. * @param {string} [newKey] - The new key to use for this property, if any.
  121564. */
  121565. loadConfig: function (config, newKey)
  121566. {
  121567. if (config === undefined)
  121568. {
  121569. config = {};
  121570. }
  121571. if (newKey)
  121572. {
  121573. this.propertyKey = newKey;
  121574. }
  121575. this.propertyValue = GetFastValue(
  121576. config,
  121577. this.propertyKey,
  121578. this.defaultValue
  121579. );
  121580. this.setMethods();
  121581. if (this.emitOnly)
  121582. {
  121583. // Reset it back again
  121584. this.onUpdate = this.defaultUpdate;
  121585. }
  121586. },
  121587. /**
  121588. * Build a JSON representation of this Particle Emitter property.
  121589. *
  121590. * @method Phaser.GameObjects.Particles.EmitterOp#toJSON
  121591. * @since 3.0.0
  121592. *
  121593. * @return {object} A JSON representation of this Particle Emitter property.
  121594. */
  121595. toJSON: function ()
  121596. {
  121597. return this.propertyValue;
  121598. },
  121599. /**
  121600. * Change the current value of the property and update its callback methods.
  121601. *
  121602. * @method Phaser.GameObjects.Particles.EmitterOp#onChange
  121603. * @since 3.0.0
  121604. *
  121605. * @param {number} value - The value of the property.
  121606. *
  121607. * @return {Phaser.GameObjects.Particles.EmitterOp} This Emitter Op object.
  121608. */
  121609. onChange: function (value)
  121610. {
  121611. this.propertyValue = value;
  121612. return this.setMethods();
  121613. },
  121614. /**
  121615. * Update the {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} and
  121616. * {@link Phaser.GameObjects.Particles.EmitterOp#onUpdate} callbacks based on the type of the current
  121617. * {@link Phaser.GameObjects.Particles.EmitterOp#propertyValue}.
  121618. *
  121619. * @method Phaser.GameObjects.Particles.EmitterOp#setMethods
  121620. * @since 3.0.0
  121621. *
  121622. * @return {Phaser.GameObjects.Particles.EmitterOp} This Emitter Op object.
  121623. */
  121624. setMethods: function ()
  121625. {
  121626. var value = this.propertyValue;
  121627. var t = typeof value;
  121628. if (t === 'number')
  121629. {
  121630. // Explicit static value:
  121631. // x: 400
  121632. this.onEmit = this.staticValueEmit;
  121633. this.onUpdate = this.staticValueUpdate; // How?
  121634. }
  121635. else if (Array.isArray(value))
  121636. {
  121637. // Picks a random element from the array:
  121638. // x: [ 100, 200, 300, 400 ]
  121639. this.onEmit = this.randomStaticValueEmit;
  121640. }
  121641. else if (t === 'function')
  121642. {
  121643. // The same as setting just the onUpdate function and no onEmit (unless this op is an emitOnly one)
  121644. // Custom callback, must return a value:
  121645. /*
  121646. x: function (particle, key, t, value)
  121647. {
  121648. return value + 50;
  121649. }
  121650. */
  121651. if (this.emitOnly)
  121652. {
  121653. this.onEmit = value;
  121654. }
  121655. else
  121656. {
  121657. this.onUpdate = value;
  121658. }
  121659. }
  121660. else if (t === 'object' && (this.has(value, 'random') || this.hasBoth(value, 'start', 'end') || this.hasBoth(value, 'min', 'max')))
  121661. {
  121662. this.start = this.has(value, 'start') ? value.start : value.min;
  121663. this.end = this.has(value, 'end') ? value.end : value.max;
  121664. var isRandom = (this.hasBoth(value, 'min', 'max') || this.has(value, 'random'));
  121665. // A random starting value (using 'min | max' instead of 'start | end' automatically implies a random value)
  121666. // x: { start: 100, end: 400, random: true } OR { min: 100, max: 400 } OR { random: [ 100, 400 ] }
  121667. if (isRandom)
  121668. {
  121669. var rnd = value.random;
  121670. // x: { random: [ 100, 400 ] } = the same as doing: x: { start: 100, end: 400, random: true }
  121671. if (Array.isArray(rnd))
  121672. {
  121673. this.start = rnd[0];
  121674. this.end = rnd[1];
  121675. }
  121676. this.onEmit = this.randomRangedValueEmit;
  121677. }
  121678. if (this.has(value, 'steps'))
  121679. {
  121680. // A stepped (per emit) range
  121681. // x: { start: 100, end: 400, steps: 64 }
  121682. // Increments a value stored in the emitter
  121683. this.steps = value.steps;
  121684. this.counter = this.start;
  121685. this.onEmit = this.steppedEmit;
  121686. }
  121687. else
  121688. {
  121689. // An eased range (defaults to Linear if not specified)
  121690. // x: { start: 100, end: 400, [ ease: 'Linear' ] }
  121691. var easeType = this.has(value, 'ease') ? value.ease : 'Linear';
  121692. this.ease = GetEaseFunction(easeType);
  121693. if (!isRandom)
  121694. {
  121695. this.onEmit = this.easedValueEmit;
  121696. }
  121697. // BUG: alpha, rotate, scaleX, scaleY, or tint are eased here if {min, max} is given.
  121698. // Probably this branch should exclude isRandom entirely.
  121699. this.onUpdate = this.easeValueUpdate;
  121700. }
  121701. }
  121702. else if (t === 'object' && this.hasEither(value, 'onEmit', 'onUpdate'))
  121703. {
  121704. // Custom onEmit and onUpdate callbacks
  121705. /*
  121706. x: {
  121707. // Called at the start of the particles life, when it is being created
  121708. onEmit: function (particle, key, t, value)
  121709. {
  121710. return value;
  121711. },
  121712. // Called during the particles life on each update
  121713. onUpdate: function (particle, key, t, value)
  121714. {
  121715. return value;
  121716. }
  121717. }
  121718. */
  121719. if (this.has(value, 'onEmit'))
  121720. {
  121721. this.onEmit = value.onEmit;
  121722. }
  121723. if (this.has(value, 'onUpdate'))
  121724. {
  121725. this.onUpdate = value.onUpdate;
  121726. }
  121727. }
  121728. return this;
  121729. },
  121730. /**
  121731. * Check whether an object has the given property.
  121732. *
  121733. * @method Phaser.GameObjects.Particles.EmitterOp#has
  121734. * @since 3.0.0
  121735. *
  121736. * @param {object} object - The object to check.
  121737. * @param {string} key - The key of the property to look for in the object.
  121738. *
  121739. * @return {boolean} `true` if the property exists in the object, `false` otherwise.
  121740. */
  121741. has: function (object, key)
  121742. {
  121743. return object.hasOwnProperty(key);
  121744. },
  121745. /**
  121746. * Check whether an object has both of the given properties.
  121747. *
  121748. * @method Phaser.GameObjects.Particles.EmitterOp#hasBoth
  121749. * @since 3.0.0
  121750. *
  121751. * @param {object} object - The object to check.
  121752. * @param {string} key1 - The key of the first property to check the object for.
  121753. * @param {string} key2 - The key of the second property to check the object for.
  121754. *
  121755. * @return {boolean} `true` if both properties exist in the object, `false` otherwise.
  121756. */
  121757. hasBoth: function (object, key1, key2)
  121758. {
  121759. return object.hasOwnProperty(key1) && object.hasOwnProperty(key2);
  121760. },
  121761. /**
  121762. * Check whether an object has at least one of the given properties.
  121763. *
  121764. * @method Phaser.GameObjects.Particles.EmitterOp#hasEither
  121765. * @since 3.0.0
  121766. *
  121767. * @param {object} object - The object to check.
  121768. * @param {string} key1 - The key of the first property to check the object for.
  121769. * @param {string} key2 - The key of the second property to check the object for.
  121770. *
  121771. * @return {boolean} `true` if at least one of the properties exists in the object, `false` if neither exist.
  121772. */
  121773. hasEither: function (object, key1, key2)
  121774. {
  121775. return object.hasOwnProperty(key1) || object.hasOwnProperty(key2);
  121776. },
  121777. /**
  121778. * The returned value sets what the property will be at the START of the particles life, on emit.
  121779. *
  121780. * @method Phaser.GameObjects.Particles.EmitterOp#defaultEmit
  121781. * @since 3.0.0
  121782. *
  121783. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  121784. * @param {string} key - The name of the property.
  121785. * @param {number} [value] - The current value of the property.
  121786. *
  121787. * @return {number} The new value of hte property.
  121788. */
  121789. defaultEmit: function (particle, key, value)
  121790. {
  121791. return value;
  121792. },
  121793. /**
  121794. * The returned value updates the property for the duration of the particles life.
  121795. *
  121796. * @method Phaser.GameObjects.Particles.EmitterOp#defaultUpdate
  121797. * @since 3.0.0
  121798. *
  121799. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  121800. * @param {string} key - The name of the property.
  121801. * @param {number} t - The T value (between 0 and 1)
  121802. * @param {number} value - The current value of the property.
  121803. *
  121804. * @return {number} The new value of the property.
  121805. */
  121806. defaultUpdate: function (particle, key, t, value)
  121807. {
  121808. return value;
  121809. },
  121810. /**
  121811. * An `onEmit` callback that returns the current value of the property.
  121812. *
  121813. * @method Phaser.GameObjects.Particles.EmitterOp#staticValueEmit
  121814. * @since 3.0.0
  121815. *
  121816. * @return {number} The current value of the property.
  121817. */
  121818. staticValueEmit: function ()
  121819. {
  121820. return this.propertyValue;
  121821. },
  121822. /**
  121823. * An `onUpdate` callback that returns the current value of the property.
  121824. *
  121825. * @method Phaser.GameObjects.Particles.EmitterOp#staticValueUpdate
  121826. * @since 3.0.0
  121827. *
  121828. * @return {number} The current value of the property.
  121829. */
  121830. staticValueUpdate: function ()
  121831. {
  121832. return this.propertyValue;
  121833. },
  121834. /**
  121835. * An `onEmit` callback that returns a random value from the current value array.
  121836. *
  121837. * @method Phaser.GameObjects.Particles.EmitterOp#randomStaticValueEmit
  121838. * @since 3.0.0
  121839. *
  121840. * @return {number} The new value of the property.
  121841. */
  121842. randomStaticValueEmit: function ()
  121843. {
  121844. var randomIndex = Math.floor(Math.random() * this.propertyValue.length);
  121845. return this.propertyValue[randomIndex];
  121846. },
  121847. /**
  121848. * An `onEmit` callback that returns a value between the {@link Phaser.GameObjects.Particles.EmitterOp#start} and
  121849. * {@link Phaser.GameObjects.Particles.EmitterOp#end} range.
  121850. *
  121851. * @method Phaser.GameObjects.Particles.EmitterOp#randomRangedValueEmit
  121852. * @since 3.0.0
  121853. *
  121854. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  121855. * @param {string} key - The key of the property.
  121856. *
  121857. * @return {number} The new value of the property.
  121858. */
  121859. randomRangedValueEmit: function (particle, key)
  121860. {
  121861. var value = FloatBetween(this.start, this.end);
  121862. if (particle && particle.data[key])
  121863. {
  121864. particle.data[key].min = value;
  121865. }
  121866. return value;
  121867. },
  121868. /**
  121869. * An `onEmit` callback that returns a stepped value between the
  121870. * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end}
  121871. * range.
  121872. *
  121873. * @method Phaser.GameObjects.Particles.EmitterOp#steppedEmit
  121874. * @since 3.0.0
  121875. *
  121876. * @return {number} The new value of the property.
  121877. */
  121878. steppedEmit: function ()
  121879. {
  121880. var current = this.counter;
  121881. var next = this.counter + (this.end - this.start) / this.steps;
  121882. this.counter = Wrap(next, this.start, this.end);
  121883. return current;
  121884. },
  121885. /**
  121886. * An `onEmit` callback that returns an eased value between the
  121887. * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end}
  121888. * range.
  121889. *
  121890. * @method Phaser.GameObjects.Particles.EmitterOp#easedValueEmit
  121891. * @since 3.0.0
  121892. *
  121893. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  121894. * @param {string} key - The name of the property.
  121895. *
  121896. * @return {number} The new value of the property.
  121897. */
  121898. easedValueEmit: function (particle, key)
  121899. {
  121900. if (particle && particle.data[key])
  121901. {
  121902. var data = particle.data[key];
  121903. data.min = this.start;
  121904. data.max = this.end;
  121905. }
  121906. return this.start;
  121907. },
  121908. /**
  121909. * An `onUpdate` callback that returns an eased value between the
  121910. * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end}
  121911. * range.
  121912. *
  121913. * @method Phaser.GameObjects.Particles.EmitterOp#easeValueUpdate
  121914. * @since 3.0.0
  121915. *
  121916. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  121917. * @param {string} key - The name of the property.
  121918. * @param {number} t - The T value (between 0 and 1)
  121919. *
  121920. * @return {number} The new value of the property.
  121921. */
  121922. easeValueUpdate: function (particle, key, t)
  121923. {
  121924. var data = particle.data[key];
  121925. return (data.max - data.min) * this.ease(t) + data.min;
  121926. }
  121927. });
  121928. module.exports = EmitterOp;
  121929. /***/ }),
  121930. /* 846 */
  121931. /***/ (function(module, exports, __webpack_require__) {
  121932. /**
  121933. * @author Richard Davey <rich@photonstorm.com>
  121934. * @copyright 2019 Photon Storm Ltd.
  121935. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121936. */
  121937. /**
  121938. * @namespace Phaser.GameObjects.Particles
  121939. */
  121940. module.exports = {
  121941. GravityWell: __webpack_require__(307),
  121942. Particle: __webpack_require__(306),
  121943. ParticleEmitter: __webpack_require__(305),
  121944. ParticleEmitterManager: __webpack_require__(165),
  121945. Zones: __webpack_require__(841)
  121946. };
  121947. /***/ }),
  121948. /* 847 */
  121949. /***/ (function(module, exports) {
  121950. /**
  121951. * @author Richard Davey <rich@photonstorm.com>
  121952. * @copyright 2019 Photon Storm Ltd.
  121953. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121954. */
  121955. /**
  121956. * Renders this Game Object with the Canvas Renderer to the given Camera.
  121957. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  121958. * This method should not be called directly. It is a utility function of the Render module.
  121959. *
  121960. * @method Phaser.GameObjects.Image#renderCanvas
  121961. * @since 3.0.0
  121962. * @private
  121963. *
  121964. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  121965. * @param {Phaser.GameObjects.Image} src - The Game Object being rendered in this call.
  121966. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  121967. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  121968. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  121969. */
  121970. var ImageCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  121971. {
  121972. renderer.batchSprite(src, src.frame, camera, parentMatrix);
  121973. };
  121974. module.exports = ImageCanvasRenderer;
  121975. /***/ }),
  121976. /* 848 */
  121977. /***/ (function(module, exports) {
  121978. /**
  121979. * @author Richard Davey <rich@photonstorm.com>
  121980. * @copyright 2019 Photon Storm Ltd.
  121981. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121982. */
  121983. /**
  121984. * Renders this Game Object with the WebGL Renderer to the given Camera.
  121985. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  121986. * This method should not be called directly. It is a utility function of the Render module.
  121987. *
  121988. * @method Phaser.GameObjects.Image#renderWebGL
  121989. * @since 3.0.0
  121990. * @private
  121991. *
  121992. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  121993. * @param {Phaser.GameObjects.Image} src - The Game Object being rendered in this call.
  121994. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  121995. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  121996. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  121997. */
  121998. var ImageWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  121999. {
  122000. this.pipeline.batchSprite(src, camera, parentMatrix);
  122001. };
  122002. module.exports = ImageWebGLRenderer;
  122003. /***/ }),
  122004. /* 849 */
  122005. /***/ (function(module, exports, __webpack_require__) {
  122006. /**
  122007. * @author Richard Davey <rich@photonstorm.com>
  122008. * @copyright 2019 Photon Storm Ltd.
  122009. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122010. */
  122011. var renderWebGL = __webpack_require__(1);
  122012. var renderCanvas = __webpack_require__(1);
  122013. if (true)
  122014. {
  122015. renderWebGL = __webpack_require__(848);
  122016. }
  122017. if (true)
  122018. {
  122019. renderCanvas = __webpack_require__(847);
  122020. }
  122021. module.exports = {
  122022. renderWebGL: renderWebGL,
  122023. renderCanvas: renderCanvas
  122024. };
  122025. /***/ }),
  122026. /* 850 */
  122027. /***/ (function(module, exports) {
  122028. /**
  122029. * @author Richard Davey <rich@photonstorm.com>
  122030. * @copyright 2019 Photon Storm Ltd.
  122031. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122032. */
  122033. /**
  122034. * Renders this Game Object with the Canvas Renderer to the given Camera.
  122035. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  122036. * This method should not be called directly. It is a utility function of the Render module.
  122037. *
  122038. * @method Phaser.GameObjects.Sprite#renderCanvas
  122039. * @since 3.0.0
  122040. * @private
  122041. *
  122042. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  122043. * @param {Phaser.GameObjects.Sprite} src - The Game Object being rendered in this call.
  122044. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  122045. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  122046. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  122047. */
  122048. var SpriteCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  122049. {
  122050. renderer.batchSprite(src, src.frame, camera, parentMatrix);
  122051. };
  122052. module.exports = SpriteCanvasRenderer;
  122053. /***/ }),
  122054. /* 851 */
  122055. /***/ (function(module, exports) {
  122056. /**
  122057. * @author Richard Davey <rich@photonstorm.com>
  122058. * @copyright 2019 Photon Storm Ltd.
  122059. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122060. */
  122061. /**
  122062. * Renders this Game Object with the WebGL Renderer to the given Camera.
  122063. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  122064. * This method should not be called directly. It is a utility function of the Render module.
  122065. *
  122066. * @method Phaser.GameObjects.Sprite#renderWebGL
  122067. * @since 3.0.0
  122068. * @private
  122069. *
  122070. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  122071. * @param {Phaser.GameObjects.Sprite} src - The Game Object being rendered in this call.
  122072. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  122073. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  122074. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  122075. */
  122076. var SpriteWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  122077. {
  122078. this.pipeline.batchSprite(src, camera, parentMatrix);
  122079. };
  122080. module.exports = SpriteWebGLRenderer;
  122081. /***/ }),
  122082. /* 852 */
  122083. /***/ (function(module, exports, __webpack_require__) {
  122084. /**
  122085. * @author Richard Davey <rich@photonstorm.com>
  122086. * @copyright 2019 Photon Storm Ltd.
  122087. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122088. */
  122089. var renderWebGL = __webpack_require__(1);
  122090. var renderCanvas = __webpack_require__(1);
  122091. if (true)
  122092. {
  122093. renderWebGL = __webpack_require__(851);
  122094. }
  122095. if (true)
  122096. {
  122097. renderCanvas = __webpack_require__(850);
  122098. }
  122099. module.exports = {
  122100. renderWebGL: renderWebGL,
  122101. renderCanvas: renderCanvas
  122102. };
  122103. /***/ }),
  122104. /* 853 */
  122105. /***/ (function(module, exports, __webpack_require__) {
  122106. /**
  122107. * @author Richard Davey <rich@photonstorm.com>
  122108. * @copyright 2019 Photon Storm Ltd.
  122109. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122110. */
  122111. var Commands = __webpack_require__(167);
  122112. var Utils = __webpack_require__(9);
  122113. // TODO: Remove the use of this
  122114. var Point = function (x, y, width)
  122115. {
  122116. this.x = x;
  122117. this.y = y;
  122118. this.width = width;
  122119. };
  122120. // TODO: Remove the use of this
  122121. var Path = function (x, y, width)
  122122. {
  122123. this.points = [];
  122124. this.pointsLength = 1;
  122125. this.points[0] = new Point(x, y, width);
  122126. };
  122127. var matrixStack = [];
  122128. /**
  122129. * Renders this Game Object with the WebGL Renderer to the given Camera.
  122130. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  122131. * This method should not be called directly. It is a utility function of the Render module.
  122132. *
  122133. * @method Phaser.GameObjects.Graphics#renderWebGL
  122134. * @since 3.0.0
  122135. * @private
  122136. *
  122137. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  122138. * @param {Phaser.GameObjects.Graphics} src - The Game Object being rendered in this call.
  122139. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  122140. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  122141. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  122142. */
  122143. var GraphicsWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  122144. {
  122145. if (src.commandBuffer.length === 0)
  122146. {
  122147. return;
  122148. }
  122149. var pipeline = renderer.currentPipeline;
  122150. var camMatrix = pipeline._tempMatrix1;
  122151. var graphicsMatrix = pipeline._tempMatrix2;
  122152. var currentMatrix = pipeline._tempMatrix4;
  122153. renderer.setPipeline(pipeline);
  122154. currentMatrix.loadIdentity();
  122155. graphicsMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  122156. camMatrix.copyFrom(camera.matrix);
  122157. if (parentMatrix)
  122158. {
  122159. // Multiply the camera by the parent matrix
  122160. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  122161. // Undo the camera scroll
  122162. graphicsMatrix.e = src.x;
  122163. graphicsMatrix.f = src.y;
  122164. // Multiply by the Sprite matrix, store result in calcMatrix
  122165. camMatrix.multiply(graphicsMatrix);
  122166. }
  122167. else
  122168. {
  122169. graphicsMatrix.e -= camera.scrollX * src.scrollFactorX;
  122170. graphicsMatrix.f -= camera.scrollY * src.scrollFactorY;
  122171. // Multiply by the Sprite matrix, store result in calcMatrix
  122172. camMatrix.multiply(graphicsMatrix);
  122173. }
  122174. var commands = src.commandBuffer;
  122175. var alpha = camera.alpha * src.alpha;
  122176. var lineWidth = 1;
  122177. var fillTint = pipeline.fillTint;
  122178. var strokeTint = pipeline.strokeTint;
  122179. var tx = 0;
  122180. var ty = 0;
  122181. var ta = 0;
  122182. var iterStep = 0.01;
  122183. var PI2 = Math.PI * 2;
  122184. var cmd;
  122185. var path = [];
  122186. var pathIndex = 0;
  122187. var pathOpen = false;
  122188. var lastPath = null;
  122189. var getTint = Utils.getTintAppendFloatAlphaAndSwap;
  122190. var currentTexture = renderer.blankTexture.glTexture;
  122191. for (var cmdIndex = 0; cmdIndex < commands.length; cmdIndex++)
  122192. {
  122193. cmd = commands[cmdIndex];
  122194. switch (cmd)
  122195. {
  122196. case Commands.BEGIN_PATH:
  122197. path.length = 0;
  122198. lastPath = null;
  122199. pathOpen = true;
  122200. break;
  122201. case Commands.CLOSE_PATH:
  122202. pathOpen = false;
  122203. if (lastPath && lastPath.points.length)
  122204. {
  122205. lastPath.points.push(lastPath.points[0]);
  122206. }
  122207. break;
  122208. case Commands.FILL_PATH:
  122209. for (pathIndex = 0; pathIndex < path.length; pathIndex++)
  122210. {
  122211. pipeline.setTexture2D(currentTexture);
  122212. pipeline.batchFillPath(
  122213. path[pathIndex].points,
  122214. currentMatrix,
  122215. camMatrix
  122216. );
  122217. }
  122218. break;
  122219. case Commands.STROKE_PATH:
  122220. for (pathIndex = 0; pathIndex < path.length; pathIndex++)
  122221. {
  122222. pipeline.setTexture2D(currentTexture);
  122223. pipeline.batchStrokePath(
  122224. path[pathIndex].points,
  122225. lineWidth,
  122226. pathOpen,
  122227. currentMatrix,
  122228. camMatrix
  122229. );
  122230. }
  122231. break;
  122232. case Commands.LINE_STYLE:
  122233. lineWidth = commands[++cmdIndex];
  122234. var strokeColor = commands[++cmdIndex];
  122235. var strokeAlpha = commands[++cmdIndex] * alpha;
  122236. var strokeTintColor = getTint(strokeColor, strokeAlpha);
  122237. strokeTint.TL = strokeTintColor;
  122238. strokeTint.TR = strokeTintColor;
  122239. strokeTint.BL = strokeTintColor;
  122240. strokeTint.BR = strokeTintColor;
  122241. break;
  122242. case Commands.FILL_STYLE:
  122243. var fillColor = commands[++cmdIndex];
  122244. var fillAlpha = commands[++cmdIndex] * alpha;
  122245. var fillTintColor = getTint(fillColor, fillAlpha);
  122246. fillTint.TL = fillTintColor;
  122247. fillTint.TR = fillTintColor;
  122248. fillTint.BL = fillTintColor;
  122249. fillTint.BR = fillTintColor;
  122250. break;
  122251. case Commands.GRADIENT_FILL_STYLE:
  122252. var gradientFillAlpha = commands[++cmdIndex] * alpha;
  122253. fillTint.TL = getTint(commands[++cmdIndex], gradientFillAlpha);
  122254. fillTint.TR = getTint(commands[++cmdIndex], gradientFillAlpha);
  122255. fillTint.BL = getTint(commands[++cmdIndex], gradientFillAlpha);
  122256. fillTint.BR = getTint(commands[++cmdIndex], gradientFillAlpha);
  122257. break;
  122258. case Commands.GRADIENT_LINE_STYLE:
  122259. lineWidth = commands[++cmdIndex];
  122260. var gradientLineAlpha = commands[++cmdIndex] * alpha;
  122261. strokeTint.TL = getTint(commands[++cmdIndex], gradientLineAlpha);
  122262. strokeTint.TR = getTint(commands[++cmdIndex], gradientLineAlpha);
  122263. strokeTint.BL = getTint(commands[++cmdIndex], gradientLineAlpha);
  122264. strokeTint.BR = getTint(commands[++cmdIndex], gradientLineAlpha);
  122265. break;
  122266. case Commands.ARC:
  122267. var iteration = 0;
  122268. var x = commands[++cmdIndex];
  122269. var y = commands[++cmdIndex];
  122270. var radius = commands[++cmdIndex];
  122271. var startAngle = commands[++cmdIndex];
  122272. var endAngle = commands[++cmdIndex];
  122273. var anticlockwise = commands[++cmdIndex];
  122274. var overshoot = commands[++cmdIndex];
  122275. endAngle -= startAngle;
  122276. if (anticlockwise)
  122277. {
  122278. if (endAngle < -PI2)
  122279. {
  122280. endAngle = -PI2;
  122281. }
  122282. else if (endAngle > 0)
  122283. {
  122284. endAngle = -PI2 + endAngle % PI2;
  122285. }
  122286. }
  122287. else if (endAngle > PI2)
  122288. {
  122289. endAngle = PI2;
  122290. }
  122291. else if (endAngle < 0)
  122292. {
  122293. endAngle = PI2 + endAngle % PI2;
  122294. }
  122295. if (lastPath === null)
  122296. {
  122297. lastPath = new Path(x + Math.cos(startAngle) * radius, y + Math.sin(startAngle) * radius, lineWidth);
  122298. path.push(lastPath);
  122299. iteration += iterStep;
  122300. }
  122301. while (iteration < 1 + overshoot)
  122302. {
  122303. ta = endAngle * iteration + startAngle;
  122304. tx = x + Math.cos(ta) * radius;
  122305. ty = y + Math.sin(ta) * radius;
  122306. lastPath.points.push(new Point(tx, ty, lineWidth));
  122307. iteration += iterStep;
  122308. }
  122309. ta = endAngle + startAngle;
  122310. tx = x + Math.cos(ta) * radius;
  122311. ty = y + Math.sin(ta) * radius;
  122312. lastPath.points.push(new Point(tx, ty, lineWidth));
  122313. break;
  122314. case Commands.FILL_RECT:
  122315. pipeline.setTexture2D(currentTexture);
  122316. pipeline.batchFillRect(
  122317. commands[++cmdIndex],
  122318. commands[++cmdIndex],
  122319. commands[++cmdIndex],
  122320. commands[++cmdIndex],
  122321. currentMatrix,
  122322. camMatrix
  122323. );
  122324. break;
  122325. case Commands.FILL_TRIANGLE:
  122326. pipeline.setTexture2D(currentTexture);
  122327. pipeline.batchFillTriangle(
  122328. commands[++cmdIndex],
  122329. commands[++cmdIndex],
  122330. commands[++cmdIndex],
  122331. commands[++cmdIndex],
  122332. commands[++cmdIndex],
  122333. commands[++cmdIndex],
  122334. currentMatrix,
  122335. camMatrix
  122336. );
  122337. break;
  122338. case Commands.STROKE_TRIANGLE:
  122339. pipeline.setTexture2D(currentTexture);
  122340. pipeline.batchStrokeTriangle(
  122341. commands[++cmdIndex],
  122342. commands[++cmdIndex],
  122343. commands[++cmdIndex],
  122344. commands[++cmdIndex],
  122345. commands[++cmdIndex],
  122346. commands[++cmdIndex],
  122347. lineWidth,
  122348. currentMatrix,
  122349. camMatrix
  122350. );
  122351. break;
  122352. case Commands.LINE_TO:
  122353. if (lastPath !== null)
  122354. {
  122355. lastPath.points.push(new Point(commands[++cmdIndex], commands[++cmdIndex], lineWidth));
  122356. }
  122357. else
  122358. {
  122359. lastPath = new Path(commands[++cmdIndex], commands[++cmdIndex], lineWidth);
  122360. path.push(lastPath);
  122361. }
  122362. break;
  122363. case Commands.MOVE_TO:
  122364. lastPath = new Path(commands[++cmdIndex], commands[++cmdIndex], lineWidth);
  122365. path.push(lastPath);
  122366. break;
  122367. case Commands.SAVE:
  122368. matrixStack.push(currentMatrix.copyToArray());
  122369. break;
  122370. case Commands.RESTORE:
  122371. currentMatrix.copyFromArray(matrixStack.pop());
  122372. break;
  122373. case Commands.TRANSLATE:
  122374. x = commands[++cmdIndex];
  122375. y = commands[++cmdIndex];
  122376. currentMatrix.translate(x, y);
  122377. break;
  122378. case Commands.SCALE:
  122379. x = commands[++cmdIndex];
  122380. y = commands[++cmdIndex];
  122381. currentMatrix.scale(x, y);
  122382. break;
  122383. case Commands.ROTATE:
  122384. currentMatrix.rotate(commands[++cmdIndex]);
  122385. break;
  122386. case Commands.SET_TEXTURE:
  122387. var frame = commands[++cmdIndex];
  122388. var mode = commands[++cmdIndex];
  122389. pipeline.currentFrame = frame;
  122390. pipeline.setTexture2D(frame.glTexture, 0);
  122391. pipeline.tintEffect = mode;
  122392. currentTexture = frame.glTexture;
  122393. break;
  122394. case Commands.CLEAR_TEXTURE:
  122395. pipeline.currentFrame = renderer.blankTexture;
  122396. pipeline.tintEffect = 2;
  122397. currentTexture = renderer.blankTexture.glTexture;
  122398. break;
  122399. }
  122400. }
  122401. };
  122402. module.exports = GraphicsWebGLRenderer;
  122403. /***/ }),
  122404. /* 854 */
  122405. /***/ (function(module, exports, __webpack_require__) {
  122406. /**
  122407. * @author Richard Davey <rich@photonstorm.com>
  122408. * @copyright 2019 Photon Storm Ltd.
  122409. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122410. */
  122411. var renderWebGL = __webpack_require__(1);
  122412. var renderCanvas = __webpack_require__(1);
  122413. if (true)
  122414. {
  122415. renderWebGL = __webpack_require__(853);
  122416. // Needed for Graphics.generateTexture
  122417. renderCanvas = __webpack_require__(308);
  122418. }
  122419. if (true)
  122420. {
  122421. renderCanvas = __webpack_require__(308);
  122422. }
  122423. module.exports = {
  122424. renderWebGL: renderWebGL,
  122425. renderCanvas: renderCanvas
  122426. };
  122427. /***/ }),
  122428. /* 855 */
  122429. /***/ (function(module, exports) {
  122430. /***/ }),
  122431. /* 856 */
  122432. /***/ (function(module, exports) {
  122433. /**
  122434. * @author Richard Davey <rich@photonstorm.com>
  122435. * @copyright 2019 Photon Storm Ltd.
  122436. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122437. */
  122438. /**
  122439. * Renders this Game Object with the WebGL Renderer to the given Camera.
  122440. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  122441. * This method should not be called directly. It is a utility function of the Render module.
  122442. *
  122443. * @method Phaser.GameObjects.Extern#renderWebGL
  122444. * @since 3.16.0
  122445. * @private
  122446. *
  122447. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  122448. * @param {Phaser.GameObjects.Extern} src - The Game Object being rendered in this call.
  122449. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  122450. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  122451. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  122452. */
  122453. var ExternWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  122454. {
  122455. var pipeline = renderer.currentPipeline;
  122456. renderer.clearPipeline();
  122457. var camMatrix = renderer._tempMatrix1;
  122458. var spriteMatrix = renderer._tempMatrix2;
  122459. var calcMatrix = renderer._tempMatrix3;
  122460. spriteMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  122461. camMatrix.copyFrom(camera.matrix);
  122462. if (parentMatrix)
  122463. {
  122464. // Multiply the camera by the parent matrix
  122465. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  122466. // Undo the camera scroll
  122467. spriteMatrix.e = src.x;
  122468. spriteMatrix.f = src.y;
  122469. // Multiply by the Sprite matrix, store result in calcMatrix
  122470. camMatrix.multiply(spriteMatrix, calcMatrix);
  122471. }
  122472. else
  122473. {
  122474. spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
  122475. spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
  122476. // Multiply by the Sprite matrix, store result in calcMatrix
  122477. camMatrix.multiply(spriteMatrix, calcMatrix);
  122478. }
  122479. // Callback
  122480. src.render.call(src, renderer, camera, calcMatrix);
  122481. renderer.rebindPipeline(pipeline);
  122482. };
  122483. module.exports = ExternWebGLRenderer;
  122484. /***/ }),
  122485. /* 857 */
  122486. /***/ (function(module, exports, __webpack_require__) {
  122487. /**
  122488. * @author Richard Davey <rich@photonstorm.com>
  122489. * @copyright 2019 Photon Storm Ltd.
  122490. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122491. */
  122492. var renderWebGL = __webpack_require__(1);
  122493. var renderCanvas = __webpack_require__(1);
  122494. if (true)
  122495. {
  122496. renderWebGL = __webpack_require__(856);
  122497. }
  122498. if (true)
  122499. {
  122500. renderCanvas = __webpack_require__(855);
  122501. }
  122502. module.exports = {
  122503. renderWebGL: renderWebGL,
  122504. renderCanvas: renderCanvas
  122505. };
  122506. /***/ }),
  122507. /* 858 */
  122508. /***/ (function(module, exports, __webpack_require__) {
  122509. /**
  122510. * @author Richard Davey <rich@photonstorm.com>
  122511. * @copyright 2019 Photon Storm Ltd.
  122512. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122513. */
  122514. var SetTransform = __webpack_require__(25);
  122515. /**
  122516. * Renders this Game Object with the Canvas Renderer to the given Camera.
  122517. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  122518. * This method should not be called directly. It is a utility function of the Render module.
  122519. *
  122520. * @method Phaser.GameObjects.DynamicBitmapText#renderCanvas
  122521. * @since 3.0.0
  122522. * @private
  122523. *
  122524. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  122525. * @param {Phaser.GameObjects.DynamicBitmapText} src - The Game Object being rendered in this call.
  122526. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  122527. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  122528. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  122529. */
  122530. var DynamicBitmapTextCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  122531. {
  122532. var text = src.text;
  122533. var textLength = text.length;
  122534. var ctx = renderer.currentContext;
  122535. if (textLength === 0 || !SetTransform(renderer, ctx, src, camera, parentMatrix))
  122536. {
  122537. return;
  122538. }
  122539. var textureFrame = src.frame;
  122540. var displayCallback = src.displayCallback;
  122541. var callbackData = src.callbackData;
  122542. var cameraScrollX = camera.scrollX * src.scrollFactorX;
  122543. var cameraScrollY = camera.scrollY * src.scrollFactorY;
  122544. var chars = src.fontData.chars;
  122545. var lineHeight = src.fontData.lineHeight;
  122546. var xAdvance = 0;
  122547. var yAdvance = 0;
  122548. var indexCount = 0;
  122549. var charCode = 0;
  122550. var glyph = null;
  122551. var glyphX = 0;
  122552. var glyphY = 0;
  122553. var glyphW = 0;
  122554. var glyphH = 0;
  122555. var x = 0;
  122556. var y = 0;
  122557. var lastGlyph = null;
  122558. var lastCharCode = 0;
  122559. var image = src.frame.source.image;
  122560. var textureX = textureFrame.cutX;
  122561. var textureY = textureFrame.cutY;
  122562. var rotation = 0;
  122563. var scale = (src.fontSize / src.fontData.size);
  122564. if (src.cropWidth > 0 && src.cropHeight > 0)
  122565. {
  122566. ctx.beginPath();
  122567. ctx.rect(0, 0, src.cropWidth, src.cropHeight);
  122568. ctx.clip();
  122569. }
  122570. for (var index = 0; index < textLength; ++index)
  122571. {
  122572. // Reset the scale (in case the callback changed it)
  122573. scale = (src.fontSize / src.fontData.size);
  122574. rotation = 0;
  122575. charCode = text.charCodeAt(index);
  122576. if (charCode === 10)
  122577. {
  122578. xAdvance = 0;
  122579. indexCount = 0;
  122580. yAdvance += lineHeight;
  122581. lastGlyph = null;
  122582. continue;
  122583. }
  122584. glyph = chars[charCode];
  122585. if (!glyph)
  122586. {
  122587. continue;
  122588. }
  122589. glyphX = textureX + glyph.x;
  122590. glyphY = textureY + glyph.y;
  122591. glyphW = glyph.width;
  122592. glyphH = glyph.height;
  122593. x = (indexCount + glyph.xOffset + xAdvance) - src.scrollX;
  122594. y = (glyph.yOffset + yAdvance) - src.scrollY;
  122595. // This could be optimized so that it doesn't even bother drawing it if the x/y is out of range
  122596. if (lastGlyph !== null)
  122597. {
  122598. var kerningOffset = glyph.kerning[lastCharCode];
  122599. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  122600. }
  122601. if (displayCallback)
  122602. {
  122603. callbackData.index = index;
  122604. callbackData.charCode = charCode;
  122605. callbackData.x = x;
  122606. callbackData.y = y;
  122607. callbackData.scale = scale;
  122608. callbackData.rotation = rotation;
  122609. callbackData.data = glyph.data;
  122610. var output = displayCallback(callbackData);
  122611. x = output.x;
  122612. y = output.y;
  122613. scale = output.scale;
  122614. rotation = output.rotation;
  122615. }
  122616. x *= scale;
  122617. y *= scale;
  122618. x -= cameraScrollX;
  122619. y -= cameraScrollY;
  122620. if (camera.roundPixels)
  122621. {
  122622. x = Math.round(x);
  122623. y = Math.round(y);
  122624. }
  122625. ctx.save();
  122626. ctx.translate(x, y);
  122627. ctx.rotate(rotation);
  122628. ctx.scale(scale, scale);
  122629. ctx.drawImage(image, glyphX, glyphY, glyphW, glyphH, 0, 0, glyphW, glyphH);
  122630. ctx.restore();
  122631. xAdvance += glyph.xAdvance;
  122632. indexCount += 1;
  122633. lastGlyph = glyph;
  122634. lastCharCode = charCode;
  122635. }
  122636. // Restore the context saved in SetTransform
  122637. ctx.restore();
  122638. };
  122639. module.exports = DynamicBitmapTextCanvasRenderer;
  122640. /***/ }),
  122641. /* 859 */
  122642. /***/ (function(module, exports, __webpack_require__) {
  122643. /**
  122644. * @author Richard Davey <rich@photonstorm.com>
  122645. * @copyright 2019 Photon Storm Ltd.
  122646. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122647. */
  122648. var Utils = __webpack_require__(9);
  122649. /**
  122650. * Renders this Game Object with the WebGL Renderer to the given Camera.
  122651. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  122652. * This method should not be called directly. It is a utility function of the Render module.
  122653. *
  122654. * @method Phaser.GameObjects.DynamicBitmapText#renderWebGL
  122655. * @since 3.0.0
  122656. * @private
  122657. *
  122658. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  122659. * @param {Phaser.GameObjects.DynamicBitmapText} src - The Game Object being rendered in this call.
  122660. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  122661. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  122662. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  122663. */
  122664. var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  122665. {
  122666. var text = src.text;
  122667. var textLength = text.length;
  122668. if (textLength === 0)
  122669. {
  122670. return;
  122671. }
  122672. var pipeline = this.pipeline;
  122673. renderer.setPipeline(pipeline, src);
  122674. var crop = (src.cropWidth > 0 || src.cropHeight > 0);
  122675. if (crop)
  122676. {
  122677. pipeline.flush();
  122678. renderer.pushScissor(
  122679. src.x,
  122680. src.y,
  122681. src.cropWidth * src.scaleX,
  122682. src.cropHeight * src.scaleY
  122683. );
  122684. }
  122685. var camMatrix = pipeline._tempMatrix1;
  122686. var spriteMatrix = pipeline._tempMatrix2;
  122687. var calcMatrix = pipeline._tempMatrix3;
  122688. var fontMatrix = pipeline._tempMatrix4;
  122689. spriteMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  122690. camMatrix.copyFrom(camera.matrix);
  122691. if (parentMatrix)
  122692. {
  122693. // Multiply the camera by the parent matrix
  122694. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  122695. // Undo the camera scroll
  122696. spriteMatrix.e = src.x;
  122697. spriteMatrix.f = src.y;
  122698. // Multiply by the Sprite matrix, store result in calcMatrix
  122699. camMatrix.multiply(spriteMatrix, calcMatrix);
  122700. }
  122701. else
  122702. {
  122703. spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
  122704. spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
  122705. // Multiply by the Sprite matrix, store result in calcMatrix
  122706. camMatrix.multiply(spriteMatrix, calcMatrix);
  122707. }
  122708. var frame = src.frame;
  122709. var texture = frame.glTexture;
  122710. var textureX = frame.cutX;
  122711. var textureY = frame.cutY;
  122712. var textureWidth = texture.width;
  122713. var textureHeight = texture.height;
  122714. var tintEffect = (src._isTinted && src.tintFill);
  122715. var tintTL = Utils.getTintAppendFloatAlpha(src._tintTL, camera.alpha * src._alphaTL);
  122716. var tintTR = Utils.getTintAppendFloatAlpha(src._tintTR, camera.alpha * src._alphaTR);
  122717. var tintBL = Utils.getTintAppendFloatAlpha(src._tintBL, camera.alpha * src._alphaBL);
  122718. var tintBR = Utils.getTintAppendFloatAlpha(src._tintBR, camera.alpha * src._alphaBR);
  122719. pipeline.setTexture2D(texture, 0);
  122720. var xAdvance = 0;
  122721. var yAdvance = 0;
  122722. var charCode = 0;
  122723. var lastCharCode = 0;
  122724. var letterSpacing = src.letterSpacing;
  122725. var glyph;
  122726. var glyphX = 0;
  122727. var glyphY = 0;
  122728. var glyphW = 0;
  122729. var glyphH = 0;
  122730. var lastGlyph;
  122731. var scrollX = src.scrollX;
  122732. var scrollY = src.scrollY;
  122733. var fontData = src.fontData;
  122734. var chars = fontData.chars;
  122735. var lineHeight = fontData.lineHeight;
  122736. var scale = (src.fontSize / fontData.size);
  122737. var rotation = 0;
  122738. var align = src._align;
  122739. var currentLine = 0;
  122740. var lineOffsetX = 0;
  122741. // Update the bounds - skipped internally if not dirty
  122742. src.getTextBounds(false);
  122743. var lineData = src._bounds.lines;
  122744. if (align === 1)
  122745. {
  122746. lineOffsetX = (lineData.longest - lineData.lengths[0]) / 2;
  122747. }
  122748. else if (align === 2)
  122749. {
  122750. lineOffsetX = (lineData.longest - lineData.lengths[0]);
  122751. }
  122752. var roundPixels = camera.roundPixels;
  122753. var displayCallback = src.displayCallback;
  122754. var callbackData = src.callbackData;
  122755. for (var i = 0; i < textLength; i++)
  122756. {
  122757. charCode = text.charCodeAt(i);
  122758. // Carriage-return
  122759. if (charCode === 10)
  122760. {
  122761. currentLine++;
  122762. if (align === 1)
  122763. {
  122764. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]) / 2;
  122765. }
  122766. else if (align === 2)
  122767. {
  122768. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]);
  122769. }
  122770. xAdvance = 0;
  122771. yAdvance += lineHeight;
  122772. lastGlyph = null;
  122773. continue;
  122774. }
  122775. glyph = chars[charCode];
  122776. if (!glyph)
  122777. {
  122778. continue;
  122779. }
  122780. glyphX = textureX + glyph.x;
  122781. glyphY = textureY + glyph.y;
  122782. glyphW = glyph.width;
  122783. glyphH = glyph.height;
  122784. var x = (glyph.xOffset + xAdvance) - scrollX;
  122785. var y = (glyph.yOffset + yAdvance) - scrollY;
  122786. if (lastGlyph !== null)
  122787. {
  122788. var kerningOffset = glyph.kerning[lastCharCode];
  122789. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  122790. }
  122791. xAdvance += glyph.xAdvance + letterSpacing;
  122792. lastGlyph = glyph;
  122793. lastCharCode = charCode;
  122794. // Nothing to render or a space? Then skip to the next glyph
  122795. if (glyphW === 0 || glyphH === 0 || charCode === 32)
  122796. {
  122797. continue;
  122798. }
  122799. scale = (src.fontSize / src.fontData.size);
  122800. rotation = 0;
  122801. if (displayCallback)
  122802. {
  122803. callbackData.color = 0;
  122804. callbackData.tint.topLeft = tintTL;
  122805. callbackData.tint.topRight = tintTR;
  122806. callbackData.tint.bottomLeft = tintBL;
  122807. callbackData.tint.bottomRight = tintBR;
  122808. callbackData.index = i;
  122809. callbackData.charCode = charCode;
  122810. callbackData.x = x;
  122811. callbackData.y = y;
  122812. callbackData.scale = scale;
  122813. callbackData.rotation = rotation;
  122814. callbackData.data = glyph.data;
  122815. var output = displayCallback(callbackData);
  122816. x = output.x;
  122817. y = output.y;
  122818. scale = output.scale;
  122819. rotation = output.rotation;
  122820. if (output.color)
  122821. {
  122822. tintTL = output.color;
  122823. tintTR = output.color;
  122824. tintBL = output.color;
  122825. tintBR = output.color;
  122826. }
  122827. else
  122828. {
  122829. tintTL = output.tint.topLeft;
  122830. tintTR = output.tint.topRight;
  122831. tintBL = output.tint.bottomLeft;
  122832. tintBR = output.tint.bottomRight;
  122833. }
  122834. tintTL = Utils.getTintAppendFloatAlpha(tintTL, camera.alpha * src._alphaTL);
  122835. tintTR = Utils.getTintAppendFloatAlpha(tintTR, camera.alpha * src._alphaTR);
  122836. tintBL = Utils.getTintAppendFloatAlpha(tintBL, camera.alpha * src._alphaBL);
  122837. tintBR = Utils.getTintAppendFloatAlpha(tintBR, camera.alpha * src._alphaBR);
  122838. }
  122839. x *= scale;
  122840. y *= scale;
  122841. x -= src.displayOriginX;
  122842. y -= src.displayOriginY;
  122843. x += lineOffsetX;
  122844. fontMatrix.applyITRS(x, y, rotation, scale, scale);
  122845. calcMatrix.multiply(fontMatrix, spriteMatrix);
  122846. var u0 = glyphX / textureWidth;
  122847. var v0 = glyphY / textureHeight;
  122848. var u1 = (glyphX + glyphW) / textureWidth;
  122849. var v1 = (glyphY + glyphH) / textureHeight;
  122850. var xw = glyphW;
  122851. var yh = glyphH;
  122852. var tx0 = spriteMatrix.e;
  122853. var ty0 = spriteMatrix.f;
  122854. var tx1 = yh * spriteMatrix.c + spriteMatrix.e;
  122855. var ty1 = yh * spriteMatrix.d + spriteMatrix.f;
  122856. var tx2 = xw * spriteMatrix.a + yh * spriteMatrix.c + spriteMatrix.e;
  122857. var ty2 = xw * spriteMatrix.b + yh * spriteMatrix.d + spriteMatrix.f;
  122858. var tx3 = xw * spriteMatrix.a + spriteMatrix.e;
  122859. var ty3 = xw * spriteMatrix.b + spriteMatrix.f;
  122860. if (roundPixels)
  122861. {
  122862. tx0 = Math.round(tx0);
  122863. ty0 = Math.round(ty0);
  122864. tx1 = Math.round(tx1);
  122865. ty1 = Math.round(ty1);
  122866. tx2 = Math.round(tx2);
  122867. ty2 = Math.round(ty2);
  122868. tx3 = Math.round(tx3);
  122869. ty3 = Math.round(ty3);
  122870. }
  122871. pipeline.batchQuad(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, 0);
  122872. }
  122873. if (crop)
  122874. {
  122875. pipeline.flush();
  122876. renderer.popScissor();
  122877. }
  122878. };
  122879. module.exports = DynamicBitmapTextWebGLRenderer;
  122880. /***/ }),
  122881. /* 860 */
  122882. /***/ (function(module, exports, __webpack_require__) {
  122883. /**
  122884. * @author Richard Davey <rich@photonstorm.com>
  122885. * @copyright 2019 Photon Storm Ltd.
  122886. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122887. */
  122888. var renderWebGL = __webpack_require__(1);
  122889. var renderCanvas = __webpack_require__(1);
  122890. if (true)
  122891. {
  122892. renderWebGL = __webpack_require__(859);
  122893. }
  122894. if (true)
  122895. {
  122896. renderCanvas = __webpack_require__(858);
  122897. }
  122898. module.exports = {
  122899. renderWebGL: renderWebGL,
  122900. renderCanvas: renderCanvas
  122901. };
  122902. /***/ }),
  122903. /* 861 */
  122904. /***/ (function(module, exports) {
  122905. /**
  122906. * @author Richard Davey <rich@photonstorm.com>
  122907. * @author Felipe Alfonso <@bitnenfer>
  122908. * @copyright 2019 Photon Storm Ltd.
  122909. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122910. */
  122911. /**
  122912. * Renders this Game Object with the Canvas Renderer to the given Camera.
  122913. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  122914. * This method should not be called directly. It is a utility function of the Render module.
  122915. *
  122916. * @method Phaser.GameObjects.Container#renderCanvas
  122917. * @since 3.4.0
  122918. * @private
  122919. *
  122920. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  122921. * @param {Phaser.GameObjects.Container} container - The Game Object being rendered in this call.
  122922. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  122923. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  122924. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  122925. */
  122926. var ContainerCanvasRenderer = function (renderer, container, interpolationPercentage, camera, parentMatrix)
  122927. {
  122928. var children = container.list;
  122929. if (children.length === 0)
  122930. {
  122931. return;
  122932. }
  122933. var transformMatrix = container.localTransform;
  122934. if (parentMatrix)
  122935. {
  122936. transformMatrix.loadIdentity();
  122937. transformMatrix.multiply(parentMatrix);
  122938. transformMatrix.translate(container.x, container.y);
  122939. transformMatrix.rotate(container.rotation);
  122940. transformMatrix.scale(container.scaleX, container.scaleY);
  122941. }
  122942. else
  122943. {
  122944. transformMatrix.applyITRS(container.x, container.y, container.rotation, container.scaleX, container.scaleY);
  122945. }
  122946. var containerHasBlendMode = (container.blendMode !== -1);
  122947. if (!containerHasBlendMode)
  122948. {
  122949. // If Container is SKIP_TEST then set blend mode to be Normal
  122950. renderer.setBlendMode(0);
  122951. }
  122952. var alpha = container._alpha;
  122953. var scrollFactorX = container.scrollFactorX;
  122954. var scrollFactorY = container.scrollFactorY;
  122955. for (var i = 0; i < children.length; i++)
  122956. {
  122957. var child = children[i];
  122958. if (!child.willRender(camera))
  122959. {
  122960. continue;
  122961. }
  122962. var childAlpha = child._alpha;
  122963. var childBlendMode = child._blendMode;
  122964. var childScrollFactorX = child.scrollFactorX;
  122965. var childScrollFactorY = child.scrollFactorY;
  122966. // Set parent values
  122967. child.setScrollFactor(childScrollFactorX * scrollFactorX, childScrollFactorY * scrollFactorY);
  122968. child.setAlpha(childAlpha * alpha);
  122969. if (containerHasBlendMode)
  122970. {
  122971. child.setBlendMode(container._blendMode);
  122972. }
  122973. // Render
  122974. child.renderCanvas(renderer, child, interpolationPercentage, camera, transformMatrix);
  122975. // Restore original values
  122976. child.setAlpha(childAlpha);
  122977. child.setScrollFactor(childScrollFactorX, childScrollFactorY);
  122978. child.setBlendMode(childBlendMode);
  122979. }
  122980. };
  122981. module.exports = ContainerCanvasRenderer;
  122982. /***/ }),
  122983. /* 862 */
  122984. /***/ (function(module, exports) {
  122985. /**
  122986. * @author Richard Davey <rich@photonstorm.com>
  122987. * @author Felipe Alfonso <@bitnenfer>
  122988. * @copyright 2019 Photon Storm Ltd.
  122989. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122990. */
  122991. /**
  122992. * Renders this Game Object with the WebGL Renderer to the given Camera.
  122993. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  122994. * This method should not be called directly. It is a utility function of the Render module.
  122995. *
  122996. * @method Phaser.GameObjects.Container#renderWebGL
  122997. * @since 3.4.0
  122998. * @private
  122999. *
  123000. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  123001. * @param {Phaser.GameObjects.Container} container - The Game Object being rendered in this call.
  123002. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  123003. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  123004. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  123005. */
  123006. var ContainerWebGLRenderer = function (renderer, container, interpolationPercentage, camera, parentMatrix)
  123007. {
  123008. var children = container.list;
  123009. if (children.length === 0)
  123010. {
  123011. return;
  123012. }
  123013. var transformMatrix = container.localTransform;
  123014. if (parentMatrix)
  123015. {
  123016. transformMatrix.loadIdentity();
  123017. transformMatrix.multiply(parentMatrix);
  123018. transformMatrix.translate(container.x, container.y);
  123019. transformMatrix.rotate(container.rotation);
  123020. transformMatrix.scale(container.scaleX, container.scaleY);
  123021. }
  123022. else
  123023. {
  123024. transformMatrix.applyITRS(container.x, container.y, container.rotation, container.scaleX, container.scaleY);
  123025. }
  123026. var containerHasBlendMode = (container.blendMode !== -1);
  123027. if (!containerHasBlendMode)
  123028. {
  123029. // If Container is SKIP_TEST then set blend mode to be Normal
  123030. renderer.setBlendMode(0);
  123031. }
  123032. var alpha = container._alpha;
  123033. var scrollFactorX = container.scrollFactorX;
  123034. var scrollFactorY = container.scrollFactorY;
  123035. for (var i = 0; i < children.length; i++)
  123036. {
  123037. var child = children[i];
  123038. if (!child.willRender(camera))
  123039. {
  123040. continue;
  123041. }
  123042. var childAlpha = child._alpha;
  123043. var childScrollFactorX = child.scrollFactorX;
  123044. var childScrollFactorY = child.scrollFactorY;
  123045. if (!containerHasBlendMode && child.blendMode !== renderer.currentBlendMode)
  123046. {
  123047. // If Container doesn't have its own blend mode, then a child can have one
  123048. renderer.setBlendMode(child.blendMode);
  123049. }
  123050. // Set parent values
  123051. child.setScrollFactor(childScrollFactorX * scrollFactorX, childScrollFactorY * scrollFactorY);
  123052. child.setAlpha(childAlpha * alpha);
  123053. // Render
  123054. child.renderWebGL(renderer, child, interpolationPercentage, camera, transformMatrix);
  123055. // Restore original values
  123056. child.setAlpha(childAlpha);
  123057. child.setScrollFactor(childScrollFactorX, childScrollFactorY);
  123058. }
  123059. };
  123060. module.exports = ContainerWebGLRenderer;
  123061. /***/ }),
  123062. /* 863 */
  123063. /***/ (function(module, exports, __webpack_require__) {
  123064. /**
  123065. * @author Richard Davey <rich@photonstorm.com>
  123066. * @author Felipe Alfonso <@bitnenfer>
  123067. * @copyright 2019 Photon Storm Ltd.
  123068. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123069. */
  123070. var renderWebGL = __webpack_require__(1);
  123071. var renderCanvas = __webpack_require__(1);
  123072. if (true)
  123073. {
  123074. renderWebGL = __webpack_require__(862);
  123075. }
  123076. if (true)
  123077. {
  123078. renderCanvas = __webpack_require__(861);
  123079. }
  123080. module.exports = {
  123081. renderWebGL: renderWebGL,
  123082. renderCanvas: renderCanvas
  123083. };
  123084. /***/ }),
  123085. /* 864 */
  123086. /***/ (function(module, exports, __webpack_require__) {
  123087. /**
  123088. * @author Richard Davey <rich@photonstorm.com>
  123089. * @copyright 2019 Photon Storm Ltd.
  123090. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123091. */
  123092. var Class = __webpack_require__(0);
  123093. /**
  123094. * @classdesc
  123095. * A Bob Game Object.
  123096. *
  123097. * A Bob belongs to a Blitter Game Object. The Blitter is responsible for managing and rendering this object.
  123098. *
  123099. * A Bob has a position, alpha value and a frame from a texture that it uses to render with. You can also toggle
  123100. * the flipped and visible state of the Bob. The Frame the Bob uses to render can be changed dynamically, but it
  123101. * must be a Frame within the Texture used by the parent Blitter.
  123102. *
  123103. * Bob positions are relative to the Blitter parent. So if you move the Blitter parent, all Bob children will
  123104. * have their positions impacted by this change as well.
  123105. *
  123106. * You can manipulate Bob objects directly from your game code, but the creation and destruction of them should be
  123107. * handled via the Blitter parent.
  123108. *
  123109. * @class Bob
  123110. * @memberof Phaser.GameObjects
  123111. * @constructor
  123112. * @since 3.0.0
  123113. *
  123114. * @param {Phaser.GameObjects.Blitter} blitter - The parent Blitter object is responsible for updating this Bob.
  123115. * @param {number} x - The horizontal position of this Game Object in the world, relative to the parent Blitter position.
  123116. * @param {number} y - The vertical position of this Game Object in the world, relative to the parent Blitter position.
  123117. * @param {(string|integer)} frame - The Frame this Bob will render with, as defined in the Texture the parent Blitter is using.
  123118. * @param {boolean} visible - Should the Bob render visible or not to start with?
  123119. */
  123120. var Bob = new Class({
  123121. initialize:
  123122. function Bob (blitter, x, y, frame, visible)
  123123. {
  123124. /**
  123125. * The Blitter object that this Bob belongs to.
  123126. *
  123127. * @name Phaser.GameObjects.Bob#parent
  123128. * @type {Phaser.GameObjects.Blitter}
  123129. * @since 3.0.0
  123130. */
  123131. this.parent = blitter;
  123132. /**
  123133. * The x position of this Bob, relative to the x position of the Blitter.
  123134. *
  123135. * @name Phaser.GameObjects.Bob#x
  123136. * @type {number}
  123137. * @since 3.0.0
  123138. */
  123139. this.x = x;
  123140. /**
  123141. * The y position of this Bob, relative to the y position of the Blitter.
  123142. *
  123143. * @name Phaser.GameObjects.Bob#y
  123144. * @type {number}
  123145. * @since 3.0.0
  123146. */
  123147. this.y = y;
  123148. /**
  123149. * The frame that the Bob uses to render with.
  123150. * To change the frame use the `Bob.setFrame` method.
  123151. *
  123152. * @name Phaser.GameObjects.Bob#frame
  123153. * @type {Phaser.Textures.Frame}
  123154. * @protected
  123155. * @since 3.0.0
  123156. */
  123157. this.frame = frame;
  123158. /**
  123159. * A blank object which can be used to store data related to this Bob in.
  123160. *
  123161. * @name Phaser.GameObjects.Bob#data
  123162. * @type {object}
  123163. * @default {}
  123164. * @since 3.0.0
  123165. */
  123166. this.data = {};
  123167. /**
  123168. * The visible state of this Bob.
  123169. *
  123170. * @name Phaser.GameObjects.Bob#_visible
  123171. * @type {boolean}
  123172. * @private
  123173. * @since 3.0.0
  123174. */
  123175. this._visible = visible;
  123176. /**
  123177. * The alpha value of this Bob.
  123178. *
  123179. * @name Phaser.GameObjects.Bob#_alpha
  123180. * @type {number}
  123181. * @private
  123182. * @default 1
  123183. * @since 3.0.0
  123184. */
  123185. this._alpha = 1;
  123186. /**
  123187. * The horizontally flipped state of the Bob.
  123188. * A Bob that is flipped horizontally will render inversed on the horizontal axis.
  123189. * Flipping always takes place from the middle of the texture.
  123190. *
  123191. * @name Phaser.GameObjects.Bob#flipX
  123192. * @type {boolean}
  123193. * @since 3.0.0
  123194. */
  123195. this.flipX = false;
  123196. /**
  123197. * The vertically flipped state of the Bob.
  123198. * A Bob that is flipped vertically will render inversed on the vertical axis (i.e. upside down)
  123199. * Flipping always takes place from the middle of the texture.
  123200. *
  123201. * @name Phaser.GameObjects.Bob#flipY
  123202. * @type {boolean}
  123203. * @since 3.0.0
  123204. */
  123205. this.flipY = false;
  123206. },
  123207. /**
  123208. * Changes the Texture Frame being used by this Bob.
  123209. * The frame must be part of the Texture the parent Blitter is using.
  123210. * If no value is given it will use the default frame of the Blitter parent.
  123211. *
  123212. * @method Phaser.GameObjects.Bob#setFrame
  123213. * @since 3.0.0
  123214. *
  123215. * @param {(string|integer|Phaser.Textures.Frame)} [frame] - The frame to be used during rendering.
  123216. *
  123217. * @return {Phaser.GameObjects.Bob} This Bob Game Object.
  123218. */
  123219. setFrame: function (frame)
  123220. {
  123221. if (frame === undefined)
  123222. {
  123223. this.frame = this.parent.frame;
  123224. }
  123225. else
  123226. {
  123227. this.frame = this.parent.texture.get(frame);
  123228. }
  123229. return this;
  123230. },
  123231. /**
  123232. * Resets the horizontal and vertical flipped state of this Bob back to their default un-flipped state.
  123233. *
  123234. * @method Phaser.GameObjects.Bob#resetFlip
  123235. * @since 3.0.0
  123236. *
  123237. * @return {Phaser.GameObjects.Bob} This Bob Game Object.
  123238. */
  123239. resetFlip: function ()
  123240. {
  123241. this.flipX = false;
  123242. this.flipY = false;
  123243. return this;
  123244. },
  123245. /**
  123246. * Resets this Bob.
  123247. *
  123248. * Changes the position to the values given, and optionally changes the frame.
  123249. *
  123250. * Also resets the flipX and flipY values, sets alpha back to 1 and visible to true.
  123251. *
  123252. * @method Phaser.GameObjects.Bob#reset
  123253. * @since 3.0.0
  123254. *
  123255. * @param {number} x - The x position of the Bob. Bob coordinate are relative to the position of the Blitter object.
  123256. * @param {number} y - The y position of the Bob. Bob coordinate are relative to the position of the Blitter object.
  123257. * @param {(string|integer|Phaser.Textures.Frame)} [frame] - The Frame the Bob will use. It _must_ be part of the Texture the parent Blitter object is using.
  123258. *
  123259. * @return {Phaser.GameObjects.Bob} This Bob Game Object.
  123260. */
  123261. reset: function (x, y, frame)
  123262. {
  123263. this.x = x;
  123264. this.y = y;
  123265. this.flipX = false;
  123266. this.flipY = false;
  123267. this._alpha = 1;
  123268. this._visible = true;
  123269. this.parent.dirty = true;
  123270. if (frame)
  123271. {
  123272. this.setFrame(frame);
  123273. }
  123274. return this;
  123275. },
  123276. /**
  123277. * Sets the horizontal flipped state of this Bob.
  123278. *
  123279. * @method Phaser.GameObjects.Bob#setFlipX
  123280. * @since 3.0.0
  123281. *
  123282. * @param {boolean} value - The flipped state. `false` for no flip, or `true` to be flipped.
  123283. *
  123284. * @return {Phaser.GameObjects.Bob} This Bob Game Object.
  123285. */
  123286. setFlipX: function (value)
  123287. {
  123288. this.flipX = value;
  123289. return this;
  123290. },
  123291. /**
  123292. * Sets the vertical flipped state of this Bob.
  123293. *
  123294. * @method Phaser.GameObjects.Bob#setFlipY
  123295. * @since 3.0.0
  123296. *
  123297. * @param {boolean} value - The flipped state. `false` for no flip, or `true` to be flipped.
  123298. *
  123299. * @return {Phaser.GameObjects.Bob} This Bob Game Object.
  123300. */
  123301. setFlipY: function (value)
  123302. {
  123303. this.flipY = value;
  123304. return this;
  123305. },
  123306. /**
  123307. * Sets the horizontal and vertical flipped state of this Bob.
  123308. *
  123309. * @method Phaser.GameObjects.Bob#setFlip
  123310. * @since 3.0.0
  123311. *
  123312. * @param {boolean} x - The horizontal flipped state. `false` for no flip, or `true` to be flipped.
  123313. * @param {boolean} y - The horizontal flipped state. `false` for no flip, or `true` to be flipped.
  123314. *
  123315. * @return {Phaser.GameObjects.Bob} This Bob Game Object.
  123316. */
  123317. setFlip: function (x, y)
  123318. {
  123319. this.flipX = x;
  123320. this.flipY = y;
  123321. return this;
  123322. },
  123323. /**
  123324. * Sets the visibility of this Bob.
  123325. *
  123326. * An invisible Bob will skip rendering.
  123327. *
  123328. * @method Phaser.GameObjects.Bob#setVisible
  123329. * @since 3.0.0
  123330. *
  123331. * @param {boolean} value - The visible state of the Game Object.
  123332. *
  123333. * @return {Phaser.GameObjects.Bob} This Bob Game Object.
  123334. */
  123335. setVisible: function (value)
  123336. {
  123337. this.visible = value;
  123338. return this;
  123339. },
  123340. /**
  123341. * Set the Alpha level of this Bob. The alpha controls the opacity of the Game Object as it renders.
  123342. * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque.
  123343. *
  123344. * A Bob with alpha 0 will skip rendering.
  123345. *
  123346. * @method Phaser.GameObjects.Bob#setAlpha
  123347. * @since 3.0.0
  123348. *
  123349. * @param {number} value - The alpha value used for this Bob. Between 0 and 1.
  123350. *
  123351. * @return {Phaser.GameObjects.Bob} This Bob Game Object.
  123352. */
  123353. setAlpha: function (value)
  123354. {
  123355. this.alpha = value;
  123356. return this;
  123357. },
  123358. /**
  123359. * Destroys this Bob instance.
  123360. * Removes itself from the Blitter and clears the parent, frame and data properties.
  123361. *
  123362. * @method Phaser.GameObjects.Bob#destroy
  123363. * @since 3.0.0
  123364. */
  123365. destroy: function ()
  123366. {
  123367. this.parent.dirty = true;
  123368. this.parent.children.remove(this);
  123369. this.parent = undefined;
  123370. this.frame = undefined;
  123371. this.data = undefined;
  123372. },
  123373. /**
  123374. * The visible state of the Bob.
  123375. *
  123376. * An invisible Bob will skip rendering.
  123377. *
  123378. * @name Phaser.GameObjects.Bob#visible
  123379. * @type {boolean}
  123380. * @since 3.0.0
  123381. */
  123382. visible: {
  123383. get: function ()
  123384. {
  123385. return this._visible;
  123386. },
  123387. set: function (value)
  123388. {
  123389. this._visible = value;
  123390. this.parent.dirty = true;
  123391. }
  123392. },
  123393. /**
  123394. * The alpha value of the Bob, between 0 and 1.
  123395. *
  123396. * A Bob with alpha 0 will skip rendering.
  123397. *
  123398. * @name Phaser.GameObjects.Bob#alpha
  123399. * @type {number}
  123400. * @since 3.0.0
  123401. */
  123402. alpha: {
  123403. get: function ()
  123404. {
  123405. return this._alpha;
  123406. },
  123407. set: function (value)
  123408. {
  123409. this._alpha = value;
  123410. this.parent.dirty = true;
  123411. }
  123412. }
  123413. });
  123414. module.exports = Bob;
  123415. /***/ }),
  123416. /* 865 */
  123417. /***/ (function(module, exports) {
  123418. /**
  123419. * @author Richard Davey <rich@photonstorm.com>
  123420. * @copyright 2019 Photon Storm Ltd.
  123421. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123422. */
  123423. /**
  123424. * Renders this Game Object with the Canvas Renderer to the given Camera.
  123425. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  123426. * This method should not be called directly. It is a utility function of the Render module.
  123427. *
  123428. * @method Phaser.GameObjects.Blitter#renderCanvas
  123429. * @since 3.0.0
  123430. * @private
  123431. *
  123432. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  123433. * @param {Phaser.GameObjects.Blitter} src - The Game Object being rendered in this call.
  123434. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  123435. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  123436. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  123437. */
  123438. var BlitterCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  123439. {
  123440. var list = src.getRenderList();
  123441. if (list.length === 0)
  123442. {
  123443. return;
  123444. }
  123445. var ctx = renderer.currentContext;
  123446. var alpha = camera.alpha * src.alpha;
  123447. if (alpha === 0)
  123448. {
  123449. // Nothing to see, so abort early
  123450. return;
  123451. }
  123452. // Blend Mode
  123453. ctx.globalCompositeOperation = renderer.blendModes[src.blendMode];
  123454. var cameraScrollX = src.x - camera.scrollX * src.scrollFactorX;
  123455. var cameraScrollY = src.y - camera.scrollY * src.scrollFactorY;
  123456. ctx.save();
  123457. if (parentMatrix)
  123458. {
  123459. parentMatrix.copyToContext(ctx);
  123460. }
  123461. var roundPixels = camera.roundPixels;
  123462. // Render bobs
  123463. for (var i = 0; i < list.length; i++)
  123464. {
  123465. var bob = list[i];
  123466. var flip = (bob.flipX || bob.flipY);
  123467. var frame = bob.frame;
  123468. var cd = frame.canvasData;
  123469. var dx = frame.x;
  123470. var dy = frame.y;
  123471. var fx = 1;
  123472. var fy = 1;
  123473. var bobAlpha = bob.alpha * alpha;
  123474. if (bobAlpha === 0)
  123475. {
  123476. continue;
  123477. }
  123478. ctx.globalAlpha = bobAlpha;
  123479. if (!flip)
  123480. {
  123481. if (roundPixels)
  123482. {
  123483. dx = Math.round(dx);
  123484. dy = Math.round(dy);
  123485. }
  123486. ctx.drawImage(
  123487. frame.source.image,
  123488. cd.x,
  123489. cd.y,
  123490. cd.width,
  123491. cd.height,
  123492. dx + bob.x + cameraScrollX,
  123493. dy + bob.y + cameraScrollY,
  123494. cd.width,
  123495. cd.height
  123496. );
  123497. }
  123498. else
  123499. {
  123500. if (bob.flipX)
  123501. {
  123502. fx = -1;
  123503. dx -= cd.width;
  123504. }
  123505. if (bob.flipY)
  123506. {
  123507. fy = -1;
  123508. dy -= cd.height;
  123509. }
  123510. ctx.save();
  123511. ctx.translate(bob.x + cameraScrollX, bob.y + cameraScrollY);
  123512. ctx.scale(fx, fy);
  123513. ctx.drawImage(frame.source.image, cd.x, cd.y, cd.width, cd.height, dx, dy, cd.width, cd.height);
  123514. ctx.restore();
  123515. }
  123516. }
  123517. ctx.restore();
  123518. };
  123519. module.exports = BlitterCanvasRenderer;
  123520. /***/ }),
  123521. /* 866 */
  123522. /***/ (function(module, exports, __webpack_require__) {
  123523. /**
  123524. * @author Richard Davey <rich@photonstorm.com>
  123525. * @copyright 2019 Photon Storm Ltd.
  123526. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123527. */
  123528. var Utils = __webpack_require__(9);
  123529. /**
  123530. * Renders this Game Object with the WebGL Renderer to the given Camera.
  123531. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  123532. * This method should not be called directly. It is a utility function of the Render module.
  123533. *
  123534. * @method Phaser.GameObjects.Blitter#renderWebGL
  123535. * @since 3.0.0
  123536. * @private
  123537. *
  123538. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  123539. * @param {Phaser.GameObjects.Blitter} src - The Game Object being rendered in this call.
  123540. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  123541. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  123542. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  123543. */
  123544. var BlitterWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  123545. {
  123546. var list = src.getRenderList();
  123547. if (list.length === 0)
  123548. {
  123549. return;
  123550. }
  123551. var pipeline = this.pipeline;
  123552. renderer.setPipeline(pipeline, src);
  123553. var cameraScrollX = camera.scrollX * src.scrollFactorX;
  123554. var cameraScrollY = camera.scrollY * src.scrollFactorY;
  123555. var calcMatrix = pipeline._tempMatrix1;
  123556. calcMatrix.copyFrom(camera.matrix);
  123557. if (parentMatrix)
  123558. {
  123559. calcMatrix.multiplyWithOffset(parentMatrix, -cameraScrollX, -cameraScrollY);
  123560. cameraScrollX = 0;
  123561. cameraScrollY = 0;
  123562. }
  123563. var blitterX = src.x - cameraScrollX;
  123564. var blitterY = src.y - cameraScrollY;
  123565. var prevTextureSourceIndex = -1;
  123566. var tintEffect = false;
  123567. var alpha = camera.alpha * src.alpha;
  123568. var roundPixels = camera.roundPixels;
  123569. for (var index = 0; index < list.length; index++)
  123570. {
  123571. var bob = list[index];
  123572. var frame = bob.frame;
  123573. var bobAlpha = bob.alpha * alpha;
  123574. if (bobAlpha === 0)
  123575. {
  123576. continue;
  123577. }
  123578. var width = frame.width;
  123579. var height = frame.height;
  123580. var x = blitterX + bob.x + frame.x;
  123581. var y = blitterY + bob.y + frame.y;
  123582. if (bob.flipX)
  123583. {
  123584. width *= -1;
  123585. x += frame.width;
  123586. }
  123587. if (bob.flipY)
  123588. {
  123589. height *= -1;
  123590. y += frame.height;
  123591. }
  123592. var xw = x + width;
  123593. var yh = y + height;
  123594. var tx0 = calcMatrix.getX(x, y);
  123595. var ty0 = calcMatrix.getY(x, y);
  123596. var tx1 = calcMatrix.getX(xw, yh);
  123597. var ty1 = calcMatrix.getY(xw, yh);
  123598. var tint = Utils.getTintAppendFloatAlpha(0xffffff, bobAlpha);
  123599. // Bind texture only if the Texture Source is different from before
  123600. if (frame.sourceIndex !== prevTextureSourceIndex)
  123601. {
  123602. pipeline.setTexture2D(frame.glTexture, 0);
  123603. prevTextureSourceIndex = frame.sourceIndex;
  123604. }
  123605. if (roundPixels)
  123606. {
  123607. tx0 = Math.round(tx0);
  123608. ty0 = Math.round(ty0);
  123609. tx1 = Math.round(tx1);
  123610. ty1 = Math.round(ty1);
  123611. }
  123612. // TL x/y, BL x/y, BR x/y, TR x/y
  123613. if (pipeline.batchQuad(tx0, ty0, tx0, ty1, tx1, ty1, tx1, ty0, frame.u0, frame.v0, frame.u1, frame.v1, tint, tint, tint, tint, tintEffect, frame.glTexture, 0))
  123614. {
  123615. prevTextureSourceIndex = -1;
  123616. }
  123617. }
  123618. };
  123619. module.exports = BlitterWebGLRenderer;
  123620. /***/ }),
  123621. /* 867 */
  123622. /***/ (function(module, exports, __webpack_require__) {
  123623. /**
  123624. * @author Richard Davey <rich@photonstorm.com>
  123625. * @copyright 2019 Photon Storm Ltd.
  123626. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123627. */
  123628. var renderWebGL = __webpack_require__(1);
  123629. var renderCanvas = __webpack_require__(1);
  123630. if (true)
  123631. {
  123632. renderWebGL = __webpack_require__(866);
  123633. }
  123634. if (true)
  123635. {
  123636. renderCanvas = __webpack_require__(865);
  123637. }
  123638. module.exports = {
  123639. renderWebGL: renderWebGL,
  123640. renderCanvas: renderCanvas
  123641. };
  123642. /***/ }),
  123643. /* 868 */
  123644. /***/ (function(module, exports, __webpack_require__) {
  123645. /**
  123646. * @author Richard Davey <rich@photonstorm.com>
  123647. * @copyright 2019 Photon Storm Ltd.
  123648. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123649. */
  123650. var SetTransform = __webpack_require__(25);
  123651. /**
  123652. * Renders this Game Object with the Canvas Renderer to the given Camera.
  123653. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  123654. * This method should not be called directly. It is a utility function of the Render module.
  123655. *
  123656. * @method Phaser.GameObjects.BitmapText#renderCanvas
  123657. * @since 3.0.0
  123658. * @private
  123659. *
  123660. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  123661. * @param {Phaser.GameObjects.BitmapText} src - The Game Object being rendered in this call.
  123662. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  123663. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  123664. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  123665. */
  123666. var BitmapTextCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  123667. {
  123668. var text = src._text;
  123669. var textLength = text.length;
  123670. var ctx = renderer.currentContext;
  123671. if (textLength === 0 || !SetTransform(renderer, ctx, src, camera, parentMatrix))
  123672. {
  123673. return;
  123674. }
  123675. var textureFrame = src.frame;
  123676. var chars = src.fontData.chars;
  123677. var lineHeight = src.fontData.lineHeight;
  123678. var letterSpacing = src._letterSpacing;
  123679. var xAdvance = 0;
  123680. var yAdvance = 0;
  123681. var charCode = 0;
  123682. var glyph = null;
  123683. var glyphX = 0;
  123684. var glyphY = 0;
  123685. var glyphW = 0;
  123686. var glyphH = 0;
  123687. var x = 0;
  123688. var y = 0;
  123689. var lastGlyph = null;
  123690. var lastCharCode = 0;
  123691. var image = src.frame.source.image;
  123692. var textureX = textureFrame.cutX;
  123693. var textureY = textureFrame.cutY;
  123694. var scale = (src._fontSize / src.fontData.size);
  123695. var align = src._align;
  123696. var currentLine = 0;
  123697. var lineOffsetX = 0;
  123698. // Update the bounds - skipped internally if not dirty
  123699. src.getTextBounds(false);
  123700. var lineData = src._bounds.lines;
  123701. if (align === 1)
  123702. {
  123703. lineOffsetX = (lineData.longest - lineData.lengths[0]) / 2;
  123704. }
  123705. else if (align === 2)
  123706. {
  123707. lineOffsetX = (lineData.longest - lineData.lengths[0]);
  123708. }
  123709. ctx.translate(-src.displayOriginX, -src.displayOriginY);
  123710. var roundPixels = camera.roundPixels;
  123711. for (var i = 0; i < textLength; i++)
  123712. {
  123713. charCode = text.charCodeAt(i);
  123714. if (charCode === 10)
  123715. {
  123716. currentLine++;
  123717. if (align === 1)
  123718. {
  123719. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]) / 2;
  123720. }
  123721. else if (align === 2)
  123722. {
  123723. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]);
  123724. }
  123725. xAdvance = 0;
  123726. yAdvance += lineHeight;
  123727. lastGlyph = null;
  123728. continue;
  123729. }
  123730. glyph = chars[charCode];
  123731. if (!glyph)
  123732. {
  123733. continue;
  123734. }
  123735. glyphX = textureX + glyph.x;
  123736. glyphY = textureY + glyph.y;
  123737. glyphW = glyph.width;
  123738. glyphH = glyph.height;
  123739. x = glyph.xOffset + xAdvance;
  123740. y = glyph.yOffset + yAdvance;
  123741. if (lastGlyph !== null)
  123742. {
  123743. var kerningOffset = glyph.kerning[lastCharCode];
  123744. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  123745. }
  123746. x *= scale;
  123747. y *= scale;
  123748. x += lineOffsetX;
  123749. xAdvance += glyph.xAdvance + letterSpacing;
  123750. lastGlyph = glyph;
  123751. lastCharCode = charCode;
  123752. // Nothing to render or a space? Then skip to the next glyph
  123753. if (glyphW === 0 || glyphH === 0 || charCode === 32)
  123754. {
  123755. continue;
  123756. }
  123757. if (roundPixels)
  123758. {
  123759. x = Math.round(x);
  123760. y = Math.round(y);
  123761. }
  123762. ctx.save();
  123763. ctx.translate(x, y);
  123764. ctx.scale(scale, scale);
  123765. ctx.drawImage(image, glyphX, glyphY, glyphW, glyphH, 0, 0, glyphW, glyphH);
  123766. ctx.restore();
  123767. }
  123768. ctx.restore();
  123769. };
  123770. module.exports = BitmapTextCanvasRenderer;
  123771. /***/ }),
  123772. /* 869 */
  123773. /***/ (function(module, exports, __webpack_require__) {
  123774. /**
  123775. * @author Richard Davey <rich@photonstorm.com>
  123776. * @copyright 2019 Photon Storm Ltd.
  123777. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123778. */
  123779. var Utils = __webpack_require__(9);
  123780. /**
  123781. * Renders this Game Object with the WebGL Renderer to the given Camera.
  123782. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  123783. * This method should not be called directly. It is a utility function of the Render module.
  123784. *
  123785. * @method Phaser.GameObjects.BitmapText#renderWebGL
  123786. * @since 3.0.0
  123787. * @private
  123788. *
  123789. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  123790. * @param {Phaser.GameObjects.BitmapText} src - The Game Object being rendered in this call.
  123791. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  123792. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  123793. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  123794. */
  123795. var BitmapTextWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  123796. {
  123797. var text = src._text;
  123798. var textLength = text.length;
  123799. if (textLength === 0)
  123800. {
  123801. return;
  123802. }
  123803. var pipeline = this.pipeline;
  123804. renderer.setPipeline(pipeline, src);
  123805. var camMatrix = pipeline._tempMatrix1;
  123806. var spriteMatrix = pipeline._tempMatrix2;
  123807. var calcMatrix = pipeline._tempMatrix3;
  123808. spriteMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  123809. camMatrix.copyFrom(camera.matrix);
  123810. if (parentMatrix)
  123811. {
  123812. // Multiply the camera by the parent matrix
  123813. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  123814. // Undo the camera scroll
  123815. spriteMatrix.e = src.x;
  123816. spriteMatrix.f = src.y;
  123817. // Multiply by the Sprite matrix, store result in calcMatrix
  123818. camMatrix.multiply(spriteMatrix, calcMatrix);
  123819. }
  123820. else
  123821. {
  123822. spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
  123823. spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
  123824. // Multiply by the Sprite matrix, store result in calcMatrix
  123825. camMatrix.multiply(spriteMatrix, calcMatrix);
  123826. }
  123827. var frame = src.frame;
  123828. var texture = frame.glTexture;
  123829. var textureX = frame.cutX;
  123830. var textureY = frame.cutY;
  123831. var textureWidth = texture.width;
  123832. var textureHeight = texture.height;
  123833. var tintEffect = (src._isTinted && src.tintFill);
  123834. var tintTL = Utils.getTintAppendFloatAlpha(src._tintTL, camera.alpha * src._alphaTL);
  123835. var tintTR = Utils.getTintAppendFloatAlpha(src._tintTR, camera.alpha * src._alphaTR);
  123836. var tintBL = Utils.getTintAppendFloatAlpha(src._tintBL, camera.alpha * src._alphaBL);
  123837. var tintBR = Utils.getTintAppendFloatAlpha(src._tintBR, camera.alpha * src._alphaBR);
  123838. pipeline.setTexture2D(texture, 0);
  123839. var xAdvance = 0;
  123840. var yAdvance = 0;
  123841. var charCode = 0;
  123842. var lastCharCode = 0;
  123843. var letterSpacing = src._letterSpacing;
  123844. var glyph;
  123845. var glyphX = 0;
  123846. var glyphY = 0;
  123847. var glyphW = 0;
  123848. var glyphH = 0;
  123849. var lastGlyph;
  123850. var fontData = src.fontData;
  123851. var chars = fontData.chars;
  123852. var lineHeight = fontData.lineHeight;
  123853. var scale = (src._fontSize / fontData.size);
  123854. var align = src._align;
  123855. var currentLine = 0;
  123856. var lineOffsetX = 0;
  123857. // Update the bounds - skipped internally if not dirty
  123858. src.getTextBounds(false);
  123859. var lineData = src._bounds.lines;
  123860. if (align === 1)
  123861. {
  123862. lineOffsetX = (lineData.longest - lineData.lengths[0]) / 2;
  123863. }
  123864. else if (align === 2)
  123865. {
  123866. lineOffsetX = (lineData.longest - lineData.lengths[0]);
  123867. }
  123868. var roundPixels = camera.roundPixels;
  123869. for (var i = 0; i < textLength; i++)
  123870. {
  123871. charCode = text.charCodeAt(i);
  123872. // Carriage-return
  123873. if (charCode === 10)
  123874. {
  123875. currentLine++;
  123876. if (align === 1)
  123877. {
  123878. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]) / 2;
  123879. }
  123880. else if (align === 2)
  123881. {
  123882. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]);
  123883. }
  123884. xAdvance = 0;
  123885. yAdvance += lineHeight;
  123886. lastGlyph = null;
  123887. continue;
  123888. }
  123889. glyph = chars[charCode];
  123890. if (!glyph)
  123891. {
  123892. continue;
  123893. }
  123894. glyphX = textureX + glyph.x;
  123895. glyphY = textureY + glyph.y;
  123896. glyphW = glyph.width;
  123897. glyphH = glyph.height;
  123898. var x = glyph.xOffset + xAdvance;
  123899. var y = glyph.yOffset + yAdvance;
  123900. if (lastGlyph !== null)
  123901. {
  123902. var kerningOffset = glyph.kerning[lastCharCode];
  123903. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  123904. }
  123905. xAdvance += glyph.xAdvance + letterSpacing;
  123906. lastGlyph = glyph;
  123907. lastCharCode = charCode;
  123908. // Nothing to render or a space? Then skip to the next glyph
  123909. if (glyphW === 0 || glyphH === 0 || charCode === 32)
  123910. {
  123911. continue;
  123912. }
  123913. x *= scale;
  123914. y *= scale;
  123915. x -= src.displayOriginX;
  123916. y -= src.displayOriginY;
  123917. x += lineOffsetX;
  123918. var u0 = glyphX / textureWidth;
  123919. var v0 = glyphY / textureHeight;
  123920. var u1 = (glyphX + glyphW) / textureWidth;
  123921. var v1 = (glyphY + glyphH) / textureHeight;
  123922. var xw = x + (glyphW * scale);
  123923. var yh = y + (glyphH * scale);
  123924. var tx0 = calcMatrix.getX(x, y);
  123925. var ty0 = calcMatrix.getY(x, y);
  123926. var tx1 = calcMatrix.getX(x, yh);
  123927. var ty1 = calcMatrix.getY(x, yh);
  123928. var tx2 = calcMatrix.getX(xw, yh);
  123929. var ty2 = calcMatrix.getY(xw, yh);
  123930. var tx3 = calcMatrix.getX(xw, y);
  123931. var ty3 = calcMatrix.getY(xw, y);
  123932. if (roundPixels)
  123933. {
  123934. tx0 = Math.round(tx0);
  123935. ty0 = Math.round(ty0);
  123936. tx1 = Math.round(tx1);
  123937. ty1 = Math.round(ty1);
  123938. tx2 = Math.round(tx2);
  123939. ty2 = Math.round(ty2);
  123940. tx3 = Math.round(tx3);
  123941. ty3 = Math.round(ty3);
  123942. }
  123943. pipeline.batchQuad(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, 0);
  123944. }
  123945. };
  123946. module.exports = BitmapTextWebGLRenderer;
  123947. /***/ }),
  123948. /* 870 */
  123949. /***/ (function(module, exports, __webpack_require__) {
  123950. /**
  123951. * @author Richard Davey <rich@photonstorm.com>
  123952. * @copyright 2019 Photon Storm Ltd.
  123953. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123954. */
  123955. var renderWebGL = __webpack_require__(1);
  123956. var renderCanvas = __webpack_require__(1);
  123957. if (true)
  123958. {
  123959. renderWebGL = __webpack_require__(869);
  123960. }
  123961. if (true)
  123962. {
  123963. renderCanvas = __webpack_require__(868);
  123964. }
  123965. module.exports = {
  123966. renderWebGL: renderWebGL,
  123967. renderCanvas: renderCanvas
  123968. };
  123969. /***/ }),
  123970. /* 871 */
  123971. /***/ (function(module, exports, __webpack_require__) {
  123972. /**
  123973. * @author Richard Davey <rich@photonstorm.com>
  123974. * @copyright 2019 Photon Storm Ltd.
  123975. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123976. */
  123977. var ParseXMLBitmapFont = __webpack_require__(314);
  123978. /**
  123979. * Parse an XML Bitmap Font from an Atlas.
  123980. *
  123981. * Adds the parsed Bitmap Font data to the cache with the `fontName` key.
  123982. *
  123983. * @function ParseFromAtlas
  123984. * @since 3.0.0
  123985. * @private
  123986. *
  123987. * @param {Phaser.Scene} scene - The Scene to parse the Bitmap Font for.
  123988. * @param {string} fontName - The key of the font to add to the Bitmap Font cache.
  123989. * @param {string} textureKey - The key of the BitmapFont's texture.
  123990. * @param {string} frameKey - The key of the BitmapFont texture's frame.
  123991. * @param {string} xmlKey - The key of the XML data of the font to parse.
  123992. * @param {integer} xSpacing - The x-axis spacing to add between each letter.
  123993. * @param {integer} ySpacing - The y-axis spacing to add to the line height.
  123994. *
  123995. * @return {boolean} Whether the parsing was successful or not.
  123996. */
  123997. var ParseFromAtlas = function (scene, fontName, textureKey, frameKey, xmlKey, xSpacing, ySpacing)
  123998. {
  123999. var frame = scene.sys.textures.getFrame(textureKey, frameKey);
  124000. var xml = scene.sys.cache.xml.get(xmlKey);
  124001. if (frame && xml)
  124002. {
  124003. var data = ParseXMLBitmapFont(xml, xSpacing, ySpacing, frame);
  124004. scene.sys.cache.bitmapFont.add(fontName, { data: data, texture: textureKey, frame: frameKey });
  124005. return true;
  124006. }
  124007. else
  124008. {
  124009. return false;
  124010. }
  124011. };
  124012. module.exports = ParseFromAtlas;
  124013. /***/ }),
  124014. /* 872 */
  124015. /***/ (function(module, exports) {
  124016. /**
  124017. * @author Richard Davey <rich@photonstorm.com>
  124018. * @copyright 2019 Photon Storm Ltd.
  124019. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124020. */
  124021. /**
  124022. * @typedef {object} BitmapTextSize
  124023. *
  124024. * @property {GlobalBitmapTextSize} global - The position and size of the BitmapText, taking into account the position and scale of the Game Object.
  124025. * @property {LocalBitmapTextSize} local - The position and size of the BitmapText, taking just the font size into account.
  124026. */
  124027. /**
  124028. * The position and size of the Bitmap Text in global space, taking into account the Game Object's scale and world position.
  124029. *
  124030. * @typedef {object} GlobalBitmapTextSize
  124031. *
  124032. * @property {number} x - The x position of the BitmapText, taking into account the x position and scale of the Game Object.
  124033. * @property {number} y - The y position of the BitmapText, taking into account the y position and scale of the Game Object.
  124034. * @property {number} width - The width of the BitmapText, taking into account the x scale of the Game Object.
  124035. * @property {number} height - The height of the BitmapText, taking into account the y scale of the Game Object.
  124036. */
  124037. /**
  124038. * The position and size of the Bitmap Text in local space, taking just the font size into account.
  124039. *
  124040. * @typedef {object} LocalBitmapTextSize
  124041. *
  124042. * @property {number} x - The x position of the BitmapText.
  124043. * @property {number} y - The y position of the BitmapText.
  124044. * @property {number} width - The width of the BitmapText.
  124045. * @property {number} height - The height of the BitmapText.
  124046. */
  124047. /**
  124048. * Calculate the position, width and height of a BitmapText Game Object.
  124049. *
  124050. * Returns a BitmapTextSize object that contains global and local variants of the Game Objects x and y coordinates and
  124051. * its width and height.
  124052. *
  124053. * The global position and size take into account the Game Object's position and scale.
  124054. *
  124055. * The local position and size just takes into account the font data.
  124056. *
  124057. * @function GetBitmapTextSize
  124058. * @since 3.0.0
  124059. * @private
  124060. *
  124061. * @param {(Phaser.GameObjects.DynamicBitmapText|Phaser.GameObjects.BitmapText)} src - The BitmapText to calculate the position, width and height of.
  124062. * @param {boolean} [round] - Whether to round the results to the nearest integer.
  124063. * @param {object} [out] - Optional object to store the results in, to save constant object creation.
  124064. *
  124065. * @return {BitmapTextSize} The calculated position, width and height of the BitmapText.
  124066. */
  124067. var GetBitmapTextSize = function (src, round, out)
  124068. {
  124069. if (out === undefined)
  124070. {
  124071. out = {
  124072. local: {
  124073. x: 0,
  124074. y: 0,
  124075. width: 0,
  124076. height: 0
  124077. },
  124078. global: {
  124079. x: 0,
  124080. y: 0,
  124081. width: 0,
  124082. height: 0
  124083. },
  124084. lines: {
  124085. shortest: 0,
  124086. longest: 0,
  124087. lengths: null
  124088. }
  124089. };
  124090. }
  124091. var text = src.text;
  124092. var textLength = text.length;
  124093. var bx = Number.MAX_VALUE;
  124094. var by = Number.MAX_VALUE;
  124095. var bw = 0;
  124096. var bh = 0;
  124097. var chars = src.fontData.chars;
  124098. var lineHeight = src.fontData.lineHeight;
  124099. var letterSpacing = src.letterSpacing;
  124100. var xAdvance = 0;
  124101. var yAdvance = 0;
  124102. var charCode = 0;
  124103. var glyph = null;
  124104. var x = 0;
  124105. var y = 0;
  124106. var scale = (src.fontSize / src.fontData.size);
  124107. var sx = scale * src.scaleX;
  124108. var sy = scale * src.scaleY;
  124109. var lastGlyph = null;
  124110. var lastCharCode = 0;
  124111. var lineWidths = [];
  124112. var shortestLine = Number.MAX_VALUE;
  124113. var longestLine = 0;
  124114. var currentLine = 0;
  124115. var currentLineWidth = 0;
  124116. for (var i = 0; i < textLength; i++)
  124117. {
  124118. charCode = text.charCodeAt(i);
  124119. if (charCode === 10)
  124120. {
  124121. xAdvance = 0;
  124122. yAdvance += lineHeight;
  124123. lastGlyph = null;
  124124. lineWidths[currentLine] = currentLineWidth;
  124125. if (currentLineWidth > longestLine)
  124126. {
  124127. longestLine = currentLineWidth;
  124128. }
  124129. if (currentLineWidth < shortestLine)
  124130. {
  124131. shortestLine = currentLineWidth;
  124132. }
  124133. currentLine++;
  124134. currentLineWidth = 0;
  124135. continue;
  124136. }
  124137. glyph = chars[charCode];
  124138. if (!glyph)
  124139. {
  124140. continue;
  124141. }
  124142. x = xAdvance;
  124143. y = yAdvance;
  124144. if (lastGlyph !== null)
  124145. {
  124146. var kerningOffset = glyph.kerning[lastCharCode];
  124147. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  124148. }
  124149. if (bx > x)
  124150. {
  124151. bx = x;
  124152. }
  124153. if (by > y)
  124154. {
  124155. by = y;
  124156. }
  124157. var gw = x + glyph.xAdvance;
  124158. var gh = y + lineHeight;
  124159. if (bw < gw)
  124160. {
  124161. bw = gw;
  124162. }
  124163. if (bh < gh)
  124164. {
  124165. bh = gh;
  124166. }
  124167. xAdvance += glyph.xAdvance + letterSpacing;
  124168. lastGlyph = glyph;
  124169. lastCharCode = charCode;
  124170. currentLineWidth = gw * scale;
  124171. }
  124172. lineWidths[currentLine] = currentLineWidth;
  124173. if (currentLineWidth > longestLine)
  124174. {
  124175. longestLine = currentLineWidth;
  124176. }
  124177. if (currentLineWidth < shortestLine)
  124178. {
  124179. shortestLine = currentLineWidth;
  124180. }
  124181. var local = out.local;
  124182. var global = out.global;
  124183. var lines = out.lines;
  124184. local.x = bx * scale;
  124185. local.y = by * scale;
  124186. local.width = bw * scale;
  124187. local.height = bh * scale;
  124188. global.x = (src.x - src.displayOriginX) + (bx * sx);
  124189. global.y = (src.y - src.displayOriginY) + (by * sy);
  124190. global.width = bw * sx;
  124191. global.height = bh * sy;
  124192. lines.shortest = shortestLine;
  124193. lines.longest = longestLine;
  124194. lines.lengths = lineWidths;
  124195. if (round)
  124196. {
  124197. local.x = Math.round(local.x);
  124198. local.y = Math.round(local.y);
  124199. local.width = Math.round(local.width);
  124200. local.height = Math.round(local.height);
  124201. global.x = Math.round(global.x);
  124202. global.y = Math.round(global.y);
  124203. global.width = Math.round(global.width);
  124204. global.height = Math.round(global.height);
  124205. lines.shortest = Math.round(shortestLine);
  124206. lines.longest = Math.round(longestLine);
  124207. }
  124208. return out;
  124209. };
  124210. module.exports = GetBitmapTextSize;
  124211. /***/ }),
  124212. /* 873 */
  124213. /***/ (function(module, exports, __webpack_require__) {
  124214. /**
  124215. * @author Richard Davey <rich@photonstorm.com>
  124216. * @copyright 2019 Photon Storm Ltd.
  124217. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124218. */
  124219. var Class = __webpack_require__(0);
  124220. var PluginCache = __webpack_require__(17);
  124221. var SceneEvents = __webpack_require__(16);
  124222. /**
  124223. * @classdesc
  124224. * The Update List plugin.
  124225. *
  124226. * Update Lists belong to a Scene and maintain the list Game Objects to be updated every frame.
  124227. *
  124228. * Some or all of these Game Objects may also be part of the Scene's [Display List]{@link Phaser.GameObjects.DisplayList}, for Rendering.
  124229. *
  124230. * @class UpdateList
  124231. * @memberof Phaser.GameObjects
  124232. * @constructor
  124233. * @since 3.0.0
  124234. *
  124235. * @param {Phaser.Scene} scene - The Scene that the Update List belongs to.
  124236. */
  124237. var UpdateList = new Class({
  124238. initialize:
  124239. function UpdateList (scene)
  124240. {
  124241. /**
  124242. * The Scene that the Update List belongs to.
  124243. *
  124244. * @name Phaser.GameObjects.UpdateList#scene
  124245. * @type {Phaser.Scene}
  124246. * @since 3.0.0
  124247. */
  124248. this.scene = scene;
  124249. /**
  124250. * The Scene's Systems.
  124251. *
  124252. * @name Phaser.GameObjects.UpdateList#systems
  124253. * @type {Phaser.Scenes.Systems}
  124254. * @since 3.0.0
  124255. */
  124256. this.systems = scene.sys;
  124257. /**
  124258. * The list of Game Objects.
  124259. *
  124260. * @name Phaser.GameObjects.UpdateList#_list
  124261. * @type {array}
  124262. * @private
  124263. * @default []
  124264. * @since 3.0.0
  124265. */
  124266. this._list = [];
  124267. /**
  124268. * Game Objects that are pending insertion into the list.
  124269. *
  124270. * @name Phaser.GameObjects.UpdateList#_pendingInsertion
  124271. * @type {array}
  124272. * @private
  124273. * @default []
  124274. * @since 3.0.0
  124275. */
  124276. this._pendingInsertion = [];
  124277. /**
  124278. * Game Objects that are pending removal from the list.
  124279. *
  124280. * @name Phaser.GameObjects.UpdateList#_pendingRemoval
  124281. * @type {array}
  124282. * @private
  124283. * @default []
  124284. * @since 3.0.0
  124285. */
  124286. this._pendingRemoval = [];
  124287. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  124288. scene.sys.events.on(SceneEvents.START, this.start, this);
  124289. },
  124290. /**
  124291. * This method is called automatically, only once, when the Scene is first created.
  124292. * Do not invoke it directly.
  124293. *
  124294. * @method Phaser.GameObjects.UpdateList#boot
  124295. * @private
  124296. * @since 3.5.1
  124297. */
  124298. boot: function ()
  124299. {
  124300. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  124301. },
  124302. /**
  124303. * This method is called automatically by the Scene when it is starting up.
  124304. * It is responsible for creating local systems, properties and listening for Scene events.
  124305. * Do not invoke it directly.
  124306. *
  124307. * @method Phaser.GameObjects.UpdateList#start
  124308. * @private
  124309. * @since 3.5.0
  124310. */
  124311. start: function ()
  124312. {
  124313. var eventEmitter = this.systems.events;
  124314. eventEmitter.on(SceneEvents.PRE_UPDATE, this.preUpdate, this);
  124315. eventEmitter.on(SceneEvents.UPDATE, this.update, this);
  124316. eventEmitter.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  124317. },
  124318. /**
  124319. * Add a Game Object to the Update List.
  124320. *
  124321. * @method Phaser.GameObjects.UpdateList#add
  124322. * @since 3.0.0
  124323. *
  124324. * @param {Phaser.GameObjects.GameObject} child - The Game Object to add.
  124325. *
  124326. * @return {Phaser.GameObjects.GameObject} The added Game Object.
  124327. */
  124328. add: function (child)
  124329. {
  124330. // Is child already in this list?
  124331. if (this._list.indexOf(child) === -1 && this._pendingInsertion.indexOf(child) === -1)
  124332. {
  124333. this._pendingInsertion.push(child);
  124334. }
  124335. return child;
  124336. },
  124337. /**
  124338. * The pre-update step.
  124339. *
  124340. * Handles Game Objects that are pending insertion to and removal from the list.
  124341. *
  124342. * @method Phaser.GameObjects.UpdateList#preUpdate
  124343. * @since 3.0.0
  124344. */
  124345. preUpdate: function ()
  124346. {
  124347. var toRemove = this._pendingRemoval.length;
  124348. var toInsert = this._pendingInsertion.length;
  124349. if (toRemove === 0 && toInsert === 0)
  124350. {
  124351. // Quick bail
  124352. return;
  124353. }
  124354. var i;
  124355. var gameObject;
  124356. // Delete old gameObjects
  124357. for (i = 0; i < toRemove; i++)
  124358. {
  124359. gameObject = this._pendingRemoval[i];
  124360. var index = this._list.indexOf(gameObject);
  124361. if (index > -1)
  124362. {
  124363. this._list.splice(index, 1);
  124364. }
  124365. }
  124366. // Move pending to active
  124367. this._list = this._list.concat(this._pendingInsertion.splice(0));
  124368. // Clear the lists
  124369. this._pendingRemoval.length = 0;
  124370. this._pendingInsertion.length = 0;
  124371. },
  124372. /**
  124373. * The update step.
  124374. *
  124375. * Pre-updates every active Game Object in the list.
  124376. *
  124377. * @method Phaser.GameObjects.UpdateList#update
  124378. * @since 3.0.0
  124379. *
  124380. * @param {number} time - The current timestamp.
  124381. * @param {number} delta - The delta time elapsed since the last frame.
  124382. */
  124383. update: function (time, delta)
  124384. {
  124385. for (var i = 0; i < this._list.length; i++)
  124386. {
  124387. var gameObject = this._list[i];
  124388. if (gameObject.active)
  124389. {
  124390. gameObject.preUpdate.call(gameObject, time, delta);
  124391. }
  124392. }
  124393. },
  124394. /**
  124395. * Remove a Game Object from the list.
  124396. *
  124397. * @method Phaser.GameObjects.UpdateList#remove
  124398. * @since 3.0.0
  124399. *
  124400. * @param {Phaser.GameObjects.GameObject} child - The Game Object to remove from the list.
  124401. *
  124402. * @return {Phaser.GameObjects.GameObject} The removed Game Object.
  124403. */
  124404. remove: function (child)
  124405. {
  124406. var index = this._list.indexOf(child);
  124407. if (index !== -1)
  124408. {
  124409. this._list.splice(index, 1);
  124410. }
  124411. return child;
  124412. },
  124413. /**
  124414. * Remove all Game Objects from the list.
  124415. *
  124416. * @method Phaser.GameObjects.UpdateList#removeAll
  124417. * @since 3.0.0
  124418. *
  124419. * @return {Phaser.GameObjects.UpdateList} This UpdateList.
  124420. */
  124421. removeAll: function ()
  124422. {
  124423. var i = this._list.length;
  124424. while (i--)
  124425. {
  124426. this.remove(this._list[i]);
  124427. }
  124428. return this;
  124429. },
  124430. /**
  124431. * The Scene that owns this plugin is shutting down.
  124432. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  124433. *
  124434. * @method Phaser.GameObjects.UpdateList#shutdown
  124435. * @since 3.0.0
  124436. */
  124437. shutdown: function ()
  124438. {
  124439. var i = this._list.length;
  124440. while (i--)
  124441. {
  124442. this._list[i].destroy(true);
  124443. }
  124444. i = this._pendingRemoval.length;
  124445. while (i--)
  124446. {
  124447. this._pendingRemoval[i].destroy(true);
  124448. }
  124449. i = this._pendingInsertion.length;
  124450. while (i--)
  124451. {
  124452. this._pendingInsertion[i].destroy(true);
  124453. }
  124454. this._list.length = 0;
  124455. this._pendingRemoval.length = 0;
  124456. this._pendingInsertion.length = 0;
  124457. var eventEmitter = this.systems.events;
  124458. eventEmitter.off(SceneEvents.PRE_UPDATE, this.preUpdate, this);
  124459. eventEmitter.off(SceneEvents.UPDATE, this.update, this);
  124460. eventEmitter.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  124461. },
  124462. /**
  124463. * The Scene that owns this plugin is being destroyed.
  124464. * We need to shutdown and then kill off all external references.
  124465. *
  124466. * @method Phaser.GameObjects.UpdateList#destroy
  124467. * @since 3.0.0
  124468. */
  124469. destroy: function ()
  124470. {
  124471. this.shutdown();
  124472. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  124473. this.scene = null;
  124474. this.systems = null;
  124475. },
  124476. /**
  124477. * The length of the list.
  124478. *
  124479. * @name Phaser.GameObjects.UpdateList#length
  124480. * @type {integer}
  124481. * @readonly
  124482. * @since 3.10.0
  124483. */
  124484. length: {
  124485. get: function ()
  124486. {
  124487. return this._list.length;
  124488. }
  124489. }
  124490. });
  124491. PluginCache.register('UpdateList', UpdateList, 'updateList');
  124492. module.exports = UpdateList;
  124493. /***/ }),
  124494. /* 874 */
  124495. /***/ (function(module, exports) {
  124496. /**
  124497. * @author Richard Davey <rich@photonstorm.com>
  124498. * @copyright 2019 Photon Storm Ltd.
  124499. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124500. */
  124501. /**
  124502. * Swaps the position of two elements in the given array.
  124503. * The elements must exist in the same array.
  124504. * The array is modified in-place.
  124505. *
  124506. * @function Phaser.Utils.Array.Swap
  124507. * @since 3.4.0
  124508. *
  124509. * @param {array} array - The input array.
  124510. * @param {*} item1 - The first element to swap.
  124511. * @param {*} item2 - The second element to swap.
  124512. *
  124513. * @return {array} The input array.
  124514. */
  124515. var Swap = function (array, item1, item2)
  124516. {
  124517. if (item1 === item2)
  124518. {
  124519. return;
  124520. }
  124521. var index1 = array.indexOf(item1);
  124522. var index2 = array.indexOf(item2);
  124523. if (index1 < 0 || index2 < 0)
  124524. {
  124525. throw new Error('Supplied items must be elements of the same array');
  124526. }
  124527. array[index1] = item2;
  124528. array[index2] = item1;
  124529. return array;
  124530. };
  124531. module.exports = Swap;
  124532. /***/ }),
  124533. /* 875 */
  124534. /***/ (function(module, exports, __webpack_require__) {
  124535. /**
  124536. * @author Richard Davey <rich@photonstorm.com>
  124537. * @copyright 2019 Photon Storm Ltd.
  124538. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124539. */
  124540. var SafeRange = __webpack_require__(68);
  124541. /**
  124542. * Scans the array for elements with the given property. If found, the property is set to the `value`.
  124543. *
  124544. * For example: `SetAll('visible', true)` would set all elements that have a `visible` property to `false`.
  124545. *
  124546. * Optionally you can specify a start and end index. For example if the array had 100 elements,
  124547. * and you set `startIndex` to 0 and `endIndex` to 50, it would update only the first 50 elements.
  124548. *
  124549. * @function Phaser.Utils.Array.SetAll
  124550. * @since 3.4.0
  124551. *
  124552. * @param {array} array - The array to search.
  124553. * @param {string} property - The property to test for on each array element.
  124554. * @param {*} value - The value to set the property to.
  124555. * @param {integer} [startIndex] - An optional start index to search from.
  124556. * @param {integer} [endIndex] - An optional end index to search to.
  124557. *
  124558. * @return {array} The input array.
  124559. */
  124560. var SetAll = function (array, property, value, startIndex, endIndex)
  124561. {
  124562. if (startIndex === undefined) { startIndex = 0; }
  124563. if (endIndex === undefined) { endIndex = array.length; }
  124564. if (SafeRange(array, startIndex, endIndex))
  124565. {
  124566. for (var i = startIndex; i < endIndex; i++)
  124567. {
  124568. var entry = array[i];
  124569. if (entry.hasOwnProperty(property))
  124570. {
  124571. entry[property] = value;
  124572. }
  124573. }
  124574. }
  124575. return array;
  124576. };
  124577. module.exports = SetAll;
  124578. /***/ }),
  124579. /* 876 */
  124580. /***/ (function(module, exports) {
  124581. /**
  124582. * @author Richard Davey <rich@photonstorm.com>
  124583. * @copyright 2019 Photon Storm Ltd.
  124584. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124585. */
  124586. /**
  124587. * Moves the given element to the bottom of the array.
  124588. * The array is modified in-place.
  124589. *
  124590. * @function Phaser.Utils.Array.SendToBack
  124591. * @since 3.4.0
  124592. *
  124593. * @param {array} array - The array.
  124594. * @param {*} item - The element to move.
  124595. *
  124596. * @return {*} The element that was moved.
  124597. */
  124598. var SendToBack = function (array, item)
  124599. {
  124600. var currentIndex = array.indexOf(item);
  124601. if (currentIndex !== -1 && currentIndex > 0)
  124602. {
  124603. array.splice(currentIndex, 1);
  124604. array.unshift(item);
  124605. }
  124606. return item;
  124607. };
  124608. module.exports = SendToBack;
  124609. /***/ }),
  124610. /* 877 */
  124611. /***/ (function(module, exports) {
  124612. /**
  124613. * @author Richard Davey <rich@photonstorm.com>
  124614. * @copyright 2019 Photon Storm Ltd.
  124615. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124616. */
  124617. /**
  124618. * Replaces an element of the array with the new element.
  124619. * The new element cannot already be a member of the array.
  124620. * The array is modified in-place.
  124621. *
  124622. * @function Phaser.Utils.Array.Replace
  124623. * @since 3.4.0
  124624. *
  124625. * @param {*} oldChild - The element in the array that will be replaced.
  124626. * @param {*} newChild - The element to be inserted into the array at the position of `oldChild`.
  124627. *
  124628. * @return {boolean} Returns true if the oldChild was successfully replaced, otherwise returns false.
  124629. */
  124630. var Replace = function (array, oldChild, newChild)
  124631. {
  124632. var index1 = array.indexOf(oldChild);
  124633. var index2 = array.indexOf(newChild);
  124634. if (index1 !== -1 && index2 === -1)
  124635. {
  124636. array[index1] = newChild;
  124637. return true;
  124638. }
  124639. else
  124640. {
  124641. return false;
  124642. }
  124643. };
  124644. module.exports = Replace;
  124645. /***/ }),
  124646. /* 878 */
  124647. /***/ (function(module, exports, __webpack_require__) {
  124648. /**
  124649. * @author Richard Davey <rich@photonstorm.com>
  124650. * @copyright 2019 Photon Storm Ltd.
  124651. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124652. */
  124653. var SpliceOne = __webpack_require__(97);
  124654. /**
  124655. * Removes a random object from the given array and returns it.
  124656. * Will return null if there are no array items that fall within the specified range or if there is no item for the randomly chosen index.
  124657. *
  124658. * @function Phaser.Utils.Array.RemoveRandomElement
  124659. * @since 3.0.0
  124660. *
  124661. * @param {array} array - The array to removed a random element from.
  124662. * @param {integer} [start=0] - The array index to start the search from.
  124663. * @param {integer} [length=array.length] - Optional restriction on the number of elements to randomly select from.
  124664. *
  124665. * @return {object} The random element that was removed, or `null` if there were no array elements that fell within the given range.
  124666. */
  124667. var RemoveRandomElement = function (array, start, length)
  124668. {
  124669. if (start === undefined) { start = 0; }
  124670. if (length === undefined) { length = array.length; }
  124671. var randomIndex = start + Math.floor(Math.random() * length);
  124672. return SpliceOne(array, randomIndex);
  124673. };
  124674. module.exports = RemoveRandomElement;
  124675. /***/ }),
  124676. /* 879 */
  124677. /***/ (function(module, exports, __webpack_require__) {
  124678. /**
  124679. * @author Richard Davey <rich@photonstorm.com>
  124680. * @copyright 2019 Photon Storm Ltd.
  124681. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124682. */
  124683. var SafeRange = __webpack_require__(68);
  124684. /**
  124685. * Removes the item within the given range in the array.
  124686. *
  124687. * The array is modified in-place.
  124688. *
  124689. * You can optionally specify a callback to be invoked for the item/s successfully removed from the array.
  124690. *
  124691. * @function Phaser.Utils.Array.RemoveBetween
  124692. * @since 3.4.0
  124693. *
  124694. * @param {array} array - The array to be modified.
  124695. * @param {integer} startIndex - The start index to remove from.
  124696. * @param {integer} endIndex - The end index to remove to.
  124697. * @param {function} [callback] - A callback to be invoked for the item removed from the array.
  124698. * @param {object} [context] - The context in which the callback is invoked.
  124699. *
  124700. * @return {Array.<*>} An array of items that were removed.
  124701. */
  124702. var RemoveBetween = function (array, startIndex, endIndex, callback, context)
  124703. {
  124704. if (startIndex === undefined) { startIndex = 0; }
  124705. if (endIndex === undefined) { endIndex = array.length; }
  124706. if (context === undefined) { context = array; }
  124707. if (SafeRange(array, startIndex, endIndex))
  124708. {
  124709. var size = endIndex - startIndex;
  124710. var removed = array.splice(startIndex, size);
  124711. if (callback)
  124712. {
  124713. for (var i = 0; i < removed.length; i++)
  124714. {
  124715. var entry = removed[i];
  124716. callback.call(context, entry);
  124717. }
  124718. }
  124719. return removed;
  124720. }
  124721. else
  124722. {
  124723. return [];
  124724. }
  124725. };
  124726. module.exports = RemoveBetween;
  124727. /***/ }),
  124728. /* 880 */
  124729. /***/ (function(module, exports, __webpack_require__) {
  124730. /**
  124731. * @author Richard Davey <rich@photonstorm.com>
  124732. * @copyright 2019 Photon Storm Ltd.
  124733. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124734. */
  124735. var SpliceOne = __webpack_require__(97);
  124736. /**
  124737. * Removes the item from the given position in the array.
  124738. *
  124739. * The array is modified in-place.
  124740. *
  124741. * You can optionally specify a callback to be invoked for the item if it is successfully removed from the array.
  124742. *
  124743. * @function Phaser.Utils.Array.RemoveAt
  124744. * @since 3.4.0
  124745. *
  124746. * @param {array} array - The array to be modified.
  124747. * @param {integer} index - The array index to remove the item from. The index must be in bounds or it will throw an error.
  124748. * @param {function} [callback] - A callback to be invoked for the item removed from the array.
  124749. * @param {object} [context] - The context in which the callback is invoked.
  124750. *
  124751. * @return {*} The item that was removed.
  124752. */
  124753. var RemoveAt = function (array, index, callback, context)
  124754. {
  124755. if (context === undefined) { context = array; }
  124756. if (index < 0 || index > array.length - 1)
  124757. {
  124758. throw new Error('Index out of bounds');
  124759. }
  124760. var item = SpliceOne(array, index);
  124761. if (callback)
  124762. {
  124763. callback.call(context, item);
  124764. }
  124765. return item;
  124766. };
  124767. module.exports = RemoveAt;
  124768. /***/ }),
  124769. /* 881 */
  124770. /***/ (function(module, exports, __webpack_require__) {
  124771. /**
  124772. * @author Richard Davey <rich@photonstorm.com>
  124773. * @copyright 2019 Photon Storm Ltd.
  124774. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124775. */
  124776. var RoundAwayFromZero = __webpack_require__(372);
  124777. /**
  124778. * Create an array of numbers (positive and/or negative) progressing from `start`
  124779. * up to but not including `end` by advancing by `step`.
  124780. *
  124781. * If `start` is less than `end` a zero-length range is created unless a negative `step` is specified.
  124782. *
  124783. * Certain values for `start` and `end` (eg. NaN/undefined/null) are currently coerced to 0;
  124784. * for forward compatibility make sure to pass in actual numbers.
  124785. *
  124786. * @example
  124787. * NumberArrayStep(4);
  124788. * // => [0, 1, 2, 3]
  124789. *
  124790. * NumberArrayStep(1, 5);
  124791. * // => [1, 2, 3, 4]
  124792. *
  124793. * NumberArrayStep(0, 20, 5);
  124794. * // => [0, 5, 10, 15]
  124795. *
  124796. * NumberArrayStep(0, -4, -1);
  124797. * // => [0, -1, -2, -3]
  124798. *
  124799. * NumberArrayStep(1, 4, 0);
  124800. * // => [1, 1, 1]
  124801. *
  124802. * NumberArrayStep(0);
  124803. * // => []
  124804. *
  124805. * @function Phaser.Utils.Array.NumberArrayStep
  124806. * @since 3.0.0
  124807. *
  124808. * @param {number} [start=0] - The start of the range.
  124809. * @param {number} [end=null] - The end of the range.
  124810. * @param {number} [step=1] - The value to increment or decrement by.
  124811. *
  124812. * @return {number[]} The array of number values.
  124813. */
  124814. var NumberArrayStep = function (start, end, step)
  124815. {
  124816. if (start === undefined) { start = 0; }
  124817. if (end === undefined) { end = null; }
  124818. if (step === undefined) { step = 1; }
  124819. if (end === null)
  124820. {
  124821. end = start;
  124822. start = 0;
  124823. }
  124824. var result = [];
  124825. var total = Math.max(RoundAwayFromZero((end - start) / (step || 1)), 0);
  124826. for (var i = 0; i < total; i++)
  124827. {
  124828. result.push(start);
  124829. start += step;
  124830. }
  124831. return result;
  124832. };
  124833. module.exports = NumberArrayStep;
  124834. /***/ }),
  124835. /* 882 */
  124836. /***/ (function(module, exports) {
  124837. /**
  124838. * @author Richard Davey <rich@photonstorm.com>
  124839. * @copyright 2019 Photon Storm Ltd.
  124840. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124841. */
  124842. /**
  124843. * Create an array representing the range of numbers (usually integers), between, and inclusive of,
  124844. * the given `start` and `end` arguments. For example:
  124845. *
  124846. * `var array = numberArray(2, 4); // array = [2, 3, 4]`
  124847. * `var array = numberArray(0, 9); // array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]`
  124848. *
  124849. * This is equivalent to `numberArrayStep(start, end, 1)`.
  124850. *
  124851. * You can optionally provide a prefix and / or suffix string. If given the array will contain
  124852. * strings, not integers. For example:
  124853. *
  124854. * `var array = numberArray(1, 4, 'Level '); // array = ["Level 1", "Level 2", "Level 3", "Level 4"]`
  124855. * `var array = numberArray(5, 7, 'HD-', '.png'); // array = ["HD-5.png", "HD-6.png", "HD-7.png"]`
  124856. *
  124857. * @function Phaser.Utils.Array.NumberArray
  124858. * @since 3.0.0
  124859. *
  124860. * @param {number} start - The minimum value the array starts with.
  124861. * @param {number} end - The maximum value the array contains.
  124862. * @param {string} [prefix] - Optional prefix to place before the number. If provided the array will contain strings, not integers.
  124863. * @param {string} [suffix] - Optional suffix to place after the number. If provided the array will contain strings, not integers.
  124864. *
  124865. * @return {(number[]|string[])} The array of number values, or strings if a prefix or suffix was provided.
  124866. */
  124867. var NumberArray = function (start, end, prefix, suffix)
  124868. {
  124869. var result = [];
  124870. for (var i = start; i <= end; i++)
  124871. {
  124872. if (prefix || suffix)
  124873. {
  124874. var key = (prefix) ? prefix + i.toString() : i.toString();
  124875. if (suffix)
  124876. {
  124877. key = key.concat(suffix);
  124878. }
  124879. result.push(key);
  124880. }
  124881. else
  124882. {
  124883. result.push(i);
  124884. }
  124885. }
  124886. return result;
  124887. };
  124888. module.exports = NumberArray;
  124889. /***/ }),
  124890. /* 883 */
  124891. /***/ (function(module, exports) {
  124892. /**
  124893. * @author Richard Davey <rich@photonstorm.com>
  124894. * @copyright 2019 Photon Storm Ltd.
  124895. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124896. */
  124897. /**
  124898. * Moves the given array element up one place in the array.
  124899. * The array is modified in-place.
  124900. *
  124901. * @function Phaser.Utils.Array.MoveUp
  124902. * @since 3.4.0
  124903. *
  124904. * @param {array} array - The input array.
  124905. * @param {*} item - The element to move up the array.
  124906. *
  124907. * @return {array} The input array.
  124908. */
  124909. var MoveUp = function (array, item)
  124910. {
  124911. var currentIndex = array.indexOf(item);
  124912. if (currentIndex !== -1 && currentIndex < array.length - 1)
  124913. {
  124914. // The element one above `item` in the array
  124915. var item2 = array[currentIndex + 1];
  124916. var index2 = array.indexOf(item2);
  124917. array[currentIndex] = item2;
  124918. array[index2] = item;
  124919. }
  124920. return array;
  124921. };
  124922. module.exports = MoveUp;
  124923. /***/ }),
  124924. /* 884 */
  124925. /***/ (function(module, exports) {
  124926. /**
  124927. * @author Richard Davey <rich@photonstorm.com>
  124928. * @copyright 2019 Photon Storm Ltd.
  124929. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124930. */
  124931. /**
  124932. * Moves an element in an array to a new position within the same array.
  124933. * The array is modified in-place.
  124934. *
  124935. * @function Phaser.Utils.Array.MoveTo
  124936. * @since 3.4.0
  124937. *
  124938. * @param {array} array - The array.
  124939. * @param {*} item - The element to move.
  124940. * @param {integer} index - The new index that the element will be moved to.
  124941. *
  124942. * @return {*} The element that was moved.
  124943. */
  124944. var MoveTo = function (array, item, index)
  124945. {
  124946. var currentIndex = array.indexOf(item);
  124947. if (currentIndex === -1 || index < 0 || index >= array.length)
  124948. {
  124949. throw new Error('Supplied index out of bounds');
  124950. }
  124951. if (currentIndex !== index)
  124952. {
  124953. // Remove
  124954. array.splice(currentIndex, 1);
  124955. // Add in new location
  124956. array.splice(index, 0, item);
  124957. }
  124958. return item;
  124959. };
  124960. module.exports = MoveTo;
  124961. /***/ }),
  124962. /* 885 */
  124963. /***/ (function(module, exports) {
  124964. /**
  124965. * @author Richard Davey <rich@photonstorm.com>
  124966. * @copyright 2019 Photon Storm Ltd.
  124967. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124968. */
  124969. /**
  124970. * Moves the given array element down one place in the array.
  124971. * The array is modified in-place.
  124972. *
  124973. * @function Phaser.Utils.Array.MoveDown
  124974. * @since 3.4.0
  124975. *
  124976. * @param {array} array - The input array.
  124977. * @param {*} item - The element to move down the array.
  124978. *
  124979. * @return {array} The input array.
  124980. */
  124981. var MoveDown = function (array, item)
  124982. {
  124983. var currentIndex = array.indexOf(item);
  124984. if (currentIndex > 0)
  124985. {
  124986. var item2 = array[currentIndex - 1];
  124987. var index2 = array.indexOf(item2);
  124988. array[currentIndex] = item2;
  124989. array[index2] = item;
  124990. }
  124991. return array;
  124992. };
  124993. module.exports = MoveDown;
  124994. /***/ }),
  124995. /* 886 */
  124996. /***/ (function(module, exports, __webpack_require__) {
  124997. /**
  124998. * @author Richard Davey <rich@photonstorm.com>
  124999. * @copyright 2019 Photon Storm Ltd.
  125000. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125001. */
  125002. var SafeRange = __webpack_require__(68);
  125003. /**
  125004. * Returns the first element in the array.
  125005. *
  125006. * You can optionally specify a matching criteria using the `property` and `value` arguments.
  125007. *
  125008. * For example: `getAll('visible', true)` would return the first element that had its `visible` property set.
  125009. *
  125010. * Optionally you can specify a start and end index. For example if the array had 100 elements,
  125011. * and you set `startIndex` to 0 and `endIndex` to 50, it would search only the first 50 elements.
  125012. *
  125013. * @function Phaser.Utils.Array.GetFirst
  125014. * @since 3.4.0
  125015. *
  125016. * @param {array} array - The array to search.
  125017. * @param {string} [property] - The property to test on each array element.
  125018. * @param {*} [value] - The value to test the property against. Must pass a strict (`===`) comparison check.
  125019. * @param {integer} [startIndex=0] - An optional start index to search from.
  125020. * @param {integer} [endIndex=array.length] - An optional end index to search up to (but not included)
  125021. *
  125022. * @return {object} The first matching element from the array, or `null` if no element could be found in the range given.
  125023. */
  125024. var GetFirst = function (array, property, value, startIndex, endIndex)
  125025. {
  125026. if (startIndex === undefined) { startIndex = 0; }
  125027. if (endIndex === undefined) { endIndex = array.length; }
  125028. if (SafeRange(array, startIndex, endIndex))
  125029. {
  125030. for (var i = startIndex; i < endIndex; i++)
  125031. {
  125032. var child = array[i];
  125033. if (!property ||
  125034. (property && value === undefined && child.hasOwnProperty(property)) ||
  125035. (property && value !== undefined && child[property] === value))
  125036. {
  125037. return child;
  125038. }
  125039. }
  125040. }
  125041. return null;
  125042. };
  125043. module.exports = GetFirst;
  125044. /***/ }),
  125045. /* 887 */
  125046. /***/ (function(module, exports, __webpack_require__) {
  125047. /**
  125048. * @author Richard Davey <rich@photonstorm.com>
  125049. * @copyright 2019 Photon Storm Ltd.
  125050. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125051. */
  125052. var SafeRange = __webpack_require__(68);
  125053. /**
  125054. * Returns all elements in the array.
  125055. *
  125056. * You can optionally specify a matching criteria using the `property` and `value` arguments.
  125057. *
  125058. * For example: `getAll('visible', true)` would return only elements that have their visible property set.
  125059. *
  125060. * Optionally you can specify a start and end index. For example if the array had 100 elements,
  125061. * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only
  125062. * the first 50 elements.
  125063. *
  125064. * @function Phaser.Utils.Array.GetAll
  125065. * @since 3.4.0
  125066. *
  125067. * @param {array} array - The array to search.
  125068. * @param {string} [property] - The property to test on each array element.
  125069. * @param {*} [value] - The value to test the property against. Must pass a strict (`===`) comparison check.
  125070. * @param {integer} [startIndex] - An optional start index to search from.
  125071. * @param {integer} [endIndex] - An optional end index to search to.
  125072. *
  125073. * @return {array} All matching elements from the array.
  125074. */
  125075. var GetAll = function (array, property, value, startIndex, endIndex)
  125076. {
  125077. if (startIndex === undefined) { startIndex = 0; }
  125078. if (endIndex === undefined) { endIndex = array.length; }
  125079. var output = [];
  125080. if (SafeRange(array, startIndex, endIndex))
  125081. {
  125082. for (var i = startIndex; i < endIndex; i++)
  125083. {
  125084. var child = array[i];
  125085. if (!property ||
  125086. (property && value === undefined && child.hasOwnProperty(property)) ||
  125087. (property && value !== undefined && child[property] === value))
  125088. {
  125089. output.push(child);
  125090. }
  125091. }
  125092. }
  125093. return output;
  125094. };
  125095. module.exports = GetAll;
  125096. /***/ }),
  125097. /* 888 */
  125098. /***/ (function(module, exports, __webpack_require__) {
  125099. /**
  125100. * @author Richard Davey <rich@photonstorm.com>
  125101. * @copyright 2019 Photon Storm Ltd.
  125102. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125103. */
  125104. var SafeRange = __webpack_require__(68);
  125105. /**
  125106. * Passes each element in the array, between the start and end indexes, to the given callback.
  125107. *
  125108. * @function Phaser.Utils.Array.EachInRange
  125109. * @since 3.4.0
  125110. *
  125111. * @param {array} array - The array to search.
  125112. * @param {function} callback - A callback to be invoked for each item in the array.
  125113. * @param {object} context - The context in which the callback is invoked.
  125114. * @param {integer} startIndex - The start index to search from.
  125115. * @param {integer} endIndex - The end index to search to.
  125116. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  125117. *
  125118. * @return {array} The input array.
  125119. */
  125120. var EachInRange = function (array, callback, context, startIndex, endIndex)
  125121. {
  125122. if (startIndex === undefined) { startIndex = 0; }
  125123. if (endIndex === undefined) { endIndex = array.length; }
  125124. if (SafeRange(array, startIndex, endIndex))
  125125. {
  125126. var i;
  125127. var args = [ null ];
  125128. for (i = 5; i < arguments.length; i++)
  125129. {
  125130. args.push(arguments[i]);
  125131. }
  125132. for (i = startIndex; i < endIndex; i++)
  125133. {
  125134. args[0] = array[i];
  125135. callback.apply(context, args);
  125136. }
  125137. }
  125138. return array;
  125139. };
  125140. module.exports = EachInRange;
  125141. /***/ }),
  125142. /* 889 */
  125143. /***/ (function(module, exports) {
  125144. /**
  125145. * @author Richard Davey <rich@photonstorm.com>
  125146. * @copyright 2019 Photon Storm Ltd.
  125147. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125148. */
  125149. /**
  125150. * Passes each element in the array to the given callback.
  125151. *
  125152. * @function Phaser.Utils.Array.Each
  125153. * @since 3.4.0
  125154. *
  125155. * @param {array} array - The array to search.
  125156. * @param {function} callback - A callback to be invoked for each item in the array.
  125157. * @param {object} context - The context in which the callback is invoked.
  125158. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the current array item.
  125159. *
  125160. * @return {array} The input array.
  125161. */
  125162. var Each = function (array, callback, context)
  125163. {
  125164. var i;
  125165. var args = [ null ];
  125166. for (i = 3; i < arguments.length; i++)
  125167. {
  125168. args.push(arguments[i]);
  125169. }
  125170. for (i = 0; i < array.length; i++)
  125171. {
  125172. args[0] = array[i];
  125173. callback.apply(context, args);
  125174. }
  125175. return array;
  125176. };
  125177. module.exports = Each;
  125178. /***/ }),
  125179. /* 890 */
  125180. /***/ (function(module, exports, __webpack_require__) {
  125181. /**
  125182. * @author Richard Davey <rich@photonstorm.com>
  125183. * @copyright 2019 Photon Storm Ltd.
  125184. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125185. */
  125186. var SafeRange = __webpack_require__(68);
  125187. /**
  125188. * Returns the total number of elements in the array which have a property matching the given value.
  125189. *
  125190. * @function Phaser.Utils.Array.CountAllMatching
  125191. * @since 3.4.0
  125192. *
  125193. * @param {array} array - The array to search.
  125194. * @param {string} property - The property to test on each array element.
  125195. * @param {*} value - The value to test the property against. Must pass a strict (`===`) comparison check.
  125196. * @param {integer} [startIndex] - An optional start index to search from.
  125197. * @param {integer} [endIndex] - An optional end index to search to.
  125198. *
  125199. * @return {integer} The total number of elements with properties matching the given value.
  125200. */
  125201. var CountAllMatching = function (array, property, value, startIndex, endIndex)
  125202. {
  125203. if (startIndex === undefined) { startIndex = 0; }
  125204. if (endIndex === undefined) { endIndex = array.length; }
  125205. var total = 0;
  125206. if (SafeRange(array, startIndex, endIndex))
  125207. {
  125208. for (var i = startIndex; i < endIndex; i++)
  125209. {
  125210. var child = array[i];
  125211. if (child[property] === value)
  125212. {
  125213. total++;
  125214. }
  125215. }
  125216. }
  125217. return total;
  125218. };
  125219. module.exports = CountAllMatching;
  125220. /***/ }),
  125221. /* 891 */
  125222. /***/ (function(module, exports) {
  125223. /**
  125224. * @author Richard Davey <rich@photonstorm.com>
  125225. * @copyright 2019 Photon Storm Ltd.
  125226. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125227. */
  125228. /**
  125229. * Moves the given element to the top of the array.
  125230. * The array is modified in-place.
  125231. *
  125232. * @function Phaser.Utils.Array.BringToTop
  125233. * @since 3.4.0
  125234. *
  125235. * @param {array} array - The array.
  125236. * @param {*} item - The element to move.
  125237. *
  125238. * @return {*} The element that was moved.
  125239. */
  125240. var BringToTop = function (array, item)
  125241. {
  125242. var currentIndex = array.indexOf(item);
  125243. if (currentIndex !== -1 && currentIndex < array.length)
  125244. {
  125245. array.splice(currentIndex, 1);
  125246. array.push(item);
  125247. }
  125248. return item;
  125249. };
  125250. module.exports = BringToTop;
  125251. /***/ }),
  125252. /* 892 */
  125253. /***/ (function(module, exports) {
  125254. /**
  125255. * @author Richard Davey <rich@photonstorm.com>
  125256. * @copyright 2019 Photon Storm Ltd.
  125257. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125258. */
  125259. /**
  125260. * Adds the given item, or array of items, to the array starting at the index specified.
  125261. *
  125262. * Each item must be unique within the array.
  125263. *
  125264. * Existing elements in the array are shifted up.
  125265. *
  125266. * The array is modified in-place and returned.
  125267. *
  125268. * You can optionally specify a limit to the maximum size of the array. If the quantity of items being
  125269. * added will take the array length over this limit, it will stop adding once the limit is reached.
  125270. *
  125271. * You can optionally specify a callback to be invoked for each item successfully added to the array.
  125272. *
  125273. * @function Phaser.Utils.Array.AddAt
  125274. * @since 3.4.0
  125275. *
  125276. * @param {array} array - The array to be added to.
  125277. * @param {any|any[]} item - The item, or array of items, to add to the array.
  125278. * @param {integer} [index=0] - The index in the array where the item will be inserted.
  125279. * @param {integer} [limit] - Optional limit which caps the size of the array.
  125280. * @param {function} [callback] - A callback to be invoked for each item successfully added to the array.
  125281. * @param {object} [context] - The context in which the callback is invoked.
  125282. *
  125283. * @return {array} The input array.
  125284. */
  125285. var AddAt = function (array, item, index, limit, callback, context)
  125286. {
  125287. if (index === undefined) { index = 0; }
  125288. if (context === undefined) { context = array; }
  125289. if (limit > 0)
  125290. {
  125291. var remaining = limit - array.length;
  125292. // There's nothing more we can do here, the array is full
  125293. if (remaining <= 0)
  125294. {
  125295. return null;
  125296. }
  125297. }
  125298. // Fast path to avoid array mutation and iteration
  125299. if (!Array.isArray(item))
  125300. {
  125301. if (array.indexOf(item) === -1)
  125302. {
  125303. array.splice(index, 0, item);
  125304. if (callback)
  125305. {
  125306. callback.call(context, item);
  125307. }
  125308. return item;
  125309. }
  125310. else
  125311. {
  125312. return null;
  125313. }
  125314. }
  125315. // If we got this far, we have an array of items to insert
  125316. // Ensure all the items are unique
  125317. var itemLength = item.length - 1;
  125318. while (itemLength >= 0)
  125319. {
  125320. if (array.indexOf(item[itemLength]) !== -1)
  125321. {
  125322. // Already exists in array, so remove it
  125323. item.pop();
  125324. }
  125325. itemLength--;
  125326. }
  125327. // Anything left?
  125328. itemLength = item.length;
  125329. if (itemLength === 0)
  125330. {
  125331. return null;
  125332. }
  125333. // Truncate to the limit
  125334. if (limit > 0 && itemLength > remaining)
  125335. {
  125336. item.splice(remaining);
  125337. itemLength = remaining;
  125338. }
  125339. for (var i = itemLength - 1; i >= 0; i--)
  125340. {
  125341. var entry = item[i];
  125342. array.splice(index, 0, entry);
  125343. if (callback)
  125344. {
  125345. callback.call(context, entry);
  125346. }
  125347. }
  125348. return item;
  125349. };
  125350. module.exports = AddAt;
  125351. /***/ }),
  125352. /* 893 */
  125353. /***/ (function(module, exports) {
  125354. /**
  125355. * @author Richard Davey <rich@photonstorm.com>
  125356. * @copyright 2019 Photon Storm Ltd.
  125357. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125358. */
  125359. /**
  125360. * Adds the given item, or array of items, to the array.
  125361. *
  125362. * Each item must be unique within the array.
  125363. *
  125364. * The array is modified in-place and returned.
  125365. *
  125366. * You can optionally specify a limit to the maximum size of the array. If the quantity of items being
  125367. * added will take the array length over this limit, it will stop adding once the limit is reached.
  125368. *
  125369. * You can optionally specify a callback to be invoked for each item successfully added to the array.
  125370. *
  125371. * @function Phaser.Utils.Array.Add
  125372. * @since 3.4.0
  125373. *
  125374. * @param {array} array - The array to be added to.
  125375. * @param {any|any[]} item - The item, or array of items, to add to the array. Each item must be unique within the array.
  125376. * @param {integer} [limit] - Optional limit which caps the size of the array.
  125377. * @param {function} [callback] - A callback to be invoked for each item successfully added to the array.
  125378. * @param {object} [context] - The context in which the callback is invoked.
  125379. *
  125380. * @return {array} The input array.
  125381. */
  125382. var Add = function (array, item, limit, callback, context)
  125383. {
  125384. if (context === undefined) { context = array; }
  125385. if (limit > 0)
  125386. {
  125387. var remaining = limit - array.length;
  125388. // There's nothing more we can do here, the array is full
  125389. if (remaining <= 0)
  125390. {
  125391. return null;
  125392. }
  125393. }
  125394. // Fast path to avoid array mutation and iteration
  125395. if (!Array.isArray(item))
  125396. {
  125397. if (array.indexOf(item) === -1)
  125398. {
  125399. array.push(item);
  125400. if (callback)
  125401. {
  125402. callback.call(context, item);
  125403. }
  125404. return item;
  125405. }
  125406. else
  125407. {
  125408. return null;
  125409. }
  125410. }
  125411. // If we got this far, we have an array of items to insert
  125412. // Ensure all the items are unique
  125413. var itemLength = item.length - 1;
  125414. while (itemLength >= 0)
  125415. {
  125416. if (array.indexOf(item[itemLength]) !== -1)
  125417. {
  125418. // Already exists in array, so remove it
  125419. item.pop();
  125420. }
  125421. itemLength--;
  125422. }
  125423. // Anything left?
  125424. itemLength = item.length;
  125425. if (itemLength === 0)
  125426. {
  125427. return null;
  125428. }
  125429. if (limit > 0 && itemLength > remaining)
  125430. {
  125431. item.splice(remaining);
  125432. itemLength = remaining;
  125433. }
  125434. for (var i = 0; i < itemLength; i++)
  125435. {
  125436. var entry = item[i];
  125437. array.push(entry);
  125438. if (callback)
  125439. {
  125440. callback.call(context, entry);
  125441. }
  125442. }
  125443. return item;
  125444. };
  125445. module.exports = Add;
  125446. /***/ }),
  125447. /* 894 */
  125448. /***/ (function(module, exports, __webpack_require__) {
  125449. /**
  125450. * @author Richard Davey <rich@photonstorm.com>
  125451. * @copyright 2019 Photon Storm Ltd.
  125452. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125453. */
  125454. var RotateMatrix = __webpack_require__(119);
  125455. /**
  125456. * Rotates the array matrix to the left (or -90 degrees)
  125457. *
  125458. * @function Phaser.Utils.Array.Matrix.RotateRight
  125459. * @since 3.0.0
  125460. *
  125461. * @param {array} matrix - The array to rotate.
  125462. *
  125463. * @return {array} The rotated matrix array. The source matrix should be discard for the returned matrix.
  125464. */
  125465. var RotateRight = function (matrix)
  125466. {
  125467. return RotateMatrix(matrix, -90);
  125468. };
  125469. module.exports = RotateRight;
  125470. /***/ }),
  125471. /* 895 */
  125472. /***/ (function(module, exports, __webpack_require__) {
  125473. /**
  125474. * @author Richard Davey <rich@photonstorm.com>
  125475. * @copyright 2019 Photon Storm Ltd.
  125476. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125477. */
  125478. var RotateMatrix = __webpack_require__(119);
  125479. /**
  125480. * Rotates the array matrix to the left (or 90 degrees)
  125481. *
  125482. * @function Phaser.Utils.Array.Matrix.RotateLeft
  125483. * @since 3.0.0
  125484. *
  125485. * @param {array} matrix - The array to rotate.
  125486. *
  125487. * @return {array} The rotated matrix array. The source matrix should be discard for the returned matrix.
  125488. */
  125489. var RotateLeft = function (matrix)
  125490. {
  125491. return RotateMatrix(matrix, 90);
  125492. };
  125493. module.exports = RotateLeft;
  125494. /***/ }),
  125495. /* 896 */
  125496. /***/ (function(module, exports, __webpack_require__) {
  125497. /**
  125498. * @author Richard Davey <rich@photonstorm.com>
  125499. * @copyright 2019 Photon Storm Ltd.
  125500. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125501. */
  125502. var RotateMatrix = __webpack_require__(119);
  125503. /**
  125504. * Rotates the array matrix 180 degrees.
  125505. *
  125506. * @function Phaser.Utils.Array.Matrix.Rotate180
  125507. * @since 3.0.0
  125508. *
  125509. * @param {array} matrix - The array to rotate.
  125510. *
  125511. * @return {array} The rotated matrix array. The source matrix should be discard for the returned matrix.
  125512. */
  125513. var Rotate180 = function (matrix)
  125514. {
  125515. return RotateMatrix(matrix, 180);
  125516. };
  125517. module.exports = Rotate180;
  125518. /***/ }),
  125519. /* 897 */
  125520. /***/ (function(module, exports) {
  125521. /**
  125522. * @author Richard Davey <rich@photonstorm.com>
  125523. * @copyright 2019 Photon Storm Ltd.
  125524. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125525. */
  125526. /**
  125527. * Reverses the rows in the given Array Matrix.
  125528. *
  125529. * @function Phaser.Utils.Array.Matrix.ReverseRows
  125530. * @since 3.0.0
  125531. *
  125532. * @param {array} matrix - The array matrix to reverse the rows for.
  125533. *
  125534. * @return {array} The column reversed matrix.
  125535. */
  125536. var ReverseRows = function (matrix)
  125537. {
  125538. for (var i = 0; i < matrix.length; i++)
  125539. {
  125540. matrix[i].reverse();
  125541. }
  125542. return matrix;
  125543. };
  125544. module.exports = ReverseRows;
  125545. /***/ }),
  125546. /* 898 */
  125547. /***/ (function(module, exports) {
  125548. /**
  125549. * @author Richard Davey <rich@photonstorm.com>
  125550. * @copyright 2019 Photon Storm Ltd.
  125551. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125552. */
  125553. /**
  125554. * Reverses the columns in the given Array Matrix.
  125555. *
  125556. * @function Phaser.Utils.Array.Matrix.ReverseColumns
  125557. * @since 3.0.0
  125558. *
  125559. * @param {array} matrix - The array matrix to reverse the columns for.
  125560. *
  125561. * @return {array} The column reversed matrix.
  125562. */
  125563. var ReverseColumns = function (matrix)
  125564. {
  125565. return matrix.reverse();
  125566. };
  125567. module.exports = ReverseColumns;
  125568. /***/ }),
  125569. /* 899 */
  125570. /***/ (function(module, exports, __webpack_require__) {
  125571. /**
  125572. * @author Richard Davey <rich@photonstorm.com>
  125573. * @copyright 2019 Photon Storm Ltd.
  125574. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125575. */
  125576. var Pad = __webpack_require__(193);
  125577. var CheckMatrix = __webpack_require__(173);
  125578. /**
  125579. * Generates a string (which you can pass to console.log) from the given Array Matrix.
  125580. *
  125581. * @function Phaser.Utils.Array.Matrix.MatrixToString
  125582. * @since 3.0.0
  125583. *
  125584. * @param {array} matrix - A 2-dimensional array.
  125585. *
  125586. * @return {string} A string representing the matrix.
  125587. */
  125588. var MatrixToString = function (matrix)
  125589. {
  125590. var str = '';
  125591. if (!CheckMatrix(matrix))
  125592. {
  125593. return str;
  125594. }
  125595. for (var r = 0; r < matrix.length; r++)
  125596. {
  125597. for (var c = 0; c < matrix[r].length; c++)
  125598. {
  125599. var cell = matrix[r][c].toString();
  125600. if (cell !== 'undefined')
  125601. {
  125602. str += Pad(cell, 2);
  125603. }
  125604. else
  125605. {
  125606. str += '?';
  125607. }
  125608. if (c < matrix[r].length - 1)
  125609. {
  125610. str += ' |';
  125611. }
  125612. }
  125613. if (r < matrix.length - 1)
  125614. {
  125615. str += '\n';
  125616. for (var i = 0; i < matrix[r].length; i++)
  125617. {
  125618. str += '---';
  125619. if (i < matrix[r].length - 1)
  125620. {
  125621. str += '+';
  125622. }
  125623. }
  125624. str += '\n';
  125625. }
  125626. }
  125627. return str;
  125628. };
  125629. module.exports = MatrixToString;
  125630. /***/ }),
  125631. /* 900 */
  125632. /***/ (function(module, exports, __webpack_require__) {
  125633. /**
  125634. * @author Richard Davey <rich@photonstorm.com>
  125635. * @copyright 2019 Photon Storm Ltd.
  125636. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125637. */
  125638. /**
  125639. * @namespace Phaser.Utils.Array.Matrix
  125640. */
  125641. module.exports = {
  125642. CheckMatrix: __webpack_require__(173),
  125643. MatrixToString: __webpack_require__(899),
  125644. ReverseColumns: __webpack_require__(898),
  125645. ReverseRows: __webpack_require__(897),
  125646. Rotate180: __webpack_require__(896),
  125647. RotateLeft: __webpack_require__(895),
  125648. RotateMatrix: __webpack_require__(119),
  125649. RotateRight: __webpack_require__(894),
  125650. TransposeMatrix: __webpack_require__(318)
  125651. };
  125652. /***/ }),
  125653. /* 901 */
  125654. /***/ (function(module, exports, __webpack_require__) {
  125655. /**
  125656. * @author Richard Davey <rich@photonstorm.com>
  125657. * @copyright 2019 Photon Storm Ltd.
  125658. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125659. */
  125660. var Class = __webpack_require__(0);
  125661. var List = __webpack_require__(120);
  125662. var PluginCache = __webpack_require__(17);
  125663. var SceneEvents = __webpack_require__(16);
  125664. var StableSort = __webpack_require__(118);
  125665. /**
  125666. * @classdesc
  125667. * The Display List plugin.
  125668. *
  125669. * Display Lists belong to a Scene and maintain the list of Game Objects to render every frame.
  125670. *
  125671. * Some of these Game Objects may also be part of the Scene's [Update List]{@link Phaser.GameObjects.UpdateList}, for updating.
  125672. *
  125673. * @class DisplayList
  125674. * @extends Phaser.Structs.List.<Phaser.GameObjects.GameObject>
  125675. * @memberof Phaser.GameObjects
  125676. * @constructor
  125677. * @since 3.0.0
  125678. *
  125679. * @param {Phaser.Scene} scene - The Scene that this Display List belongs to.
  125680. */
  125681. var DisplayList = new Class({
  125682. Extends: List,
  125683. initialize:
  125684. function DisplayList (scene)
  125685. {
  125686. List.call(this, scene);
  125687. /**
  125688. * The flag the determines whether Game Objects should be sorted when `depthSort()` is called.
  125689. *
  125690. * @name Phaser.GameObjects.DisplayList#sortChildrenFlag
  125691. * @type {boolean}
  125692. * @default false
  125693. * @since 3.0.0
  125694. */
  125695. this.sortChildrenFlag = false;
  125696. /**
  125697. * The Scene that this Display List belongs to.
  125698. *
  125699. * @name Phaser.GameObjects.DisplayList#scene
  125700. * @type {Phaser.Scene}
  125701. * @since 3.0.0
  125702. */
  125703. this.scene = scene;
  125704. /**
  125705. * The Scene's Systems.
  125706. *
  125707. * @name Phaser.GameObjects.DisplayList#systems
  125708. * @type {Phaser.Scenes.Systems}
  125709. * @since 3.0.0
  125710. */
  125711. this.systems = scene.sys;
  125712. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  125713. scene.sys.events.on(SceneEvents.START, this.start, this);
  125714. },
  125715. /**
  125716. * This method is called automatically, only once, when the Scene is first created.
  125717. * Do not invoke it directly.
  125718. *
  125719. * @method Phaser.GameObjects.DisplayList#boot
  125720. * @private
  125721. * @since 3.5.1
  125722. */
  125723. boot: function ()
  125724. {
  125725. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  125726. },
  125727. /**
  125728. * This method is called automatically by the Scene when it is starting up.
  125729. * It is responsible for creating local systems, properties and listening for Scene events.
  125730. * Do not invoke it directly.
  125731. *
  125732. * @method Phaser.GameObjects.DisplayList#start
  125733. * @private
  125734. * @since 3.5.0
  125735. */
  125736. start: function ()
  125737. {
  125738. this.systems.events.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  125739. },
  125740. /**
  125741. * Force a sort of the display list on the next call to depthSort.
  125742. *
  125743. * @method Phaser.GameObjects.DisplayList#queueDepthSort
  125744. * @since 3.0.0
  125745. */
  125746. queueDepthSort: function ()
  125747. {
  125748. this.sortChildrenFlag = true;
  125749. },
  125750. /**
  125751. * Immediately sorts the display list if the flag is set.
  125752. *
  125753. * @method Phaser.GameObjects.DisplayList#depthSort
  125754. * @since 3.0.0
  125755. */
  125756. depthSort: function ()
  125757. {
  125758. if (this.sortChildrenFlag)
  125759. {
  125760. StableSort.inplace(this.list, this.sortByDepth);
  125761. this.sortChildrenFlag = false;
  125762. }
  125763. },
  125764. /**
  125765. * Compare the depth of two Game Objects.
  125766. *
  125767. * @method Phaser.GameObjects.DisplayList#sortByDepth
  125768. * @since 3.0.0
  125769. *
  125770. * @param {Phaser.GameObjects.GameObject} childA - The first Game Object.
  125771. * @param {Phaser.GameObjects.GameObject} childB - The second Game Object.
  125772. *
  125773. * @return {integer} The difference between the depths of each Game Object.
  125774. */
  125775. sortByDepth: function (childA, childB)
  125776. {
  125777. return childA._depth - childB._depth;
  125778. },
  125779. /**
  125780. * Returns an array which contains all objects currently on the Display List.
  125781. * This is a reference to the main list array, not a copy of it, so be careful not to modify it.
  125782. *
  125783. * @method Phaser.GameObjects.DisplayList#getChildren
  125784. * @since 3.12.0
  125785. *
  125786. * @return {Phaser.GameObjects.GameObject[]} The group members.
  125787. */
  125788. getChildren: function ()
  125789. {
  125790. return this.list;
  125791. },
  125792. /**
  125793. * The Scene that owns this plugin is shutting down.
  125794. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  125795. *
  125796. * @method Phaser.GameObjects.DisplayList#shutdown
  125797. * @private
  125798. * @since 3.0.0
  125799. */
  125800. shutdown: function ()
  125801. {
  125802. var i = this.list.length;
  125803. while (i--)
  125804. {
  125805. this.list[i].destroy(true);
  125806. }
  125807. this.list.length = 0;
  125808. this.systems.events.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  125809. },
  125810. /**
  125811. * The Scene that owns this plugin is being destroyed.
  125812. * We need to shutdown and then kill off all external references.
  125813. *
  125814. * @method Phaser.GameObjects.DisplayList#destroy
  125815. * @private
  125816. * @since 3.0.0
  125817. */
  125818. destroy: function ()
  125819. {
  125820. this.shutdown();
  125821. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  125822. this.scene = null;
  125823. this.systems = null;
  125824. }
  125825. });
  125826. PluginCache.register('DisplayList', DisplayList, 'displayList');
  125827. module.exports = DisplayList;
  125828. /***/ }),
  125829. /* 902 */
  125830. /***/ (function(module, exports, __webpack_require__) {
  125831. /**
  125832. * @author Richard Davey <rich@photonstorm.com>
  125833. * @copyright 2019 Photon Storm Ltd.
  125834. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125835. */
  125836. /**
  125837. * @namespace Phaser.GameObjects
  125838. */
  125839. var GameObjects = {
  125840. Events: __webpack_require__(133),
  125841. DisplayList: __webpack_require__(901),
  125842. GameObjectCreator: __webpack_require__(14),
  125843. GameObjectFactory: __webpack_require__(5),
  125844. UpdateList: __webpack_require__(873),
  125845. Components: __webpack_require__(13),
  125846. BuildGameObject: __webpack_require__(30),
  125847. BuildGameObjectAnimation: __webpack_require__(315),
  125848. GameObject: __webpack_require__(18),
  125849. BitmapText: __webpack_require__(117),
  125850. Blitter: __webpack_require__(171),
  125851. Container: __webpack_require__(170),
  125852. DynamicBitmapText: __webpack_require__(169),
  125853. Extern: __webpack_require__(312),
  125854. Graphics: __webpack_require__(168),
  125855. Group: __webpack_require__(94),
  125856. Image: __webpack_require__(93),
  125857. Particles: __webpack_require__(846),
  125858. PathFollower: __webpack_require__(300),
  125859. RenderTexture: __webpack_require__(164),
  125860. RetroFont: __webpack_require__(837),
  125861. Sprite: __webpack_require__(67),
  125862. Text: __webpack_require__(163),
  125863. TileSprite: __webpack_require__(162),
  125864. Zone: __webpack_require__(137),
  125865. // Shapes
  125866. Shape: __webpack_require__(29),
  125867. Arc: __webpack_require__(298),
  125868. Curve: __webpack_require__(297),
  125869. Ellipse: __webpack_require__(296),
  125870. Grid: __webpack_require__(295),
  125871. IsoBox: __webpack_require__(294),
  125872. IsoTriangle: __webpack_require__(293),
  125873. Line: __webpack_require__(292),
  125874. Polygon: __webpack_require__(291),
  125875. Rectangle: __webpack_require__(286),
  125876. Star: __webpack_require__(285),
  125877. Triangle: __webpack_require__(284),
  125878. // Game Object Factories
  125879. Factories: {
  125880. Blitter: __webpack_require__(792),
  125881. Container: __webpack_require__(791),
  125882. DynamicBitmapText: __webpack_require__(790),
  125883. Extern: __webpack_require__(789),
  125884. Graphics: __webpack_require__(788),
  125885. Group: __webpack_require__(787),
  125886. Image: __webpack_require__(786),
  125887. Particles: __webpack_require__(785),
  125888. PathFollower: __webpack_require__(784),
  125889. RenderTexture: __webpack_require__(783),
  125890. Sprite: __webpack_require__(782),
  125891. StaticBitmapText: __webpack_require__(781),
  125892. Text: __webpack_require__(780),
  125893. TileSprite: __webpack_require__(779),
  125894. Zone: __webpack_require__(778),
  125895. // Shapes
  125896. Arc: __webpack_require__(777),
  125897. Curve: __webpack_require__(776),
  125898. Ellipse: __webpack_require__(775),
  125899. Grid: __webpack_require__(774),
  125900. IsoBox: __webpack_require__(773),
  125901. IsoTriangle: __webpack_require__(772),
  125902. Line: __webpack_require__(771),
  125903. Polygon: __webpack_require__(770),
  125904. Rectangle: __webpack_require__(769),
  125905. Star: __webpack_require__(768),
  125906. Triangle: __webpack_require__(767)
  125907. },
  125908. Creators: {
  125909. Blitter: __webpack_require__(766),
  125910. Container: __webpack_require__(765),
  125911. DynamicBitmapText: __webpack_require__(764),
  125912. Graphics: __webpack_require__(763),
  125913. Group: __webpack_require__(762),
  125914. Image: __webpack_require__(761),
  125915. Particles: __webpack_require__(760),
  125916. RenderTexture: __webpack_require__(759),
  125917. Sprite: __webpack_require__(758),
  125918. StaticBitmapText: __webpack_require__(757),
  125919. Text: __webpack_require__(756),
  125920. TileSprite: __webpack_require__(755),
  125921. Zone: __webpack_require__(754)
  125922. }
  125923. };
  125924. if (false)
  125925. {}
  125926. if (true)
  125927. {
  125928. // WebGL only Game Objects
  125929. GameObjects.Mesh = __webpack_require__(116);
  125930. GameObjects.Quad = __webpack_require__(159);
  125931. GameObjects.Factories.Mesh = __webpack_require__(750);
  125932. GameObjects.Factories.Quad = __webpack_require__(749);
  125933. GameObjects.Creators.Mesh = __webpack_require__(748);
  125934. GameObjects.Creators.Quad = __webpack_require__(747);
  125935. GameObjects.Light = __webpack_require__(281);
  125936. __webpack_require__(280);
  125937. __webpack_require__(746);
  125938. }
  125939. module.exports = GameObjects;
  125940. /***/ }),
  125941. /* 903 */
  125942. /***/ (function(module, exports) {
  125943. /**
  125944. * @author Richard Davey <rich@photonstorm.com>
  125945. * @copyright 2019 Photon Storm Ltd.
  125946. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125947. */
  125948. var imageHeight = 0;
  125949. /**
  125950. * @function addFrame
  125951. * @private
  125952. * @since 3.0.0
  125953. */
  125954. var addFrame = function (texture, sourceIndex, name, frame)
  125955. {
  125956. // The frame values are the exact coordinates to cut the frame out of the atlas from
  125957. var y = imageHeight - frame.y - frame.height;
  125958. texture.add(name, sourceIndex, frame.x, y, frame.width, frame.height);
  125959. // These are the original (non-trimmed) sprite values
  125960. /*
  125961. if (src.trimmed)
  125962. {
  125963. newFrame.setTrim(
  125964. src.sourceSize.w,
  125965. src.sourceSize.h,
  125966. src.spriteSourceSize.x,
  125967. src.spriteSourceSize.y,
  125968. src.spriteSourceSize.w,
  125969. src.spriteSourceSize.h
  125970. );
  125971. }
  125972. */
  125973. };
  125974. /**
  125975. * Parses a Unity YAML File and creates Frames in the Texture.
  125976. * For more details about Sprite Meta Data see https://docs.unity3d.com/ScriptReference/SpriteMetaData.html
  125977. *
  125978. * @function Phaser.Textures.Parsers.UnityYAML
  125979. * @memberof Phaser.Textures.Parsers
  125980. * @private
  125981. * @since 3.0.0
  125982. *
  125983. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  125984. * @param {integer} sourceIndex - The index of the TextureSource.
  125985. * @param {object} yaml - The YAML data.
  125986. *
  125987. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  125988. */
  125989. var UnityYAML = function (texture, sourceIndex, yaml)
  125990. {
  125991. // Add in a __BASE entry (for the entire atlas)
  125992. var source = texture.source[sourceIndex];
  125993. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  125994. imageHeight = source.height;
  125995. var data = yaml.split('\n');
  125996. var lineRegExp = /^[ ]*(- )*(\w+)+[: ]+(.*)/;
  125997. var prevSprite = '';
  125998. var currentSprite = '';
  125999. var rect = { x: 0, y: 0, width: 0, height: 0 };
  126000. // var pivot = { x: 0, y: 0 };
  126001. // var border = { x: 0, y: 0, z: 0, w: 0 };
  126002. for (var i = 0; i < data.length; i++)
  126003. {
  126004. var results = data[i].match(lineRegExp);
  126005. if (!results)
  126006. {
  126007. continue;
  126008. }
  126009. var isList = (results[1] === '- ');
  126010. var key = results[2];
  126011. var value = results[3];
  126012. if (isList)
  126013. {
  126014. if (currentSprite !== prevSprite)
  126015. {
  126016. addFrame(texture, sourceIndex, currentSprite, rect);
  126017. prevSprite = currentSprite;
  126018. }
  126019. rect = { x: 0, y: 0, width: 0, height: 0 };
  126020. }
  126021. if (key === 'name')
  126022. {
  126023. // Start new list
  126024. currentSprite = value;
  126025. continue;
  126026. }
  126027. switch (key)
  126028. {
  126029. case 'x':
  126030. case 'y':
  126031. case 'width':
  126032. case 'height':
  126033. rect[key] = parseInt(value, 10);
  126034. break;
  126035. // case 'pivot':
  126036. // pivot = eval('var obj = ' + value);
  126037. // break;
  126038. // case 'border':
  126039. // border = eval('var obj = ' + value);
  126040. // break;
  126041. }
  126042. }
  126043. if (currentSprite !== prevSprite)
  126044. {
  126045. addFrame(texture, sourceIndex, currentSprite, rect);
  126046. }
  126047. return texture;
  126048. };
  126049. module.exports = UnityYAML;
  126050. /*
  126051. Example data:
  126052. TextureImporter:
  126053. spritePivot: {x: .5, y: .5}
  126054. spriteBorder: {x: 0, y: 0, z: 0, w: 0}
  126055. spritePixelsToUnits: 100
  126056. spriteSheet:
  126057. sprites:
  126058. - name: asteroids_0
  126059. rect:
  126060. serializedVersion: 2
  126061. x: 5
  126062. y: 328
  126063. width: 65
  126064. height: 82
  126065. alignment: 0
  126066. pivot: {x: 0, y: 0}
  126067. border: {x: 0, y: 0, z: 0, w: 0}
  126068. - name: asteroids_1
  126069. rect:
  126070. serializedVersion: 2
  126071. x: 80
  126072. y: 322
  126073. width: 53
  126074. height: 88
  126075. alignment: 0
  126076. pivot: {x: 0, y: 0}
  126077. border: {x: 0, y: 0, z: 0, w: 0}
  126078. spritePackingTag: Asteroids
  126079. */
  126080. /***/ }),
  126081. /* 904 */
  126082. /***/ (function(module, exports, __webpack_require__) {
  126083. /**
  126084. * @author Richard Davey <rich@photonstorm.com>
  126085. * @copyright 2019 Photon Storm Ltd.
  126086. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126087. */
  126088. var GetFastValue = __webpack_require__(2);
  126089. /**
  126090. * Parses a Sprite Sheet and adds the Frames to the Texture, where the Sprite Sheet is stored as a frame within an Atlas.
  126091. *
  126092. * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact
  126093. * same size and cannot be trimmed or rotated.
  126094. *
  126095. * @function Phaser.Textures.Parsers.SpriteSheetFromAtlas
  126096. * @memberof Phaser.Textures.Parsers
  126097. * @private
  126098. * @since 3.0.0
  126099. *
  126100. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  126101. * @param {Phaser.Textures.Frame} frame - The Frame that contains the Sprite Sheet.
  126102. * @param {object} config - An object describing how to parse the Sprite Sheet.
  126103. * @param {number} config.frameWidth - Width in pixels of a single frame in the sprite sheet.
  126104. * @param {number} [config.frameHeight] - Height in pixels of a single frame in the sprite sheet. Defaults to frameWidth if not provided.
  126105. * @param {number} [config.startFrame=0] - Index of the start frame in the sprite sheet
  126106. * @param {number} [config.endFrame=-1] - Index of the end frame in the sprite sheet. -1 mean all the rest of the frames
  126107. * @param {number} [config.margin=0] - If the frames have been drawn with a margin, specify the amount here.
  126108. * @param {number} [config.spacing=0] - If the frames have been drawn with spacing between them, specify the amount here.
  126109. *
  126110. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  126111. */
  126112. var SpriteSheetFromAtlas = function (texture, frame, config)
  126113. {
  126114. var frameWidth = GetFastValue(config, 'frameWidth', null);
  126115. var frameHeight = GetFastValue(config, 'frameHeight', frameWidth);
  126116. // If missing we can't proceed
  126117. if (!frameWidth)
  126118. {
  126119. throw new Error('TextureManager.SpriteSheetFromAtlas: Invalid frameWidth given.');
  126120. }
  126121. // Add in a __BASE entry (for the entire atlas)
  126122. // var source = texture.source[sourceIndex];
  126123. // texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  126124. var startFrame = GetFastValue(config, 'startFrame', 0);
  126125. var endFrame = GetFastValue(config, 'endFrame', -1);
  126126. var margin = GetFastValue(config, 'margin', 0);
  126127. var spacing = GetFastValue(config, 'spacing', 0);
  126128. var x = frame.cutX;
  126129. var y = frame.cutY;
  126130. var cutWidth = frame.cutWidth;
  126131. var cutHeight = frame.cutHeight;
  126132. var sheetWidth = frame.realWidth;
  126133. var sheetHeight = frame.realHeight;
  126134. var row = Math.floor((sheetWidth - margin + spacing) / (frameWidth + spacing));
  126135. var column = Math.floor((sheetHeight - margin + spacing) / (frameHeight + spacing));
  126136. var total = row * column;
  126137. // trim offsets
  126138. var leftPad = frame.x;
  126139. var leftWidth = frameWidth - leftPad;
  126140. var rightWidth = frameWidth - ((sheetWidth - cutWidth) - leftPad);
  126141. var topPad = frame.y;
  126142. var topHeight = frameHeight - topPad;
  126143. var bottomHeight = frameHeight - ((sheetHeight - cutHeight) - topPad);
  126144. // console.log('x / y', x, y);
  126145. // console.log('cutW / H', cutWidth, cutHeight);
  126146. // console.log('sheetW / H', sheetWidth, sheetHeight);
  126147. // console.log('row', row, 'column', column, 'total', total);
  126148. // console.log('LW', leftWidth, 'RW', rightWidth, 'TH', topHeight, 'BH', bottomHeight);
  126149. if (startFrame > total || startFrame < -total)
  126150. {
  126151. startFrame = 0;
  126152. }
  126153. if (startFrame < 0)
  126154. {
  126155. // Allow negative skipframes.
  126156. startFrame = total + startFrame;
  126157. }
  126158. if (endFrame !== -1)
  126159. {
  126160. total = startFrame + (endFrame + 1);
  126161. }
  126162. var sheetFrame;
  126163. var frameX = margin;
  126164. var frameY = margin;
  126165. var frameIndex = 0;
  126166. var sourceIndex = frame.sourceIndex;
  126167. for (var sheetY = 0; sheetY < column; sheetY++)
  126168. {
  126169. var topRow = (sheetY === 0);
  126170. var bottomRow = (sheetY === column - 1);
  126171. for (var sheetX = 0; sheetX < row; sheetX++)
  126172. {
  126173. var leftRow = (sheetX === 0);
  126174. var rightRow = (sheetX === row - 1);
  126175. sheetFrame = texture.add(frameIndex, sourceIndex, x + frameX, y + frameY, frameWidth, frameHeight);
  126176. if (leftRow || topRow || rightRow || bottomRow)
  126177. {
  126178. var destX = (leftRow) ? leftPad : 0;
  126179. var destY = (topRow) ? topPad : 0;
  126180. var trimWidth = 0;
  126181. var trimHeight = 0;
  126182. if (leftRow)
  126183. {
  126184. trimWidth += (frameWidth - leftWidth);
  126185. }
  126186. if (rightRow)
  126187. {
  126188. trimWidth += (frameWidth - rightWidth);
  126189. }
  126190. if (topRow)
  126191. {
  126192. trimHeight += (frameHeight - topHeight);
  126193. }
  126194. if (bottomRow)
  126195. {
  126196. trimHeight += (frameHeight - bottomHeight);
  126197. }
  126198. var destWidth = frameWidth - trimWidth;
  126199. var destHeight = frameHeight - trimHeight;
  126200. sheetFrame.cutWidth = destWidth;
  126201. sheetFrame.cutHeight = destHeight;
  126202. sheetFrame.setTrim(frameWidth, frameHeight, destX, destY, destWidth, destHeight);
  126203. }
  126204. frameX += spacing;
  126205. if (leftRow)
  126206. {
  126207. frameX += leftWidth;
  126208. }
  126209. else if (rightRow)
  126210. {
  126211. frameX += rightWidth;
  126212. }
  126213. else
  126214. {
  126215. frameX += frameWidth;
  126216. }
  126217. frameIndex++;
  126218. }
  126219. frameX = margin;
  126220. frameY += spacing;
  126221. if (topRow)
  126222. {
  126223. frameY += topHeight;
  126224. }
  126225. else if (bottomRow)
  126226. {
  126227. frameY += bottomHeight;
  126228. }
  126229. else
  126230. {
  126231. frameY += frameHeight;
  126232. }
  126233. }
  126234. return texture;
  126235. };
  126236. module.exports = SpriteSheetFromAtlas;
  126237. /***/ }),
  126238. /* 905 */
  126239. /***/ (function(module, exports, __webpack_require__) {
  126240. /**
  126241. * @author Richard Davey <rich@photonstorm.com>
  126242. * @copyright 2019 Photon Storm Ltd.
  126243. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126244. */
  126245. var GetFastValue = __webpack_require__(2);
  126246. /**
  126247. * Parses a Sprite Sheet and adds the Frames to the Texture.
  126248. *
  126249. * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact
  126250. * same size and cannot be trimmed or rotated.
  126251. *
  126252. * @function Phaser.Textures.Parsers.SpriteSheet
  126253. * @memberof Phaser.Textures.Parsers
  126254. * @private
  126255. * @since 3.0.0
  126256. *
  126257. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  126258. * @param {integer} sourceIndex - The index of the TextureSource.
  126259. * @param {integer} x - [description]
  126260. * @param {integer} y - [description]
  126261. * @param {integer} width - [description]
  126262. * @param {integer} height - [description]
  126263. * @param {object} config - An object describing how to parse the Sprite Sheet.
  126264. * @param {number} config.frameWidth - Width in pixels of a single frame in the sprite sheet.
  126265. * @param {number} [config.frameHeight] - Height in pixels of a single frame in the sprite sheet. Defaults to frameWidth if not provided.
  126266. * @param {number} [config.startFrame=0] - [description]
  126267. * @param {number} [config.endFrame=-1] - [description]
  126268. * @param {number} [config.margin=0] - If the frames have been drawn with a margin, specify the amount here.
  126269. * @param {number} [config.spacing=0] - If the frames have been drawn with spacing between them, specify the amount here.
  126270. *
  126271. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  126272. */
  126273. var SpriteSheet = function (texture, sourceIndex, x, y, width, height, config)
  126274. {
  126275. var frameWidth = GetFastValue(config, 'frameWidth', null);
  126276. var frameHeight = GetFastValue(config, 'frameHeight', frameWidth);
  126277. // If missing we can't proceed
  126278. if (frameWidth === null)
  126279. {
  126280. throw new Error('TextureManager.SpriteSheet: Invalid frameWidth given.');
  126281. }
  126282. // Add in a __BASE entry (for the entire atlas)
  126283. var source = texture.source[sourceIndex];
  126284. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  126285. var startFrame = GetFastValue(config, 'startFrame', 0);
  126286. var endFrame = GetFastValue(config, 'endFrame', -1);
  126287. var margin = GetFastValue(config, 'margin', 0);
  126288. var spacing = GetFastValue(config, 'spacing', 0);
  126289. var row = Math.floor((width - margin + spacing) / (frameWidth + spacing));
  126290. var column = Math.floor((height - margin + spacing) / (frameHeight + spacing));
  126291. var total = row * column;
  126292. if (total === 0)
  126293. {
  126294. console.warn('SpriteSheet frame dimensions will result in zero frames.');
  126295. }
  126296. if (startFrame > total || startFrame < -total)
  126297. {
  126298. startFrame = 0;
  126299. }
  126300. if (startFrame < 0)
  126301. {
  126302. // Allow negative skipframes.
  126303. startFrame = total + startFrame;
  126304. }
  126305. if (endFrame !== -1)
  126306. {
  126307. total = startFrame + (endFrame + 1);
  126308. }
  126309. var fx = margin;
  126310. var fy = margin;
  126311. var ax = 0;
  126312. var ay = 0;
  126313. for (var i = 0; i < total; i++)
  126314. {
  126315. ax = 0;
  126316. ay = 0;
  126317. var w = fx + frameWidth;
  126318. var h = fy + frameHeight;
  126319. if (w > width)
  126320. {
  126321. ax = w - width;
  126322. }
  126323. if (h > height)
  126324. {
  126325. ay = h - height;
  126326. }
  126327. texture.add(i, sourceIndex, x + fx, y + fy, frameWidth - ax, frameHeight - ay);
  126328. fx += frameWidth + spacing;
  126329. if (fx + frameWidth > width)
  126330. {
  126331. fx = margin;
  126332. fy += frameHeight + spacing;
  126333. }
  126334. }
  126335. return texture;
  126336. };
  126337. module.exports = SpriteSheet;
  126338. /***/ }),
  126339. /* 906 */
  126340. /***/ (function(module, exports, __webpack_require__) {
  126341. /**
  126342. * @author Richard Davey <rich@photonstorm.com>
  126343. * @copyright 2019 Photon Storm Ltd.
  126344. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126345. */
  126346. var Clone = __webpack_require__(70);
  126347. /**
  126348. * Parses a Texture Atlas JSON Hash and adds the Frames to the Texture.
  126349. * JSON format expected to match that defined by Texture Packer, with the frames property containing an object of Frames.
  126350. *
  126351. * @function Phaser.Textures.Parsers.JSONHash
  126352. * @memberof Phaser.Textures.Parsers
  126353. * @private
  126354. * @since 3.0.0
  126355. *
  126356. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  126357. * @param {integer} sourceIndex - The index of the TextureSource.
  126358. * @param {object} json - The JSON data.
  126359. *
  126360. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  126361. */
  126362. var JSONHash = function (texture, sourceIndex, json)
  126363. {
  126364. // Malformed?
  126365. if (!json['frames'])
  126366. {
  126367. console.warn('Invalid Texture Atlas JSON Hash given, missing \'frames\' Object');
  126368. return;
  126369. }
  126370. // Add in a __BASE entry (for the entire atlas)
  126371. var source = texture.source[sourceIndex];
  126372. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  126373. // By this stage frames is a fully parsed Object
  126374. var frames = json['frames'];
  126375. var newFrame;
  126376. for (var key in frames)
  126377. {
  126378. var src = frames[key];
  126379. // The frame values are the exact coordinates to cut the frame out of the atlas from
  126380. newFrame = texture.add(key, sourceIndex, src.frame.x, src.frame.y, src.frame.w, src.frame.h);
  126381. // These are the original (non-trimmed) sprite values
  126382. if (src.trimmed)
  126383. {
  126384. newFrame.setTrim(
  126385. src.sourceSize.w,
  126386. src.sourceSize.h,
  126387. src.spriteSourceSize.x,
  126388. src.spriteSourceSize.y,
  126389. src.spriteSourceSize.w,
  126390. src.spriteSourceSize.h
  126391. );
  126392. }
  126393. if (src.rotated)
  126394. {
  126395. newFrame.rotated = true;
  126396. newFrame.updateUVsInverted();
  126397. }
  126398. // Copy over any extra data
  126399. newFrame.customData = Clone(src);
  126400. }
  126401. // Copy over any additional data that was in the JSON to Texture.customData
  126402. for (var dataKey in json)
  126403. {
  126404. if (dataKey === 'frames')
  126405. {
  126406. continue;
  126407. }
  126408. if (Array.isArray(json[dataKey]))
  126409. {
  126410. texture.customData[dataKey] = json[dataKey].slice(0);
  126411. }
  126412. else
  126413. {
  126414. texture.customData[dataKey] = json[dataKey];
  126415. }
  126416. }
  126417. return texture;
  126418. };
  126419. module.exports = JSONHash;
  126420. /***/ }),
  126421. /* 907 */
  126422. /***/ (function(module, exports, __webpack_require__) {
  126423. /**
  126424. * @author Richard Davey <rich@photonstorm.com>
  126425. * @copyright 2019 Photon Storm Ltd.
  126426. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126427. */
  126428. var Clone = __webpack_require__(70);
  126429. /**
  126430. * Parses a Texture Atlas JSON Array and adds the Frames to the Texture.
  126431. * JSON format expected to match that defined by Texture Packer, with the frames property containing an array of Frames.
  126432. *
  126433. * @function Phaser.Textures.Parsers.JSONArray
  126434. * @memberof Phaser.Textures.Parsers
  126435. * @private
  126436. * @since 3.0.0
  126437. *
  126438. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  126439. * @param {integer} sourceIndex - The index of the TextureSource.
  126440. * @param {object} json - The JSON data.
  126441. *
  126442. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  126443. */
  126444. var JSONArray = function (texture, sourceIndex, json)
  126445. {
  126446. // Malformed?
  126447. if (!json['frames'] && !json['textures'])
  126448. {
  126449. console.warn('Invalid Texture Atlas JSON Array');
  126450. return;
  126451. }
  126452. // Add in a __BASE entry (for the entire atlas)
  126453. var source = texture.source[sourceIndex];
  126454. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  126455. // By this stage frames is a fully parsed array
  126456. var frames = (Array.isArray(json.textures)) ? json.textures[sourceIndex].frames : json.frames;
  126457. var newFrame;
  126458. for (var i = 0; i < frames.length; i++)
  126459. {
  126460. var src = frames[i];
  126461. // The frame values are the exact coordinates to cut the frame out of the atlas from
  126462. newFrame = texture.add(src.filename, sourceIndex, src.frame.x, src.frame.y, src.frame.w, src.frame.h);
  126463. // These are the original (non-trimmed) sprite values
  126464. if (src.trimmed)
  126465. {
  126466. newFrame.setTrim(
  126467. src.sourceSize.w,
  126468. src.sourceSize.h,
  126469. src.spriteSourceSize.x,
  126470. src.spriteSourceSize.y,
  126471. src.spriteSourceSize.w,
  126472. src.spriteSourceSize.h
  126473. );
  126474. }
  126475. if (src.rotated)
  126476. {
  126477. newFrame.rotated = true;
  126478. newFrame.updateUVsInverted();
  126479. }
  126480. if (src.anchor)
  126481. {
  126482. newFrame.customPivot = true;
  126483. newFrame.pivotX = src.anchor.x;
  126484. newFrame.pivotY = src.anchor.y;
  126485. }
  126486. // Copy over any extra data
  126487. newFrame.customData = Clone(src);
  126488. }
  126489. // Copy over any additional data that was in the JSON to Texture.customData
  126490. for (var dataKey in json)
  126491. {
  126492. if (dataKey === 'frames')
  126493. {
  126494. continue;
  126495. }
  126496. if (Array.isArray(json[dataKey]))
  126497. {
  126498. texture.customData[dataKey] = json[dataKey].slice(0);
  126499. }
  126500. else
  126501. {
  126502. texture.customData[dataKey] = json[dataKey];
  126503. }
  126504. }
  126505. return texture;
  126506. };
  126507. module.exports = JSONArray;
  126508. /***/ }),
  126509. /* 908 */
  126510. /***/ (function(module, exports) {
  126511. /**
  126512. * @author Richard Davey <rich@photonstorm.com>
  126513. * @copyright 2019 Photon Storm Ltd.
  126514. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126515. */
  126516. /**
  126517. * Adds an Image Element to a Texture.
  126518. *
  126519. * @function Phaser.Textures.Parsers.Image
  126520. * @memberof Phaser.Textures.Parsers
  126521. * @private
  126522. * @since 3.0.0
  126523. *
  126524. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  126525. * @param {integer} sourceIndex - The index of the TextureSource.
  126526. *
  126527. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  126528. */
  126529. var Image = function (texture, sourceIndex)
  126530. {
  126531. var source = texture.source[sourceIndex];
  126532. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  126533. return texture;
  126534. };
  126535. module.exports = Image;
  126536. /***/ }),
  126537. /* 909 */
  126538. /***/ (function(module, exports) {
  126539. /**
  126540. * @author Richard Davey <rich@photonstorm.com>
  126541. * @copyright 2019 Photon Storm Ltd.
  126542. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126543. */
  126544. /**
  126545. * Adds a Canvas Element to a Texture.
  126546. *
  126547. * @function Phaser.Textures.Parsers.Canvas
  126548. * @memberof Phaser.Textures.Parsers
  126549. * @private
  126550. * @since 3.0.0
  126551. *
  126552. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  126553. * @param {integer} sourceIndex - The index of the TextureSource.
  126554. *
  126555. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  126556. */
  126557. var Canvas = function (texture, sourceIndex)
  126558. {
  126559. var source = texture.source[sourceIndex];
  126560. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  126561. return texture;
  126562. };
  126563. module.exports = Canvas;
  126564. /***/ }),
  126565. /* 910 */
  126566. /***/ (function(module, exports) {
  126567. /**
  126568. * @author Richard Davey <rich@photonstorm.com>
  126569. * @copyright 2019 Photon Storm Ltd.
  126570. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126571. */
  126572. /**
  126573. * Parses an XML Texture Atlas object and adds all the Frames into a Texture.
  126574. *
  126575. * @function Phaser.Textures.Parsers.AtlasXML
  126576. * @memberof Phaser.Textures.Parsers
  126577. * @private
  126578. * @since 3.7.0
  126579. *
  126580. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  126581. * @param {integer} sourceIndex - The index of the TextureSource.
  126582. * @param {*} xml - The XML data.
  126583. *
  126584. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  126585. */
  126586. var AtlasXML = function (texture, sourceIndex, xml)
  126587. {
  126588. // Malformed?
  126589. if (!xml.getElementsByTagName('TextureAtlas'))
  126590. {
  126591. console.warn('Invalid Texture Atlas XML given');
  126592. return;
  126593. }
  126594. // Add in a __BASE entry (for the entire atlas)
  126595. var source = texture.source[sourceIndex];
  126596. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  126597. // By this stage frames is a fully parsed array
  126598. var frames = xml.getElementsByTagName('SubTexture');
  126599. var newFrame;
  126600. for (var i = 0; i < frames.length; i++)
  126601. {
  126602. var frame = frames[i].attributes;
  126603. var name = frame.name.value;
  126604. var x = parseInt(frame.x.value, 10);
  126605. var y = parseInt(frame.y.value, 10);
  126606. var width = parseInt(frame.width.value, 10);
  126607. var height = parseInt(frame.height.value, 10);
  126608. // The frame values are the exact coordinates to cut the frame out of the atlas from
  126609. newFrame = texture.add(name, sourceIndex, x, y, width, height);
  126610. // These are the original (non-trimmed) sprite values
  126611. if (frame.frameX)
  126612. {
  126613. var frameX = Math.abs(parseInt(frame.frameX.value, 10));
  126614. var frameY = Math.abs(parseInt(frame.frameY.value, 10));
  126615. var frameWidth = parseInt(frame.frameWidth.value, 10);
  126616. var frameHeight = parseInt(frame.frameHeight.value, 10);
  126617. newFrame.setTrim(
  126618. width,
  126619. height,
  126620. frameX,
  126621. frameY,
  126622. frameWidth,
  126623. frameHeight
  126624. );
  126625. }
  126626. }
  126627. return texture;
  126628. };
  126629. module.exports = AtlasXML;
  126630. /***/ }),
  126631. /* 911 */
  126632. /***/ (function(module, exports, __webpack_require__) {
  126633. /**
  126634. * @author Richard Davey <rich@photonstorm.com>
  126635. * @copyright 2019 Photon Storm Ltd.
  126636. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126637. */
  126638. var Class = __webpack_require__(0);
  126639. var Clamp = __webpack_require__(23);
  126640. var Color = __webpack_require__(32);
  126641. var IsSizePowerOfTwo = __webpack_require__(127);
  126642. var Texture = __webpack_require__(175);
  126643. /**
  126644. * @classdesc
  126645. * A Canvas Texture is a special kind of Texture that is backed by an HTML Canvas Element as its source.
  126646. *
  126647. * You can use the properties of this texture to draw to the canvas element directly, using all of the standard
  126648. * canvas operations available in the browser. Any Game Object can be given this texture and will render with it.
  126649. *
  126650. * Note: When running under WebGL the Canvas Texture needs to re-generate its base WebGLTexture and reupload it to
  126651. * the GPU every time you modify it, otherwise the changes you make to this texture will not be visible. To do this
  126652. * you should call `CanvasTexture.refresh()` once you are finished with your changes to the canvas. Try and keep
  126653. * this to a minimum, especially on large canvas sizes, or you may inadvertently thrash the GPU by constantly uploading
  126654. * texture data to it. This restriction does not apply if using the Canvas Renderer.
  126655. *
  126656. * It starts with only one frame that covers the whole of the canvas. You can add further frames, that specify
  126657. * sections of the canvas using the `add` method.
  126658. *
  126659. * Should you need to resize the canvas use the `setSize` method so that it accurately updates all of the underlying
  126660. * texture data as well. Forgetting to do this (i.e. by changing the canvas size directly from your code) could cause
  126661. * graphical errors.
  126662. *
  126663. * @class CanvasTexture
  126664. * @extends Phaser.Textures.Texture
  126665. * @memberof Phaser.Textures
  126666. * @constructor
  126667. * @since 3.7.0
  126668. *
  126669. * @param {Phaser.Textures.CanvasTexture} manager - A reference to the Texture Manager this Texture belongs to.
  126670. * @param {string} key - The unique string-based key of this Texture.
  126671. * @param {HTMLCanvasElement} source - The canvas element that is used as the base of this texture.
  126672. * @param {integer} width - The width of the canvas.
  126673. * @param {integer} height - The height of the canvas.
  126674. */
  126675. var CanvasTexture = new Class({
  126676. Extends: Texture,
  126677. initialize:
  126678. function CanvasTexture (manager, key, source, width, height)
  126679. {
  126680. Texture.call(this, manager, key, source, width, height);
  126681. this.add('__BASE', 0, 0, 0, width, height);
  126682. /**
  126683. * A reference to the Texture Source of this Canvas.
  126684. *
  126685. * @name Phaser.Textures.CanvasTexture#_source
  126686. * @type {Phaser.Textures.TextureSource}
  126687. * @private
  126688. * @since 3.7.0
  126689. */
  126690. this._source = this.frames['__BASE'].source;
  126691. /**
  126692. * The source Canvas Element.
  126693. *
  126694. * @name Phaser.Textures.CanvasTexture#canvas
  126695. * @readonly
  126696. * @type {HTMLCanvasElement}
  126697. * @since 3.7.0
  126698. */
  126699. this.canvas = this._source.image;
  126700. /**
  126701. * The 2D Canvas Rendering Context.
  126702. *
  126703. * @name Phaser.Textures.CanvasTexture#context
  126704. * @readonly
  126705. * @type {CanvasRenderingContext2D}
  126706. * @since 3.7.0
  126707. */
  126708. this.context = this.canvas.getContext('2d');
  126709. /**
  126710. * The width of the Canvas.
  126711. * This property is read-only, if you wish to change it use the `setSize` method.
  126712. *
  126713. * @name Phaser.Textures.CanvasTexture#width
  126714. * @readonly
  126715. * @type {integer}
  126716. * @since 3.7.0
  126717. */
  126718. this.width = width;
  126719. /**
  126720. * The height of the Canvas.
  126721. * This property is read-only, if you wish to change it use the `setSize` method.
  126722. *
  126723. * @name Phaser.Textures.CanvasTexture#height
  126724. * @readonly
  126725. * @type {integer}
  126726. * @since 3.7.0
  126727. */
  126728. this.height = height;
  126729. /**
  126730. * The context image data.
  126731. * Use the `update` method to populate this when the canvas changes.
  126732. *
  126733. * @name Phaser.Textures.CanvasTexture#imageData
  126734. * @type {ImageData}
  126735. * @since 3.13.0
  126736. */
  126737. this.imageData = this.context.getImageData(0, 0, width, height);
  126738. /**
  126739. * A Uint8ClampedArray view into the `buffer`.
  126740. * Use the `update` method to populate this when the canvas changes.
  126741. * Note that this is unavailable in some browsers, such as Epic Browser, due to their security restrictions.
  126742. *
  126743. * @name Phaser.Textures.CanvasTexture#data
  126744. * @type {Uint8ClampedArray}
  126745. * @since 3.13.0
  126746. */
  126747. this.data = null;
  126748. if (this.imageData)
  126749. {
  126750. this.data = this.imageData.data;
  126751. }
  126752. /**
  126753. * An Uint32Array view into the `buffer`.
  126754. *
  126755. * @name Phaser.Textures.CanvasTexture#pixels
  126756. * @type {Uint32Array}
  126757. * @since 3.13.0
  126758. */
  126759. this.pixels = null;
  126760. /**
  126761. * An ArrayBuffer the same size as the context ImageData.
  126762. *
  126763. * @name Phaser.Textures.CanvasTexture#buffer
  126764. * @type {ArrayBuffer}
  126765. * @since 3.13.0
  126766. */
  126767. this.buffer;
  126768. if (this.data)
  126769. {
  126770. if (this.imageData.data.buffer)
  126771. {
  126772. this.buffer = this.imageData.data.buffer;
  126773. this.pixels = new Uint32Array(this.buffer);
  126774. }
  126775. else if (window.ArrayBuffer)
  126776. {
  126777. this.buffer = new ArrayBuffer(this.imageData.data.length);
  126778. this.pixels = new Uint32Array(this.buffer);
  126779. }
  126780. else
  126781. {
  126782. this.pixels = this.imageData.data;
  126783. }
  126784. }
  126785. },
  126786. /**
  126787. * This re-creates the `imageData` from the current context.
  126788. * It then re-builds the ArrayBuffer, the `data` Uint8ClampedArray reference and the `pixels` Int32Array.
  126789. *
  126790. * Warning: This is a very expensive operation, so use it sparingly.
  126791. *
  126792. * @method Phaser.Textures.CanvasTexture#update
  126793. * @since 3.13.0
  126794. *
  126795. * @return {Phaser.Textures.CanvasTexture} This CanvasTexture.
  126796. */
  126797. update: function ()
  126798. {
  126799. this.imageData = this.context.getImageData(0, 0, this.width, this.height);
  126800. this.data = this.imageData.data;
  126801. if (this.imageData.data.buffer)
  126802. {
  126803. this.buffer = this.imageData.data.buffer;
  126804. this.pixels = new Uint32Array(this.buffer);
  126805. }
  126806. else if (window.ArrayBuffer)
  126807. {
  126808. this.buffer = new ArrayBuffer(this.imageData.data.length);
  126809. this.pixels = new Uint32Array(this.buffer);
  126810. }
  126811. else
  126812. {
  126813. this.pixels = this.imageData.data;
  126814. }
  126815. return this;
  126816. },
  126817. /**
  126818. * Draws the given Image or Canvas element to this CanvasTexture, then updates the internal
  126819. * ImageData buffer and arrays.
  126820. *
  126821. * @method Phaser.Textures.CanvasTexture#draw
  126822. * @since 3.13.0
  126823. *
  126824. * @param {integer} x - The x coordinate to draw the source at.
  126825. * @param {integer} y - The y coordinate to draw the source at.
  126826. * @param {(HTMLImageElement|HTMLCanvasElement)} source - The element to draw to this canvas.
  126827. *
  126828. * @return {Phaser.Textures.CanvasTexture} This CanvasTexture.
  126829. */
  126830. draw: function (x, y, source)
  126831. {
  126832. this.context.drawImage(source, x, y);
  126833. return this.update();
  126834. },
  126835. /**
  126836. * Draws the given texture frame to this CanvasTexture, then updates the internal
  126837. * ImageData buffer and arrays.
  126838. *
  126839. * @method Phaser.Textures.CanvasTexture#drawFrame
  126840. * @since 3.16.0
  126841. *
  126842. * @param {string} key - The unique string-based key of the Texture.
  126843. * @param {(string|integer)} [frame] - The string-based name, or integer based index, of the Frame to get from the Texture.
  126844. * @param {integer} [x=0] - The x coordinate to draw the source at.
  126845. * @param {integer} [y=0] - The y coordinate to draw the source at.
  126846. *
  126847. * @return {Phaser.Textures.CanvasTexture} This CanvasTexture.
  126848. */
  126849. drawFrame: function (key, frame, x, y)
  126850. {
  126851. if (x === undefined) { x = 0; }
  126852. if (y === undefined) { y = 0; }
  126853. var textureFrame = this.manager.getFrame(key, frame);
  126854. if (textureFrame)
  126855. {
  126856. var cd = textureFrame.canvasData;
  126857. var width = textureFrame.cutWidth;
  126858. var height = textureFrame.cutHeight;
  126859. var res = textureFrame.source.resolution;
  126860. this.context.drawImage(
  126861. textureFrame.source.image,
  126862. cd.x, cd.y,
  126863. width,
  126864. height,
  126865. x, y,
  126866. width / res,
  126867. height / res
  126868. );
  126869. return this.update();
  126870. }
  126871. else
  126872. {
  126873. return this;
  126874. }
  126875. },
  126876. /**
  126877. * Sets a pixel in the CanvasTexture to the given color and alpha values.
  126878. *
  126879. * This is an expensive operation to run in large quantities, so use sparingly.
  126880. *
  126881. * @method Phaser.Textures.CanvasTexture#setPixel
  126882. * @since 3.16.0
  126883. *
  126884. * @param {integer} x - The x coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer.
  126885. * @param {integer} y - The y coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer.
  126886. * @param {integer} red - The red color value. A number between 0 and 255.
  126887. * @param {integer} green - The green color value. A number between 0 and 255.
  126888. * @param {integer} blue - The blue color value. A number between 0 and 255.
  126889. * @param {integer} [alpha=255] - The alpha value. A number between 0 and 255.
  126890. *
  126891. * @return {this} This CanvasTexture.
  126892. */
  126893. setPixel: function (x, y, red, green, blue, alpha)
  126894. {
  126895. if (alpha === undefined) { alpha = 255; }
  126896. x = Math.abs(Math.floor(x));
  126897. y = Math.abs(Math.floor(y));
  126898. var index = this.getIndex(x, y);
  126899. if (index > -1)
  126900. {
  126901. var imageData = this.context.getImageData(x, y, 1, 1);
  126902. imageData.data[0] = red;
  126903. imageData.data[1] = green;
  126904. imageData.data[2] = blue;
  126905. imageData.data[3] = alpha;
  126906. this.context.putImageData(imageData, x, y);
  126907. }
  126908. return this;
  126909. },
  126910. /**
  126911. * Puts the ImageData into the context of this CanvasTexture at the given coordinates.
  126912. *
  126913. * @method Phaser.Textures.CanvasTexture#putData
  126914. * @since 3.16.0
  126915. *
  126916. * @param {ImageData} imageData - The ImageData to put at the given location.
  126917. * @param {integer} x - The x coordinate to put the imageData. Must lay within the dimensions of this CanvasTexture and be an integer.
  126918. * @param {integer} y - The y coordinate to put the imageData. Must lay within the dimensions of this CanvasTexture and be an integer.
  126919. * @param {integer} [dirtyX=0] - Horizontal position (x coordinate) of the top-left corner from which the image data will be extracted.
  126920. * @param {integer} [dirtyY=0] - Vertical position (x coordinate) of the top-left corner from which the image data will be extracted.
  126921. * @param {integer} [dirtyWidth] - Width of the rectangle to be painted. Defaults to the width of the image data.
  126922. * @param {integer} [dirtyHeight] - Height of the rectangle to be painted. Defaults to the height of the image data.
  126923. *
  126924. * @return {this} This CanvasTexture.
  126925. */
  126926. putData: function (imageData, x, y, dirtyX, dirtyY, dirtyWidth, dirtyHeight)
  126927. {
  126928. if (dirtyX === undefined) { dirtyX = 0; }
  126929. if (dirtyY === undefined) { dirtyY = 0; }
  126930. if (dirtyWidth === undefined) { dirtyWidth = imageData.width; }
  126931. if (dirtyHeight === undefined) { dirtyHeight = imageData.height; }
  126932. this.context.putImageData(imageData, x, y, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
  126933. return this;
  126934. },
  126935. /**
  126936. * Gets an ImageData region from this CanvasTexture from the position and size specified.
  126937. * You can write this back using `CanvasTexture.putData`, or manipulate it.
  126938. *
  126939. * @method Phaser.Textures.CanvasTexture#getData
  126940. * @since 3.16.0
  126941. *
  126942. * @param {integer} x - The x coordinate of the top-left of the area to get the ImageData from. Must lay within the dimensions of this CanvasTexture and be an integer.
  126943. * @param {integer} y - The y coordinate of the top-left of the area to get the ImageData from. Must lay within the dimensions of this CanvasTexture and be an integer.
  126944. * @param {integer} width - The width of the rectangle from which the ImageData will be extracted. Positive values are to the right, and negative to the left.
  126945. * @param {integer} height - The height of the rectangle from which the ImageData will be extracted. Positive values are down, and negative are up.
  126946. *
  126947. * @return {ImageData} The ImageData extracted from this CanvasTexture.
  126948. */
  126949. getData: function (x, y, width, height)
  126950. {
  126951. x = Clamp(Math.floor(x), 0, this.width - 1);
  126952. y = Clamp(Math.floor(y), 0, this.height - 1);
  126953. width = Clamp(width, 1, this.width - x);
  126954. height = Clamp(height, 1, this.height - y);
  126955. var imageData = this.context.getImageData(x, y, width, height);
  126956. return imageData;
  126957. },
  126958. /**
  126959. * Get the color of a specific pixel from this texture and store it in a Color object.
  126960. *
  126961. * If you have drawn anything to this CanvasTexture since it was created you must call `CanvasTexture.update` to refresh the array buffer,
  126962. * otherwise this may return out of date color values, or worse - throw a run-time error as it tries to access an array element that doesn't exist.
  126963. *
  126964. * @method Phaser.Textures.CanvasTexture#getPixel
  126965. * @since 3.13.0
  126966. *
  126967. * @param {integer} x - The x coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer.
  126968. * @param {integer} y - The y coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer.
  126969. * @param {Phaser.Display.Color} [out] - A Color object to store the pixel values in. If not provided a new Color object will be created.
  126970. *
  126971. * @return {Phaser.Display.Color} An object with the red, green, blue and alpha values set in the r, g, b and a properties.
  126972. */
  126973. getPixel: function (x, y, out)
  126974. {
  126975. if (!out)
  126976. {
  126977. out = new Color();
  126978. }
  126979. var index = this.getIndex(x, y);
  126980. if (index > -1)
  126981. {
  126982. var data = this.data;
  126983. var r = data[index + 0];
  126984. var g = data[index + 1];
  126985. var b = data[index + 2];
  126986. var a = data[index + 3];
  126987. out.setTo(r, g, b, a);
  126988. }
  126989. return out;
  126990. },
  126991. /**
  126992. * An object containing the position and color data for a single pixel in a CanvasTexture.
  126993. *
  126994. * @typedef {object} PixelConfig
  126995. *
  126996. * @property {integer} x - The x-coordinate of the pixel.
  126997. * @property {integer} y - The y-coordinate of the pixel.
  126998. * @property {integer} color - The color of the pixel, not including the alpha channel.
  126999. * @property {float} alpha - The alpha of the pixel, between 0 and 1.
  127000. */
  127001. /**
  127002. * Returns an array containing all of the pixels in the given region.
  127003. *
  127004. * If the requested region extends outside the bounds of this CanvasTexture,
  127005. * the region is truncated to fit.
  127006. *
  127007. * If you have drawn anything to this CanvasTexture since it was created you must call `CanvasTexture.update` to refresh the array buffer,
  127008. * otherwise this may return out of date color values, or worse - throw a run-time error as it tries to access an array element that doesn't exist.
  127009. *
  127010. * @method Phaser.Textures.CanvasTexture#getPixels
  127011. * @since 3.16.0
  127012. *
  127013. * @param {integer} x - The x coordinate of the top-left of the region. Must lay within the dimensions of this CanvasTexture and be an integer.
  127014. * @param {integer} y - The y coordinate of the top-left of the region. Must lay within the dimensions of this CanvasTexture and be an integer.
  127015. * @param {integer} width - The width of the region to get. Must be an integer.
  127016. * @param {integer} [height] - The height of the region to get. Must be an integer. If not given will be set to the `width`.
  127017. *
  127018. * @return {PixelConfig[]} An array of Pixel objects.
  127019. */
  127020. getPixels: function (x, y, width, height)
  127021. {
  127022. if (height === undefined) { height = width; }
  127023. x = Math.abs(Math.round(x));
  127024. y = Math.abs(Math.round(y));
  127025. var left = Clamp(x, 0, this.width);
  127026. var right = Clamp(x + width, 0, this.width);
  127027. var top = Clamp(y, 0, this.height);
  127028. var bottom = Clamp(y + height, 0, this.height);
  127029. var pixel = new Color();
  127030. var out = [];
  127031. for (var py = top; py < bottom; py++)
  127032. {
  127033. var row = [];
  127034. for (var px = left; px < right; px++)
  127035. {
  127036. pixel = this.getPixel(px, py, pixel);
  127037. row.push({ x: px, y: py, color: pixel.color, alpha: pixel.alphaGL });
  127038. }
  127039. out.push(row);
  127040. }
  127041. return out;
  127042. },
  127043. /**
  127044. * Returns the Image Data index for the given pixel in this CanvasTexture.
  127045. *
  127046. * The index can be used to read directly from the `this.data` array.
  127047. *
  127048. * The index points to the red value in the array. The subsequent 3 indexes
  127049. * point to green, blue and alpha respectively.
  127050. *
  127051. * @method Phaser.Textures.CanvasTexture#getIndex
  127052. * @since 3.16.0
  127053. *
  127054. * @param {integer} x - The x coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer.
  127055. * @param {integer} y - The y coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer.
  127056. *
  127057. * @return {integer}
  127058. */
  127059. getIndex: function (x, y)
  127060. {
  127061. x = Math.abs(Math.round(x));
  127062. y = Math.abs(Math.round(y));
  127063. if (x < this.width && y < this.height)
  127064. {
  127065. return (x + y * this.width) * 4;
  127066. }
  127067. else
  127068. {
  127069. return -1;
  127070. }
  127071. },
  127072. /**
  127073. * This should be called manually if you are running under WebGL.
  127074. * It will refresh the WebGLTexture from the Canvas source. Only call this if you know that the
  127075. * canvas has changed, as there is a significant GPU texture allocation cost involved in doing so.
  127076. *
  127077. * @method Phaser.Textures.CanvasTexture#refresh
  127078. * @since 3.7.0
  127079. *
  127080. * @return {Phaser.Textures.CanvasTexture} This CanvasTexture.
  127081. */
  127082. refresh: function ()
  127083. {
  127084. this._source.update();
  127085. return this;
  127086. },
  127087. /**
  127088. * Gets the Canvas Element.
  127089. *
  127090. * @method Phaser.Textures.CanvasTexture#getCanvas
  127091. * @since 3.7.0
  127092. *
  127093. * @return {HTMLCanvasElement} The Canvas DOM element this texture is using.
  127094. */
  127095. getCanvas: function ()
  127096. {
  127097. return this.canvas;
  127098. },
  127099. /**
  127100. * Gets the 2D Canvas Rendering Context.
  127101. *
  127102. * @method Phaser.Textures.CanvasTexture#getContext
  127103. * @since 3.7.0
  127104. *
  127105. * @return {CanvasRenderingContext2D} The Canvas Rendering Context this texture is using.
  127106. */
  127107. getContext: function ()
  127108. {
  127109. return this.context;
  127110. },
  127111. /**
  127112. * Clears the given region of this Canvas Texture, resetting it back to transparent.
  127113. * If no region is given, the whole Canvas Texture is cleared.
  127114. *
  127115. * @method Phaser.Textures.CanvasTexture#clear
  127116. * @since 3.7.0
  127117. *
  127118. * @param {integer} [x=0] - The x coordinate of the top-left of the region to clear.
  127119. * @param {integer} [y=0] - The y coordinate of the top-left of the region to clear.
  127120. * @param {integer} [width] - The width of the region.
  127121. * @param {integer} [height] - The height of the region.
  127122. *
  127123. * @return {Phaser.Textures.CanvasTexture} The Canvas Texture.
  127124. */
  127125. clear: function (x, y, width, height)
  127126. {
  127127. if (x === undefined) { x = 0; }
  127128. if (y === undefined) { y = 0; }
  127129. if (width === undefined) { width = this.width; }
  127130. if (height === undefined) { height = this.height; }
  127131. this.context.clearRect(x, y, width, height);
  127132. return this.update();
  127133. },
  127134. /**
  127135. * Changes the size of this Canvas Texture.
  127136. *
  127137. * @method Phaser.Textures.CanvasTexture#setSize
  127138. * @since 3.7.0
  127139. *
  127140. * @param {integer} width - The new width of the Canvas.
  127141. * @param {integer} [height] - The new height of the Canvas. If not given it will use the width as the height.
  127142. *
  127143. * @return {Phaser.Textures.CanvasTexture} The Canvas Texture.
  127144. */
  127145. setSize: function (width, height)
  127146. {
  127147. if (height === undefined) { height = width; }
  127148. if (width !== this.width || height !== this.height)
  127149. {
  127150. // Update the Canvas
  127151. this.canvas.width = width;
  127152. this.canvas.height = height;
  127153. // Update the Texture Source
  127154. this._source.width = width;
  127155. this._source.height = height;
  127156. this._source.isPowerOf2 = IsSizePowerOfTwo(width, height);
  127157. // Update the Frame
  127158. this.frames['__BASE'].setSize(width, height, 0, 0);
  127159. this.refresh();
  127160. }
  127161. return this;
  127162. },
  127163. /**
  127164. * Destroys this Texture and releases references to its sources and frames.
  127165. *
  127166. * @method Phaser.Textures.CanvasTexture#destroy
  127167. * @since 3.16.0
  127168. */
  127169. destroy: function ()
  127170. {
  127171. Texture.prototype.destroy.call(this);
  127172. this._source = null;
  127173. this.canvas = null;
  127174. this.context = null;
  127175. this.imageData = null;
  127176. this.data = null;
  127177. this.pixels = null;
  127178. this.buffer = null;
  127179. }
  127180. });
  127181. module.exports = CanvasTexture;
  127182. /***/ }),
  127183. /* 912 */
  127184. /***/ (function(module, exports) {
  127185. /**
  127186. * @author Richard Davey <rich@photonstorm.com>
  127187. * @copyright 2019 Photon Storm Ltd.
  127188. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127189. */
  127190. /**
  127191. * The Sound Volume Event.
  127192. *
  127193. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their volume changes.
  127194. *
  127195. * Listen to it from a Sound instance using `Sound.on('volume', listener)`, i.e.:
  127196. *
  127197. * ```javascript
  127198. * var music = this.sound.add('key');
  127199. * music.on('volume', listener);
  127200. * music.play();
  127201. * music.setVolume(0.5);
  127202. * ```
  127203. *
  127204. * @event Phaser.Sound.Events#VOLUME
  127205. *
  127206. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127207. * @param {number} volume - The new volume of the Sound.
  127208. */
  127209. module.exports = 'volume';
  127210. /***/ }),
  127211. /* 913 */
  127212. /***/ (function(module, exports) {
  127213. /**
  127214. * @author Richard Davey <rich@photonstorm.com>
  127215. * @copyright 2019 Photon Storm Ltd.
  127216. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127217. */
  127218. /**
  127219. * The Sound Manager Unlocked Event.
  127220. *
  127221. * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager,
  127222. * or the HTML5 Audio Manager. It is dispatched during the update loop when the Sound Manager becomes unlocked. For
  127223. * Web Audio this is on the first user gesture on the page.
  127224. *
  127225. * Listen to it from a Scene using: `this.sound.on('unlocked', listener)`.
  127226. *
  127227. * @event Phaser.Sound.Events#UNLOCKED
  127228. *
  127229. * @param {Phaser.Sound.BaseSoundManager} soundManager - A reference to the sound manager that emitted the event.
  127230. */
  127231. module.exports = 'unlocked';
  127232. /***/ }),
  127233. /* 914 */
  127234. /***/ (function(module, exports) {
  127235. /**
  127236. * @author Richard Davey <rich@photonstorm.com>
  127237. * @copyright 2019 Photon Storm Ltd.
  127238. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127239. */
  127240. /**
  127241. * The Sound Stop Event.
  127242. *
  127243. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are stopped.
  127244. *
  127245. * Listen to it from a Sound instance using `Sound.on('stop', listener)`, i.e.:
  127246. *
  127247. * ```javascript
  127248. * var music = this.sound.add('key');
  127249. * music.on('stop', listener);
  127250. * music.play();
  127251. * music.stop();
  127252. * ```
  127253. *
  127254. * @event Phaser.Sound.Events#STOP
  127255. *
  127256. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127257. */
  127258. module.exports = 'stop';
  127259. /***/ }),
  127260. /* 915 */
  127261. /***/ (function(module, exports) {
  127262. /**
  127263. * @author Richard Davey <rich@photonstorm.com>
  127264. * @copyright 2019 Photon Storm Ltd.
  127265. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127266. */
  127267. /**
  127268. * The Stop All Sounds Event.
  127269. *
  127270. * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager,
  127271. * or the HTML5 Audio Manager. It is dispatched when the `stopAll` method is invoked and after all current Sounds
  127272. * have been stopped.
  127273. *
  127274. * Listen to it from a Scene using: `this.sound.on('stopall', listener)`.
  127275. *
  127276. * @event Phaser.Sound.Events#STOP_ALL
  127277. *
  127278. * @param {Phaser.Sound.BaseSoundManager} soundManager - A reference to the sound manager that emitted the event.
  127279. */
  127280. module.exports = 'stopall';
  127281. /***/ }),
  127282. /* 916 */
  127283. /***/ (function(module, exports) {
  127284. /**
  127285. * @author Richard Davey <rich@photonstorm.com>
  127286. * @copyright 2019 Photon Storm Ltd.
  127287. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127288. */
  127289. /**
  127290. * The Sound Seek Event.
  127291. *
  127292. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are seeked to a new position.
  127293. *
  127294. * Listen to it from a Sound instance using `Sound.on('seek', listener)`, i.e.:
  127295. *
  127296. * ```javascript
  127297. * var music = this.sound.add('key');
  127298. * music.on('seek', listener);
  127299. * music.play();
  127300. * music.setSeek(5000);
  127301. * ```
  127302. *
  127303. * @event Phaser.Sound.Events#SEEK
  127304. *
  127305. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127306. * @param {number} detune - The new detune value of the Sound.
  127307. */
  127308. module.exports = 'seek';
  127309. /***/ }),
  127310. /* 917 */
  127311. /***/ (function(module, exports) {
  127312. /**
  127313. * @author Richard Davey <rich@photonstorm.com>
  127314. * @copyright 2019 Photon Storm Ltd.
  127315. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127316. */
  127317. /**
  127318. * The Sound Resume Event.
  127319. *
  127320. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are resumed from a paused state.
  127321. *
  127322. * Listen to it from a Sound instance using `Sound.on('resume', listener)`, i.e.:
  127323. *
  127324. * ```javascript
  127325. * var music = this.sound.add('key');
  127326. * music.on('resume', listener);
  127327. * music.play();
  127328. * music.pause();
  127329. * music.resume();
  127330. * ```
  127331. *
  127332. * @event Phaser.Sound.Events#RESUME
  127333. *
  127334. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127335. */
  127336. module.exports = 'resume';
  127337. /***/ }),
  127338. /* 918 */
  127339. /***/ (function(module, exports) {
  127340. /**
  127341. * @author Richard Davey <rich@photonstorm.com>
  127342. * @copyright 2019 Photon Storm Ltd.
  127343. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127344. */
  127345. /**
  127346. * The Resume All Sounds Event.
  127347. *
  127348. * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager,
  127349. * or the HTML5 Audio Manager. It is dispatched when the `resumeAll` method is invoked and after all current Sounds
  127350. * have been resumed.
  127351. *
  127352. * Listen to it from a Scene using: `this.sound.on('resumeall', listener)`.
  127353. *
  127354. * @event Phaser.Sound.Events#RESUME_ALL
  127355. *
  127356. * @param {Phaser.Sound.BaseSoundManager} soundManager - A reference to the sound manager that emitted the event.
  127357. */
  127358. module.exports = 'resumeall';
  127359. /***/ }),
  127360. /* 919 */
  127361. /***/ (function(module, exports) {
  127362. /**
  127363. * @author Richard Davey <rich@photonstorm.com>
  127364. * @copyright 2019 Photon Storm Ltd.
  127365. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127366. */
  127367. /**
  127368. * The Sound Rate Change Event.
  127369. *
  127370. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their rate changes.
  127371. *
  127372. * Listen to it from a Sound instance using `Sound.on('rate', listener)`, i.e.:
  127373. *
  127374. * ```javascript
  127375. * var music = this.sound.add('key');
  127376. * music.on('rate', listener);
  127377. * music.play();
  127378. * music.setRate(0.5);
  127379. * ```
  127380. *
  127381. * @event Phaser.Sound.Events#RATE
  127382. *
  127383. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127384. * @param {number} rate - The new rate of the Sound.
  127385. */
  127386. module.exports = 'rate';
  127387. /***/ }),
  127388. /* 920 */
  127389. /***/ (function(module, exports) {
  127390. /**
  127391. * @author Richard Davey <rich@photonstorm.com>
  127392. * @copyright 2019 Photon Storm Ltd.
  127393. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127394. */
  127395. /**
  127396. * The Sound Play Event.
  127397. *
  127398. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are played.
  127399. *
  127400. * Listen to it from a Sound instance using `Sound.on('play', listener)`, i.e.:
  127401. *
  127402. * ```javascript
  127403. * var music = this.sound.add('key');
  127404. * music.on('play', listener);
  127405. * music.play();
  127406. * ```
  127407. *
  127408. * @event Phaser.Sound.Events#PLAY
  127409. *
  127410. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127411. */
  127412. module.exports = 'play';
  127413. /***/ }),
  127414. /* 921 */
  127415. /***/ (function(module, exports) {
  127416. /**
  127417. * @author Richard Davey <rich@photonstorm.com>
  127418. * @copyright 2019 Photon Storm Ltd.
  127419. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127420. */
  127421. /**
  127422. * The Sound Pause Event.
  127423. *
  127424. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are paused.
  127425. *
  127426. * Listen to it from a Sound instance using `Sound.on('pause', listener)`, i.e.:
  127427. *
  127428. * ```javascript
  127429. * var music = this.sound.add('key');
  127430. * music.on('pause', listener);
  127431. * music.play();
  127432. * music.pause();
  127433. * ```
  127434. *
  127435. * @event Phaser.Sound.Events#PAUSE
  127436. *
  127437. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127438. */
  127439. module.exports = 'pause';
  127440. /***/ }),
  127441. /* 922 */
  127442. /***/ (function(module, exports) {
  127443. /**
  127444. * @author Richard Davey <rich@photonstorm.com>
  127445. * @copyright 2019 Photon Storm Ltd.
  127446. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127447. */
  127448. /**
  127449. * The Pause All Sounds Event.
  127450. *
  127451. * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager,
  127452. * or the HTML5 Audio Manager. It is dispatched when the `pauseAll` method is invoked and after all current Sounds
  127453. * have been paused.
  127454. *
  127455. * Listen to it from a Scene using: `this.sound.on('pauseall', listener)`.
  127456. *
  127457. * @event Phaser.Sound.Events#PAUSE_ALL
  127458. *
  127459. * @param {Phaser.Sound.BaseSoundManager} soundManager - A reference to the sound manager that emitted the event.
  127460. */
  127461. module.exports = 'pauseall';
  127462. /***/ }),
  127463. /* 923 */
  127464. /***/ (function(module, exports) {
  127465. /**
  127466. * @author Richard Davey <rich@photonstorm.com>
  127467. * @copyright 2019 Photon Storm Ltd.
  127468. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127469. */
  127470. /**
  127471. * The Sound Mute Event.
  127472. *
  127473. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their mute state changes.
  127474. *
  127475. * Listen to it from a Sound instance using `Sound.on('mute', listener)`, i.e.:
  127476. *
  127477. * ```javascript
  127478. * var music = this.sound.add('key');
  127479. * music.on('mute', listener);
  127480. * music.play();
  127481. * music.setMute(true);
  127482. * ```
  127483. *
  127484. * @event Phaser.Sound.Events#MUTE
  127485. *
  127486. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127487. * @param {boolean} mute - The mute value. `true` if the Sound is now muted, otherwise `false`.
  127488. */
  127489. module.exports = 'mute';
  127490. /***/ }),
  127491. /* 924 */
  127492. /***/ (function(module, exports) {
  127493. /**
  127494. * @author Richard Davey <rich@photonstorm.com>
  127495. * @copyright 2019 Photon Storm Ltd.
  127496. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127497. */
  127498. /**
  127499. * The Sound Looped Event.
  127500. *
  127501. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they loop during playback.
  127502. *
  127503. * Listen to it from a Sound instance using `Sound.on('looped', listener)`, i.e.:
  127504. *
  127505. * ```javascript
  127506. * var music = this.sound.add('key');
  127507. * music.on('looped', listener);
  127508. * music.setLoop(true);
  127509. * music.play();
  127510. * ```
  127511. *
  127512. * This is not to be confused with the [LOOP]{@linkcode Phaser.Sound.Events#event:LOOP} event, which only emits when the loop state of a Sound is changed.
  127513. *
  127514. * @event Phaser.Sound.Events#LOOPED
  127515. *
  127516. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127517. */
  127518. module.exports = 'looped';
  127519. /***/ }),
  127520. /* 925 */
  127521. /***/ (function(module, exports) {
  127522. /**
  127523. * @author Richard Davey <rich@photonstorm.com>
  127524. * @copyright 2019 Photon Storm Ltd.
  127525. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127526. */
  127527. /**
  127528. * The Sound Loop Event.
  127529. *
  127530. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their loop state is changed.
  127531. *
  127532. * Listen to it from a Sound instance using `Sound.on('loop', listener)`, i.e.:
  127533. *
  127534. * ```javascript
  127535. * var music = this.sound.add('key');
  127536. * music.on('loop', listener);
  127537. * music.setLoop(true);
  127538. * ```
  127539. *
  127540. * This is not to be confused with the [LOOPED]{@linkcode Phaser.Sound.Events#event:LOOPED} event, which emits each time a Sound loops during playback.
  127541. *
  127542. * @event Phaser.Sound.Events#LOOP
  127543. *
  127544. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127545. * @param {boolean} loop - The new loop value. `true` if the Sound will loop, otherwise `false`.
  127546. */
  127547. module.exports = 'loop';
  127548. /***/ }),
  127549. /* 926 */
  127550. /***/ (function(module, exports) {
  127551. /**
  127552. * @author Richard Davey <rich@photonstorm.com>
  127553. * @copyright 2019 Photon Storm Ltd.
  127554. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127555. */
  127556. /**
  127557. * The Sound Manager Global Volume Event.
  127558. *
  127559. * This event is dispatched by the Sound Manager when its `volume` property is changed, either directly
  127560. * or via the `setVolume` method. This changes the volume of all active sounds.
  127561. *
  127562. * Listen to it from a Scene using: `this.sound.on('volume', listener)`.
  127563. *
  127564. * @event Phaser.Sound.Events#GLOBAL_VOLUME
  127565. *
  127566. * @param {(Phaser.Sound.WebAudioSoundManager|Phaser.Sound.HTML5AudioSoundManager)} soundManager - A reference to the sound manager that emitted the event.
  127567. * @param {number} volume - The new global volume of the Sound Manager.
  127568. */
  127569. module.exports = 'volume';
  127570. /***/ }),
  127571. /* 927 */
  127572. /***/ (function(module, exports) {
  127573. /**
  127574. * @author Richard Davey <rich@photonstorm.com>
  127575. * @copyright 2019 Photon Storm Ltd.
  127576. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127577. */
  127578. /**
  127579. * The Sound Manager Global Rate Event.
  127580. *
  127581. * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager,
  127582. * or the HTML5 Audio Manager. It is dispatched when the `rate` property of the Sound Manager is changed, which globally
  127583. * adjusts the playback rate of all active sounds.
  127584. *
  127585. * Listen to it from a Scene using: `this.sound.on('rate', listener)`.
  127586. *
  127587. * @event Phaser.Sound.Events#GLOBAL_RATE
  127588. *
  127589. * @param {Phaser.Sound.BaseSoundManager} soundManager - A reference to the sound manager that emitted the event.
  127590. * @param {number} rate - The updated rate value.
  127591. */
  127592. module.exports = 'rate';
  127593. /***/ }),
  127594. /* 928 */
  127595. /***/ (function(module, exports) {
  127596. /**
  127597. * @author Richard Davey <rich@photonstorm.com>
  127598. * @copyright 2019 Photon Storm Ltd.
  127599. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127600. */
  127601. /**
  127602. * The Sound Manager Global Mute Event.
  127603. *
  127604. * This event is dispatched by the Sound Manager when its `mute` property is changed, either directly
  127605. * or via the `setMute` method. This changes the mute state of all active sounds.
  127606. *
  127607. * Listen to it from a Scene using: `this.sound.on('mute', listener)`.
  127608. *
  127609. * @event Phaser.Sound.Events#GLOBAL_MUTE
  127610. *
  127611. * @param {(Phaser.Sound.WebAudioSoundManager|Phaser.Sound.HTML5AudioSoundManager)} soundManager - A reference to the sound manager that emitted the event.
  127612. * @param {boolean} mute - The mute value. `true` if the Sound Manager is now muted, otherwise `false`.
  127613. */
  127614. module.exports = 'mute';
  127615. /***/ }),
  127616. /* 929 */
  127617. /***/ (function(module, exports) {
  127618. /**
  127619. * @author Richard Davey <rich@photonstorm.com>
  127620. * @copyright 2019 Photon Storm Ltd.
  127621. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127622. */
  127623. /**
  127624. * The Sound Manager Global Detune Event.
  127625. *
  127626. * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager,
  127627. * or the HTML5 Audio Manager. It is dispatched when the `detune` property of the Sound Manager is changed, which globally
  127628. * adjusts the detuning of all active sounds.
  127629. *
  127630. * Listen to it from a Scene using: `this.sound.on('rate', listener)`.
  127631. *
  127632. * @event Phaser.Sound.Events#GLOBAL_DETUNE
  127633. *
  127634. * @param {Phaser.Sound.BaseSoundManager} soundManager - A reference to the sound manager that emitted the event.
  127635. * @param {number} detune - The updated detune value.
  127636. */
  127637. module.exports = 'detune';
  127638. /***/ }),
  127639. /* 930 */
  127640. /***/ (function(module, exports) {
  127641. /**
  127642. * @author Richard Davey <rich@photonstorm.com>
  127643. * @copyright 2019 Photon Storm Ltd.
  127644. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127645. */
  127646. /**
  127647. * The Sound Detune Event.
  127648. *
  127649. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their detune value changes.
  127650. *
  127651. * Listen to it from a Sound instance using `Sound.on('detune', listener)`, i.e.:
  127652. *
  127653. * ```javascript
  127654. * var music = this.sound.add('key');
  127655. * music.on('detune', listener);
  127656. * music.play();
  127657. * music.setDetune(200);
  127658. * ```
  127659. *
  127660. * @event Phaser.Sound.Events#DETUNE
  127661. *
  127662. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127663. * @param {number} detune - The new detune value of the Sound.
  127664. */
  127665. module.exports = 'detune';
  127666. /***/ }),
  127667. /* 931 */
  127668. /***/ (function(module, exports) {
  127669. /**
  127670. * @author Richard Davey <rich@photonstorm.com>
  127671. * @copyright 2019 Photon Storm Ltd.
  127672. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127673. */
  127674. /**
  127675. * The Sound Destroy Event.
  127676. *
  127677. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are destroyed, either
  127678. * directly or via a Sound Manager.
  127679. *
  127680. * Listen to it from a Sound instance using `Sound.on('destroy', listener)`, i.e.:
  127681. *
  127682. * ```javascript
  127683. * var music = this.sound.add('key');
  127684. * music.on('destroy', listener);
  127685. * music.destroy();
  127686. * ```
  127687. *
  127688. * @event Phaser.Sound.Events#DESTROY
  127689. *
  127690. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127691. */
  127692. module.exports = 'destroy';
  127693. /***/ }),
  127694. /* 932 */
  127695. /***/ (function(module, exports) {
  127696. /**
  127697. * @author Richard Davey <rich@photonstorm.com>
  127698. * @copyright 2019 Photon Storm Ltd.
  127699. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127700. */
  127701. /**
  127702. * The Sound Complete Event.
  127703. *
  127704. * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they complete playback.
  127705. *
  127706. * Listen to it from a Sound instance using `Sound.on('complete', listener)`, i.e.:
  127707. *
  127708. * ```javascript
  127709. * var music = this.sound.add('key');
  127710. * music.on('complete', listener);
  127711. * music.play();
  127712. * ```
  127713. *
  127714. * @event Phaser.Sound.Events#COMPLETE
  127715. *
  127716. * @param {(Phaser.Sound.WebAudioSound|Phaser.Sound.HTML5AudioSound)} sound - A reference to the Sound that emitted the event.
  127717. */
  127718. module.exports = 'complete';
  127719. /***/ }),
  127720. /* 933 */
  127721. /***/ (function(module, exports, __webpack_require__) {
  127722. /**
  127723. * @author Richard Davey <rich@photonstorm.com>
  127724. * @copyright 2019 Photon Storm Ltd.
  127725. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127726. */
  127727. // These properties get injected into the Scene and map to local systems
  127728. // The map value is the property that is injected into the Scene, the key is the Scene.Systems reference.
  127729. // These defaults can be modified via the Scene config object
  127730. // var config = {
  127731. // map: {
  127732. // add: 'makeStuff',
  127733. // load: 'loader'
  127734. // }
  127735. // };
  127736. var InjectionMap = {
  127737. game: 'game',
  127738. anims: 'anims',
  127739. cache: 'cache',
  127740. plugins: 'plugins',
  127741. registry: 'registry',
  127742. scale: 'scale',
  127743. sound: 'sound',
  127744. textures: 'textures',
  127745. events: 'events',
  127746. cameras: 'cameras',
  127747. add: 'add',
  127748. make: 'make',
  127749. scenePlugin: 'scene',
  127750. displayList: 'children',
  127751. lights: 'lights',
  127752. data: 'data',
  127753. input: 'input',
  127754. load: 'load',
  127755. time: 'time',
  127756. tweens: 'tweens',
  127757. arcadePhysics: 'physics',
  127758. impactPhysics: 'impact',
  127759. matterPhysics: 'matter'
  127760. };
  127761. if (false)
  127762. {}
  127763. if (false)
  127764. {}
  127765. module.exports = InjectionMap;
  127766. /***/ }),
  127767. /* 934 */
  127768. /***/ (function(module, exports, __webpack_require__) {
  127769. /**
  127770. * @author Richard Davey <rich@photonstorm.com>
  127771. * @copyright 2019 Photon Storm Ltd.
  127772. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127773. */
  127774. var GetFastValue = __webpack_require__(2);
  127775. /**
  127776. * Builds an array of which plugins (not including physics plugins) should be activated for the given Scene.
  127777. *
  127778. * @function Phaser.Scenes.GetScenePlugins
  127779. * @since 3.0.0
  127780. *
  127781. * @param {Phaser.Scenes.Systems} sys - The Scene Systems object to check for plugins.
  127782. *
  127783. * @return {array} An array of all plugins which should be activated, either the default ones or the ones configured in the Scene Systems object.
  127784. */
  127785. var GetScenePlugins = function (sys)
  127786. {
  127787. var defaultPlugins = sys.plugins.getDefaultScenePlugins();
  127788. var scenePlugins = GetFastValue(sys.settings, 'plugins', false);
  127789. // Scene Plugins always override Default Plugins
  127790. if (Array.isArray(scenePlugins))
  127791. {
  127792. return scenePlugins;
  127793. }
  127794. else if (defaultPlugins)
  127795. {
  127796. return defaultPlugins;
  127797. }
  127798. else
  127799. {
  127800. // No default plugins or plugins in this scene
  127801. return [];
  127802. }
  127803. };
  127804. module.exports = GetScenePlugins;
  127805. /***/ }),
  127806. /* 935 */
  127807. /***/ (function(module, exports, __webpack_require__) {
  127808. /**
  127809. * @author Richard Davey <rich@photonstorm.com>
  127810. * @copyright 2019 Photon Storm Ltd.
  127811. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127812. */
  127813. var GetFastValue = __webpack_require__(2);
  127814. var UppercaseFirst = __webpack_require__(330);
  127815. /**
  127816. * Builds an array of which physics plugins should be activated for the given Scene.
  127817. *
  127818. * @function Phaser.Scenes.GetPhysicsPlugins
  127819. * @since 3.0.0
  127820. *
  127821. * @param {Phaser.Scenes.Systems} sys - The scene system to get the physics systems of.
  127822. *
  127823. * @return {array} An array of Physics systems to start for this Scene.
  127824. */
  127825. var GetPhysicsPlugins = function (sys)
  127826. {
  127827. var defaultSystem = sys.game.config.defaultPhysicsSystem;
  127828. var sceneSystems = GetFastValue(sys.settings, 'physics', false);
  127829. if (!defaultSystem && !sceneSystems)
  127830. {
  127831. // No default physics system or systems in this scene
  127832. return;
  127833. }
  127834. // Let's build the systems array
  127835. var output = [];
  127836. if (defaultSystem)
  127837. {
  127838. output.push(UppercaseFirst(defaultSystem + 'Physics'));
  127839. }
  127840. if (sceneSystems)
  127841. {
  127842. for (var key in sceneSystems)
  127843. {
  127844. key = UppercaseFirst(key.concat('Physics'));
  127845. if (output.indexOf(key) === -1)
  127846. {
  127847. output.push(key);
  127848. }
  127849. }
  127850. }
  127851. // An array of Physics systems to start for this Scene
  127852. return output;
  127853. };
  127854. module.exports = GetPhysicsPlugins;
  127855. /***/ }),
  127856. /* 936 */
  127857. /***/ (function(module, exports) {
  127858. /**
  127859. * @author Richard Davey <rich@photonstorm.com>
  127860. * @copyright 2019 Photon Storm Ltd.
  127861. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127862. */
  127863. /**
  127864. * The Loader Plugin Start Event.
  127865. *
  127866. * This event is dispatched when the Loader starts running. At this point load progress is zero.
  127867. *
  127868. * This event is dispatched even if there aren't any files in the load queue.
  127869. *
  127870. * Listen to it from a Scene using: `this.load.on('start', listener)`.
  127871. *
  127872. * @event Phaser.Loader.Events#START
  127873. *
  127874. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader Plugin that dispatched this event.
  127875. */
  127876. module.exports = 'start';
  127877. /***/ }),
  127878. /* 937 */
  127879. /***/ (function(module, exports) {
  127880. /**
  127881. * @author Richard Davey <rich@photonstorm.com>
  127882. * @copyright 2019 Photon Storm Ltd.
  127883. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127884. */
  127885. /**
  127886. * The Loader Plugin Progress Event.
  127887. *
  127888. * This event is dispatched when the Loader updates its load progress, typically as a result of a file having completed loading.
  127889. *
  127890. * Listen to it from a Scene using: `this.load.on('progress', listener)`.
  127891. *
  127892. * @event Phaser.Loader.Events#PROGRESS
  127893. *
  127894. * @param {number} progress - The current progress of the load. A value between 0 and 1.
  127895. */
  127896. module.exports = 'progress';
  127897. /***/ }),
  127898. /* 938 */
  127899. /***/ (function(module, exports) {
  127900. /**
  127901. * @author Richard Davey <rich@photonstorm.com>
  127902. * @copyright 2019 Photon Storm Ltd.
  127903. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127904. */
  127905. /**
  127906. * The Loader Plugin Post Process Event.
  127907. *
  127908. * This event is dispatched by the Loader Plugin when the Loader has finished loading everything in the load queue.
  127909. * It is dispatched before the internal lists are cleared and each File is destroyed.
  127910. *
  127911. * Use this hook to perform any last minute processing of files that can only happen once the
  127912. * Loader has completed, but prior to it emitting the `complete` event.
  127913. *
  127914. * Listen to it from a Scene using: `this.load.on('postprocess', listener)`.
  127915. *
  127916. * @event Phaser.Loader.Events#POST_PROCESS
  127917. *
  127918. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader Plugin that dispatched this event.
  127919. */
  127920. module.exports = 'postprocess';
  127921. /***/ }),
  127922. /* 939 */
  127923. /***/ (function(module, exports) {
  127924. /**
  127925. * @author Richard Davey <rich@photonstorm.com>
  127926. * @copyright 2019 Photon Storm Ltd.
  127927. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127928. */
  127929. /**
  127930. * The File Load Progress Event.
  127931. *
  127932. * This event is dispatched by the Loader Plugin during the load of a file, if the browser receives a DOM ProgressEvent and
  127933. * the `lengthComputable` event property is true. Depending on the size of the file and browser in use, this may, or may not happen.
  127934. *
  127935. * Listen to it from a Scene using: `this.load.on('fileprogress', listener)`.
  127936. *
  127937. * @event Phaser.Loader.Events#FILE_PROGRESS
  127938. *
  127939. * @param {Phaser.Loader.File} file - A reference to the File which errored during load.
  127940. * @param {number} percentComplete - A value between 0 and 1 indicating how 'complete' this file is.
  127941. */
  127942. module.exports = 'fileprogress';
  127943. /***/ }),
  127944. /* 940 */
  127945. /***/ (function(module, exports) {
  127946. /**
  127947. * @author Richard Davey <rich@photonstorm.com>
  127948. * @copyright 2019 Photon Storm Ltd.
  127949. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127950. */
  127951. /**
  127952. * The File Load Event.
  127953. *
  127954. * This event is dispatched by the Loader Plugin when a file finishes loading,
  127955. * but _before_ it is processed and added to the internal Phaser caches.
  127956. *
  127957. * Listen to it from a Scene using: `this.load.on('load', listener)`.
  127958. *
  127959. * @event Phaser.Loader.Events#FILE_LOAD
  127960. *
  127961. * @param {Phaser.Loader.File} file - A reference to the File which just finished loading.
  127962. */
  127963. module.exports = 'load';
  127964. /***/ }),
  127965. /* 941 */
  127966. /***/ (function(module, exports) {
  127967. /**
  127968. * @author Richard Davey <rich@photonstorm.com>
  127969. * @copyright 2019 Photon Storm Ltd.
  127970. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127971. */
  127972. /**
  127973. * The File Load Error Event.
  127974. *
  127975. * This event is dispatched by the Loader Plugin when a file fails to load.
  127976. *
  127977. * Listen to it from a Scene using: `this.load.on('loaderror', listener)`.
  127978. *
  127979. * @event Phaser.Loader.Events#FILE_LOAD_ERROR
  127980. *
  127981. * @param {Phaser.Loader.File} file - A reference to the File which errored during load.
  127982. */
  127983. module.exports = 'loaderror';
  127984. /***/ }),
  127985. /* 942 */
  127986. /***/ (function(module, exports) {
  127987. /**
  127988. * @author Richard Davey <rich@photonstorm.com>
  127989. * @copyright 2019 Photon Storm Ltd.
  127990. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  127991. */
  127992. /**
  127993. * The File Load Complete Event.
  127994. *
  127995. * This event is dispatched by the Loader Plugin when any file in the queue finishes loading.
  127996. *
  127997. * It uses a special dynamic event name constructed from the key and type of the file.
  127998. *
  127999. * For example, if you have loaded an `image` with a key of `monster`, you can listen for it
  128000. * using the following:
  128001. *
  128002. * ```javascript
  128003. * this.load.on('filecomplete-image-monster', function (key, type, data) {
  128004. * // Your handler code
  128005. * });
  128006. * ```
  128007. *
  128008. * Or, if you have loaded a texture `atlas` with a key of `Level1`:
  128009. *
  128010. * ```javascript
  128011. * this.load.on('filecomplete-atlas-Level1', function (key, type, data) {
  128012. * // Your handler code
  128013. * });
  128014. * ```
  128015. *
  128016. * Or, if you have loaded a sprite sheet with a key of `Explosion` and a prefix of `GAMEOVER`:
  128017. *
  128018. * ```javascript
  128019. * this.load.on('filecomplete-spritesheet-GAMEOVERExplosion', function (key, type, data) {
  128020. * // Your handler code
  128021. * });
  128022. * ```
  128023. *
  128024. * You can also listen for the generic completion of files. See the [FILE_COMPLETE]{@linkcode Phaser.Loader.Events#event:FILE_COMPLETE} event.
  128025. *
  128026. * @event Phaser.Loader.Events#FILE_KEY_COMPLETE
  128027. *
  128028. * @param {string} key - The key of the file that just loaded and finished processing.
  128029. * @param {string} type - The [file type]{@link Phaser.Loader.File#type} of the file that just loaded, i.e. `image`.
  128030. * @param {any} data - The raw data the file contained.
  128031. */
  128032. module.exports = 'filecomplete-';
  128033. /***/ }),
  128034. /* 943 */
  128035. /***/ (function(module, exports) {
  128036. /**
  128037. * @author Richard Davey <rich@photonstorm.com>
  128038. * @copyright 2019 Photon Storm Ltd.
  128039. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128040. */
  128041. /**
  128042. * The File Load Complete Event.
  128043. *
  128044. * This event is dispatched by the Loader Plugin when any file in the queue finishes loading.
  128045. *
  128046. * Listen to it from a Scene using: `this.load.on('filecomplete', listener)`.
  128047. *
  128048. * You can also listen for the completion of a specific file. See the [FILE_KEY_COMPLETE]{@linkcode Phaser.Loader.Events#event:FILE_KEY_COMPLETE} event.
  128049. *
  128050. * @event Phaser.Loader.Events#FILE_COMPLETE
  128051. *
  128052. * @param {string} key - The key of the file that just loaded and finished processing.
  128053. * @param {string} type - The [file type]{@link Phaser.Loader.File#type} of the file that just loaded, i.e. `image`.
  128054. * @param {any} data - The raw data the file contained.
  128055. */
  128056. module.exports = 'filecomplete';
  128057. /***/ }),
  128058. /* 944 */
  128059. /***/ (function(module, exports) {
  128060. /**
  128061. * @author Richard Davey <rich@photonstorm.com>
  128062. * @copyright 2019 Photon Storm Ltd.
  128063. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128064. */
  128065. /**
  128066. * The Loader Plugin Complete Event.
  128067. *
  128068. * This event is dispatched when the Loader has fully processed everything in the load queue.
  128069. * By this point every loaded file will now be in its associated cache and ready for use.
  128070. *
  128071. * Listen to it from a Scene using: `this.load.on('complete', listener)`.
  128072. *
  128073. * @event Phaser.Loader.Events#COMPLETE
  128074. *
  128075. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader Plugin that dispatched this event.
  128076. * @param {integer} totalComplete - The total number of files that successfully loaded.
  128077. * @param {integer} totalFailed - The total number of files that failed to load.
  128078. */
  128079. module.exports = 'complete';
  128080. /***/ }),
  128081. /* 945 */
  128082. /***/ (function(module, exports) {
  128083. /**
  128084. * @author Richard Davey <rich@photonstorm.com>
  128085. * @copyright 2019 Photon Storm Ltd.
  128086. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128087. */
  128088. /**
  128089. * The Loader Plugin Add File Event.
  128090. *
  128091. * This event is dispatched when a new file is successfully added to the Loader and placed into the load queue.
  128092. *
  128093. * Listen to it from a Scene using: `this.load.on('addfile', listener)`.
  128094. *
  128095. * If you add lots of files to a Loader from a `preload` method, it will dispatch this event for each one of them.
  128096. *
  128097. * @event Phaser.Loader.Events#ADD
  128098. *
  128099. * @param {string} key - The unique key of the file that was added to the Loader.
  128100. * @param {string} type - The [file type]{@link Phaser.Loader.File#type} string of the file that was added to the Loader, i.e. `image`.
  128101. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader Plugin that dispatched this event.
  128102. * @param {Phaser.Loader.File} file - A reference to the File which was added to the Loader.
  128103. */
  128104. module.exports = 'addfile';
  128105. /***/ }),
  128106. /* 946 */
  128107. /***/ (function(module, exports) {
  128108. /**
  128109. * @author Richard Davey <rich@photonstorm.com>
  128110. * @copyright 2019 Photon Storm Ltd.
  128111. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128112. */
  128113. var GetInnerHeight = function (iOS)
  128114. {
  128115. // Based on code by @tylerjpeterson
  128116. if (!iOS)
  128117. {
  128118. return window.innerHeight;
  128119. }
  128120. var axis = Math.abs(window.orientation);
  128121. var size = { w: 0, h: 0 };
  128122. var ruler = document.createElement('div');
  128123. ruler.setAttribute('style', 'position: fixed; height: 100vh; width: 0; top: 0');
  128124. document.documentElement.appendChild(ruler);
  128125. size.w = (axis === 90) ? ruler.offsetHeight : window.innerWidth;
  128126. size.h = (axis === 90) ? window.innerWidth : ruler.offsetHeight;
  128127. document.documentElement.removeChild(ruler);
  128128. ruler = null;
  128129. if (Math.abs(window.orientation) !== 90)
  128130. {
  128131. return size.h;
  128132. }
  128133. else
  128134. {
  128135. return size.w;
  128136. }
  128137. };
  128138. module.exports = GetInnerHeight;
  128139. /***/ }),
  128140. /* 947 */
  128141. /***/ (function(module, exports) {
  128142. /**
  128143. * @author Richard Davey <rich@photonstorm.com>
  128144. * @copyright 2019 Photon Storm Ltd.
  128145. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128146. */
  128147. /**
  128148. * The Scale Manager Resize Event.
  128149. *
  128150. * This event is dispatched whenever the Scale Manager detects a resize event from the browser.
  128151. * It sends three parameters to the callback, each of them being Size components. You can read
  128152. * the `width`, `height`, `aspectRatio` and other properties of these components to help with
  128153. * scaling your own game content.
  128154. *
  128155. * @event Phaser.Scale.Events#RESIZE
  128156. *
  128157. * @param {Phaser.Structs.Size} gameSize - A reference to the Game Size component. This is the un-scaled size of your game canvas.
  128158. * @param {Phaser.Structs.Size} baseSize - A reference to the Base Size component. This is the game size multiplied by resolution.
  128159. * @param {Phaser.Structs.Size} displaySize - A reference to the Display Size component. This is the scaled canvas size, after applying zoom and scale mode.
  128160. */
  128161. module.exports = 'resize';
  128162. /***/ }),
  128163. /* 948 */
  128164. /***/ (function(module, exports) {
  128165. /**
  128166. * @author Richard Davey <rich@photonstorm.com>
  128167. * @copyright 2019 Photon Storm Ltd.
  128168. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128169. */
  128170. /**
  128171. * The Scale Manager Resize Event.
  128172. *
  128173. * @event Phaser.Scale.Events#ORIENTATION_CHANGE
  128174. *
  128175. * @param {string} orientation -
  128176. */
  128177. module.exports = 'orientationchange';
  128178. /***/ }),
  128179. /* 949 */
  128180. /***/ (function(module, exports) {
  128181. /**
  128182. * @author Richard Davey <rich@photonstorm.com>
  128183. * @copyright 2019 Photon Storm Ltd.
  128184. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128185. */
  128186. /**
  128187. * The Scale Manager Resize Event.
  128188. *
  128189. * @event Phaser.Scale.Events#LEAVE_FULLSCREEN
  128190. */
  128191. module.exports = 'leavefullscreen';
  128192. /***/ }),
  128193. /* 950 */
  128194. /***/ (function(module, exports) {
  128195. /**
  128196. * @author Richard Davey <rich@photonstorm.com>
  128197. * @copyright 2019 Photon Storm Ltd.
  128198. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128199. */
  128200. /**
  128201. * The Scale Manager Resize Event.
  128202. *
  128203. * @event Phaser.Scale.Events#FULLSCREEN_UNSUPPORTED
  128204. */
  128205. module.exports = 'fullscreenunsupported';
  128206. /***/ }),
  128207. /* 951 */
  128208. /***/ (function(module, exports) {
  128209. /**
  128210. * @author Richard Davey <rich@photonstorm.com>
  128211. * @copyright 2019 Photon Storm Ltd.
  128212. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128213. */
  128214. /**
  128215. * The Scale Manager Resize Event.
  128216. *
  128217. * @event Phaser.Scale.Events#ENTER_FULLSCREEN
  128218. */
  128219. module.exports = 'enterfullscreen';
  128220. /***/ }),
  128221. /* 952 */
  128222. /***/ (function(module, exports) {
  128223. /**
  128224. * @author Richard Davey <rich@photonstorm.com>
  128225. * @copyright 2019 Photon Storm Ltd.
  128226. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128227. */
  128228. /**
  128229. * The Input Plugin Update Event.
  128230. *
  128231. * This internal event is dispatched by the Input Plugin at the start of its `update` method.
  128232. * This hook is designed specifically for input plugins, but can also be listened to from user-land code.
  128233. *
  128234. * @event Phaser.Input.Events#UPDATE
  128235. *
  128236. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  128237. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  128238. */
  128239. module.exports = 'update';
  128240. /***/ }),
  128241. /* 953 */
  128242. /***/ (function(module, exports) {
  128243. /**
  128244. * @author Richard Davey <rich@photonstorm.com>
  128245. * @copyright 2019 Photon Storm Ltd.
  128246. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128247. */
  128248. /**
  128249. * The Input Plugin Start Event.
  128250. *
  128251. * This internal event is dispatched by the Input Plugin when it has finished setting-up,
  128252. * signalling to all of its internal systems to start.
  128253. *
  128254. * @event Phaser.Input.Events#START
  128255. */
  128256. module.exports = 'start';
  128257. /***/ }),
  128258. /* 954 */
  128259. /***/ (function(module, exports) {
  128260. /**
  128261. * @author Richard Davey <rich@photonstorm.com>
  128262. * @copyright 2019 Photon Storm Ltd.
  128263. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128264. */
  128265. /**
  128266. * The Input Plugin Shutdown Event.
  128267. *
  128268. * This internal event is dispatched by the Input Plugin when it shuts down, signalling to all of its systems to shut themselves down.
  128269. *
  128270. * @event Phaser.Input.Events#SHUTDOWN
  128271. */
  128272. module.exports = 'shutdown';
  128273. /***/ }),
  128274. /* 955 */
  128275. /***/ (function(module, exports) {
  128276. /**
  128277. * @author Richard Davey <rich@photonstorm.com>
  128278. * @copyright 2019 Photon Storm Ltd.
  128279. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128280. */
  128281. /**
  128282. * The Input Plugin Pre-Update Event.
  128283. *
  128284. * This internal event is dispatched by the Input Plugin at the start of its `preUpdate` method.
  128285. * This hook is designed specifically for input plugins, but can also be listened to from user-land code.
  128286. *
  128287. * @event Phaser.Input.Events#PRE_UPDATE
  128288. */
  128289. module.exports = 'preupdate';
  128290. /***/ }),
  128291. /* 956 */
  128292. /***/ (function(module, exports) {
  128293. /**
  128294. * @author Richard Davey <rich@photonstorm.com>
  128295. * @copyright 2019 Photon Storm Ltd.
  128296. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128297. */
  128298. /**
  128299. * The Input Manager Pointer Lock Change Event.
  128300. *
  128301. * This event is dispatched by the Input Manager when it is processing a native Pointer Lock Change DOM Event.
  128302. *
  128303. * @event Phaser.Input.Events#POINTERLOCK_CHANGE
  128304. *
  128305. * @param {Event} event - The native DOM Event.
  128306. * @param {boolean} locked - The locked state of the Mouse Pointer.
  128307. */
  128308. module.exports = 'pointerlockchange';
  128309. /***/ }),
  128310. /* 957 */
  128311. /***/ (function(module, exports) {
  128312. /**
  128313. * @author Richard Davey <rich@photonstorm.com>
  128314. * @copyright 2019 Photon Storm Ltd.
  128315. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128316. */
  128317. /**
  128318. * The Pointer Up Outside Input Event.
  128319. *
  128320. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is released anywhere outside of the game canvas.
  128321. *
  128322. * Listen to this event from within a Scene using: `this.input.on('pointerupoutside', listener)`.
  128323. *
  128324. * The event hierarchy is as follows:
  128325. *
  128326. * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP}
  128327. * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP}
  128328. * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE}
  128329. *
  128330. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128331. * the propagation of this event.
  128332. *
  128333. * @event Phaser.Input.Events#POINTER_UP_OUTSIDE
  128334. *
  128335. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128336. */
  128337. module.exports = 'pointerupoutside';
  128338. /***/ }),
  128339. /* 958 */
  128340. /***/ (function(module, exports) {
  128341. /**
  128342. * @author Richard Davey <rich@photonstorm.com>
  128343. * @copyright 2019 Photon Storm Ltd.
  128344. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128345. */
  128346. /**
  128347. * The Pointer Up Input Event.
  128348. *
  128349. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is released anywhere.
  128350. *
  128351. * Listen to this event from within a Scene using: `this.input.on('pointerup', listener)`.
  128352. *
  128353. * The event hierarchy is as follows:
  128354. *
  128355. * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP}
  128356. * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP}
  128357. * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE}
  128358. *
  128359. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128360. * the propagation of this event.
  128361. *
  128362. * @event Phaser.Input.Events#POINTER_UP
  128363. *
  128364. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128365. * @param {Phaser.GameObjects.GameObject[]} currentlyOver - An array containing all interactive Game Objects that the pointer was over when the event was created.
  128366. */
  128367. module.exports = 'pointerup';
  128368. /***/ }),
  128369. /* 959 */
  128370. /***/ (function(module, exports) {
  128371. /**
  128372. * @author Richard Davey <rich@photonstorm.com>
  128373. * @copyright 2019 Photon Storm Ltd.
  128374. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128375. */
  128376. /**
  128377. * The Pointer Over Input Event.
  128378. *
  128379. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves over any interactive Game Object.
  128380. *
  128381. * Listen to this event from within a Scene using: `this.input.on('pointerover', listener)`.
  128382. *
  128383. * The event hierarchy is as follows:
  128384. *
  128385. * 1. [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER}
  128386. * 2. [GAMEOBJECT_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OVER}
  128387. * 3. [POINTER_OVER]{@linkcode Phaser.Input.Events#event:POINTER_OVER}
  128388. *
  128389. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128390. * the propagation of this event.
  128391. *
  128392. * @event Phaser.Input.Events#POINTER_OVER
  128393. *
  128394. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128395. * @param {Phaser.GameObjects.GameObject[]} justOver - An array containing all interactive Game Objects that the pointer moved over when the event was created.
  128396. */
  128397. module.exports = 'pointerover';
  128398. /***/ }),
  128399. /* 960 */
  128400. /***/ (function(module, exports) {
  128401. /**
  128402. * @author Richard Davey <rich@photonstorm.com>
  128403. * @copyright 2019 Photon Storm Ltd.
  128404. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128405. */
  128406. /**
  128407. * The Pointer Out Input Event.
  128408. *
  128409. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves out of any interactive Game Object.
  128410. *
  128411. * Listen to this event from within a Scene using: `this.input.on('pointerup', listener)`.
  128412. *
  128413. * The event hierarchy is as follows:
  128414. *
  128415. * 1. [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT}
  128416. * 2. [GAMEOBJECT_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OUT}
  128417. * 3. [POINTER_OUT]{@linkcode Phaser.Input.Events#event:POINTER_OUT}
  128418. *
  128419. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128420. * the propagation of this event.
  128421. *
  128422. * @event Phaser.Input.Events#POINTER_OUT
  128423. *
  128424. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128425. * @param {Phaser.GameObjects.GameObject[]} justOut - An array containing all interactive Game Objects that the pointer moved out of when the event was created.
  128426. */
  128427. module.exports = 'pointerout';
  128428. /***/ }),
  128429. /* 961 */
  128430. /***/ (function(module, exports) {
  128431. /**
  128432. * @author Richard Davey <rich@photonstorm.com>
  128433. * @copyright 2019 Photon Storm Ltd.
  128434. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128435. */
  128436. /**
  128437. * The Pointer Move Input Event.
  128438. *
  128439. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is moved anywhere.
  128440. *
  128441. * Listen to this event from within a Scene using: `this.input.on('pointermove', listener)`.
  128442. *
  128443. * The event hierarchy is as follows:
  128444. *
  128445. * 1. [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE}
  128446. * 2. [GAMEOBJECT_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_MOVE}
  128447. * 3. [POINTER_MOVE]{@linkcode Phaser.Input.Events#event:POINTER_MOVE}
  128448. *
  128449. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128450. * the propagation of this event.
  128451. *
  128452. * @event Phaser.Input.Events#POINTER_MOVE
  128453. *
  128454. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128455. * @param {Phaser.GameObjects.GameObject[]} currentlyOver - An array containing all interactive Game Objects that the pointer was over when the event was created.
  128456. */
  128457. module.exports = 'pointermove';
  128458. /***/ }),
  128459. /* 962 */
  128460. /***/ (function(module, exports) {
  128461. /**
  128462. * @author Richard Davey <rich@photonstorm.com>
  128463. * @copyright 2019 Photon Storm Ltd.
  128464. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128465. */
  128466. /**
  128467. * The Pointer Down Outside Input Event.
  128468. *
  128469. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is pressed down anywhere outside of the game canvas.
  128470. *
  128471. * Listen to this event from within a Scene using: `this.input.on('pointerdownoutside', listener)`.
  128472. *
  128473. * The event hierarchy is as follows:
  128474. *
  128475. * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN}
  128476. * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN}
  128477. * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE}
  128478. *
  128479. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128480. * the propagation of this event.
  128481. *
  128482. * @event Phaser.Input.Events#POINTER_DOWN_OUTSIDE
  128483. *
  128484. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128485. */
  128486. module.exports = 'pointerdownoutside';
  128487. /***/ }),
  128488. /* 963 */
  128489. /***/ (function(module, exports) {
  128490. /**
  128491. * @author Richard Davey <rich@photonstorm.com>
  128492. * @copyright 2019 Photon Storm Ltd.
  128493. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128494. */
  128495. /**
  128496. * The Pointer Down Input Event.
  128497. *
  128498. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is pressed down anywhere.
  128499. *
  128500. * Listen to this event from within a Scene using: `this.input.on('pointerdown', listener)`.
  128501. *
  128502. * The event hierarchy is as follows:
  128503. *
  128504. * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN}
  128505. * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN}
  128506. * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE}
  128507. *
  128508. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128509. * the propagation of this event.
  128510. *
  128511. * @event Phaser.Input.Events#POINTER_DOWN
  128512. *
  128513. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128514. * @param {Phaser.GameObjects.GameObject[]} currentlyOver - An array containing all interactive Game Objects that the pointer was over when the event was created.
  128515. */
  128516. module.exports = 'pointerdown';
  128517. /***/ }),
  128518. /* 964 */
  128519. /***/ (function(module, exports) {
  128520. /**
  128521. * @author Richard Davey <rich@photonstorm.com>
  128522. * @copyright 2019 Photon Storm Ltd.
  128523. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128524. */
  128525. /**
  128526. * The Input Manager Update Event.
  128527. *
  128528. * This internal event is dispatched by the Input Manager as part of its update step.
  128529. *
  128530. * @event Phaser.Input.Events#MANAGER_UPDATE
  128531. */
  128532. module.exports = 'update';
  128533. /***/ }),
  128534. /* 965 */
  128535. /***/ (function(module, exports) {
  128536. /**
  128537. * @author Richard Davey <rich@photonstorm.com>
  128538. * @copyright 2019 Photon Storm Ltd.
  128539. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128540. */
  128541. /**
  128542. * The Input Manager Process Event.
  128543. *
  128544. * This internal event is dispatched by the Input Manager when not using the legacy queue system,
  128545. * and it wants the Input Plugins to update themselves.
  128546. *
  128547. * @event Phaser.Input.Events#MANAGER_PROCESS
  128548. *
  128549. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  128550. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  128551. */
  128552. module.exports = 'process';
  128553. /***/ }),
  128554. /* 966 */
  128555. /***/ (function(module, exports) {
  128556. /**
  128557. * @author Richard Davey <rich@photonstorm.com>
  128558. * @copyright 2019 Photon Storm Ltd.
  128559. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128560. */
  128561. /**
  128562. * The Input Manager Boot Event.
  128563. *
  128564. * This internal event is dispatched by the Input Manager when it boots.
  128565. *
  128566. * @event Phaser.Input.Events#MANAGER_BOOT
  128567. */
  128568. module.exports = 'boot';
  128569. /***/ }),
  128570. /* 967 */
  128571. /***/ (function(module, exports) {
  128572. /**
  128573. * @author Richard Davey <rich@photonstorm.com>
  128574. * @copyright 2019 Photon Storm Ltd.
  128575. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128576. */
  128577. /**
  128578. * The Game Object Up Input Event.
  128579. *
  128580. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is released while over _any_ interactive Game Object.
  128581. *
  128582. * Listen to this event from within a Scene using: `this.input.on('gameobjectup', listener)`.
  128583. *
  128584. * To receive this event, the Game Objects must have been set as interactive.
  128585. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128586. *
  128587. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} event instead.
  128588. *
  128589. * The event hierarchy is as follows:
  128590. *
  128591. * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP}
  128592. * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP}
  128593. * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE}
  128594. *
  128595. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128596. * the propagation of this event.
  128597. *
  128598. * @event Phaser.Input.Events#GAMEOBJECT_UP
  128599. *
  128600. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128601. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object the pointer was over when released.
  128602. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  128603. */
  128604. module.exports = 'gameobjectup';
  128605. /***/ }),
  128606. /* 968 */
  128607. /***/ (function(module, exports) {
  128608. /**
  128609. * @author Richard Davey <rich@photonstorm.com>
  128610. * @copyright 2019 Photon Storm Ltd.
  128611. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128612. */
  128613. /**
  128614. * The Game Object Pointer Up Event.
  128615. *
  128616. * This event is dispatched by an interactive Game Object if a pointer is released while over it.
  128617. *
  128618. * Listen to this event from a Game Object using: `gameObject.on('pointerup', listener)`.
  128619. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  128620. *
  128621. * To receive this event, the Game Object must have been set as interactive.
  128622. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128623. *
  128624. * The event hierarchy is as follows:
  128625. *
  128626. * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP}
  128627. * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP}
  128628. * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE}
  128629. *
  128630. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128631. * the propagation of this event.
  128632. *
  128633. * @event Phaser.Input.Events#GAMEOBJECT_POINTER_UP
  128634. *
  128635. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128636. * @param {number} localX - The x coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  128637. * @param {number} localY - The y coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  128638. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  128639. */
  128640. module.exports = 'pointerup';
  128641. /***/ }),
  128642. /* 969 */
  128643. /***/ (function(module, exports) {
  128644. /**
  128645. * @author Richard Davey <rich@photonstorm.com>
  128646. * @copyright 2019 Photon Storm Ltd.
  128647. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128648. */
  128649. /**
  128650. * The Game Object Pointer Over Event.
  128651. *
  128652. * This event is dispatched by an interactive Game Object if a pointer moves over it.
  128653. *
  128654. * Listen to this event from a Game Object using: `gameObject.on('pointerover', listener)`.
  128655. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  128656. *
  128657. * To receive this event, the Game Object must have been set as interactive.
  128658. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128659. *
  128660. * The event hierarchy is as follows:
  128661. *
  128662. * 1. [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER}
  128663. * 2. [GAMEOBJECT_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OVER}
  128664. * 3. [POINTER_OVER]{@linkcode Phaser.Input.Events#event:POINTER_OVER}
  128665. *
  128666. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128667. * the propagation of this event.
  128668. *
  128669. * @event Phaser.Input.Events#GAMEOBJECT_POINTER_OVER
  128670. *
  128671. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128672. * @param {number} localX - The x coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  128673. * @param {number} localY - The y coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  128674. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  128675. */
  128676. module.exports = 'pointerover';
  128677. /***/ }),
  128678. /* 970 */
  128679. /***/ (function(module, exports) {
  128680. /**
  128681. * @author Richard Davey <rich@photonstorm.com>
  128682. * @copyright 2019 Photon Storm Ltd.
  128683. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128684. */
  128685. /**
  128686. * The Game Object Pointer Out Event.
  128687. *
  128688. * This event is dispatched by an interactive Game Object if a pointer moves out of it.
  128689. *
  128690. * Listen to this event from a Game Object using: `gameObject.on('pointerout', listener)`.
  128691. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  128692. *
  128693. * To receive this event, the Game Object must have been set as interactive.
  128694. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128695. *
  128696. * The event hierarchy is as follows:
  128697. *
  128698. * 1. [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT}
  128699. * 2. [GAMEOBJECT_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OUT}
  128700. * 3. [POINTER_OUT]{@linkcode Phaser.Input.Events#event:POINTER_OUT}
  128701. *
  128702. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128703. * the propagation of this event.
  128704. *
  128705. * @event Phaser.Input.Events#GAMEOBJECT_POINTER_OUT
  128706. *
  128707. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128708. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  128709. */
  128710. module.exports = 'pointerout';
  128711. /***/ }),
  128712. /* 971 */
  128713. /***/ (function(module, exports) {
  128714. /**
  128715. * @author Richard Davey <rich@photonstorm.com>
  128716. * @copyright 2019 Photon Storm Ltd.
  128717. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128718. */
  128719. /**
  128720. * The Game Object Pointer Move Event.
  128721. *
  128722. * This event is dispatched by an interactive Game Object if a pointer is moved while over it.
  128723. *
  128724. * Listen to this event from a Game Object using: `gameObject.on('pointermove', listener)`.
  128725. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  128726. *
  128727. * To receive this event, the Game Object must have been set as interactive.
  128728. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128729. *
  128730. * The event hierarchy is as follows:
  128731. *
  128732. * 1. [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE}
  128733. * 2. [GAMEOBJECT_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_MOVE}
  128734. * 3. [POINTER_MOVE]{@linkcode Phaser.Input.Events#event:POINTER_MOVE}
  128735. *
  128736. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128737. * the propagation of this event.
  128738. *
  128739. * @event Phaser.Input.Events#GAMEOBJECT_POINTER_MOVE
  128740. *
  128741. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128742. * @param {number} localX - The x coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  128743. * @param {number} localY - The y coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  128744. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  128745. */
  128746. module.exports = 'pointermove';
  128747. /***/ }),
  128748. /* 972 */
  128749. /***/ (function(module, exports) {
  128750. /**
  128751. * @author Richard Davey <rich@photonstorm.com>
  128752. * @copyright 2019 Photon Storm Ltd.
  128753. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128754. */
  128755. /**
  128756. * The Game Object Pointer Down Event.
  128757. *
  128758. * This event is dispatched by an interactive Game Object if a pointer is pressed down on it.
  128759. *
  128760. * Listen to this event from a Game Object using: `gameObject.on('pointerdown', listener)`.
  128761. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  128762. *
  128763. * To receive this event, the Game Object must have been set as interactive.
  128764. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128765. *
  128766. * The event hierarchy is as follows:
  128767. *
  128768. * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN}
  128769. * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN}
  128770. * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE}
  128771. *
  128772. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128773. * the propagation of this event.
  128774. *
  128775. * @event Phaser.Input.Events#GAMEOBJECT_POINTER_DOWN
  128776. *
  128777. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128778. * @param {number} localX - The x coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  128779. * @param {number} localY - The y coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  128780. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  128781. */
  128782. module.exports = 'pointerdown';
  128783. /***/ }),
  128784. /* 973 */
  128785. /***/ (function(module, exports) {
  128786. /**
  128787. * @author Richard Davey <rich@photonstorm.com>
  128788. * @copyright 2019 Photon Storm Ltd.
  128789. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128790. */
  128791. /**
  128792. * The Game Object Over Input Event.
  128793. *
  128794. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves over _any_ interactive Game Object.
  128795. *
  128796. * Listen to this event from within a Scene using: `this.input.on('gameobjectover', listener)`.
  128797. *
  128798. * To receive this event, the Game Objects must have been set as interactive.
  128799. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128800. *
  128801. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER} event instead.
  128802. *
  128803. * The event hierarchy is as follows:
  128804. *
  128805. * 1. [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER}
  128806. * 2. [GAMEOBJECT_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OVER}
  128807. * 3. [POINTER_OVER]{@linkcode Phaser.Input.Events#event:POINTER_OVER}
  128808. *
  128809. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128810. * the propagation of this event.
  128811. *
  128812. * @event Phaser.Input.Events#GAMEOBJECT_OVER
  128813. *
  128814. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128815. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object the pointer moved over.
  128816. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  128817. */
  128818. module.exports = 'gameobjectover';
  128819. /***/ }),
  128820. /* 974 */
  128821. /***/ (function(module, exports) {
  128822. /**
  128823. * @author Richard Davey <rich@photonstorm.com>
  128824. * @copyright 2019 Photon Storm Ltd.
  128825. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128826. */
  128827. /**
  128828. * The Game Object Out Input Event.
  128829. *
  128830. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves out of _any_ interactive Game Object.
  128831. *
  128832. * Listen to this event from within a Scene using: `this.input.on('gameobjectout', listener)`.
  128833. *
  128834. * To receive this event, the Game Objects must have been set as interactive.
  128835. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128836. *
  128837. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT} event instead.
  128838. *
  128839. * The event hierarchy is as follows:
  128840. *
  128841. * 1. [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT}
  128842. * 2. [GAMEOBJECT_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OUT}
  128843. * 3. [POINTER_OUT]{@linkcode Phaser.Input.Events#event:POINTER_OUT}
  128844. *
  128845. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128846. * the propagation of this event.
  128847. *
  128848. * @event Phaser.Input.Events#GAMEOBJECT_OUT
  128849. *
  128850. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128851. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object the pointer moved out of.
  128852. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  128853. */
  128854. module.exports = 'gameobjectout';
  128855. /***/ }),
  128856. /* 975 */
  128857. /***/ (function(module, exports) {
  128858. /**
  128859. * @author Richard Davey <rich@photonstorm.com>
  128860. * @copyright 2019 Photon Storm Ltd.
  128861. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128862. */
  128863. /**
  128864. * The Game Object Move Input Event.
  128865. *
  128866. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is moved across _any_ interactive Game Object.
  128867. *
  128868. * Listen to this event from within a Scene using: `this.input.on('gameobjectmove', listener)`.
  128869. *
  128870. * To receive this event, the Game Objects must have been set as interactive.
  128871. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128872. *
  128873. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE} event instead.
  128874. *
  128875. * The event hierarchy is as follows:
  128876. *
  128877. * 1. [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE}
  128878. * 2. [GAMEOBJECT_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_MOVE}
  128879. * 3. [POINTER_MOVE]{@linkcode Phaser.Input.Events#event:POINTER_MOVE}
  128880. *
  128881. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  128882. * the propagation of this event.
  128883. *
  128884. * @event Phaser.Input.Events#GAMEOBJECT_MOVE
  128885. *
  128886. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128887. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object the pointer was moved on.
  128888. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  128889. */
  128890. module.exports = 'gameobjectmove';
  128891. /***/ }),
  128892. /* 976 */
  128893. /***/ (function(module, exports) {
  128894. /**
  128895. * @author Richard Davey <rich@photonstorm.com>
  128896. * @copyright 2019 Photon Storm Ltd.
  128897. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128898. */
  128899. /**
  128900. * The Game Object Drop Event.
  128901. *
  128902. * This event is dispatched by an interactive Game Object if a pointer drops it on a Drag Target.
  128903. *
  128904. * Listen to this event from a Game Object using: `gameObject.on('drop', listener)`.
  128905. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  128906. *
  128907. * To receive this event, the Game Object must have been set as interactive and enabled for drag.
  128908. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128909. *
  128910. * @event Phaser.Input.Events#GAMEOBJECT_DROP
  128911. *
  128912. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128913. * @param {Phaser.GameObjects.GameObject} target - The Drag Target the `gameObject` has been dropped on.
  128914. */
  128915. module.exports = 'drop';
  128916. /***/ }),
  128917. /* 977 */
  128918. /***/ (function(module, exports) {
  128919. /**
  128920. * @author Richard Davey <rich@photonstorm.com>
  128921. * @copyright 2019 Photon Storm Ltd.
  128922. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128923. */
  128924. /**
  128925. * The Game Object Drag Start Event.
  128926. *
  128927. * This event is dispatched by an interactive Game Object if a pointer starts to drag it.
  128928. *
  128929. * Listen to this event from a Game Object using: `gameObject.on('dragstart', listener)`.
  128930. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  128931. *
  128932. * To receive this event, the Game Object must have been set as interactive and enabled for drag.
  128933. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128934. *
  128935. * There are lots of useful drag related properties that are set within the Game Object when dragging occurs.
  128936. * For example, `gameObject.input.dragStartX`, `dragStartY` and so on.
  128937. *
  128938. * @event Phaser.Input.Events#GAMEOBJECT_DRAG_START
  128939. *
  128940. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128941. * @param {number} dragX - The x coordinate where the Pointer is currently dragging the Game Object, in world space.
  128942. * @param {number} dragY - The y coordinate where the Pointer is currently dragging the Game Object, in world space.
  128943. */
  128944. module.exports = 'dragstart';
  128945. /***/ }),
  128946. /* 978 */
  128947. /***/ (function(module, exports) {
  128948. /**
  128949. * @author Richard Davey <rich@photonstorm.com>
  128950. * @copyright 2019 Photon Storm Ltd.
  128951. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128952. */
  128953. /**
  128954. * The Game Object Drag Over Event.
  128955. *
  128956. * This event is dispatched by an interactive Game Object if a pointer drags it over a drag target.
  128957. *
  128958. * When the Game Object first enters the drag target it will emit a `dragenter` event. If it then moves while within
  128959. * the drag target, it will emit this event instead.
  128960. *
  128961. * Listen to this event from a Game Object using: `gameObject.on('dragover', listener)`.
  128962. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  128963. *
  128964. * To receive this event, the Game Object must have been set as interactive and enabled for drag.
  128965. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128966. *
  128967. * @event Phaser.Input.Events#GAMEOBJECT_DRAG_OVER
  128968. *
  128969. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128970. * @param {Phaser.GameObjects.GameObject} target - The drag target that this pointer has moved over.
  128971. */
  128972. module.exports = 'dragover';
  128973. /***/ }),
  128974. /* 979 */
  128975. /***/ (function(module, exports) {
  128976. /**
  128977. * @author Richard Davey <rich@photonstorm.com>
  128978. * @copyright 2019 Photon Storm Ltd.
  128979. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128980. */
  128981. /**
  128982. * The Game Object Drag Leave Event.
  128983. *
  128984. * This event is dispatched by an interactive Game Object if a pointer drags it out of a drag target.
  128985. *
  128986. * Listen to this event from a Game Object using: `gameObject.on('dragleave', listener)`.
  128987. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  128988. *
  128989. * To receive this event, the Game Object must have been set as interactive and enabled for drag.
  128990. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  128991. *
  128992. * @event Phaser.Input.Events#GAMEOBJECT_DRAG_LEAVE
  128993. *
  128994. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  128995. * @param {Phaser.GameObjects.GameObject} target - The drag target that this pointer has left.
  128996. */
  128997. module.exports = 'dragleave';
  128998. /***/ }),
  128999. /* 980 */
  129000. /***/ (function(module, exports) {
  129001. /**
  129002. * @author Richard Davey <rich@photonstorm.com>
  129003. * @copyright 2019 Photon Storm Ltd.
  129004. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129005. */
  129006. /**
  129007. * The Game Object Drag Event.
  129008. *
  129009. * This event is dispatched by an interactive Game Object if a pointer moves while dragging it.
  129010. *
  129011. * Listen to this event from a Game Object using: `gameObject.on('drag', listener)`.
  129012. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  129013. *
  129014. * To receive this event, the Game Object must have been set as interactive and enabled for drag.
  129015. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  129016. *
  129017. * @event Phaser.Input.Events#GAMEOBJECT_DRAG
  129018. *
  129019. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129020. * @param {number} dragX - The x coordinate where the Pointer is currently dragging the Game Object, in world space.
  129021. * @param {number} dragY - The y coordinate where the Pointer is currently dragging the Game Object, in world space.
  129022. */
  129023. module.exports = 'drag';
  129024. /***/ }),
  129025. /* 981 */
  129026. /***/ (function(module, exports) {
  129027. /**
  129028. * @author Richard Davey <rich@photonstorm.com>
  129029. * @copyright 2019 Photon Storm Ltd.
  129030. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129031. */
  129032. /**
  129033. * The Game Object Drag Enter Event.
  129034. *
  129035. * This event is dispatched by an interactive Game Object if a pointer drags it into a drag target.
  129036. *
  129037. * Listen to this event from a Game Object using: `gameObject.on('dragenter', listener)`.
  129038. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  129039. *
  129040. * To receive this event, the Game Object must have been set as interactive and enabled for drag.
  129041. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  129042. *
  129043. * @event Phaser.Input.Events#GAMEOBJECT_DRAG_ENTER
  129044. *
  129045. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129046. * @param {Phaser.GameObjects.GameObject} target - The drag target that this pointer has moved into.
  129047. */
  129048. module.exports = 'dragenter';
  129049. /***/ }),
  129050. /* 982 */
  129051. /***/ (function(module, exports) {
  129052. /**
  129053. * @author Richard Davey <rich@photonstorm.com>
  129054. * @copyright 2019 Photon Storm Ltd.
  129055. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129056. */
  129057. /**
  129058. * The Game Object Drag End Event.
  129059. *
  129060. * This event is dispatched by an interactive Game Object if a pointer stops dragging it.
  129061. *
  129062. * Listen to this event from a Game Object using: `gameObject.on('dragend', listener)`.
  129063. * Note that the scope of the listener is automatically set to be the Game Object instance itself.
  129064. *
  129065. * To receive this event, the Game Object must have been set as interactive and enabled for drag.
  129066. * See [GameObject.setInteractive](Phaser.GameObjects.GameObject#setInteractive) for more details.
  129067. *
  129068. * @event Phaser.Input.Events#GAMEOBJECT_DRAG_END
  129069. *
  129070. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129071. * @param {number} dragX - The x coordinate where the Pointer stopped dragging the Game Object, in world space.
  129072. * @param {number} dragY - The y coordinate where the Pointer stopped dragging the Game Object, in world space.
  129073. */
  129074. module.exports = 'dragend';
  129075. /***/ }),
  129076. /* 983 */
  129077. /***/ (function(module, exports) {
  129078. /**
  129079. * @author Richard Davey <rich@photonstorm.com>
  129080. * @copyright 2019 Photon Storm Ltd.
  129081. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129082. */
  129083. /**
  129084. * The Game Object Down Input Event.
  129085. *
  129086. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is pressed down on _any_ interactive Game Object.
  129087. *
  129088. * Listen to this event from within a Scene using: `this.input.on('gameobjectdown', listener)`.
  129089. *
  129090. * To receive this event, the Game Objects must have been set as interactive.
  129091. * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details.
  129092. *
  129093. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} event instead.
  129094. *
  129095. * The event hierarchy is as follows:
  129096. *
  129097. * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN}
  129098. * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN}
  129099. * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE}
  129100. *
  129101. * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop
  129102. * the propagation of this event.
  129103. *
  129104. * @event Phaser.Input.Events#GAMEOBJECT_DOWN
  129105. *
  129106. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129107. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object the pointer was pressed down on.
  129108. * @param {Phaser.Input.EventData} event - The Phaser input event. You can call `stopPropagation()` to halt it from going any further in the event flow.
  129109. */
  129110. module.exports = 'gameobjectdown';
  129111. /***/ }),
  129112. /* 984 */
  129113. /***/ (function(module, exports) {
  129114. /**
  129115. * @author Richard Davey <rich@photonstorm.com>
  129116. * @copyright 2019 Photon Storm Ltd.
  129117. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129118. */
  129119. /**
  129120. * The Input Plugin Game Over Event.
  129121. *
  129122. * This event is dispatched by the Input Plugin if the active pointer enters the game canvas and is now
  129123. * over of it, having previously been elsewhere on the web page.
  129124. *
  129125. * Listen to this event from within a Scene using: `this.input.on('gameover', listener)`.
  129126. *
  129127. * @event Phaser.Input.Events#GAME_OVER
  129128. *
  129129. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  129130. * @param {(MouseEvent|TouchEvent)} event - The DOM Event that triggered the canvas over.
  129131. */
  129132. module.exports = 'gameover';
  129133. /***/ }),
  129134. /* 985 */
  129135. /***/ (function(module, exports) {
  129136. /**
  129137. * @author Richard Davey <rich@photonstorm.com>
  129138. * @copyright 2019 Photon Storm Ltd.
  129139. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129140. */
  129141. /**
  129142. * The Input Plugin Game Out Event.
  129143. *
  129144. * This event is dispatched by the Input Plugin if the active pointer leaves the game canvas and is now
  129145. * outside of it, elsewhere on the web page.
  129146. *
  129147. * Listen to this event from within a Scene using: `this.input.on('gameout', listener)`.
  129148. *
  129149. * @event Phaser.Input.Events#GAME_OUT
  129150. *
  129151. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  129152. * @param {(MouseEvent|TouchEvent)} event - The DOM Event that triggered the canvas out.
  129153. */
  129154. module.exports = 'gameout';
  129155. /***/ }),
  129156. /* 986 */
  129157. /***/ (function(module, exports) {
  129158. /**
  129159. * @author Richard Davey <rich@photonstorm.com>
  129160. * @copyright 2019 Photon Storm Ltd.
  129161. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129162. */
  129163. /**
  129164. * The Pointer Drop Input Event.
  129165. *
  129166. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drops a Game Object on a Drag Target.
  129167. *
  129168. * Listen to this event from within a Scene using: `this.input.on('drop', listener)`.
  129169. *
  129170. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DROP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DROP} event instead.
  129171. *
  129172. * @event Phaser.Input.Events#DROP
  129173. *
  129174. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129175. * @param {Phaser.GameObjects.GameObject} gameObject - The interactive Game Object that this pointer was dragging.
  129176. * @param {Phaser.GameObjects.GameObject} target - The Drag Target the `gameObject` has been dropped on.
  129177. */
  129178. module.exports = 'drop';
  129179. /***/ }),
  129180. /* 987 */
  129181. /***/ (function(module, exports) {
  129182. /**
  129183. * @author Richard Davey <rich@photonstorm.com>
  129184. * @copyright 2019 Photon Storm Ltd.
  129185. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129186. */
  129187. /**
  129188. * The Pointer Drag Start Input Event.
  129189. *
  129190. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer starts to drag any Game Object.
  129191. *
  129192. * Listen to this event from within a Scene using: `this.input.on('dragstart', listener)`.
  129193. *
  129194. * A Pointer can only drag a single Game Object at once.
  129195. *
  129196. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_START]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_START} event instead.
  129197. *
  129198. * @event Phaser.Input.Events#DRAG_START
  129199. *
  129200. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129201. * @param {Phaser.GameObjects.GameObject} gameObject - The interactive Game Object that this pointer is dragging.
  129202. */
  129203. module.exports = 'dragstart';
  129204. /***/ }),
  129205. /* 988 */
  129206. /***/ (function(module, exports) {
  129207. /**
  129208. * @author Richard Davey <rich@photonstorm.com>
  129209. * @copyright 2019 Photon Storm Ltd.
  129210. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129211. */
  129212. /**
  129213. * The Pointer Drag Over Input Event.
  129214. *
  129215. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drags a Game Object over a Drag Target.
  129216. *
  129217. * When the Game Object first enters the drag target it will emit a `dragenter` event. If it then moves while within
  129218. * the drag target, it will emit this event instead.
  129219. *
  129220. * Listen to this event from within a Scene using: `this.input.on('dragover', listener)`.
  129221. *
  129222. * A Pointer can only drag a single Game Object at once.
  129223. *
  129224. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_OVER} event instead.
  129225. *
  129226. * @event Phaser.Input.Events#DRAG_OVER
  129227. *
  129228. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129229. * @param {Phaser.GameObjects.GameObject} gameObject - The interactive Game Object that this pointer is dragging.
  129230. * @param {Phaser.GameObjects.GameObject} target - The drag target that this pointer has moved over.
  129231. */
  129232. module.exports = 'dragover';
  129233. /***/ }),
  129234. /* 989 */
  129235. /***/ (function(module, exports) {
  129236. /**
  129237. * @author Richard Davey <rich@photonstorm.com>
  129238. * @copyright 2019 Photon Storm Ltd.
  129239. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129240. */
  129241. /**
  129242. * The Pointer Drag Leave Input Event.
  129243. *
  129244. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drags a Game Object out of a Drag Target.
  129245. *
  129246. * Listen to this event from within a Scene using: `this.input.on('dragleave', listener)`.
  129247. *
  129248. * A Pointer can only drag a single Game Object at once.
  129249. *
  129250. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_LEAVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_LEAVE} event instead.
  129251. *
  129252. * @event Phaser.Input.Events#DRAG_LEAVE
  129253. *
  129254. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129255. * @param {Phaser.GameObjects.GameObject} gameObject - The interactive Game Object that this pointer is dragging.
  129256. * @param {Phaser.GameObjects.GameObject} target - The drag target that this pointer has left.
  129257. */
  129258. module.exports = 'dragleave';
  129259. /***/ }),
  129260. /* 990 */
  129261. /***/ (function(module, exports) {
  129262. /**
  129263. * @author Richard Davey <rich@photonstorm.com>
  129264. * @copyright 2019 Photon Storm Ltd.
  129265. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129266. */
  129267. /**
  129268. * The Pointer Drag Input Event.
  129269. *
  129270. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves while dragging a Game Object.
  129271. *
  129272. * Listen to this event from within a Scene using: `this.input.on('drag', listener)`.
  129273. *
  129274. * A Pointer can only drag a single Game Object at once.
  129275. *
  129276. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG} event instead.
  129277. *
  129278. * @event Phaser.Input.Events#DRAG
  129279. *
  129280. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129281. * @param {Phaser.GameObjects.GameObject} gameObject - The interactive Game Object that this pointer is dragging.
  129282. * @param {number} dragX - The x coordinate where the Pointer is currently dragging the Game Object, in world space.
  129283. * @param {number} dragY - The y coordinate where the Pointer is currently dragging the Game Object, in world space.
  129284. */
  129285. module.exports = 'drag';
  129286. /***/ }),
  129287. /* 991 */
  129288. /***/ (function(module, exports) {
  129289. /**
  129290. * @author Richard Davey <rich@photonstorm.com>
  129291. * @copyright 2019 Photon Storm Ltd.
  129292. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129293. */
  129294. /**
  129295. * The Pointer Drag Enter Input Event.
  129296. *
  129297. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drags a Game Object into a Drag Target.
  129298. *
  129299. * Listen to this event from within a Scene using: `this.input.on('dragenter', listener)`.
  129300. *
  129301. * A Pointer can only drag a single Game Object at once.
  129302. *
  129303. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_ENTER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_ENTER} event instead.
  129304. *
  129305. * @event Phaser.Input.Events#DRAG_ENTER
  129306. *
  129307. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129308. * @param {Phaser.GameObjects.GameObject} gameObject - The interactive Game Object that this pointer is dragging.
  129309. * @param {Phaser.GameObjects.GameObject} target - The drag target that this pointer has moved into.
  129310. */
  129311. module.exports = 'dragenter';
  129312. /***/ }),
  129313. /* 992 */
  129314. /***/ (function(module, exports) {
  129315. /**
  129316. * @author Richard Davey <rich@photonstorm.com>
  129317. * @copyright 2019 Photon Storm Ltd.
  129318. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129319. */
  129320. /**
  129321. * The Pointer Drag End Input Event.
  129322. *
  129323. * This event is dispatched by the Input Plugin belonging to a Scene if a pointer stops dragging a Game Object.
  129324. *
  129325. * Listen to this event from within a Scene using: `this.input.on('dragend', listener)`.
  129326. *
  129327. * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_END]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_END} event instead.
  129328. *
  129329. * @event Phaser.Input.Events#DRAG_END
  129330. *
  129331. * @param {Phaser.Input.Pointer} pointer - The Pointer responsible for triggering this event.
  129332. * @param {Phaser.GameObjects.GameObject} gameObject - The interactive Game Object that this pointer stopped dragging.
  129333. */
  129334. module.exports = 'dragend';
  129335. /***/ }),
  129336. /* 993 */
  129337. /***/ (function(module, exports) {
  129338. /**
  129339. * @author Richard Davey <rich@photonstorm.com>
  129340. * @copyright 2019 Photon Storm Ltd.
  129341. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129342. */
  129343. /**
  129344. * The Input Plugin Destroy Event.
  129345. *
  129346. * This internal event is dispatched by the Input Plugin when it is destroyed, signalling to all of its systems to destroy themselves.
  129347. *
  129348. * @event Phaser.Input.Events#DESTROY
  129349. */
  129350. module.exports = 'destroy';
  129351. /***/ }),
  129352. /* 994 */
  129353. /***/ (function(module, exports) {
  129354. /**
  129355. * @author Richard Davey <rich@photonstorm.com>
  129356. * @copyright 2019 Photon Storm Ltd.
  129357. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129358. */
  129359. /**
  129360. * The Input Plugin Boot Event.
  129361. *
  129362. * This internal event is dispatched by the Input Plugin when it boots, signalling to all of its systems to create themselves.
  129363. *
  129364. * @event Phaser.Input.Events#BOOT
  129365. */
  129366. module.exports = 'boot';
  129367. /***/ }),
  129368. /* 995 */
  129369. /***/ (function(module, exports, __webpack_require__) {
  129370. /**
  129371. * @author Richard Davey <rich@photonstorm.com>
  129372. * @copyright 2019 Photon Storm Ltd.
  129373. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129374. */
  129375. var AddToDOM = __webpack_require__(179);
  129376. var AnimationManager = __webpack_require__(415);
  129377. var CacheManager = __webpack_require__(412);
  129378. var CanvasPool = __webpack_require__(24);
  129379. var Class = __webpack_require__(0);
  129380. var Config = __webpack_require__(390);
  129381. var CreateRenderer = __webpack_require__(367);
  129382. var DataManager = __webpack_require__(134);
  129383. var DebugHeader = __webpack_require__(365);
  129384. var Device = __webpack_require__(389);
  129385. var DOMContentLoaded = __webpack_require__(351);
  129386. var EventEmitter = __webpack_require__(11);
  129387. var Events = __webpack_require__(26);
  129388. var InputManager = __webpack_require__(342);
  129389. var PluginCache = __webpack_require__(17);
  129390. var PluginManager = __webpack_require__(336);
  129391. var ScaleManager = __webpack_require__(335);
  129392. var SceneManager = __webpack_require__(332);
  129393. var SoundManagerCreator = __webpack_require__(328);
  129394. var TextureEvents = __webpack_require__(126);
  129395. var TextureManager = __webpack_require__(321);
  129396. var TimeStep = __webpack_require__(364);
  129397. var VisibilityHandler = __webpack_require__(362);
  129398. if (false)
  129399. { var CreateDOMContainer; }
  129400. if (false)
  129401. { var FacebookInstantGamesPlugin; }
  129402. /**
  129403. * @classdesc
  129404. * The Phaser.Game instance is the main controller for the entire Phaser game. It is responsible
  129405. * for handling the boot process, parsing the configuration values, creating the renderer,
  129406. * and setting-up all of the global Phaser systems, such as sound and input.
  129407. * Once that is complete it will start the Scene Manager and then begin the main game loop.
  129408. *
  129409. * You should generally avoid accessing any of the systems created by Game, and instead use those
  129410. * made available to you via the Phaser.Scene Systems class instead.
  129411. *
  129412. * @class Game
  129413. * @memberof Phaser
  129414. * @constructor
  129415. * @fires Phaser.Core.Events#BLUR
  129416. * @fires Phaser.Core.Events#FOCUS
  129417. * @fires Phaser.Core.Events#HIDDEN
  129418. * @fires Phaser.Core.Events#VISIBLE
  129419. * @since 3.0.0
  129420. *
  129421. * @param {GameConfig} [GameConfig] - The configuration object for your Phaser Game instance.
  129422. */
  129423. var Game = new Class({
  129424. initialize:
  129425. function Game (config)
  129426. {
  129427. /**
  129428. * The parsed Game Configuration object.
  129429. *
  129430. * The values stored within this object are read-only and should not be changed at run-time.
  129431. *
  129432. * @name Phaser.Game#config
  129433. * @type {Phaser.Core.Config}
  129434. * @readonly
  129435. * @since 3.0.0
  129436. */
  129437. this.config = new Config(config);
  129438. /**
  129439. * A reference to either the Canvas or WebGL Renderer that this Game is using.
  129440. *
  129441. * @name Phaser.Game#renderer
  129442. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  129443. * @since 3.0.0
  129444. */
  129445. this.renderer = null;
  129446. if (false)
  129447. {}
  129448. /**
  129449. * A reference to the HTML Canvas Element that Phaser uses to render the game.
  129450. * This is created automatically by Phaser unless you provide a `canvas` property
  129451. * in your Game Config.
  129452. *
  129453. * @name Phaser.Game#canvas
  129454. * @type {HTMLCanvasElement}
  129455. * @since 3.0.0
  129456. */
  129457. this.canvas = null;
  129458. /**
  129459. * A reference to the Rendering Context belonging to the Canvas Element this game is rendering to.
  129460. * If the game is running under Canvas it will be a 2d Canvas Rendering Context.
  129461. * If the game is running under WebGL it will be a WebGL Rendering Context.
  129462. * This context is created automatically by Phaser unless you provide a `context` property
  129463. * in your Game Config.
  129464. *
  129465. * @name Phaser.Game#context
  129466. * @type {(CanvasRenderingContext2D|WebGLRenderingContext)}
  129467. * @since 3.0.0
  129468. */
  129469. this.context = null;
  129470. /**
  129471. * A flag indicating when this Game instance has finished its boot process.
  129472. *
  129473. * @name Phaser.Game#isBooted
  129474. * @type {boolean}
  129475. * @readonly
  129476. * @since 3.0.0
  129477. */
  129478. this.isBooted = false;
  129479. /**
  129480. * A flag indicating if this Game is currently running its game step or not.
  129481. *
  129482. * @name Phaser.Game#isRunning
  129483. * @type {boolean}
  129484. * @readonly
  129485. * @since 3.0.0
  129486. */
  129487. this.isRunning = false;
  129488. /**
  129489. * An Event Emitter which is used to broadcast game-level events from the global systems.
  129490. *
  129491. * @name Phaser.Game#events
  129492. * @type {Phaser.Events.EventEmitter}
  129493. * @since 3.0.0
  129494. */
  129495. this.events = new EventEmitter();
  129496. /**
  129497. * An instance of the Animation Manager.
  129498. *
  129499. * The Animation Manager is a global system responsible for managing all animations used within your game.
  129500. *
  129501. * @name Phaser.Game#anims
  129502. * @type {Phaser.Animations.AnimationManager}
  129503. * @since 3.0.0
  129504. */
  129505. this.anims = new AnimationManager(this);
  129506. /**
  129507. * An instance of the Texture Manager.
  129508. *
  129509. * The Texture Manager is a global system responsible for managing all textures being used by your game.
  129510. *
  129511. * @name Phaser.Game#textures
  129512. * @type {Phaser.Textures.TextureManager}
  129513. * @since 3.0.0
  129514. */
  129515. this.textures = new TextureManager(this);
  129516. /**
  129517. * An instance of the Cache Manager.
  129518. *
  129519. * The Cache Manager is a global system responsible for caching, accessing and releasing external game assets.
  129520. *
  129521. * @name Phaser.Game#cache
  129522. * @type {Phaser.Cache.CacheManager}
  129523. * @since 3.0.0
  129524. */
  129525. this.cache = new CacheManager(this);
  129526. /**
  129527. * An instance of the Data Manager
  129528. *
  129529. * @name Phaser.Game#registry
  129530. * @type {Phaser.Data.DataManager}
  129531. * @since 3.0.0
  129532. */
  129533. this.registry = new DataManager(this);
  129534. /**
  129535. * An instance of the Input Manager.
  129536. *
  129537. * The Input Manager is a global system responsible for the capture of browser-level input events.
  129538. *
  129539. * @name Phaser.Game#input
  129540. * @type {Phaser.Input.InputManager}
  129541. * @since 3.0.0
  129542. */
  129543. this.input = new InputManager(this, this.config);
  129544. /**
  129545. * An instance of the Scene Manager.
  129546. *
  129547. * The Scene Manager is a global system responsible for creating, modifying and updating the Scenes in your game.
  129548. *
  129549. * @name Phaser.Game#scene
  129550. * @type {Phaser.Scenes.SceneManager}
  129551. * @since 3.0.0
  129552. */
  129553. this.scene = new SceneManager(this, this.config.sceneConfig);
  129554. /**
  129555. * A reference to the Device inspector.
  129556. *
  129557. * Contains information about the device running this game, such as OS, browser vendor and feature support.
  129558. * Used by various systems to determine capabilities and code paths.
  129559. *
  129560. * @name Phaser.Game#device
  129561. * @type {Phaser.DeviceConf}
  129562. * @since 3.0.0
  129563. */
  129564. this.device = Device;
  129565. /**
  129566. * An instance of the Scale Manager.
  129567. *
  129568. * The Scale Manager is a global system responsible for handling scaling of the game canvas.
  129569. *
  129570. * @name Phaser.Game#scale
  129571. * @type {Phaser.Scale.ScaleManager}
  129572. * @since 3.16.0
  129573. */
  129574. this.scale = new ScaleManager(this, this.config);
  129575. /**
  129576. * An instance of the base Sound Manager.
  129577. *
  129578. * The Sound Manager is a global system responsible for the playback and updating of all audio in your game.
  129579. *
  129580. * @name Phaser.Game#sound
  129581. * @type {Phaser.Sound.BaseSoundManager}
  129582. * @since 3.0.0
  129583. */
  129584. this.sound = SoundManagerCreator.create(this);
  129585. /**
  129586. * An instance of the Time Step.
  129587. *
  129588. * The Time Step is a global system responsible for setting-up and responding to the browser frame events, processing
  129589. * them and calculating delta values. It then automatically calls the game step.
  129590. *
  129591. * @name Phaser.Game#loop
  129592. * @type {Phaser.Core.TimeStep}
  129593. * @since 3.0.0
  129594. */
  129595. this.loop = new TimeStep(this, this.config.fps);
  129596. /**
  129597. * An instance of the Plugin Manager.
  129598. *
  129599. * The Plugin Manager is a global system that allows plugins to register themselves with it, and can then install
  129600. * those plugins into Scenes as required.
  129601. *
  129602. * @name Phaser.Game#plugins
  129603. * @type {Phaser.Plugins.PluginManager}
  129604. * @since 3.0.0
  129605. */
  129606. this.plugins = new PluginManager(this, this.config);
  129607. if (false)
  129608. {}
  129609. /**
  129610. * Is this Game pending destruction at the start of the next frame?
  129611. *
  129612. * @name Phaser.Game#pendingDestroy
  129613. * @type {boolean}
  129614. * @private
  129615. * @since 3.5.0
  129616. */
  129617. this.pendingDestroy = false;
  129618. /**
  129619. * Remove the Canvas once the destroy is over?
  129620. *
  129621. * @name Phaser.Game#removeCanvas
  129622. * @type {boolean}
  129623. * @private
  129624. * @since 3.5.0
  129625. */
  129626. this.removeCanvas = false;
  129627. /**
  129628. * Remove everything when the game is destroyed.
  129629. * You cannot create a new Phaser instance on the same web page after doing this.
  129630. *
  129631. * @name Phaser.Game#noReturn
  129632. * @type {boolean}
  129633. * @private
  129634. * @since 3.12.0
  129635. */
  129636. this.noReturn = false;
  129637. /**
  129638. * Does the window the game is running in currently have focus or not?
  129639. * This is modified by the VisibilityHandler.
  129640. *
  129641. * @name Phaser.Game#hasFocus
  129642. * @type {boolean}
  129643. * @readonly
  129644. * @since 3.9.0
  129645. */
  129646. this.hasFocus = false;
  129647. // Wait for the DOM Ready event, then call boot.
  129648. DOMContentLoaded(this.boot.bind(this));
  129649. },
  129650. /**
  129651. * This method is called automatically when the DOM is ready. It is responsible for creating the renderer,
  129652. * displaying the Debug Header, adding the game canvas to the DOM and emitting the 'boot' event.
  129653. * It listens for a 'ready' event from the base systems and once received it will call `Game.start`.
  129654. *
  129655. * @method Phaser.Game#boot
  129656. * @protected
  129657. * @fires Phaser.Core.Events#BOOT
  129658. * @listens Phaser.Textures.Events#READY
  129659. * @since 3.0.0
  129660. */
  129661. boot: function ()
  129662. {
  129663. if (!PluginCache.hasCore('EventEmitter'))
  129664. {
  129665. console.warn('Aborting. Core Plugins missing.');
  129666. return;
  129667. }
  129668. this.isBooted = true;
  129669. this.config.preBoot(this);
  129670. this.scale.preBoot();
  129671. CreateRenderer(this);
  129672. if (false)
  129673. {}
  129674. DebugHeader(this);
  129675. AddToDOM(this.canvas, this.config.parent);
  129676. // The Texture Manager has to wait on a couple of non-blocking events before it's fully ready.
  129677. // So it will emit this internal event when done:
  129678. this.textures.once(TextureEvents.READY, this.texturesReady, this);
  129679. this.events.emit(Events.BOOT);
  129680. },
  129681. /**
  129682. * Called automatically when the Texture Manager has finished setting up and preparing the
  129683. * default textures.
  129684. *
  129685. * @method Phaser.Game#texturesReady
  129686. * @private
  129687. * @fires Phaser.Game#ready
  129688. * @since 3.12.0
  129689. */
  129690. texturesReady: function ()
  129691. {
  129692. // Start all the other systems
  129693. this.events.emit(Events.READY);
  129694. this.start();
  129695. },
  129696. /**
  129697. * Called automatically by Game.boot once all of the global systems have finished setting themselves up.
  129698. * By this point the Game is now ready to start the main loop running.
  129699. * It will also enable the Visibility Handler.
  129700. *
  129701. * @method Phaser.Game#start
  129702. * @protected
  129703. * @since 3.0.0
  129704. */
  129705. start: function ()
  129706. {
  129707. this.isRunning = true;
  129708. this.config.postBoot(this);
  129709. if (this.renderer)
  129710. {
  129711. this.loop.start(this.step.bind(this));
  129712. }
  129713. else
  129714. {
  129715. this.loop.start(this.headlessStep.bind(this));
  129716. }
  129717. VisibilityHandler(this);
  129718. var eventEmitter = this.events;
  129719. eventEmitter.on(Events.HIDDEN, this.onHidden, this);
  129720. eventEmitter.on(Events.VISIBLE, this.onVisible, this);
  129721. eventEmitter.on(Events.BLUR, this.onBlur, this);
  129722. eventEmitter.on(Events.FOCUS, this.onFocus, this);
  129723. },
  129724. /**
  129725. * The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of
  129726. * Request Animation Frame, or Set Timeout on very old browsers.)
  129727. *
  129728. * The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager.
  129729. *
  129730. * It will then render each Scene in turn, via the Renderer. This process emits `prerender` and `postrender` events.
  129731. *
  129732. * @method Phaser.Game#step
  129733. * @fires Phaser.Core.Events#PRE_STEP_EVENT
  129734. * @fires Phaser.Core.Events#STEP_EVENT
  129735. * @fires Phaser.Core.Events#POST_STEP_EVENT
  129736. * @fires Phaser.Core.Events#PRE_RENDER_EVENT
  129737. * @fires Phaser.Core.Events#POST_RENDER_EVENT
  129738. * @since 3.0.0
  129739. *
  129740. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  129741. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  129742. */
  129743. step: function (time, delta)
  129744. {
  129745. if (this.pendingDestroy)
  129746. {
  129747. return this.runDestroy();
  129748. }
  129749. var eventEmitter = this.events;
  129750. // Global Managers like Input and Sound update in the prestep
  129751. eventEmitter.emit(Events.PRE_STEP, time, delta);
  129752. // This is mostly meant for user-land code and plugins
  129753. eventEmitter.emit(Events.STEP, time, delta);
  129754. // Update the Scene Manager and all active Scenes
  129755. this.scene.update(time, delta);
  129756. // Our final event before rendering starts
  129757. eventEmitter.emit(Events.POST_STEP, time, delta);
  129758. var renderer = this.renderer;
  129759. // Run the Pre-render (clearing the canvas, setting background colors, etc)
  129760. renderer.preRender();
  129761. eventEmitter.emit(Events.PRE_RENDER, renderer, time, delta);
  129762. // The main render loop. Iterates all Scenes and all Cameras in those scenes, rendering to the renderer instance.
  129763. this.scene.render(renderer);
  129764. // The Post-Render call. Tidies up loose end, takes snapshots, etc.
  129765. renderer.postRender();
  129766. // The final event before the step repeats. Your last chance to do anything to the canvas before it all starts again.
  129767. eventEmitter.emit(Events.POST_RENDER, renderer, time, delta);
  129768. },
  129769. /**
  129770. * A special version of the Game Step for the HEADLESS renderer only.
  129771. *
  129772. * The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of
  129773. * Request Animation Frame, or Set Timeout on very old browsers.)
  129774. *
  129775. * The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager.
  129776. *
  129777. * This process emits `prerender` and `postrender` events, even though nothing actually displays.
  129778. *
  129779. * @method Phaser.Game#headlessStep
  129780. * @fires Phaser.Game#prerenderEvent
  129781. * @fires Phaser.Game#postrenderEvent
  129782. * @since 3.2.0
  129783. *
  129784. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  129785. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  129786. */
  129787. headlessStep: function (time, delta)
  129788. {
  129789. var eventEmitter = this.events;
  129790. // Global Managers
  129791. eventEmitter.emit(Events.PRE_STEP, time, delta);
  129792. eventEmitter.emit(Events.STEP, time, delta);
  129793. // Scenes
  129794. this.scene.update(time, delta);
  129795. eventEmitter.emit(Events.POST_STEP, time, delta);
  129796. // Render
  129797. eventEmitter.emit(Events.PRE_RENDER);
  129798. eventEmitter.emit(Events.POST_RENDER);
  129799. },
  129800. /**
  129801. * Called automatically by the Visibility Handler.
  129802. * This will pause the main loop and then emit a pause event.
  129803. *
  129804. * @method Phaser.Game#onHidden
  129805. * @protected
  129806. * @fires Phaser.Core.Events#PAUSE
  129807. * @since 3.0.0
  129808. */
  129809. onHidden: function ()
  129810. {
  129811. this.loop.pause();
  129812. this.events.emit(Events.PAUSE);
  129813. },
  129814. /**
  129815. * Called automatically by the Visibility Handler.
  129816. * This will resume the main loop and then emit a resume event.
  129817. *
  129818. * @method Phaser.Game#onVisible
  129819. * @protected
  129820. * @fires Phaser.Core.Events#RESUME
  129821. * @since 3.0.0
  129822. */
  129823. onVisible: function ()
  129824. {
  129825. this.loop.resume();
  129826. this.events.emit(Events.RESUME);
  129827. },
  129828. /**
  129829. * Called automatically by the Visibility Handler.
  129830. * This will set the main loop into a 'blurred' state, which pauses it.
  129831. *
  129832. * @method Phaser.Game#onBlur
  129833. * @protected
  129834. * @since 3.0.0
  129835. */
  129836. onBlur: function ()
  129837. {
  129838. this.hasFocus = false;
  129839. this.loop.blur();
  129840. },
  129841. /**
  129842. * Called automatically by the Visibility Handler.
  129843. * This will set the main loop into a 'focused' state, which resumes it.
  129844. *
  129845. * @method Phaser.Game#onFocus
  129846. * @protected
  129847. * @since 3.0.0
  129848. */
  129849. onFocus: function ()
  129850. {
  129851. this.hasFocus = true;
  129852. this.loop.focus();
  129853. },
  129854. /**
  129855. * Returns the current game frame.
  129856. * When the game starts running, the frame is incremented every time Request Animation Frame, or Set Timeout, fires.
  129857. *
  129858. * @method Phaser.Game#getFrame
  129859. * @since 3.16.0
  129860. *
  129861. * @return {number} The current game frame.
  129862. */
  129863. getFrame: function ()
  129864. {
  129865. return this.loop.frame;
  129866. },
  129867. /**
  129868. * Returns the current game timestamp.
  129869. * When the game starts running, the frame is incremented every time Request Animation Frame, or Set Timeout, fires.
  129870. *
  129871. * @method Phaser.Game#getTime
  129872. * @since 3.16.0
  129873. *
  129874. * @return {number} The current game timestamp.
  129875. */
  129876. getTime: function ()
  129877. {
  129878. return this.loop.frame.time;
  129879. },
  129880. /**
  129881. * Flags this Game instance as needing to be destroyed on the next frame.
  129882. * It will wait until the current frame has completed and then call `runDestroy` internally.
  129883. *
  129884. * If you **do not** need to run Phaser again on the same web page you can set the `noReturn` argument to `true` and it will free-up
  129885. * memory being held by the core Phaser plugins. If you do need to create another game instance on the same page, leave this as `false`.
  129886. *
  129887. * @method Phaser.Game#destroy
  129888. * @fires Phaser.Core.Events#DESTROY
  129889. * @since 3.0.0
  129890. *
  129891. * @param {boolean} removeCanvas - Set to `true` if you would like the parent canvas element removed from the DOM, or `false` to leave it in place.
  129892. * @param {boolean} [noReturn=false] - If `true` all the core Phaser plugins are destroyed. You cannot create another instance of Phaser on the same web page if you do this.
  129893. */
  129894. destroy: function (removeCanvas, noReturn)
  129895. {
  129896. if (noReturn === undefined) { noReturn = false; }
  129897. this.pendingDestroy = true;
  129898. this.removeCanvas = removeCanvas;
  129899. this.noReturn = noReturn;
  129900. },
  129901. /**
  129902. * Destroys this Phaser.Game instance, all global systems, all sub-systems and all Scenes.
  129903. *
  129904. * @method Phaser.Game#runDestroy
  129905. * @private
  129906. * @since 3.5.0
  129907. */
  129908. runDestroy: function ()
  129909. {
  129910. this.events.emit(Events.DESTROY);
  129911. this.events.removeAllListeners();
  129912. this.scene.destroy();
  129913. if (this.renderer)
  129914. {
  129915. this.renderer.destroy();
  129916. }
  129917. if (this.removeCanvas && this.canvas)
  129918. {
  129919. CanvasPool.remove(this.canvas);
  129920. if (this.canvas.parentNode)
  129921. {
  129922. this.canvas.parentNode.removeChild(this.canvas);
  129923. }
  129924. }
  129925. if (false)
  129926. {}
  129927. this.loop.destroy();
  129928. this.pendingDestroy = false;
  129929. }
  129930. });
  129931. module.exports = Game;
  129932. /**
  129933. * "Computers are good at following instructions, but not at reading your mind." - Donald Knuth
  129934. */
  129935. /***/ }),
  129936. /* 996 */
  129937. /***/ (function(module, exports, __webpack_require__) {
  129938. /**
  129939. * @author Richard Davey <rich@photonstorm.com>
  129940. * @copyright 2019 Photon Storm Ltd.
  129941. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129942. */
  129943. var Class = __webpack_require__(0);
  129944. var EE = __webpack_require__(11);
  129945. var PluginCache = __webpack_require__(17);
  129946. /**
  129947. * @classdesc
  129948. * EventEmitter is a Scene Systems plugin compatible version of eventemitter3.
  129949. *
  129950. * @class EventEmitter
  129951. * @memberof Phaser.Events
  129952. * @constructor
  129953. * @since 3.0.0
  129954. */
  129955. var EventEmitter = new Class({
  129956. Extends: EE,
  129957. initialize:
  129958. function EventEmitter ()
  129959. {
  129960. EE.call(this);
  129961. },
  129962. /**
  129963. * Removes all listeners.
  129964. *
  129965. * @method Phaser.Events.EventEmitter#shutdown
  129966. * @since 3.0.0
  129967. */
  129968. shutdown: function ()
  129969. {
  129970. this.removeAllListeners();
  129971. },
  129972. /**
  129973. * Removes all listeners.
  129974. *
  129975. * @method Phaser.Events.EventEmitter#destroy
  129976. * @since 3.0.0
  129977. */
  129978. destroy: function ()
  129979. {
  129980. this.removeAllListeners();
  129981. }
  129982. });
  129983. /**
  129984. * Return an array listing the events for which the emitter has registered listeners.
  129985. *
  129986. * @method Phaser.Events.EventEmitter#eventNames
  129987. * @since 3.0.0
  129988. *
  129989. * @return {array}
  129990. */
  129991. /**
  129992. * Return the listeners registered for a given event.
  129993. *
  129994. * @method Phaser.Events.EventEmitter#listeners
  129995. * @since 3.0.0
  129996. *
  129997. * @param {(string|symbol)} event - The event name.
  129998. *
  129999. * @return {array} The registered listeners.
  130000. */
  130001. /**
  130002. * Return the number of listeners listening to a given event.
  130003. *
  130004. * @method Phaser.Events.EventEmitter#listenerCount
  130005. * @since 3.0.0
  130006. *
  130007. * @param {(string|symbol)} event - The event name.
  130008. *
  130009. * @return {number} The number of listeners.
  130010. */
  130011. /**
  130012. * Calls each of the listeners registered for a given event.
  130013. *
  130014. * @method Phaser.Events.EventEmitter#emit
  130015. * @since 3.0.0
  130016. *
  130017. * @param {(string|symbol)} event - The event name.
  130018. * @param {...*} [args] - Additional arguments that will be passed to the event handler.
  130019. *
  130020. * @return {boolean} `true` if the event had listeners, else `false`.
  130021. */
  130022. /**
  130023. * Add a listener for a given event.
  130024. *
  130025. * @method Phaser.Events.EventEmitter#on
  130026. * @since 3.0.0
  130027. *
  130028. * @param {(string|symbol)} event - The event name.
  130029. * @param {function} fn - The listener function.
  130030. * @param {*} [context=this] - The context to invoke the listener with.
  130031. *
  130032. * @return {Phaser.Events.EventEmitter} `this`.
  130033. */
  130034. /**
  130035. * Add a listener for a given event.
  130036. *
  130037. * @method Phaser.Events.EventEmitter#addListener
  130038. * @since 3.0.0
  130039. *
  130040. * @param {(string|symbol)} event - The event name.
  130041. * @param {function} fn - The listener function.
  130042. * @param {*} [context=this] - The context to invoke the listener with.
  130043. *
  130044. * @return {Phaser.Events.EventEmitter} `this`.
  130045. */
  130046. /**
  130047. * Add a one-time listener for a given event.
  130048. *
  130049. * @method Phaser.Events.EventEmitter#once
  130050. * @since 3.0.0
  130051. *
  130052. * @param {(string|symbol)} event - The event name.
  130053. * @param {function} fn - The listener function.
  130054. * @param {*} [context=this] - The context to invoke the listener with.
  130055. *
  130056. * @return {Phaser.Events.EventEmitter} `this`.
  130057. */
  130058. /**
  130059. * Remove the listeners of a given event.
  130060. *
  130061. * @method Phaser.Events.EventEmitter#removeListener
  130062. * @since 3.0.0
  130063. *
  130064. * @param {(string|symbol)} event - The event name.
  130065. * @param {function} [fn] - Only remove the listeners that match this function.
  130066. * @param {*} [context] - Only remove the listeners that have this context.
  130067. * @param {boolean} [once] - Only remove one-time listeners.
  130068. *
  130069. * @return {Phaser.Events.EventEmitter} `this`.
  130070. */
  130071. /**
  130072. * Remove the listeners of a given event.
  130073. *
  130074. * @method Phaser.Events.EventEmitter#off
  130075. * @since 3.0.0
  130076. *
  130077. * @param {(string|symbol)} event - The event name.
  130078. * @param {function} [fn] - Only remove the listeners that match this function.
  130079. * @param {*} [context] - Only remove the listeners that have this context.
  130080. * @param {boolean} [once] - Only remove one-time listeners.
  130081. *
  130082. * @return {Phaser.Events.EventEmitter} `this`.
  130083. */
  130084. /**
  130085. * Remove all listeners, or those of the specified event.
  130086. *
  130087. * @method Phaser.Events.EventEmitter#removeAllListeners
  130088. * @since 3.0.0
  130089. *
  130090. * @param {(string|symbol)} [event] - The event name.
  130091. *
  130092. * @return {Phaser.Events.EventEmitter} `this`.
  130093. */
  130094. PluginCache.register('EventEmitter', EventEmitter, 'events');
  130095. module.exports = EventEmitter;
  130096. /***/ }),
  130097. /* 997 */
  130098. /***/ (function(module, exports, __webpack_require__) {
  130099. /**
  130100. * @author Richard Davey <rich@photonstorm.com>
  130101. * @copyright 2019 Photon Storm Ltd.
  130102. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130103. */
  130104. /**
  130105. * @namespace Phaser.Events
  130106. */
  130107. module.exports = { EventEmitter: __webpack_require__(996) };
  130108. /***/ }),
  130109. /* 998 */
  130110. /***/ (function(module, exports, __webpack_require__) {
  130111. /**
  130112. * @author Richard Davey <rich@photonstorm.com>
  130113. * @copyright 2019 Photon Storm Ltd.
  130114. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130115. */
  130116. /**
  130117. * @namespace Phaser.DOM
  130118. */
  130119. var Dom = {
  130120. AddToDOM: __webpack_require__(179),
  130121. DOMContentLoaded: __webpack_require__(351),
  130122. GetScreenOrientation: __webpack_require__(350),
  130123. GetTarget: __webpack_require__(345),
  130124. ParseXML: __webpack_require__(344),
  130125. RemoveFromDOM: __webpack_require__(343),
  130126. RequestAnimationFrame: __webpack_require__(363)
  130127. };
  130128. module.exports = Dom;
  130129. /***/ }),
  130130. /* 999 */
  130131. /***/ (function(module, exports, __webpack_require__) {
  130132. /**
  130133. * @author Richard Davey <rich@photonstorm.com>
  130134. * @copyright 2019 Photon Storm Ltd.
  130135. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130136. */
  130137. /**
  130138. * @namespace Phaser.Display.Masks
  130139. */
  130140. module.exports = {
  130141. BitmapMask: __webpack_require__(426),
  130142. GeometryMask: __webpack_require__(425)
  130143. };
  130144. /***/ }),
  130145. /* 1000 */
  130146. /***/ (function(module, exports, __webpack_require__) {
  130147. /**
  130148. * @author Richard Davey <rich@photonstorm.com>
  130149. * @copyright 2019 Photon Storm Ltd.
  130150. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130151. */
  130152. var ComponentToHex = __webpack_require__(353);
  130153. /**
  130154. * Converts the color values into an HTML compatible color string, prefixed with either `#` or `0x`.
  130155. *
  130156. * @function Phaser.Display.Color.RGBToString
  130157. * @since 3.0.0
  130158. *
  130159. * @param {integer} r - The red color value. A number between 0 and 255.
  130160. * @param {integer} g - The green color value. A number between 0 and 255.
  130161. * @param {integer} b - The blue color value. A number between 0 and 255.
  130162. * @param {integer} [a=255] - The alpha value. A number between 0 and 255.
  130163. * @param {string} [prefix=#] - The prefix of the string. Either `#` or `0x`.
  130164. *
  130165. * @return {string} A string-based representation of the color values.
  130166. */
  130167. var RGBToString = function (r, g, b, a, prefix)
  130168. {
  130169. if (a === undefined) { a = 255; }
  130170. if (prefix === undefined) { prefix = '#'; }
  130171. if (prefix === '#')
  130172. {
  130173. return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
  130174. }
  130175. else
  130176. {
  130177. return '0x' + ComponentToHex(a) + ComponentToHex(r) + ComponentToHex(g) + ComponentToHex(b);
  130178. }
  130179. };
  130180. module.exports = RGBToString;
  130181. /***/ }),
  130182. /* 1001 */
  130183. /***/ (function(module, exports, __webpack_require__) {
  130184. /**
  130185. * @author Richard Davey <rich@photonstorm.com>
  130186. * @copyright 2019 Photon Storm Ltd.
  130187. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130188. */
  130189. var Between = __webpack_require__(184);
  130190. var Color = __webpack_require__(32);
  130191. /**
  130192. * Creates a new Color object where the r, g, and b values have been set to random values
  130193. * based on the given min max values.
  130194. *
  130195. * @function Phaser.Display.Color.RandomRGB
  130196. * @since 3.0.0
  130197. *
  130198. * @param {integer} [min=0] - The minimum value to set the random range from (between 0 and 255)
  130199. * @param {integer} [max=255] - The maximum value to set the random range from (between 0 and 255)
  130200. *
  130201. * @return {Phaser.Display.Color} A Color object.
  130202. */
  130203. var RandomRGB = function (min, max)
  130204. {
  130205. if (min === undefined) { min = 0; }
  130206. if (max === undefined) { max = 255; }
  130207. return new Color(Between(min, max), Between(min, max), Between(min, max));
  130208. };
  130209. module.exports = RandomRGB;
  130210. /***/ }),
  130211. /* 1002 */
  130212. /***/ (function(module, exports, __webpack_require__) {
  130213. /**
  130214. * @author Richard Davey <rich@photonstorm.com>
  130215. * @copyright 2019 Photon Storm Ltd.
  130216. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130217. */
  130218. var Linear = __webpack_require__(129);
  130219. /**
  130220. * @namespace Phaser.Display.Color.Interpolate
  130221. * @memberof Phaser.Display.Color
  130222. * @since 3.0.0
  130223. */
  130224. /**
  130225. * Interpolates between the two given color ranges over the length supplied.
  130226. *
  130227. * @function Phaser.Display.Color.Interpolate.RGBWithRGB
  130228. * @memberof Phaser.Display.Color.Interpolate
  130229. * @static
  130230. * @since 3.0.0
  130231. *
  130232. * @param {number} r1 - Red value.
  130233. * @param {number} g1 - Blue value.
  130234. * @param {number} b1 - Green value.
  130235. * @param {number} r2 - Red value.
  130236. * @param {number} g2 - Blue value.
  130237. * @param {number} b2 - Green value.
  130238. * @param {number} [length=100] - Distance to interpolate over.
  130239. * @param {number} [index=0] - Index to start from.
  130240. *
  130241. * @return {ColorObject} An object containing the interpolated color values.
  130242. */
  130243. var RGBWithRGB = function (r1, g1, b1, r2, g2, b2, length, index)
  130244. {
  130245. if (length === undefined) { length = 100; }
  130246. if (index === undefined) { index = 0; }
  130247. var t = index / length;
  130248. return {
  130249. r: Linear(r1, r2, t),
  130250. g: Linear(g1, g2, t),
  130251. b: Linear(b1, b2, t)
  130252. };
  130253. };
  130254. /**
  130255. * Interpolates between the two given color objects over the length supplied.
  130256. *
  130257. * @function Phaser.Display.Color.Interpolate.ColorWithColor
  130258. * @memberof Phaser.Display.Color.Interpolate
  130259. * @static
  130260. * @since 3.0.0
  130261. *
  130262. * @param {Phaser.Display.Color} color1 - The first Color object.
  130263. * @param {Phaser.Display.Color} color2 - The second Color object.
  130264. * @param {number} [length=100] - Distance to interpolate over.
  130265. * @param {number} [index=0] - Index to start from.
  130266. *
  130267. * @return {ColorObject} An object containing the interpolated color values.
  130268. */
  130269. var ColorWithColor = function (color1, color2, length, index)
  130270. {
  130271. if (length === undefined) { length = 100; }
  130272. if (index === undefined) { index = 0; }
  130273. return RGBWithRGB(color1.r, color1.g, color1.b, color2.r, color2.g, color2.b, length, index);
  130274. };
  130275. /**
  130276. * Interpolates between the Color object and color values over the length supplied.
  130277. *
  130278. * @function Phaser.Display.Color.Interpolate.ColorWithRGB
  130279. * @memberof Phaser.Display.Color.Interpolate
  130280. * @static
  130281. * @since 3.0.0
  130282. *
  130283. * @param {Phaser.Display.Color} color1 - The first Color object.
  130284. * @param {number} r - Red value.
  130285. * @param {number} g - Blue value.
  130286. * @param {number} b - Green value.
  130287. * @param {number} [length=100] - Distance to interpolate over.
  130288. * @param {number} [index=0] - Index to start from.
  130289. *
  130290. * @return {ColorObject} An object containing the interpolated color values.
  130291. */
  130292. var ColorWithRGB = function (color, r, g, b, length, index)
  130293. {
  130294. if (length === undefined) { length = 100; }
  130295. if (index === undefined) { index = 0; }
  130296. return RGBWithRGB(color.r, color.g, color.b, r, g, b, length, index);
  130297. };
  130298. module.exports = {
  130299. RGBWithRGB: RGBWithRGB,
  130300. ColorWithRGB: ColorWithRGB,
  130301. ColorWithColor: ColorWithColor
  130302. };
  130303. /***/ }),
  130304. /* 1003 */
  130305. /***/ (function(module, exports, __webpack_require__) {
  130306. /**
  130307. * @author Richard Davey <rich@photonstorm.com>
  130308. * @copyright 2019 Photon Storm Ltd.
  130309. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130310. */
  130311. var HSVToRGB = __webpack_require__(190);
  130312. /**
  130313. * Get HSV color wheel values in an array which will be 360 elements in size.
  130314. *
  130315. * @function Phaser.Display.Color.HSVColorWheel
  130316. * @since 3.0.0
  130317. *
  130318. * @param {number} [s=1] - The saturation, in the range 0 - 1.
  130319. * @param {number} [v=1] - The value, in the range 0 - 1.
  130320. *
  130321. * @return {ColorObject[]} An array containing 360 elements, where each contains a single numeric value corresponding to the color at that point in the HSV color wheel.
  130322. */
  130323. var HSVColorWheel = function (s, v)
  130324. {
  130325. if (s === undefined) { s = 1; }
  130326. if (v === undefined) { v = 1; }
  130327. var colors = [];
  130328. for (var c = 0; c <= 359; c++)
  130329. {
  130330. colors.push(HSVToRGB(c / 359, s, v));
  130331. }
  130332. return colors;
  130333. };
  130334. module.exports = HSVColorWheel;
  130335. /***/ }),
  130336. /* 1004 */
  130337. /***/ (function(module, exports, __webpack_require__) {
  130338. /**
  130339. * @author Richard Davey <rich@photonstorm.com>
  130340. * @copyright 2019 Photon Storm Ltd.
  130341. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130342. */
  130343. var Color = __webpack_require__(32);
  130344. var HueToComponent = __webpack_require__(352);
  130345. /**
  130346. * Converts HSL (hue, saturation and lightness) values to a Phaser Color object.
  130347. *
  130348. * @function Phaser.Display.Color.HSLToColor
  130349. * @since 3.0.0
  130350. *
  130351. * @param {number} h - The hue value in the range 0 to 1.
  130352. * @param {number} s - The saturation value in the range 0 to 1.
  130353. * @param {number} l - The lightness value in the range 0 to 1.
  130354. *
  130355. * @return {Phaser.Display.Color} A Color object created from the results of the h, s and l values.
  130356. */
  130357. var HSLToColor = function (h, s, l)
  130358. {
  130359. // achromatic by default
  130360. var r = l;
  130361. var g = l;
  130362. var b = l;
  130363. if (s !== 0)
  130364. {
  130365. var q = (l < 0.5) ? l * (1 + s) : l + s - l * s;
  130366. var p = 2 * l - q;
  130367. r = HueToComponent(p, q, h + 1 / 3);
  130368. g = HueToComponent(p, q, h);
  130369. b = HueToComponent(p, q, h - 1 / 3);
  130370. }
  130371. var color = new Color();
  130372. return color.setGLTo(r, g, b, 1);
  130373. };
  130374. module.exports = HSLToColor;
  130375. /***/ }),
  130376. /* 1005 */
  130377. /***/ (function(module, exports) {
  130378. /**
  130379. * @author Richard Davey <rich@photonstorm.com>
  130380. * @copyright 2019 Photon Storm Ltd.
  130381. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130382. */
  130383. /**
  130384. * Converts the given color value into an Object containing r,g,b and a properties.
  130385. *
  130386. * @function Phaser.Display.Color.ColorToRGBA
  130387. * @since 3.0.0
  130388. *
  130389. * @param {number} color - A color value, optionally including the alpha value.
  130390. *
  130391. * @return {ColorObject} An object containing the parsed color values.
  130392. */
  130393. var ColorToRGBA = function (color)
  130394. {
  130395. var output = {
  130396. r: color >> 16 & 0xFF,
  130397. g: color >> 8 & 0xFF,
  130398. b: color & 0xFF,
  130399. a: 255
  130400. };
  130401. if (color > 16777215)
  130402. {
  130403. output.a = color >>> 24;
  130404. }
  130405. return output;
  130406. };
  130407. module.exports = ColorToRGBA;
  130408. /***/ }),
  130409. /* 1006 */
  130410. /***/ (function(module, exports) {
  130411. /**
  130412. * @author Richard Davey <rich@photonstorm.com>
  130413. * @copyright 2019 Photon Storm Ltd.
  130414. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130415. */
  130416. /**
  130417. * Sets the user-select property on the canvas style. Can be used to disable default browser selection actions.
  130418. *
  130419. * @function Phaser.Display.Canvas.UserSelect
  130420. * @since 3.0.0
  130421. *
  130422. * @param {HTMLCanvasElement} canvas - The canvas element to have the style applied to.
  130423. * @param {string} [value='none'] - The touch callout value to set on the canvas. Set to `none` to disable touch callouts.
  130424. *
  130425. * @return {HTMLCanvasElement} The canvas element.
  130426. */
  130427. var UserSelect = function (canvas, value)
  130428. {
  130429. if (value === undefined) { value = 'none'; }
  130430. var vendors = [
  130431. '-webkit-',
  130432. '-khtml-',
  130433. '-moz-',
  130434. '-ms-',
  130435. ''
  130436. ];
  130437. vendors.forEach(function (vendor)
  130438. {
  130439. canvas.style[vendor + 'user-select'] = value;
  130440. });
  130441. canvas.style['-webkit-touch-callout'] = value;
  130442. canvas.style['-webkit-tap-highlight-color'] = 'rgba(0, 0, 0, 0)';
  130443. return canvas;
  130444. };
  130445. module.exports = UserSelect;
  130446. /***/ }),
  130447. /* 1007 */
  130448. /***/ (function(module, exports) {
  130449. /**
  130450. * @author Richard Davey <rich@photonstorm.com>
  130451. * @copyright 2019 Photon Storm Ltd.
  130452. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130453. */
  130454. /**
  130455. * Sets the touch-action property on the canvas style. Can be used to disable default browser touch actions.
  130456. *
  130457. * @function Phaser.Display.Canvas.TouchAction
  130458. * @since 3.0.0
  130459. *
  130460. * @param {HTMLCanvasElement} canvas - The canvas element to have the style applied to.
  130461. * @param {string} [value='none'] - The touch action value to set on the canvas. Set to `none` to disable touch actions.
  130462. *
  130463. * @return {HTMLCanvasElement} The canvas element.
  130464. */
  130465. var TouchAction = function (canvas, value)
  130466. {
  130467. if (value === undefined) { value = 'none'; }
  130468. canvas.style['msTouchAction'] = value;
  130469. canvas.style['ms-touch-action'] = value;
  130470. canvas.style['touch-action'] = value;
  130471. return canvas;
  130472. };
  130473. module.exports = TouchAction;
  130474. /***/ }),
  130475. /* 1008 */
  130476. /***/ (function(module, exports, __webpack_require__) {
  130477. /**
  130478. * @author Richard Davey <rich@photonstorm.com>
  130479. * @copyright 2019 Photon Storm Ltd.
  130480. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130481. */
  130482. /**
  130483. * @namespace Phaser.Display.Canvas
  130484. */
  130485. module.exports = {
  130486. CanvasInterpolation: __webpack_require__(366),
  130487. CanvasPool: __webpack_require__(24),
  130488. Smoothing: __webpack_require__(130),
  130489. TouchAction: __webpack_require__(1007),
  130490. UserSelect: __webpack_require__(1006)
  130491. };
  130492. /***/ }),
  130493. /* 1009 */
  130494. /***/ (function(module, exports) {
  130495. /**
  130496. * @author Richard Davey <rich@photonstorm.com>
  130497. * @copyright 2019 Photon Storm Ltd.
  130498. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130499. */
  130500. /**
  130501. * Returns the amount the Game Object is visually offset from its y coordinate.
  130502. * This is the same as `width * origin.y`.
  130503. * This value will only be > 0 if `origin.y` is not equal to zero.
  130504. *
  130505. * @function Phaser.Display.Bounds.GetOffsetY
  130506. * @since 3.0.0
  130507. *
  130508. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  130509. *
  130510. * @return {number} The vertical offset of the Game Object.
  130511. */
  130512. var GetOffsetY = function (gameObject)
  130513. {
  130514. return gameObject.height * gameObject.originY;
  130515. };
  130516. module.exports = GetOffsetY;
  130517. /***/ }),
  130518. /* 1010 */
  130519. /***/ (function(module, exports) {
  130520. /**
  130521. * @author Richard Davey <rich@photonstorm.com>
  130522. * @copyright 2019 Photon Storm Ltd.
  130523. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130524. */
  130525. /**
  130526. * Returns the amount the Game Object is visually offset from its x coordinate.
  130527. * This is the same as `width * origin.x`.
  130528. * This value will only be > 0 if `origin.x` is not equal to zero.
  130529. *
  130530. * @function Phaser.Display.Bounds.GetOffsetX
  130531. * @since 3.0.0
  130532. *
  130533. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  130534. *
  130535. * @return {number} The horizontal offset of the Game Object.
  130536. */
  130537. var GetOffsetX = function (gameObject)
  130538. {
  130539. return gameObject.width * gameObject.originX;
  130540. };
  130541. module.exports = GetOffsetX;
  130542. /***/ }),
  130543. /* 1011 */
  130544. /***/ (function(module, exports, __webpack_require__) {
  130545. /**
  130546. * @author Richard Davey <rich@photonstorm.com>
  130547. * @copyright 2019 Photon Storm Ltd.
  130548. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130549. */
  130550. /**
  130551. * @namespace Phaser.Display.Bounds
  130552. */
  130553. module.exports = {
  130554. CenterOn: __webpack_require__(444),
  130555. GetBottom: __webpack_require__(51),
  130556. GetCenterX: __webpack_require__(81),
  130557. GetCenterY: __webpack_require__(78),
  130558. GetLeft: __webpack_require__(49),
  130559. GetOffsetX: __webpack_require__(1010),
  130560. GetOffsetY: __webpack_require__(1009),
  130561. GetRight: __webpack_require__(47),
  130562. GetTop: __webpack_require__(45),
  130563. SetBottom: __webpack_require__(50),
  130564. SetCenterX: __webpack_require__(80),
  130565. SetCenterY: __webpack_require__(79),
  130566. SetLeft: __webpack_require__(48),
  130567. SetRight: __webpack_require__(46),
  130568. SetTop: __webpack_require__(44)
  130569. };
  130570. /***/ }),
  130571. /* 1012 */
  130572. /***/ (function(module, exports, __webpack_require__) {
  130573. /**
  130574. * @author Richard Davey <rich@photonstorm.com>
  130575. * @copyright 2019 Photon Storm Ltd.
  130576. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130577. */
  130578. var GetRight = __webpack_require__(47);
  130579. var GetTop = __webpack_require__(45);
  130580. var SetBottom = __webpack_require__(50);
  130581. var SetRight = __webpack_require__(46);
  130582. /**
  130583. * Takes given Game Object and aligns it so that it is positioned next to the top right position of the other.
  130584. *
  130585. * @function Phaser.Display.Align.To.TopRight
  130586. * @since 3.0.0
  130587. *
  130588. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130589. *
  130590. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130591. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130592. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130593. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130594. *
  130595. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130596. */
  130597. var TopRight = function (gameObject, alignTo, offsetX, offsetY)
  130598. {
  130599. if (offsetX === undefined) { offsetX = 0; }
  130600. if (offsetY === undefined) { offsetY = 0; }
  130601. SetRight(gameObject, GetRight(alignTo) + offsetX);
  130602. SetBottom(gameObject, GetTop(alignTo) - offsetY);
  130603. return gameObject;
  130604. };
  130605. module.exports = TopRight;
  130606. /***/ }),
  130607. /* 1013 */
  130608. /***/ (function(module, exports, __webpack_require__) {
  130609. /**
  130610. * @author Richard Davey <rich@photonstorm.com>
  130611. * @copyright 2019 Photon Storm Ltd.
  130612. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130613. */
  130614. var GetLeft = __webpack_require__(49);
  130615. var GetTop = __webpack_require__(45);
  130616. var SetBottom = __webpack_require__(50);
  130617. var SetLeft = __webpack_require__(48);
  130618. /**
  130619. * Takes given Game Object and aligns it so that it is positioned next to the top left position of the other.
  130620. *
  130621. * @function Phaser.Display.Align.To.TopLeft
  130622. * @since 3.0.0
  130623. *
  130624. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130625. *
  130626. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130627. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130628. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130629. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130630. *
  130631. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130632. */
  130633. var TopLeft = function (gameObject, alignTo, offsetX, offsetY)
  130634. {
  130635. if (offsetX === undefined) { offsetX = 0; }
  130636. if (offsetY === undefined) { offsetY = 0; }
  130637. SetLeft(gameObject, GetLeft(alignTo) - offsetX);
  130638. SetBottom(gameObject, GetTop(alignTo) - offsetY);
  130639. return gameObject;
  130640. };
  130641. module.exports = TopLeft;
  130642. /***/ }),
  130643. /* 1014 */
  130644. /***/ (function(module, exports, __webpack_require__) {
  130645. /**
  130646. * @author Richard Davey <rich@photonstorm.com>
  130647. * @copyright 2019 Photon Storm Ltd.
  130648. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130649. */
  130650. var GetCenterX = __webpack_require__(81);
  130651. var GetTop = __webpack_require__(45);
  130652. var SetBottom = __webpack_require__(50);
  130653. var SetCenterX = __webpack_require__(80);
  130654. /**
  130655. * Takes given Game Object and aligns it so that it is positioned next to the top center position of the other.
  130656. *
  130657. * @function Phaser.Display.Align.To.TopCenter
  130658. * @since 3.0.0
  130659. *
  130660. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130661. *
  130662. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130663. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130664. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130665. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130666. *
  130667. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130668. */
  130669. var TopCenter = function (gameObject, alignTo, offsetX, offsetY)
  130670. {
  130671. if (offsetX === undefined) { offsetX = 0; }
  130672. if (offsetY === undefined) { offsetY = 0; }
  130673. SetCenterX(gameObject, GetCenterX(alignTo) + offsetX);
  130674. SetBottom(gameObject, GetTop(alignTo) - offsetY);
  130675. return gameObject;
  130676. };
  130677. module.exports = TopCenter;
  130678. /***/ }),
  130679. /* 1015 */
  130680. /***/ (function(module, exports, __webpack_require__) {
  130681. /**
  130682. * @author Richard Davey <rich@photonstorm.com>
  130683. * @copyright 2019 Photon Storm Ltd.
  130684. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130685. */
  130686. var GetRight = __webpack_require__(47);
  130687. var GetTop = __webpack_require__(45);
  130688. var SetLeft = __webpack_require__(48);
  130689. var SetTop = __webpack_require__(44);
  130690. /**
  130691. * Takes given Game Object and aligns it so that it is positioned next to the right top position of the other.
  130692. *
  130693. * @function Phaser.Display.Align.To.RightTop
  130694. * @since 3.0.0
  130695. *
  130696. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130697. *
  130698. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130699. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130700. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130701. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130702. *
  130703. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130704. */
  130705. var RightTop = function (gameObject, alignTo, offsetX, offsetY)
  130706. {
  130707. if (offsetX === undefined) { offsetX = 0; }
  130708. if (offsetY === undefined) { offsetY = 0; }
  130709. SetLeft(gameObject, GetRight(alignTo) + offsetX);
  130710. SetTop(gameObject, GetTop(alignTo) - offsetY);
  130711. return gameObject;
  130712. };
  130713. module.exports = RightTop;
  130714. /***/ }),
  130715. /* 1016 */
  130716. /***/ (function(module, exports, __webpack_require__) {
  130717. /**
  130718. * @author Richard Davey <rich@photonstorm.com>
  130719. * @copyright 2019 Photon Storm Ltd.
  130720. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130721. */
  130722. var GetCenterY = __webpack_require__(78);
  130723. var GetRight = __webpack_require__(47);
  130724. var SetCenterY = __webpack_require__(79);
  130725. var SetLeft = __webpack_require__(48);
  130726. /**
  130727. * Takes given Game Object and aligns it so that it is positioned next to the right center position of the other.
  130728. *
  130729. * @function Phaser.Display.Align.To.RightCenter
  130730. * @since 3.0.0
  130731. *
  130732. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130733. *
  130734. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130735. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130736. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130737. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130738. *
  130739. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130740. */
  130741. var RightCenter = function (gameObject, alignTo, offsetX, offsetY)
  130742. {
  130743. if (offsetX === undefined) { offsetX = 0; }
  130744. if (offsetY === undefined) { offsetY = 0; }
  130745. SetLeft(gameObject, GetRight(alignTo) + offsetX);
  130746. SetCenterY(gameObject, GetCenterY(alignTo) + offsetY);
  130747. return gameObject;
  130748. };
  130749. module.exports = RightCenter;
  130750. /***/ }),
  130751. /* 1017 */
  130752. /***/ (function(module, exports, __webpack_require__) {
  130753. /**
  130754. * @author Richard Davey <rich@photonstorm.com>
  130755. * @copyright 2019 Photon Storm Ltd.
  130756. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130757. */
  130758. var GetBottom = __webpack_require__(51);
  130759. var GetRight = __webpack_require__(47);
  130760. var SetBottom = __webpack_require__(50);
  130761. var SetLeft = __webpack_require__(48);
  130762. /**
  130763. * Takes given Game Object and aligns it so that it is positioned next to the right bottom position of the other.
  130764. *
  130765. * @function Phaser.Display.Align.To.RightBottom
  130766. * @since 3.0.0
  130767. *
  130768. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130769. *
  130770. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130771. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130772. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130773. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130774. *
  130775. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130776. */
  130777. var RightBottom = function (gameObject, alignTo, offsetX, offsetY)
  130778. {
  130779. if (offsetX === undefined) { offsetX = 0; }
  130780. if (offsetY === undefined) { offsetY = 0; }
  130781. SetLeft(gameObject, GetRight(alignTo) + offsetX);
  130782. SetBottom(gameObject, GetBottom(alignTo) + offsetY);
  130783. return gameObject;
  130784. };
  130785. module.exports = RightBottom;
  130786. /***/ }),
  130787. /* 1018 */
  130788. /***/ (function(module, exports, __webpack_require__) {
  130789. /**
  130790. * @author Richard Davey <rich@photonstorm.com>
  130791. * @copyright 2019 Photon Storm Ltd.
  130792. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130793. */
  130794. var GetLeft = __webpack_require__(49);
  130795. var GetTop = __webpack_require__(45);
  130796. var SetRight = __webpack_require__(46);
  130797. var SetTop = __webpack_require__(44);
  130798. /**
  130799. * Takes given Game Object and aligns it so that it is positioned next to the left top position of the other.
  130800. *
  130801. * @function Phaser.Display.Align.To.LeftTop
  130802. * @since 3.0.0
  130803. *
  130804. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130805. *
  130806. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130807. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130808. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130809. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130810. *
  130811. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130812. */
  130813. var LeftTop = function (gameObject, alignTo, offsetX, offsetY)
  130814. {
  130815. if (offsetX === undefined) { offsetX = 0; }
  130816. if (offsetY === undefined) { offsetY = 0; }
  130817. SetRight(gameObject, GetLeft(alignTo) - offsetX);
  130818. SetTop(gameObject, GetTop(alignTo) - offsetY);
  130819. return gameObject;
  130820. };
  130821. module.exports = LeftTop;
  130822. /***/ }),
  130823. /* 1019 */
  130824. /***/ (function(module, exports, __webpack_require__) {
  130825. /**
  130826. * @author Richard Davey <rich@photonstorm.com>
  130827. * @copyright 2019 Photon Storm Ltd.
  130828. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130829. */
  130830. var GetCenterY = __webpack_require__(78);
  130831. var GetLeft = __webpack_require__(49);
  130832. var SetCenterY = __webpack_require__(79);
  130833. var SetRight = __webpack_require__(46);
  130834. /**
  130835. * Takes given Game Object and aligns it so that it is positioned next to the left center position of the other.
  130836. *
  130837. * @function Phaser.Display.Align.To.LeftCenter
  130838. * @since 3.0.0
  130839. *
  130840. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130841. *
  130842. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130843. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130844. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130845. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130846. *
  130847. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130848. */
  130849. var LeftCenter = function (gameObject, alignTo, offsetX, offsetY)
  130850. {
  130851. if (offsetX === undefined) { offsetX = 0; }
  130852. if (offsetY === undefined) { offsetY = 0; }
  130853. SetRight(gameObject, GetLeft(alignTo) - offsetX);
  130854. SetCenterY(gameObject, GetCenterY(alignTo) + offsetY);
  130855. return gameObject;
  130856. };
  130857. module.exports = LeftCenter;
  130858. /***/ }),
  130859. /* 1020 */
  130860. /***/ (function(module, exports, __webpack_require__) {
  130861. /**
  130862. * @author Richard Davey <rich@photonstorm.com>
  130863. * @copyright 2019 Photon Storm Ltd.
  130864. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130865. */
  130866. var GetBottom = __webpack_require__(51);
  130867. var GetLeft = __webpack_require__(49);
  130868. var SetBottom = __webpack_require__(50);
  130869. var SetRight = __webpack_require__(46);
  130870. /**
  130871. * Takes given Game Object and aligns it so that it is positioned next to the left bottom position of the other.
  130872. *
  130873. * @function Phaser.Display.Align.To.LeftBottom
  130874. * @since 3.0.0
  130875. *
  130876. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130877. *
  130878. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130879. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130880. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130881. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130882. *
  130883. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130884. */
  130885. var LeftBottom = function (gameObject, alignTo, offsetX, offsetY)
  130886. {
  130887. if (offsetX === undefined) { offsetX = 0; }
  130888. if (offsetY === undefined) { offsetY = 0; }
  130889. SetRight(gameObject, GetLeft(alignTo) - offsetX);
  130890. SetBottom(gameObject, GetBottom(alignTo) + offsetY);
  130891. return gameObject;
  130892. };
  130893. module.exports = LeftBottom;
  130894. /***/ }),
  130895. /* 1021 */
  130896. /***/ (function(module, exports, __webpack_require__) {
  130897. /**
  130898. * @author Richard Davey <rich@photonstorm.com>
  130899. * @copyright 2019 Photon Storm Ltd.
  130900. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130901. */
  130902. var GetBottom = __webpack_require__(51);
  130903. var GetRight = __webpack_require__(47);
  130904. var SetRight = __webpack_require__(46);
  130905. var SetTop = __webpack_require__(44);
  130906. /**
  130907. * Takes given Game Object and aligns it so that it is positioned next to the bottom right position of the other.
  130908. *
  130909. * @function Phaser.Display.Align.To.BottomRight
  130910. * @since 3.0.0
  130911. *
  130912. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130913. *
  130914. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130915. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130916. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130917. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130918. *
  130919. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130920. */
  130921. var BottomRight = function (gameObject, alignTo, offsetX, offsetY)
  130922. {
  130923. if (offsetX === undefined) { offsetX = 0; }
  130924. if (offsetY === undefined) { offsetY = 0; }
  130925. SetRight(gameObject, GetRight(alignTo) + offsetX);
  130926. SetTop(gameObject, GetBottom(alignTo) + offsetY);
  130927. return gameObject;
  130928. };
  130929. module.exports = BottomRight;
  130930. /***/ }),
  130931. /* 1022 */
  130932. /***/ (function(module, exports, __webpack_require__) {
  130933. /**
  130934. * @author Richard Davey <rich@photonstorm.com>
  130935. * @copyright 2019 Photon Storm Ltd.
  130936. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130937. */
  130938. var GetBottom = __webpack_require__(51);
  130939. var GetLeft = __webpack_require__(49);
  130940. var SetLeft = __webpack_require__(48);
  130941. var SetTop = __webpack_require__(44);
  130942. /**
  130943. * Takes given Game Object and aligns it so that it is positioned next to the bottom left position of the other.
  130944. *
  130945. * @function Phaser.Display.Align.To.BottomLeft
  130946. * @since 3.0.0
  130947. *
  130948. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130949. *
  130950. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130951. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130952. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130953. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130954. *
  130955. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130956. */
  130957. var BottomLeft = function (gameObject, alignTo, offsetX, offsetY)
  130958. {
  130959. if (offsetX === undefined) { offsetX = 0; }
  130960. if (offsetY === undefined) { offsetY = 0; }
  130961. SetLeft(gameObject, GetLeft(alignTo) - offsetX);
  130962. SetTop(gameObject, GetBottom(alignTo) + offsetY);
  130963. return gameObject;
  130964. };
  130965. module.exports = BottomLeft;
  130966. /***/ }),
  130967. /* 1023 */
  130968. /***/ (function(module, exports, __webpack_require__) {
  130969. /**
  130970. * @author Richard Davey <rich@photonstorm.com>
  130971. * @copyright 2019 Photon Storm Ltd.
  130972. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130973. */
  130974. var GetBottom = __webpack_require__(51);
  130975. var GetCenterX = __webpack_require__(81);
  130976. var SetCenterX = __webpack_require__(80);
  130977. var SetTop = __webpack_require__(44);
  130978. /**
  130979. * Takes given Game Object and aligns it so that it is positioned next to the bottom center position of the other.
  130980. *
  130981. * @function Phaser.Display.Align.To.BottomCenter
  130982. * @since 3.0.0
  130983. *
  130984. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  130985. *
  130986. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  130987. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  130988. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  130989. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  130990. *
  130991. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  130992. */
  130993. var BottomCenter = function (gameObject, alignTo, offsetX, offsetY)
  130994. {
  130995. if (offsetX === undefined) { offsetX = 0; }
  130996. if (offsetY === undefined) { offsetY = 0; }
  130997. SetCenterX(gameObject, GetCenterX(alignTo) + offsetX);
  130998. SetTop(gameObject, GetBottom(alignTo) + offsetY);
  130999. return gameObject;
  131000. };
  131001. module.exports = BottomCenter;
  131002. /***/ }),
  131003. /* 1024 */
  131004. /***/ (function(module, exports, __webpack_require__) {
  131005. /**
  131006. * @author Richard Davey <rich@photonstorm.com>
  131007. * @copyright 2019 Photon Storm Ltd.
  131008. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131009. */
  131010. /**
  131011. * @namespace Phaser.Display.Align.To
  131012. */
  131013. module.exports = {
  131014. BottomCenter: __webpack_require__(1023),
  131015. BottomLeft: __webpack_require__(1022),
  131016. BottomRight: __webpack_require__(1021),
  131017. LeftBottom: __webpack_require__(1020),
  131018. LeftCenter: __webpack_require__(1019),
  131019. LeftTop: __webpack_require__(1018),
  131020. RightBottom: __webpack_require__(1017),
  131021. RightCenter: __webpack_require__(1016),
  131022. RightTop: __webpack_require__(1015),
  131023. TopCenter: __webpack_require__(1014),
  131024. TopLeft: __webpack_require__(1013),
  131025. TopRight: __webpack_require__(1012)
  131026. };
  131027. /***/ }),
  131028. /* 1025 */
  131029. /***/ (function(module, exports, __webpack_require__) {
  131030. /**
  131031. * @author Richard Davey <rich@photonstorm.com>
  131032. * @copyright 2019 Photon Storm Ltd.
  131033. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131034. */
  131035. /**
  131036. * @namespace Phaser.Display.Align.In
  131037. */
  131038. module.exports = {
  131039. BottomCenter: __webpack_require__(448),
  131040. BottomLeft: __webpack_require__(447),
  131041. BottomRight: __webpack_require__(446),
  131042. Center: __webpack_require__(445),
  131043. LeftCenter: __webpack_require__(443),
  131044. QuickSet: __webpack_require__(449),
  131045. RightCenter: __webpack_require__(442),
  131046. TopCenter: __webpack_require__(441),
  131047. TopLeft: __webpack_require__(440),
  131048. TopRight: __webpack_require__(439)
  131049. };
  131050. /***/ }),
  131051. /* 1026 */
  131052. /***/ (function(module, exports, __webpack_require__) {
  131053. /**
  131054. * @author Richard Davey <rich@photonstorm.com>
  131055. * @copyright 2019 Photon Storm Ltd.
  131056. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131057. */
  131058. var CONST = __webpack_require__(208);
  131059. var Extend = __webpack_require__(19);
  131060. /**
  131061. * @namespace Phaser.Display.Align
  131062. */
  131063. var Align = {
  131064. In: __webpack_require__(1025),
  131065. To: __webpack_require__(1024)
  131066. };
  131067. // Merge in the consts
  131068. Align = Extend(false, Align, CONST);
  131069. module.exports = Align;
  131070. /***/ }),
  131071. /* 1027 */
  131072. /***/ (function(module, exports, __webpack_require__) {
  131073. /**
  131074. * @author Richard Davey <rich@photonstorm.com>
  131075. * @copyright 2019 Photon Storm Ltd.
  131076. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131077. */
  131078. /**
  131079. * @namespace Phaser.Display
  131080. */
  131081. module.exports = {
  131082. Align: __webpack_require__(1026),
  131083. Bounds: __webpack_require__(1011),
  131084. Canvas: __webpack_require__(1008),
  131085. Color: __webpack_require__(354),
  131086. Masks: __webpack_require__(999)
  131087. };
  131088. /***/ }),
  131089. /* 1028 */
  131090. /***/ (function(module, exports, __webpack_require__) {
  131091. /**
  131092. * @author Richard Davey <rich@photonstorm.com>
  131093. * @copyright 2019 Photon Storm Ltd.
  131094. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131095. */
  131096. var Class = __webpack_require__(0);
  131097. var DataManager = __webpack_require__(134);
  131098. var PluginCache = __webpack_require__(17);
  131099. var SceneEvents = __webpack_require__(16);
  131100. /**
  131101. * @classdesc
  131102. * The Data Component features a means to store pieces of data specific to a Game Object, System or Plugin.
  131103. * You can then search, query it, and retrieve the data. The parent must either extend EventEmitter,
  131104. * or have a property called `events` that is an instance of it.
  131105. *
  131106. * @class DataManagerPlugin
  131107. * @extends Phaser.Data.DataManager
  131108. * @memberof Phaser.Data
  131109. * @constructor
  131110. * @since 3.0.0
  131111. *
  131112. * @param {Phaser.Scene} scene - A reference to the Scene that this DataManager belongs to.
  131113. */
  131114. var DataManagerPlugin = new Class({
  131115. Extends: DataManager,
  131116. initialize:
  131117. function DataManagerPlugin (scene)
  131118. {
  131119. DataManager.call(this, scene, scene.sys.events);
  131120. /**
  131121. * A reference to the Scene that this DataManager belongs to.
  131122. *
  131123. * @name Phaser.Data.DataManagerPlugin#scene
  131124. * @type {Phaser.Scene}
  131125. * @since 3.0.0
  131126. */
  131127. this.scene = scene;
  131128. /**
  131129. * A reference to the Scene's Systems.
  131130. *
  131131. * @name Phaser.Data.DataManagerPlugin#systems
  131132. * @type {Phaser.Scenes.Systems}
  131133. * @since 3.0.0
  131134. */
  131135. this.systems = scene.sys;
  131136. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  131137. scene.sys.events.on(SceneEvents.START, this.start, this);
  131138. },
  131139. /**
  131140. * This method is called automatically, only once, when the Scene is first created.
  131141. * Do not invoke it directly.
  131142. *
  131143. * @method Phaser.Data.DataManagerPlugin#boot
  131144. * @private
  131145. * @since 3.5.1
  131146. */
  131147. boot: function ()
  131148. {
  131149. this.events = this.systems.events;
  131150. this.events.once(SceneEvents.DESTROY, this.destroy, this);
  131151. },
  131152. /**
  131153. * This method is called automatically by the Scene when it is starting up.
  131154. * It is responsible for creating local systems, properties and listening for Scene events.
  131155. * Do not invoke it directly.
  131156. *
  131157. * @method Phaser.Data.DataManagerPlugin#start
  131158. * @private
  131159. * @since 3.5.0
  131160. */
  131161. start: function ()
  131162. {
  131163. this.events.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  131164. },
  131165. /**
  131166. * The Scene that owns this plugin is shutting down.
  131167. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  131168. *
  131169. * @method Phaser.Data.DataManagerPlugin#shutdown
  131170. * @private
  131171. * @since 3.5.0
  131172. */
  131173. shutdown: function ()
  131174. {
  131175. this.systems.events.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  131176. },
  131177. /**
  131178. * The Scene that owns this plugin is being destroyed.
  131179. * We need to shutdown and then kill off all external references.
  131180. *
  131181. * @method Phaser.Data.DataManagerPlugin#destroy
  131182. * @since 3.5.0
  131183. */
  131184. destroy: function ()
  131185. {
  131186. DataManager.prototype.destroy.call(this);
  131187. this.events.off(SceneEvents.START, this.start, this);
  131188. this.scene = null;
  131189. this.systems = null;
  131190. }
  131191. });
  131192. PluginCache.register('DataManagerPlugin', DataManagerPlugin, 'data');
  131193. module.exports = DataManagerPlugin;
  131194. /***/ }),
  131195. /* 1029 */
  131196. /***/ (function(module, exports, __webpack_require__) {
  131197. /**
  131198. * @author Richard Davey <rich@photonstorm.com>
  131199. * @copyright 2019 Photon Storm Ltd.
  131200. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131201. */
  131202. /**
  131203. * @namespace Phaser.Data
  131204. */
  131205. module.exports = {
  131206. DataManager: __webpack_require__(134),
  131207. DataManagerPlugin: __webpack_require__(1028),
  131208. Events: __webpack_require__(420)
  131209. };
  131210. /***/ }),
  131211. /* 1030 */
  131212. /***/ (function(module, exports, __webpack_require__) {
  131213. /**
  131214. * @author Richard Davey <rich@photonstorm.com>
  131215. * @copyright 2019 Photon Storm Ltd.
  131216. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131217. */
  131218. var Class = __webpack_require__(0);
  131219. var Vector2 = __webpack_require__(3);
  131220. /**
  131221. * @classdesc
  131222. * A MoveTo Curve is a very simple curve consisting of only a single point. Its intended use is to move the ending point in a Path.
  131223. *
  131224. * @class MoveTo
  131225. * @memberof Phaser.Curves
  131226. * @constructor
  131227. * @since 3.0.0
  131228. *
  131229. * @param {number} [x] - `x` pixel coordinate.
  131230. * @param {number} [y] - `y` pixel coordinate.
  131231. */
  131232. var MoveTo = new Class({
  131233. initialize:
  131234. function MoveTo (x, y)
  131235. {
  131236. // Skip length calcs in paths
  131237. /**
  131238. * Denotes that this Curve does not influence the bounds, points, and drawing of its parent Path. Must be `false` or some methods in the parent Path will throw errors.
  131239. *
  131240. * @name Phaser.Curves.MoveTo#active
  131241. * @type {boolean}
  131242. * @default false
  131243. * @since 3.0.0
  131244. */
  131245. this.active = false;
  131246. /**
  131247. * The lone point which this curve consists of.
  131248. *
  131249. * @name Phaser.Curves.MoveTo#p0
  131250. * @type {Phaser.Math.Vector2}
  131251. * @since 3.0.0
  131252. */
  131253. this.p0 = new Vector2(x, y);
  131254. },
  131255. /**
  131256. * Get point at relative position in curve according to length.
  131257. *
  131258. * @method Phaser.Curves.MoveTo#getPoint
  131259. * @since 3.0.0
  131260. *
  131261. * @generic {Phaser.Math.Vector2} O - [out,$return]
  131262. *
  131263. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  131264. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  131265. *
  131266. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  131267. */
  131268. getPoint: function (t, out)
  131269. {
  131270. if (out === undefined) { out = new Vector2(); }
  131271. return out.copy(this.p0);
  131272. },
  131273. /**
  131274. * Retrieves the point at given position in the curve. This will always return this curve's only point.
  131275. *
  131276. * @method Phaser.Curves.MoveTo#getPointAt
  131277. * @since 3.0.0
  131278. *
  131279. * @generic {Phaser.Math.Vector2} O - [out,$return]
  131280. *
  131281. * @param {number} u - The position in the path to retrieve, between 0 and 1. Not used.
  131282. * @param {Phaser.Math.Vector2} [out] - An optional vector in which to store the point.
  131283. *
  131284. * @return {Phaser.Math.Vector2} The modified `out` vector, or a new `Vector2` if none was provided.
  131285. */
  131286. getPointAt: function (u, out)
  131287. {
  131288. return this.getPoint(u, out);
  131289. },
  131290. /**
  131291. * Gets the resolution of this curve.
  131292. *
  131293. * @method Phaser.Curves.MoveTo#getResolution
  131294. * @since 3.0.0
  131295. *
  131296. * @return {number} The resolution of this curve. For a MoveTo the value is always 1.
  131297. */
  131298. getResolution: function ()
  131299. {
  131300. return 1;
  131301. },
  131302. /**
  131303. * Gets the length of this curve.
  131304. *
  131305. * @method Phaser.Curves.MoveTo#getLength
  131306. * @since 3.0.0
  131307. *
  131308. * @return {number} The length of this curve. For a MoveTo the value is always 0.
  131309. */
  131310. getLength: function ()
  131311. {
  131312. return 0;
  131313. },
  131314. /**
  131315. * Converts this curve into a JSON-serializable object.
  131316. *
  131317. * @method Phaser.Curves.MoveTo#toJSON
  131318. * @since 3.0.0
  131319. *
  131320. * @return {JSONCurve} A primitive object with the curve's type and only point.
  131321. */
  131322. toJSON: function ()
  131323. {
  131324. return {
  131325. type: 'MoveTo',
  131326. points: [
  131327. this.p0.x, this.p0.y
  131328. ]
  131329. };
  131330. }
  131331. });
  131332. module.exports = MoveTo;
  131333. /***/ }),
  131334. /* 1031 */
  131335. /***/ (function(module, exports, __webpack_require__) {
  131336. /**
  131337. * @author Richard Davey <rich@photonstorm.com>
  131338. * @copyright 2019 Photon Storm Ltd.
  131339. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131340. */
  131341. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  131342. var Class = __webpack_require__(0);
  131343. var CubicBezierCurve = __webpack_require__(359);
  131344. var EllipseCurve = __webpack_require__(358);
  131345. var GameObjectFactory = __webpack_require__(5);
  131346. var LineCurve = __webpack_require__(357);
  131347. var MovePathTo = __webpack_require__(1030);
  131348. var QuadraticBezierCurve = __webpack_require__(356);
  131349. var Rectangle = __webpack_require__(10);
  131350. var SplineCurve = __webpack_require__(355);
  131351. var Vector2 = __webpack_require__(3);
  131352. /**
  131353. * @typedef {object} JSONPath
  131354. *
  131355. * @property {string} type - The of the curve.
  131356. * @property {number} x - The X coordinate of the curve's starting point.
  131357. * @property {number} y - The Y coordinate of the path's starting point.
  131358. * @property {boolean} autoClose - The path is auto closed.
  131359. * @property {JSONCurve[]} curves - The list of the curves
  131360. */
  131361. /**
  131362. * @classdesc
  131363. * A Path combines multiple Curves into one continuous compound curve. It does not matter how many Curves are in the Path or what type they are.
  131364. *
  131365. * A Curve in a Path does not have to start where the previous Curve ends - that is to say, a Path does not have to be an uninterrupted curve. Only the order of the Curves influences the actual points on the Path.
  131366. *
  131367. * @class Path
  131368. * @memberof Phaser.Curves
  131369. * @constructor
  131370. * @since 3.0.0
  131371. *
  131372. * @param {number} [x=0] - The X coordinate of the Path's starting point or a {@link JSONPath}.
  131373. * @param {number} [y=0] - The Y coordinate of the Path's starting point.
  131374. */
  131375. var Path = new Class({
  131376. initialize:
  131377. function Path (x, y)
  131378. {
  131379. if (x === undefined) { x = 0; }
  131380. if (y === undefined) { y = 0; }
  131381. /**
  131382. * The name of this Path.
  131383. * Empty by default and never populated by Phaser, this is left for developers to use.
  131384. *
  131385. * @name Phaser.Curves.Path#name
  131386. * @type {string}
  131387. * @default ''
  131388. * @since 3.0.0
  131389. */
  131390. this.name = '';
  131391. /**
  131392. * The list of Curves which make up this Path.
  131393. *
  131394. * @name Phaser.Curves.Path#curves
  131395. * @type {Phaser.Curves.Curve[]}
  131396. * @default []
  131397. * @since 3.0.0
  131398. */
  131399. this.curves = [];
  131400. /**
  131401. * The cached length of each Curve in the Path.
  131402. *
  131403. * Used internally by {@link #getCurveLengths}.
  131404. *
  131405. * @name Phaser.Curves.Path#cacheLengths
  131406. * @type {number[]}
  131407. * @default []
  131408. * @since 3.0.0
  131409. */
  131410. this.cacheLengths = [];
  131411. /**
  131412. * Automatically closes the path.
  131413. *
  131414. * @name Phaser.Curves.Path#autoClose
  131415. * @type {boolean}
  131416. * @default false
  131417. * @since 3.0.0
  131418. */
  131419. this.autoClose = false;
  131420. /**
  131421. * The starting point of the Path.
  131422. *
  131423. * This is not necessarily equivalent to the starting point of the first Curve in the Path. In an empty Path, it's also treated as the ending point.
  131424. *
  131425. * @name Phaser.Curves.Path#startPoint
  131426. * @type {Phaser.Math.Vector2}
  131427. * @since 3.0.0
  131428. */
  131429. this.startPoint = new Vector2();
  131430. /**
  131431. * A temporary vector used to avoid object creation when adding a Curve to the Path.
  131432. *
  131433. * @name Phaser.Curves.Path#_tmpVec2A
  131434. * @type {Phaser.Math.Vector2}
  131435. * @private
  131436. * @since 3.0.0
  131437. */
  131438. this._tmpVec2A = new Vector2();
  131439. /**
  131440. * A temporary vector used to avoid object creation when adding a Curve to the Path.
  131441. *
  131442. * @name Phaser.Curves.Path#_tmpVec2B
  131443. * @type {Phaser.Math.Vector2}
  131444. * @private
  131445. * @since 3.0.0
  131446. */
  131447. this._tmpVec2B = new Vector2();
  131448. if (typeof x === 'object')
  131449. {
  131450. this.fromJSON(x);
  131451. }
  131452. else
  131453. {
  131454. this.startPoint.set(x, y);
  131455. }
  131456. },
  131457. /**
  131458. * Appends a Curve to the end of the Path.
  131459. *
  131460. * The Curve does not have to start where the Path ends or, for an empty Path, at its defined starting point.
  131461. *
  131462. * @method Phaser.Curves.Path#add
  131463. * @since 3.0.0
  131464. *
  131465. * @param {Phaser.Curves.Curve} curve - The Curve to append.
  131466. *
  131467. * @return {Phaser.Curves.Path} This Path object.
  131468. */
  131469. add: function (curve)
  131470. {
  131471. this.curves.push(curve);
  131472. return this;
  131473. },
  131474. /**
  131475. * Creates a circular Ellipse Curve positioned at the end of the Path.
  131476. *
  131477. * @method Phaser.Curves.Path#circleTo
  131478. * @since 3.0.0
  131479. *
  131480. * @param {number} radius - The radius of the circle.
  131481. * @param {boolean} [clockwise=false] - `true` to create a clockwise circle as opposed to a counter-clockwise circle.
  131482. * @param {number} [rotation=0] - The rotation of the circle in degrees.
  131483. *
  131484. * @return {Phaser.Curves.Path} This Path object.
  131485. */
  131486. circleTo: function (radius, clockwise, rotation)
  131487. {
  131488. if (clockwise === undefined) { clockwise = false; }
  131489. return this.ellipseTo(radius, radius, 0, 360, clockwise, rotation);
  131490. },
  131491. /**
  131492. * Ensures that the Path is closed.
  131493. *
  131494. * A closed Path starts and ends at the same point. If the Path is not closed, a straight Line Curve will be created from the ending point directly to the starting point. During the check, the actual starting point of the Path, i.e. the starting point of the first Curve, will be used as opposed to the Path's defined {@link startPoint}, which could differ.
  131495. *
  131496. * Calling this method on an empty Path will result in an error.
  131497. *
  131498. * @method Phaser.Curves.Path#closePath
  131499. * @since 3.0.0
  131500. *
  131501. * @return {Phaser.Curves.Path} This Path object.
  131502. */
  131503. closePath: function ()
  131504. {
  131505. // Add a line curve if start and end of lines are not connected
  131506. var startPoint = this.curves[0].getPoint(0);
  131507. var endPoint = this.curves[this.curves.length - 1].getPoint(1);
  131508. if (!startPoint.equals(endPoint))
  131509. {
  131510. // This will copy a reference to the vectors, which probably isn't sensible
  131511. this.curves.push(new LineCurve(endPoint, startPoint));
  131512. }
  131513. return this;
  131514. },
  131515. /**
  131516. * Creates a cubic bezier curve starting at the previous end point and ending at p3, using p1 and p2 as control points.
  131517. *
  131518. * @method Phaser.Curves.Path#cubicBezierTo
  131519. * @since 3.0.0
  131520. *
  131521. * @param {(number|Phaser.Math.Vector2)} x - The x coordinate of the end point. Or, if a Vec2, the p1 value.
  131522. * @param {(number|Phaser.Math.Vector2)} y - The y coordinate of the end point. Or, if a Vec2, the p2 value.
  131523. * @param {(number|Phaser.Math.Vector2)} control1X - The x coordinate of the first control point. Or, if a Vec2, the p3 value.
  131524. * @param {number} [control1Y] - The y coordinate of the first control point. Not used if vec2s are provided as the first 3 arguments.
  131525. * @param {number} [control2X] - The x coordinate of the second control point. Not used if vec2s are provided as the first 3 arguments.
  131526. * @param {number} [control2Y] - The y coordinate of the second control point. Not used if vec2s are provided as the first 3 arguments.
  131527. *
  131528. * @return {Phaser.Curves.Path} This Path object.
  131529. */
  131530. cubicBezierTo: function (x, y, control1X, control1Y, control2X, control2Y)
  131531. {
  131532. var p0 = this.getEndPoint();
  131533. var p1;
  131534. var p2;
  131535. var p3;
  131536. // Assume they're all vec2s
  131537. if (x instanceof Vector2)
  131538. {
  131539. p1 = x;
  131540. p2 = y;
  131541. p3 = control1X;
  131542. }
  131543. else
  131544. {
  131545. p1 = new Vector2(control1X, control1Y);
  131546. p2 = new Vector2(control2X, control2Y);
  131547. p3 = new Vector2(x, y);
  131548. }
  131549. return this.add(new CubicBezierCurve(p0, p1, p2, p3));
  131550. },
  131551. // Creates a quadratic bezier curve starting at the previous end point and ending at p2, using p1 as a control point
  131552. /**
  131553. * Creates a Quadratic Bezier Curve starting at the ending point of the Path.
  131554. *
  131555. * @method Phaser.Curves.Path#quadraticBezierTo
  131556. * @since 3.2.0
  131557. *
  131558. * @param {(number|Phaser.Math.Vector2[])} x - The X coordinate of the second control point or, if it's a `Vector2`, the first control point.
  131559. * @param {number} [y] - The Y coordinate of the second control point or, if `x` is a `Vector2`, the second control point.
  131560. * @param {number} [controlX] - If `x` is not a `Vector2`, the X coordinate of the first control point.
  131561. * @param {number} [controlY] - If `x` is not a `Vector2`, the Y coordinate of the first control point.
  131562. *
  131563. * @return {Phaser.Curves.Path} This Path object.
  131564. */
  131565. quadraticBezierTo: function (x, y, controlX, controlY)
  131566. {
  131567. var p0 = this.getEndPoint();
  131568. var p1;
  131569. var p2;
  131570. // Assume they're all vec2s
  131571. if (x instanceof Vector2)
  131572. {
  131573. p1 = x;
  131574. p2 = y;
  131575. }
  131576. else
  131577. {
  131578. p1 = new Vector2(controlX, controlY);
  131579. p2 = new Vector2(x, y);
  131580. }
  131581. return this.add(new QuadraticBezierCurve(p0, p1, p2));
  131582. },
  131583. /**
  131584. * Draws all Curves in the Path to a Graphics Game Object.
  131585. *
  131586. * @method Phaser.Curves.Path#draw
  131587. * @since 3.0.0
  131588. *
  131589. * @generic {Phaser.GameObjects.Graphics} G - [out,$return]
  131590. *
  131591. * @param {Phaser.GameObjects.Graphics} graphics - The Graphics Game Object to draw to.
  131592. * @param {integer} [pointsTotal=32] - The number of points to draw for each Curve. Higher numbers result in a smoother curve but require more processing.
  131593. *
  131594. * @return {Phaser.GameObjects.Graphics} The Graphics object which was drawn to.
  131595. */
  131596. draw: function (graphics, pointsTotal)
  131597. {
  131598. for (var i = 0; i < this.curves.length; i++)
  131599. {
  131600. var curve = this.curves[i];
  131601. if (!curve.active)
  131602. {
  131603. continue;
  131604. }
  131605. curve.draw(graphics, pointsTotal);
  131606. }
  131607. return graphics;
  131608. },
  131609. /**
  131610. * Creates an ellipse curve positioned at the previous end point, using the given parameters.
  131611. *
  131612. * @method Phaser.Curves.Path#ellipseTo
  131613. * @since 3.0.0
  131614. *
  131615. * @param {number} xRadius - The horizontal radius of the ellipse.
  131616. * @param {number} yRadius - The vertical radius of the ellipse.
  131617. * @param {number} startAngle - The start angle of the ellipse, in degrees.
  131618. * @param {number} endAngle - The end angle of the ellipse, in degrees.
  131619. * @param {boolean} clockwise - Whether the ellipse should be rotated clockwise (`true`) or counter-clockwise (`false`).
  131620. * @param {number} rotation - The rotation of the ellipse, in degrees.
  131621. *
  131622. * @return {Phaser.Curves.Path} This Path object.
  131623. */
  131624. ellipseTo: function (xRadius, yRadius, startAngle, endAngle, clockwise, rotation)
  131625. {
  131626. var ellipse = new EllipseCurve(0, 0, xRadius, yRadius, startAngle, endAngle, clockwise, rotation);
  131627. var end = this.getEndPoint(this._tmpVec2A);
  131628. // Calculate where to center the ellipse
  131629. var start = ellipse.getStartPoint(this._tmpVec2B);
  131630. end.subtract(start);
  131631. ellipse.x = end.x;
  131632. ellipse.y = end.y;
  131633. return this.add(ellipse);
  131634. },
  131635. /**
  131636. * Creates a Path from a Path Configuration object.
  131637. *
  131638. * The provided object should be a {@link JSONPath}, as returned by {@link #toJSON}. Providing a malformed object may cause errors.
  131639. *
  131640. * @method Phaser.Curves.Path#fromJSON
  131641. * @since 3.0.0
  131642. *
  131643. * @param {object} data - The JSON object containing the Path data.
  131644. *
  131645. * @return {Phaser.Curves.Path} This Path object.
  131646. */
  131647. fromJSON: function (data)
  131648. {
  131649. // data should be an object matching the Path.toJSON object structure.
  131650. this.curves = [];
  131651. this.cacheLengths = [];
  131652. this.startPoint.set(data.x, data.y);
  131653. this.autoClose = data.autoClose;
  131654. for (var i = 0; i < data.curves.length; i++)
  131655. {
  131656. var curve = data.curves[i];
  131657. switch (curve.type)
  131658. {
  131659. case 'LineCurve':
  131660. this.add(LineCurve.fromJSON(curve));
  131661. break;
  131662. case 'EllipseCurve':
  131663. this.add(EllipseCurve.fromJSON(curve));
  131664. break;
  131665. case 'SplineCurve':
  131666. this.add(SplineCurve.fromJSON(curve));
  131667. break;
  131668. case 'CubicBezierCurve':
  131669. this.add(CubicBezierCurve.fromJSON(curve));
  131670. break;
  131671. case 'QuadraticBezierCurve':
  131672. this.add(QuadraticBezierCurve.fromJSON(curve));
  131673. break;
  131674. }
  131675. }
  131676. return this;
  131677. },
  131678. /**
  131679. * Returns a Rectangle with a position and size matching the bounds of this Path.
  131680. *
  131681. * @method Phaser.Curves.Path#getBounds
  131682. * @since 3.0.0
  131683. *
  131684. * @generic {Phaser.Math.Vector2} O - [out,$return]
  131685. *
  131686. * @param {Phaser.Geom.Rectangle} [out] - The Rectangle to store the bounds in.
  131687. * @param {integer} [accuracy=16] - The accuracy of the bounds calculations. Higher values are more accurate at the cost of calculation speed.
  131688. *
  131689. * @return {Phaser.Geom.Rectangle} The modified `out` Rectangle, or a new Rectangle if none was provided.
  131690. */
  131691. getBounds: function (out, accuracy)
  131692. {
  131693. if (out === undefined) { out = new Rectangle(); }
  131694. if (accuracy === undefined) { accuracy = 16; }
  131695. out.x = Number.MAX_VALUE;
  131696. out.y = Number.MAX_VALUE;
  131697. var bounds = new Rectangle();
  131698. var maxRight = Number.MIN_SAFE_INTEGER;
  131699. var maxBottom = Number.MIN_SAFE_INTEGER;
  131700. for (var i = 0; i < this.curves.length; i++)
  131701. {
  131702. var curve = this.curves[i];
  131703. if (!curve.active)
  131704. {
  131705. continue;
  131706. }
  131707. curve.getBounds(bounds, accuracy);
  131708. out.x = Math.min(out.x, bounds.x);
  131709. out.y = Math.min(out.y, bounds.y);
  131710. maxRight = Math.max(maxRight, bounds.right);
  131711. maxBottom = Math.max(maxBottom, bounds.bottom);
  131712. }
  131713. out.right = maxRight;
  131714. out.bottom = maxBottom;
  131715. return out;
  131716. },
  131717. /**
  131718. * Returns an array containing the length of the Path at the end of each Curve.
  131719. *
  131720. * The result of this method will be cached to avoid recalculating it in subsequent calls. The cache is only invalidated when the {@link #curves} array changes in length, leading to potential inaccuracies if a Curve in the Path is changed, or if a Curve is removed and another is added in its place.
  131721. *
  131722. * @method Phaser.Curves.Path#getCurveLengths
  131723. * @since 3.0.0
  131724. *
  131725. * @return {number[]} An array containing the length of the Path at the end of each one of its Curves.
  131726. */
  131727. getCurveLengths: function ()
  131728. {
  131729. // We use cache values if curves and cache array are same length
  131730. if (this.cacheLengths.length === this.curves.length)
  131731. {
  131732. return this.cacheLengths;
  131733. }
  131734. // Get length of sub-curve
  131735. // Push sums into cached array
  131736. var lengths = [];
  131737. var sums = 0;
  131738. for (var i = 0; i < this.curves.length; i++)
  131739. {
  131740. sums += this.curves[i].getLength();
  131741. lengths.push(sums);
  131742. }
  131743. this.cacheLengths = lengths;
  131744. return lengths;
  131745. },
  131746. /**
  131747. * Returns the ending point of the Path.
  131748. *
  131749. * A Path's ending point is equivalent to the ending point of the last Curve in the Path. For an empty Path, the ending point is at the Path's defined {@link #startPoint}.
  131750. *
  131751. * @method Phaser.Curves.Path#getEndPoint
  131752. * @since 3.0.0
  131753. *
  131754. * @generic {Phaser.Math.Vector2} O - [out,$return]
  131755. *
  131756. * @param {Phaser.Math.Vector2} [out] - The object to store the point in.
  131757. *
  131758. * @return {Phaser.Math.Vector2} The modified `out` object, or a new Vector2 if none was provided.
  131759. */
  131760. getEndPoint: function (out)
  131761. {
  131762. if (out === undefined) { out = new Vector2(); }
  131763. if (this.curves.length > 0)
  131764. {
  131765. this.curves[this.curves.length - 1].getPoint(1, out);
  131766. }
  131767. else
  131768. {
  131769. out.copy(this.startPoint);
  131770. }
  131771. return out;
  131772. },
  131773. /**
  131774. * Returns the total length of the Path.
  131775. *
  131776. * @see {@link #getCurveLengths}
  131777. *
  131778. * @method Phaser.Curves.Path#getLength
  131779. * @since 3.0.0
  131780. *
  131781. * @return {number} The total length of the Path.
  131782. */
  131783. getLength: function ()
  131784. {
  131785. var lens = this.getCurveLengths();
  131786. return lens[lens.length - 1];
  131787. },
  131788. // To get accurate point with reference to
  131789. // entire path distance at time t,
  131790. // following has to be done:
  131791. // 1. Length of each sub path have to be known
  131792. // 2. Locate and identify type of curve
  131793. // 3. Get t for the curve
  131794. // 4. Return curve.getPointAt(t')
  131795. /**
  131796. * Calculates the coordinates of the point at the given normalized location (between 0 and 1) on the Path.
  131797. *
  131798. * The location is relative to the entire Path, not to an individual Curve. A location of 0.5 is always in the middle of the Path and is thus an equal distance away from both its starting and ending points. In a Path with one Curve, it would be in the middle of the Curve; in a Path with two Curves, it could be anywhere on either one of them depending on their lengths.
  131799. *
  131800. * @method Phaser.Curves.Path#getPoint
  131801. * @since 3.0.0
  131802. *
  131803. * @generic {Phaser.Math.Vector2} O - [out,$return]
  131804. *
  131805. * @param {number} t - The location of the point to return, between 0 and 1.
  131806. * @param {Phaser.Math.Vector2} [out] - The object in which to store the calculated point.
  131807. *
  131808. * @return {?Phaser.Math.Vector2} The modified `out` object, or a new `Vector2` if none was provided.
  131809. */
  131810. getPoint: function (t, out)
  131811. {
  131812. if (out === undefined) { out = new Vector2(); }
  131813. var d = t * this.getLength();
  131814. var curveLengths = this.getCurveLengths();
  131815. var i = 0;
  131816. while (i < curveLengths.length)
  131817. {
  131818. if (curveLengths[i] >= d)
  131819. {
  131820. var diff = curveLengths[i] - d;
  131821. var curve = this.curves[i];
  131822. var segmentLength = curve.getLength();
  131823. var u = (segmentLength === 0) ? 0 : 1 - diff / segmentLength;
  131824. return curve.getPointAt(u, out);
  131825. }
  131826. i++;
  131827. }
  131828. // loop where sum != 0, sum > d , sum+1 <d
  131829. return null;
  131830. },
  131831. /**
  131832. * Returns the defined starting point of the Path.
  131833. *
  131834. * This is not necessarily equal to the starting point of the first Curve if it differs from {@link startPoint}.
  131835. *
  131836. * @method Phaser.Curves.Path#getPoints
  131837. * @since 3.0.0
  131838. *
  131839. * @param {integer} [divisions=12] - The number of points to divide the path in to.
  131840. *
  131841. * @return {Phaser.Math.Vector2[]} An array of Vector2 objects that containing the points along the Path.
  131842. */
  131843. getPoints: function (divisions)
  131844. {
  131845. if (divisions === undefined) { divisions = 12; }
  131846. var points = [];
  131847. var last;
  131848. for (var i = 0; i < this.curves.length; i++)
  131849. {
  131850. var curve = this.curves[i];
  131851. if (!curve.active)
  131852. {
  131853. continue;
  131854. }
  131855. var resolution = curve.getResolution(divisions);
  131856. var pts = curve.getPoints(resolution);
  131857. for (var j = 0; j < pts.length; j++)
  131858. {
  131859. var point = pts[j];
  131860. if (last && last.equals(point))
  131861. {
  131862. // ensures no consecutive points are duplicates
  131863. continue;
  131864. }
  131865. points.push(point);
  131866. last = point;
  131867. }
  131868. }
  131869. if (this.autoClose && points.length > 1 && !points[points.length - 1].equals(points[0]))
  131870. {
  131871. points.push(points[0]);
  131872. }
  131873. return points;
  131874. },
  131875. /**
  131876. * [description]
  131877. *
  131878. * @method Phaser.Curves.Path#getRandomPoint
  131879. * @since 3.0.0
  131880. *
  131881. * @generic {Phaser.Math.Vector2} O - [out,$return]
  131882. *
  131883. * @param {Phaser.Math.Vector2} [out] - `Vector2` instance that should be used for storing the result. If `undefined` a new `Vector2` will be created.
  131884. *
  131885. * @return {Phaser.Math.Vector2} [description]
  131886. */
  131887. getRandomPoint: function (out)
  131888. {
  131889. if (out === undefined) { out = new Vector2(); }
  131890. return this.getPoint(Math.random(), out);
  131891. },
  131892. /**
  131893. * Creates a straight Line Curve from the ending point of the Path to the given coordinates.
  131894. *
  131895. * @method Phaser.Curves.Path#getSpacedPoints
  131896. * @since 3.0.0
  131897. *
  131898. * @param {integer} [divisions=40] - The X coordinate of the line's ending point, or the line's ending point as a `Vector2`.
  131899. *
  131900. * @return {Phaser.Math.Vector2[]} [description]
  131901. */
  131902. getSpacedPoints: function (divisions)
  131903. {
  131904. if (divisions === undefined) { divisions = 40; }
  131905. var points = [];
  131906. for (var i = 0; i <= divisions; i++)
  131907. {
  131908. points.push(this.getPoint(i / divisions));
  131909. }
  131910. if (this.autoClose)
  131911. {
  131912. points.push(points[0]);
  131913. }
  131914. return points;
  131915. },
  131916. /**
  131917. * [description]
  131918. *
  131919. * @method Phaser.Curves.Path#getStartPoint
  131920. * @since 3.0.0
  131921. *
  131922. * @generic {Phaser.Math.Vector2} O - [out,$return]
  131923. *
  131924. * @param {Phaser.Math.Vector2} [out] - [description]
  131925. *
  131926. * @return {Phaser.Math.Vector2} [description]
  131927. */
  131928. getStartPoint: function (out)
  131929. {
  131930. if (out === undefined) { out = new Vector2(); }
  131931. return out.copy(this.startPoint);
  131932. },
  131933. // Creates a line curve from the previous end point to x/y
  131934. /**
  131935. * [description]
  131936. *
  131937. * @method Phaser.Curves.Path#lineTo
  131938. * @since 3.0.0
  131939. *
  131940. * @param {(number|Phaser.Math.Vector2)} x - [description]
  131941. * @param {number} [y] - [description]
  131942. *
  131943. * @return {Phaser.Curves.Path} [description]
  131944. */
  131945. lineTo: function (x, y)
  131946. {
  131947. if (x instanceof Vector2)
  131948. {
  131949. this._tmpVec2B.copy(x);
  131950. }
  131951. else
  131952. {
  131953. this._tmpVec2B.set(x, y);
  131954. }
  131955. var end = this.getEndPoint(this._tmpVec2A);
  131956. return this.add(new LineCurve([ end.x, end.y, this._tmpVec2B.x, this._tmpVec2B.y ]));
  131957. },
  131958. // Creates a spline curve starting at the previous end point, using the given parameters
  131959. /**
  131960. * [description]
  131961. *
  131962. * @method Phaser.Curves.Path#splineTo
  131963. * @since 3.0.0
  131964. *
  131965. * @param {Phaser.Math.Vector2[]} points - [description]
  131966. *
  131967. * @return {Phaser.Curves.Path} [description]
  131968. */
  131969. splineTo: function (points)
  131970. {
  131971. points.unshift(this.getEndPoint());
  131972. return this.add(new SplineCurve(points));
  131973. },
  131974. /**
  131975. * [description]
  131976. *
  131977. * @method Phaser.Curves.Path#moveTo
  131978. * @since 3.0.0
  131979. *
  131980. * @param {number} x - [description]
  131981. * @param {number} y - [description]
  131982. *
  131983. * @return {Phaser.Curves.Path} [description]
  131984. */
  131985. moveTo: function (x, y)
  131986. {
  131987. return this.add(new MovePathTo(x, y));
  131988. },
  131989. /**
  131990. * [description]
  131991. *
  131992. * @method Phaser.Curves.Path#toJSON
  131993. * @since 3.0.0
  131994. *
  131995. * @return {JSONPath} [description]
  131996. */
  131997. toJSON: function ()
  131998. {
  131999. var out = [];
  132000. for (var i = 0; i < this.curves.length; i++)
  132001. {
  132002. out.push(this.curves[i].toJSON());
  132003. }
  132004. return {
  132005. type: 'Path',
  132006. x: this.startPoint.x,
  132007. y: this.startPoint.y,
  132008. autoClose: this.autoClose,
  132009. curves: out
  132010. };
  132011. },
  132012. // cacheLengths must be recalculated.
  132013. /**
  132014. * [description]
  132015. *
  132016. * @method Phaser.Curves.Path#updateArcLengths
  132017. * @since 3.0.0
  132018. */
  132019. updateArcLengths: function ()
  132020. {
  132021. this.cacheLengths = [];
  132022. this.getCurveLengths();
  132023. },
  132024. /**
  132025. * [description]
  132026. *
  132027. * @method Phaser.Curves.Path#destroy
  132028. * @since 3.0.0
  132029. */
  132030. destroy: function ()
  132031. {
  132032. this.curves.length = 0;
  132033. this.cacheLengths.length = 0;
  132034. this.startPoint = undefined;
  132035. }
  132036. });
  132037. /**
  132038. * Creates a new Path Object.
  132039. *
  132040. * @method Phaser.GameObjects.GameObjectFactory#path
  132041. * @since 3.0.0
  132042. *
  132043. * @param {number} x - The horizontal position of this Path.
  132044. * @param {number} y - The vertical position of this Path.
  132045. *
  132046. * @return {Phaser.Curves.Path} The Path Object that was created.
  132047. */
  132048. GameObjectFactory.register('path', function (x, y)
  132049. {
  132050. return new Path(x, y);
  132051. });
  132052. // When registering a factory function 'this' refers to the GameObjectFactory context.
  132053. //
  132054. // There are several properties available to use:
  132055. //
  132056. // this.scene - a reference to the Scene that owns the GameObjectFactory
  132057. // this.displayList - a reference to the Display List the Scene owns
  132058. // this.updateList - a reference to the Update List the Scene owns
  132059. module.exports = Path;
  132060. /***/ }),
  132061. /* 1032 */
  132062. /***/ (function(module, exports, __webpack_require__) {
  132063. /**
  132064. * @author Richard Davey <rich@photonstorm.com>
  132065. * @copyright 2019 Photon Storm Ltd.
  132066. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132067. */
  132068. /**
  132069. * @namespace Phaser.Curves
  132070. */
  132071. /**
  132072. * @typedef {object} JSONCurve
  132073. *
  132074. * @property {string} type - The of the curve
  132075. * @property {number[]} points - The arrays of points like `[x1, y1, x2, y2]`
  132076. */
  132077. module.exports = {
  132078. Path: __webpack_require__(1031),
  132079. CubicBezier: __webpack_require__(359),
  132080. Curve: __webpack_require__(76),
  132081. Ellipse: __webpack_require__(358),
  132082. Line: __webpack_require__(357),
  132083. QuadraticBezier: __webpack_require__(356),
  132084. Spline: __webpack_require__(355)
  132085. };
  132086. /***/ }),
  132087. /* 1033 */
  132088. /***/ (function(module, exports) {
  132089. /**
  132090. * @author Richard Davey <rich@photonstorm.com>
  132091. * @copyright 2019 Photon Storm Ltd.
  132092. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132093. */
  132094. /**
  132095. * A 16 color palette inspired by Japanese computers like the MSX.
  132096. *
  132097. * @name Phaser.Create.Palettes.MSX
  132098. * @since 3.0.0
  132099. *
  132100. * @type {Palette}
  132101. */
  132102. module.exports = {
  132103. 0: '#000',
  132104. 1: '#191028',
  132105. 2: '#46af45',
  132106. 3: '#a1d685',
  132107. 4: '#453e78',
  132108. 5: '#7664fe',
  132109. 6: '#833129',
  132110. 7: '#9ec2e8',
  132111. 8: '#dc534b',
  132112. 9: '#e18d79',
  132113. A: '#d6b97b',
  132114. B: '#e9d8a1',
  132115. C: '#216c4b',
  132116. D: '#d365c8',
  132117. E: '#afaab9',
  132118. F: '#fff'
  132119. };
  132120. /***/ }),
  132121. /* 1034 */
  132122. /***/ (function(module, exports) {
  132123. /**
  132124. * @author Richard Davey <rich@photonstorm.com>
  132125. * @copyright 2019 Photon Storm Ltd.
  132126. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132127. */
  132128. /**
  132129. * A 16 color JMP palette by [Arne](http://androidarts.com/palette/16pal.htm)
  132130. *
  132131. * @name Phaser.Create.Palettes.JMP
  132132. * @since 3.0.0
  132133. *
  132134. * @type {Palette}
  132135. */
  132136. module.exports = {
  132137. 0: '#000',
  132138. 1: '#191028',
  132139. 2: '#46af45',
  132140. 3: '#a1d685',
  132141. 4: '#453e78',
  132142. 5: '#7664fe',
  132143. 6: '#833129',
  132144. 7: '#9ec2e8',
  132145. 8: '#dc534b',
  132146. 9: '#e18d79',
  132147. A: '#d6b97b',
  132148. B: '#e9d8a1',
  132149. C: '#216c4b',
  132150. D: '#d365c8',
  132151. E: '#afaab9',
  132152. F: '#f5f4eb'
  132153. };
  132154. /***/ }),
  132155. /* 1035 */
  132156. /***/ (function(module, exports) {
  132157. /**
  132158. * @author Richard Davey <rich@photonstorm.com>
  132159. * @copyright 2019 Photon Storm Ltd.
  132160. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132161. */
  132162. /**
  132163. * A 16 color CGA inspired palette by [Arne](http://androidarts.com/palette/16pal.htm)
  132164. *
  132165. * @name Phaser.Create.Palettes.CGA
  132166. * @since 3.0.0
  132167. *
  132168. * @type {Palette}
  132169. */
  132170. module.exports = {
  132171. 0: '#000',
  132172. 1: '#2234d1',
  132173. 2: '#0c7e45',
  132174. 3: '#44aacc',
  132175. 4: '#8a3622',
  132176. 5: '#5c2e78',
  132177. 6: '#aa5c3d',
  132178. 7: '#b5b5b5',
  132179. 8: '#5e606e',
  132180. 9: '#4c81fb',
  132181. A: '#6cd947',
  132182. B: '#7be2f9',
  132183. C: '#eb8a60',
  132184. D: '#e23d69',
  132185. E: '#ffd93f',
  132186. F: '#fff'
  132187. };
  132188. /***/ }),
  132189. /* 1036 */
  132190. /***/ (function(module, exports) {
  132191. /**
  132192. * @author Richard Davey <rich@photonstorm.com>
  132193. * @copyright 2019 Photon Storm Ltd.
  132194. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132195. */
  132196. /**
  132197. * A 16 color palette inspired by the Commodore 64.
  132198. *
  132199. * @name Phaser.Create.Palettes.C64
  132200. * @since 3.0.0
  132201. *
  132202. * @type {Palette}
  132203. */
  132204. module.exports = {
  132205. 0: '#000',
  132206. 1: '#fff',
  132207. 2: '#8b4131',
  132208. 3: '#7bbdc5',
  132209. 4: '#8b41ac',
  132210. 5: '#6aac41',
  132211. 6: '#3931a4',
  132212. 7: '#d5de73',
  132213. 8: '#945a20',
  132214. 9: '#5a4100',
  132215. A: '#bd736a',
  132216. B: '#525252',
  132217. C: '#838383',
  132218. D: '#acee8b',
  132219. E: '#7b73de',
  132220. F: '#acacac'
  132221. };
  132222. /***/ }),
  132223. /* 1037 */
  132224. /***/ (function(module, exports, __webpack_require__) {
  132225. /**
  132226. * @author Richard Davey <rich@photonstorm.com>
  132227. * @copyright 2019 Photon Storm Ltd.
  132228. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132229. */
  132230. /**
  132231. * @typedef {object} Palette
  132232. *
  132233. * @property {string} 0 - Color value 1.
  132234. * @property {string} 1 - Color value 2.
  132235. * @property {string} 2 - Color value 3.
  132236. * @property {string} 3 - Color value 4.
  132237. * @property {string} 4 - Color value 5.
  132238. * @property {string} 5 - Color value 6.
  132239. * @property {string} 6 - Color value 7.
  132240. * @property {string} 7 - Color value 8.
  132241. * @property {string} 8 - Color value 9.
  132242. * @property {string} 9 - Color value 10.
  132243. * @property {string} A - Color value 11.
  132244. * @property {string} B - Color value 12.
  132245. * @property {string} C - Color value 13.
  132246. * @property {string} D - Color value 14.
  132247. * @property {string} E - Color value 15.
  132248. * @property {string} F - Color value 16.
  132249. */
  132250. /**
  132251. * @namespace Phaser.Create.Palettes
  132252. */
  132253. module.exports = {
  132254. ARNE16: __webpack_require__(360),
  132255. C64: __webpack_require__(1036),
  132256. CGA: __webpack_require__(1035),
  132257. JMP: __webpack_require__(1034),
  132258. MSX: __webpack_require__(1033)
  132259. };
  132260. /***/ }),
  132261. /* 1038 */
  132262. /***/ (function(module, exports, __webpack_require__) {
  132263. /**
  132264. * @author Richard Davey <rich@photonstorm.com>
  132265. * @copyright 2019 Photon Storm Ltd.
  132266. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132267. */
  132268. /**
  132269. * @namespace Phaser.Create
  132270. */
  132271. module.exports = {
  132272. GenerateTexture: __webpack_require__(361),
  132273. Palettes: __webpack_require__(1037)
  132274. };
  132275. /***/ }),
  132276. /* 1039 */
  132277. /***/ (function(module, exports) {
  132278. module.exports = [
  132279. '#define SHADER_NAME PHASER_TEXTURE_TINT_VS',
  132280. '',
  132281. 'precision mediump float;',
  132282. '',
  132283. 'uniform mat4 uProjectionMatrix;',
  132284. 'uniform mat4 uViewMatrix;',
  132285. 'uniform mat4 uModelMatrix;',
  132286. '',
  132287. 'attribute vec2 inPosition;',
  132288. 'attribute vec2 inTexCoord;',
  132289. 'attribute float inTintEffect;',
  132290. 'attribute vec4 inTint;',
  132291. '',
  132292. 'varying vec2 outTexCoord;',
  132293. 'varying float outTintEffect;',
  132294. 'varying vec4 outTint;',
  132295. '',
  132296. 'void main ()',
  132297. '{',
  132298. ' gl_Position = uProjectionMatrix * uViewMatrix * uModelMatrix * vec4(inPosition, 1.0, 1.0);',
  132299. '',
  132300. ' outTexCoord = inTexCoord;',
  132301. ' outTint = inTint;',
  132302. ' outTintEffect = inTintEffect;',
  132303. '}',
  132304. '',
  132305. ''
  132306. ].join('\n');
  132307. /***/ }),
  132308. /* 1040 */
  132309. /***/ (function(module, exports) {
  132310. module.exports = [
  132311. '#define SHADER_NAME PHASER_TEXTURE_TINT_FS',
  132312. '',
  132313. 'precision mediump float;',
  132314. '',
  132315. 'uniform sampler2D uMainSampler;',
  132316. '',
  132317. 'varying vec2 outTexCoord;',
  132318. 'varying float outTintEffect;',
  132319. 'varying vec4 outTint;',
  132320. '',
  132321. 'void main()',
  132322. '{',
  132323. ' vec4 texture = texture2D(uMainSampler, outTexCoord);',
  132324. ' vec4 texel = vec4(outTint.rgb * outTint.a, outTint.a);',
  132325. ' vec4 color = texture;',
  132326. '',
  132327. ' if (outTintEffect == 0.0)',
  132328. ' {',
  132329. ' // Multiply texture tint',
  132330. ' color = texture * texel;',
  132331. ' }',
  132332. ' else if (outTintEffect == 1.0)',
  132333. ' {',
  132334. ' // Solid color + texture alpha',
  132335. ' color.rgb = mix(texture.rgb, outTint.rgb * outTint.a, texture.a);',
  132336. ' color.a = texture.a * texel.a;',
  132337. ' }',
  132338. ' else if (outTintEffect == 2.0)',
  132339. ' {',
  132340. ' // Solid color, no texture',
  132341. ' color = texel;',
  132342. ' }',
  132343. '',
  132344. ' gl_FragColor = color;',
  132345. '}',
  132346. ''
  132347. ].join('\n');
  132348. /***/ }),
  132349. /* 1041 */
  132350. /***/ (function(module, exports) {
  132351. /**
  132352. * @author Richard Davey <rich@photonstorm.com>
  132353. * @copyright 2019 Photon Storm Ltd.
  132354. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132355. */
  132356. /**
  132357. * Implements a model view projection matrices.
  132358. * Pipelines can implement this for doing 2D and 3D rendering.
  132359. */
  132360. var ModelViewProjection = {
  132361. /**
  132362. * Dirty flag for checking if model matrix needs to be updated on GPU.
  132363. */
  132364. modelMatrixDirty: false,
  132365. /**
  132366. * Dirty flag for checking if view matrix needs to be updated on GPU.
  132367. */
  132368. viewMatrixDirty: false,
  132369. /**
  132370. * Dirty flag for checking if projection matrix needs to be updated on GPU.
  132371. */
  132372. projectionMatrixDirty: false,
  132373. /**
  132374. * Model matrix
  132375. */
  132376. modelMatrix: null,
  132377. /**
  132378. * View matrix
  132379. */
  132380. viewMatrix: null,
  132381. /**
  132382. * Projection matrix
  132383. */
  132384. projectionMatrix: null,
  132385. /**
  132386. * Initializes MVP matrices with an identity matrix
  132387. */
  132388. mvpInit: function ()
  132389. {
  132390. this.modelMatrixDirty = true;
  132391. this.viewMatrixDirty = true;
  132392. this.projectionMatrixDirty = true;
  132393. this.modelMatrix = new Float32Array([
  132394. 1, 0, 0, 0,
  132395. 0, 1, 0, 0,
  132396. 0, 0, 1, 0,
  132397. 0, 0, 0, 1
  132398. ]);
  132399. this.viewMatrix = new Float32Array([
  132400. 1, 0, 0, 0,
  132401. 0, 1, 0, 0,
  132402. 0, 0, 1, 0,
  132403. 0, 0, 0, 1
  132404. ]);
  132405. this.projectionMatrix = new Float32Array([
  132406. 1, 0, 0, 0,
  132407. 0, 1, 0, 0,
  132408. 0, 0, 1, 0,
  132409. 0, 0, 0, 1
  132410. ]);
  132411. return this;
  132412. },
  132413. /**
  132414. * If dirty flags are set then the matrices are uploaded to the GPU.
  132415. */
  132416. mvpUpdate: function ()
  132417. {
  132418. var program = this.program;
  132419. if (this.modelMatrixDirty)
  132420. {
  132421. this.renderer.setMatrix4(program, 'uModelMatrix', false, this.modelMatrix);
  132422. this.modelMatrixDirty = false;
  132423. }
  132424. if (this.viewMatrixDirty)
  132425. {
  132426. this.renderer.setMatrix4(program, 'uViewMatrix', false, this.viewMatrix);
  132427. this.viewMatrixDirty = false;
  132428. }
  132429. if (this.projectionMatrixDirty)
  132430. {
  132431. this.renderer.setMatrix4(program, 'uProjectionMatrix', false, this.projectionMatrix);
  132432. this.projectionMatrixDirty = false;
  132433. }
  132434. return this;
  132435. },
  132436. /**
  132437. * Loads an identity matrix to the model matrix
  132438. */
  132439. modelIdentity: function ()
  132440. {
  132441. var modelMatrix = this.modelMatrix;
  132442. modelMatrix[0] = 1;
  132443. modelMatrix[1] = 0;
  132444. modelMatrix[2] = 0;
  132445. modelMatrix[3] = 0;
  132446. modelMatrix[4] = 0;
  132447. modelMatrix[5] = 1;
  132448. modelMatrix[6] = 0;
  132449. modelMatrix[7] = 0;
  132450. modelMatrix[8] = 0;
  132451. modelMatrix[9] = 0;
  132452. modelMatrix[10] = 1;
  132453. modelMatrix[11] = 0;
  132454. modelMatrix[12] = 0;
  132455. modelMatrix[13] = 0;
  132456. modelMatrix[14] = 0;
  132457. modelMatrix[15] = 1;
  132458. this.modelMatrixDirty = true;
  132459. return this;
  132460. },
  132461. /**
  132462. * Scale model matrix
  132463. */
  132464. modelScale: function (x, y, z)
  132465. {
  132466. var modelMatrix = this.modelMatrix;
  132467. modelMatrix[0] = modelMatrix[0] * x;
  132468. modelMatrix[1] = modelMatrix[1] * x;
  132469. modelMatrix[2] = modelMatrix[2] * x;
  132470. modelMatrix[3] = modelMatrix[3] * x;
  132471. modelMatrix[4] = modelMatrix[4] * y;
  132472. modelMatrix[5] = modelMatrix[5] * y;
  132473. modelMatrix[6] = modelMatrix[6] * y;
  132474. modelMatrix[7] = modelMatrix[7] * y;
  132475. modelMatrix[8] = modelMatrix[8] * z;
  132476. modelMatrix[9] = modelMatrix[9] * z;
  132477. modelMatrix[10] = modelMatrix[10] * z;
  132478. modelMatrix[11] = modelMatrix[11] * z;
  132479. this.modelMatrixDirty = true;
  132480. return this;
  132481. },
  132482. /**
  132483. * Translate model matrix
  132484. */
  132485. modelTranslate: function (x, y, z)
  132486. {
  132487. var modelMatrix = this.modelMatrix;
  132488. modelMatrix[12] = modelMatrix[0] * x + modelMatrix[4] * y + modelMatrix[8] * z + modelMatrix[12];
  132489. modelMatrix[13] = modelMatrix[1] * x + modelMatrix[5] * y + modelMatrix[9] * z + modelMatrix[13];
  132490. modelMatrix[14] = modelMatrix[2] * x + modelMatrix[6] * y + modelMatrix[10] * z + modelMatrix[14];
  132491. modelMatrix[15] = modelMatrix[3] * x + modelMatrix[7] * y + modelMatrix[11] * z + modelMatrix[15];
  132492. this.modelMatrixDirty = true;
  132493. return this;
  132494. },
  132495. /**
  132496. * Rotates the model matrix in the X axis.
  132497. */
  132498. modelRotateX: function (radians)
  132499. {
  132500. var modelMatrix = this.modelMatrix;
  132501. var s = Math.sin(radians);
  132502. var c = Math.cos(radians);
  132503. var a10 = modelMatrix[4];
  132504. var a11 = modelMatrix[5];
  132505. var a12 = modelMatrix[6];
  132506. var a13 = modelMatrix[7];
  132507. var a20 = modelMatrix[8];
  132508. var a21 = modelMatrix[9];
  132509. var a22 = modelMatrix[10];
  132510. var a23 = modelMatrix[11];
  132511. modelMatrix[4] = a10 * c + a20 * s;
  132512. modelMatrix[5] = a11 * c + a21 * s;
  132513. modelMatrix[6] = a12 * c + a22 * s;
  132514. modelMatrix[7] = a13 * c + a23 * s;
  132515. modelMatrix[8] = a20 * c - a10 * s;
  132516. modelMatrix[9] = a21 * c - a11 * s;
  132517. modelMatrix[10] = a22 * c - a12 * s;
  132518. modelMatrix[11] = a23 * c - a13 * s;
  132519. this.modelMatrixDirty = true;
  132520. return this;
  132521. },
  132522. /**
  132523. * Rotates the model matrix in the Y axis.
  132524. */
  132525. modelRotateY: function (radians)
  132526. {
  132527. var modelMatrix = this.modelMatrix;
  132528. var s = Math.sin(radians);
  132529. var c = Math.cos(radians);
  132530. var a00 = modelMatrix[0];
  132531. var a01 = modelMatrix[1];
  132532. var a02 = modelMatrix[2];
  132533. var a03 = modelMatrix[3];
  132534. var a20 = modelMatrix[8];
  132535. var a21 = modelMatrix[9];
  132536. var a22 = modelMatrix[10];
  132537. var a23 = modelMatrix[11];
  132538. modelMatrix[0] = a00 * c - a20 * s;
  132539. modelMatrix[1] = a01 * c - a21 * s;
  132540. modelMatrix[2] = a02 * c - a22 * s;
  132541. modelMatrix[3] = a03 * c - a23 * s;
  132542. modelMatrix[8] = a00 * s + a20 * c;
  132543. modelMatrix[9] = a01 * s + a21 * c;
  132544. modelMatrix[10] = a02 * s + a22 * c;
  132545. modelMatrix[11] = a03 * s + a23 * c;
  132546. this.modelMatrixDirty = true;
  132547. return this;
  132548. },
  132549. /**
  132550. * Rotates the model matrix in the Z axis.
  132551. */
  132552. modelRotateZ: function (radians)
  132553. {
  132554. var modelMatrix = this.modelMatrix;
  132555. var s = Math.sin(radians);
  132556. var c = Math.cos(radians);
  132557. var a00 = modelMatrix[0];
  132558. var a01 = modelMatrix[1];
  132559. var a02 = modelMatrix[2];
  132560. var a03 = modelMatrix[3];
  132561. var a10 = modelMatrix[4];
  132562. var a11 = modelMatrix[5];
  132563. var a12 = modelMatrix[6];
  132564. var a13 = modelMatrix[7];
  132565. modelMatrix[0] = a00 * c + a10 * s;
  132566. modelMatrix[1] = a01 * c + a11 * s;
  132567. modelMatrix[2] = a02 * c + a12 * s;
  132568. modelMatrix[3] = a03 * c + a13 * s;
  132569. modelMatrix[4] = a10 * c - a00 * s;
  132570. modelMatrix[5] = a11 * c - a01 * s;
  132571. modelMatrix[6] = a12 * c - a02 * s;
  132572. modelMatrix[7] = a13 * c - a03 * s;
  132573. this.modelMatrixDirty = true;
  132574. return this;
  132575. },
  132576. /**
  132577. * Loads identity matrix into the view matrix
  132578. */
  132579. viewIdentity: function ()
  132580. {
  132581. var viewMatrix = this.viewMatrix;
  132582. viewMatrix[0] = 1;
  132583. viewMatrix[1] = 0;
  132584. viewMatrix[2] = 0;
  132585. viewMatrix[3] = 0;
  132586. viewMatrix[4] = 0;
  132587. viewMatrix[5] = 1;
  132588. viewMatrix[6] = 0;
  132589. viewMatrix[7] = 0;
  132590. viewMatrix[8] = 0;
  132591. viewMatrix[9] = 0;
  132592. viewMatrix[10] = 1;
  132593. viewMatrix[11] = 0;
  132594. viewMatrix[12] = 0;
  132595. viewMatrix[13] = 0;
  132596. viewMatrix[14] = 0;
  132597. viewMatrix[15] = 1;
  132598. this.viewMatrixDirty = true;
  132599. return this;
  132600. },
  132601. /**
  132602. * Scales view matrix
  132603. */
  132604. viewScale: function (x, y, z)
  132605. {
  132606. var viewMatrix = this.viewMatrix;
  132607. viewMatrix[0] = viewMatrix[0] * x;
  132608. viewMatrix[1] = viewMatrix[1] * x;
  132609. viewMatrix[2] = viewMatrix[2] * x;
  132610. viewMatrix[3] = viewMatrix[3] * x;
  132611. viewMatrix[4] = viewMatrix[4] * y;
  132612. viewMatrix[5] = viewMatrix[5] * y;
  132613. viewMatrix[6] = viewMatrix[6] * y;
  132614. viewMatrix[7] = viewMatrix[7] * y;
  132615. viewMatrix[8] = viewMatrix[8] * z;
  132616. viewMatrix[9] = viewMatrix[9] * z;
  132617. viewMatrix[10] = viewMatrix[10] * z;
  132618. viewMatrix[11] = viewMatrix[11] * z;
  132619. this.viewMatrixDirty = true;
  132620. return this;
  132621. },
  132622. /**
  132623. * Translates view matrix
  132624. */
  132625. viewTranslate: function (x, y, z)
  132626. {
  132627. var viewMatrix = this.viewMatrix;
  132628. viewMatrix[12] = viewMatrix[0] * x + viewMatrix[4] * y + viewMatrix[8] * z + viewMatrix[12];
  132629. viewMatrix[13] = viewMatrix[1] * x + viewMatrix[5] * y + viewMatrix[9] * z + viewMatrix[13];
  132630. viewMatrix[14] = viewMatrix[2] * x + viewMatrix[6] * y + viewMatrix[10] * z + viewMatrix[14];
  132631. viewMatrix[15] = viewMatrix[3] * x + viewMatrix[7] * y + viewMatrix[11] * z + viewMatrix[15];
  132632. this.viewMatrixDirty = true;
  132633. return this;
  132634. },
  132635. /**
  132636. * Rotates view matrix in the X axis.
  132637. */
  132638. viewRotateX: function (radians)
  132639. {
  132640. var viewMatrix = this.viewMatrix;
  132641. var s = Math.sin(radians);
  132642. var c = Math.cos(radians);
  132643. var a10 = viewMatrix[4];
  132644. var a11 = viewMatrix[5];
  132645. var a12 = viewMatrix[6];
  132646. var a13 = viewMatrix[7];
  132647. var a20 = viewMatrix[8];
  132648. var a21 = viewMatrix[9];
  132649. var a22 = viewMatrix[10];
  132650. var a23 = viewMatrix[11];
  132651. viewMatrix[4] = a10 * c + a20 * s;
  132652. viewMatrix[5] = a11 * c + a21 * s;
  132653. viewMatrix[6] = a12 * c + a22 * s;
  132654. viewMatrix[7] = a13 * c + a23 * s;
  132655. viewMatrix[8] = a20 * c - a10 * s;
  132656. viewMatrix[9] = a21 * c - a11 * s;
  132657. viewMatrix[10] = a22 * c - a12 * s;
  132658. viewMatrix[11] = a23 * c - a13 * s;
  132659. this.viewMatrixDirty = true;
  132660. return this;
  132661. },
  132662. /**
  132663. * Rotates view matrix in the Y axis.
  132664. */
  132665. viewRotateY: function (radians)
  132666. {
  132667. var viewMatrix = this.viewMatrix;
  132668. var s = Math.sin(radians);
  132669. var c = Math.cos(radians);
  132670. var a00 = viewMatrix[0];
  132671. var a01 = viewMatrix[1];
  132672. var a02 = viewMatrix[2];
  132673. var a03 = viewMatrix[3];
  132674. var a20 = viewMatrix[8];
  132675. var a21 = viewMatrix[9];
  132676. var a22 = viewMatrix[10];
  132677. var a23 = viewMatrix[11];
  132678. viewMatrix[0] = a00 * c - a20 * s;
  132679. viewMatrix[1] = a01 * c - a21 * s;
  132680. viewMatrix[2] = a02 * c - a22 * s;
  132681. viewMatrix[3] = a03 * c - a23 * s;
  132682. viewMatrix[8] = a00 * s + a20 * c;
  132683. viewMatrix[9] = a01 * s + a21 * c;
  132684. viewMatrix[10] = a02 * s + a22 * c;
  132685. viewMatrix[11] = a03 * s + a23 * c;
  132686. this.viewMatrixDirty = true;
  132687. return this;
  132688. },
  132689. /**
  132690. * Rotates view matrix in the Z axis.
  132691. */
  132692. viewRotateZ: function (radians)
  132693. {
  132694. var viewMatrix = this.viewMatrix;
  132695. var s = Math.sin(radians);
  132696. var c = Math.cos(radians);
  132697. var a00 = viewMatrix[0];
  132698. var a01 = viewMatrix[1];
  132699. var a02 = viewMatrix[2];
  132700. var a03 = viewMatrix[3];
  132701. var a10 = viewMatrix[4];
  132702. var a11 = viewMatrix[5];
  132703. var a12 = viewMatrix[6];
  132704. var a13 = viewMatrix[7];
  132705. viewMatrix[0] = a00 * c + a10 * s;
  132706. viewMatrix[1] = a01 * c + a11 * s;
  132707. viewMatrix[2] = a02 * c + a12 * s;
  132708. viewMatrix[3] = a03 * c + a13 * s;
  132709. viewMatrix[4] = a10 * c - a00 * s;
  132710. viewMatrix[5] = a11 * c - a01 * s;
  132711. viewMatrix[6] = a12 * c - a02 * s;
  132712. viewMatrix[7] = a13 * c - a03 * s;
  132713. this.viewMatrixDirty = true;
  132714. return this;
  132715. },
  132716. /**
  132717. * Loads a 2D view matrix (3x2 matrix) into a 4x4 view matrix
  132718. */
  132719. viewLoad2D: function (matrix2D)
  132720. {
  132721. var vm = this.viewMatrix;
  132722. vm[0] = matrix2D[0];
  132723. vm[1] = matrix2D[1];
  132724. vm[2] = 0.0;
  132725. vm[3] = 0.0;
  132726. vm[4] = matrix2D[2];
  132727. vm[5] = matrix2D[3];
  132728. vm[6] = 0.0;
  132729. vm[7] = 0.0;
  132730. vm[8] = matrix2D[4];
  132731. vm[9] = matrix2D[5];
  132732. vm[10] = 1.0;
  132733. vm[11] = 0.0;
  132734. vm[12] = 0.0;
  132735. vm[13] = 0.0;
  132736. vm[14] = 0.0;
  132737. vm[15] = 1.0;
  132738. this.viewMatrixDirty = true;
  132739. return this;
  132740. },
  132741. /**
  132742. * Copies a 4x4 matrix into the view matrix
  132743. */
  132744. viewLoad: function (matrix)
  132745. {
  132746. var vm = this.viewMatrix;
  132747. vm[0] = matrix[0];
  132748. vm[1] = matrix[1];
  132749. vm[2] = matrix[2];
  132750. vm[3] = matrix[3];
  132751. vm[4] = matrix[4];
  132752. vm[5] = matrix[5];
  132753. vm[6] = matrix[6];
  132754. vm[7] = matrix[7];
  132755. vm[8] = matrix[8];
  132756. vm[9] = matrix[9];
  132757. vm[10] = matrix[10];
  132758. vm[11] = matrix[11];
  132759. vm[12] = matrix[12];
  132760. vm[13] = matrix[13];
  132761. vm[14] = matrix[14];
  132762. vm[15] = matrix[15];
  132763. this.viewMatrixDirty = true;
  132764. return this;
  132765. },
  132766. /**
  132767. * Loads identity matrix into the projection matrix.
  132768. */
  132769. projIdentity: function ()
  132770. {
  132771. var projectionMatrix = this.projectionMatrix;
  132772. projectionMatrix[0] = 1;
  132773. projectionMatrix[1] = 0;
  132774. projectionMatrix[2] = 0;
  132775. projectionMatrix[3] = 0;
  132776. projectionMatrix[4] = 0;
  132777. projectionMatrix[5] = 1;
  132778. projectionMatrix[6] = 0;
  132779. projectionMatrix[7] = 0;
  132780. projectionMatrix[8] = 0;
  132781. projectionMatrix[9] = 0;
  132782. projectionMatrix[10] = 1;
  132783. projectionMatrix[11] = 0;
  132784. projectionMatrix[12] = 0;
  132785. projectionMatrix[13] = 0;
  132786. projectionMatrix[14] = 0;
  132787. projectionMatrix[15] = 1;
  132788. this.projectionMatrixDirty = true;
  132789. return this;
  132790. },
  132791. /**
  132792. * Sets up an orthographics projection matrix
  132793. */
  132794. projOrtho: function (left, right, bottom, top, near, far)
  132795. {
  132796. var projectionMatrix = this.projectionMatrix;
  132797. var leftRight = 1.0 / (left - right);
  132798. var bottomTop = 1.0 / (bottom - top);
  132799. var nearFar = 1.0 / (near - far);
  132800. projectionMatrix[0] = -2.0 * leftRight;
  132801. projectionMatrix[1] = 0.0;
  132802. projectionMatrix[2] = 0.0;
  132803. projectionMatrix[3] = 0.0;
  132804. projectionMatrix[4] = 0.0;
  132805. projectionMatrix[5] = -2.0 * bottomTop;
  132806. projectionMatrix[6] = 0.0;
  132807. projectionMatrix[7] = 0.0;
  132808. projectionMatrix[8] = 0.0;
  132809. projectionMatrix[9] = 0.0;
  132810. projectionMatrix[10] = 2.0 * nearFar;
  132811. projectionMatrix[11] = 0.0;
  132812. projectionMatrix[12] = (left + right) * leftRight;
  132813. projectionMatrix[13] = (top + bottom) * bottomTop;
  132814. projectionMatrix[14] = (far + near) * nearFar;
  132815. projectionMatrix[15] = 1.0;
  132816. this.projectionMatrixDirty = true;
  132817. return this;
  132818. },
  132819. /**
  132820. * Sets up a perspective projection matrix
  132821. */
  132822. projPersp: function (fovy, aspectRatio, near, far)
  132823. {
  132824. var projectionMatrix = this.projectionMatrix;
  132825. var fov = 1.0 / Math.tan(fovy / 2.0);
  132826. var nearFar = 1.0 / (near - far);
  132827. projectionMatrix[0] = fov / aspectRatio;
  132828. projectionMatrix[1] = 0.0;
  132829. projectionMatrix[2] = 0.0;
  132830. projectionMatrix[3] = 0.0;
  132831. projectionMatrix[4] = 0.0;
  132832. projectionMatrix[5] = fov;
  132833. projectionMatrix[6] = 0.0;
  132834. projectionMatrix[7] = 0.0;
  132835. projectionMatrix[8] = 0.0;
  132836. projectionMatrix[9] = 0.0;
  132837. projectionMatrix[10] = (far + near) * nearFar;
  132838. projectionMatrix[11] = -1.0;
  132839. projectionMatrix[12] = 0.0;
  132840. projectionMatrix[13] = 0.0;
  132841. projectionMatrix[14] = (2.0 * far * near) * nearFar;
  132842. projectionMatrix[15] = 0.0;
  132843. this.projectionMatrixDirty = true;
  132844. return this;
  132845. }
  132846. };
  132847. module.exports = ModelViewProjection;
  132848. /***/ }),
  132849. /* 1042 */
  132850. /***/ (function(module, exports) {
  132851. module.exports = [
  132852. '#define SHADER_NAME PHASER_FORWARD_DIFFUSE_FS',
  132853. '',
  132854. 'precision mediump float;',
  132855. '',
  132856. 'struct Light',
  132857. '{',
  132858. ' vec2 position;',
  132859. ' vec3 color;',
  132860. ' float intensity;',
  132861. ' float radius;',
  132862. '};',
  132863. '',
  132864. 'const int kMaxLights = %LIGHT_COUNT%;',
  132865. '',
  132866. 'uniform vec4 uCamera; /* x, y, rotation, zoom */',
  132867. 'uniform vec2 uResolution;',
  132868. 'uniform sampler2D uMainSampler;',
  132869. 'uniform sampler2D uNormSampler;',
  132870. 'uniform vec3 uAmbientLightColor;',
  132871. 'uniform Light uLights[kMaxLights];',
  132872. 'uniform mat3 uInverseRotationMatrix;',
  132873. '',
  132874. 'varying vec2 outTexCoord;',
  132875. 'varying vec4 outTint;',
  132876. '',
  132877. 'void main()',
  132878. '{',
  132879. ' vec3 finalColor = vec3(0.0, 0.0, 0.0);',
  132880. ' vec4 color = texture2D(uMainSampler, outTexCoord) * vec4(outTint.rgb * outTint.a, outTint.a);',
  132881. ' vec3 normalMap = texture2D(uNormSampler, outTexCoord).rgb;',
  132882. ' vec3 normal = normalize(uInverseRotationMatrix * vec3(normalMap * 2.0 - 1.0));',
  132883. ' vec2 res = vec2(min(uResolution.x, uResolution.y)) * uCamera.w;',
  132884. '',
  132885. ' for (int index = 0; index < kMaxLights; ++index)',
  132886. ' {',
  132887. ' Light light = uLights[index];',
  132888. ' vec3 lightDir = vec3((light.position.xy / res) - (gl_FragCoord.xy / res), 0.1);',
  132889. ' vec3 lightNormal = normalize(lightDir);',
  132890. ' float distToSurf = length(lightDir) * uCamera.w;',
  132891. ' float diffuseFactor = max(dot(normal, lightNormal), 0.0);',
  132892. ' float radius = (light.radius / res.x * uCamera.w) * uCamera.w;',
  132893. ' float attenuation = clamp(1.0 - distToSurf * distToSurf / (radius * radius), 0.0, 1.0);',
  132894. ' vec3 diffuse = light.color * diffuseFactor;',
  132895. ' finalColor += (attenuation * diffuse) * light.intensity;',
  132896. ' }',
  132897. '',
  132898. ' vec4 colorOutput = vec4(uAmbientLightColor + finalColor, 1.0);',
  132899. ' gl_FragColor = color * vec4(colorOutput.rgb * colorOutput.a, colorOutput.a);',
  132900. '',
  132901. '}',
  132902. ''
  132903. ].join('\n');
  132904. /***/ }),
  132905. /* 1043 */
  132906. /***/ (function(module, exports) {
  132907. module.exports = [
  132908. '#define SHADER_NAME PHASER_BITMAP_MASK_VS',
  132909. '',
  132910. 'precision mediump float;',
  132911. '',
  132912. 'attribute vec2 inPosition;',
  132913. '',
  132914. 'void main()',
  132915. '{',
  132916. ' gl_Position = vec4(inPosition, 0.0, 1.0);',
  132917. '}',
  132918. ''
  132919. ].join('\n');
  132920. /***/ }),
  132921. /* 1044 */
  132922. /***/ (function(module, exports) {
  132923. module.exports = [
  132924. '#define SHADER_NAME PHASER_BITMAP_MASK_FS',
  132925. '',
  132926. 'precision mediump float;',
  132927. '',
  132928. 'uniform vec2 uResolution;',
  132929. 'uniform sampler2D uMainSampler;',
  132930. 'uniform sampler2D uMaskSampler;',
  132931. 'uniform bool uInvertMaskAlpha;',
  132932. '',
  132933. 'void main()',
  132934. '{',
  132935. ' vec2 uv = gl_FragCoord.xy / uResolution;',
  132936. ' vec4 mainColor = texture2D(uMainSampler, uv);',
  132937. ' vec4 maskColor = texture2D(uMaskSampler, uv);',
  132938. ' float alpha = mainColor.a;',
  132939. '',
  132940. ' if (!uInvertMaskAlpha)',
  132941. ' {',
  132942. ' alpha *= (maskColor.a);',
  132943. ' }',
  132944. ' else',
  132945. ' {',
  132946. ' alpha *= (1.0 - maskColor.a);',
  132947. ' }',
  132948. '',
  132949. ' gl_FragColor = vec4(mainColor.rgb * alpha, alpha);',
  132950. '}',
  132951. ''
  132952. ].join('\n');
  132953. /***/ }),
  132954. /* 1045 */
  132955. /***/ (function(module, exports) {
  132956. /**
  132957. * @author Richard Davey <rich@photonstorm.com>
  132958. * @copyright 2019 Photon Storm Ltd.
  132959. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132960. */
  132961. /**
  132962. * The Texture Remove Event.
  132963. *
  132964. * This event is dispatched by the Texture Manager when a texture is removed from it.
  132965. *
  132966. * Listen to this event from within a Scene using: `this.textures.on('removetexture', listener)`.
  132967. *
  132968. * If you have any Game Objects still using the removed texture, they will start throwing
  132969. * errors the next time they try to render. Be sure to clear all use of the texture in this event handler.
  132970. *
  132971. * @event Phaser.Textures.Events#REMOVE
  132972. *
  132973. * @param {string} key - The key of the Texture that was removed from the Texture Manager.
  132974. */
  132975. module.exports = 'removetexture';
  132976. /***/ }),
  132977. /* 1046 */
  132978. /***/ (function(module, exports) {
  132979. /**
  132980. * @author Richard Davey <rich@photonstorm.com>
  132981. * @copyright 2019 Photon Storm Ltd.
  132982. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132983. */
  132984. /**
  132985. * This internal event signifies that the Texture Manager is now ready and the Game can continue booting.
  132986. *
  132987. * When a Phaser Game instance is booting for the first time, the Texture Manager has to wait on a couple of non-blocking
  132988. * async events before it's fully ready to carry on. When those complete the Texture Manager emits this event via the Game
  132989. * instance, which tells the Game to carry on booting.
  132990. *
  132991. * @event Phaser.Textures.Events#READY
  132992. */
  132993. module.exports = 'ready';
  132994. /***/ }),
  132995. /* 1047 */
  132996. /***/ (function(module, exports) {
  132997. /**
  132998. * @author Richard Davey <rich@photonstorm.com>
  132999. * @copyright 2019 Photon Storm Ltd.
  133000. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133001. */
  133002. /**
  133003. * The Texture Load Event.
  133004. *
  133005. * This event is dispatched by the Texture Manager when a texture has finished loading on it.
  133006. * This only happens for base64 encoded textures. All other texture types are loaded via the Loader Plugin.
  133007. *
  133008. * Listen to this event from within a Scene using: `this.textures.on('onload', listener)`.
  133009. *
  133010. * This event is dispatched after the [ADD]{@linkcode Phaser.Textures.Events#event:ADD} event.
  133011. *
  133012. * @event Phaser.Textures.Events#LOAD
  133013. *
  133014. * @param {string} key - The key of the Texture that was loaded by the Texture Manager.
  133015. * @param {Phaser.Textures.Texture} texture - A reference to the Texture that was loaded by the Texture Manager.
  133016. */
  133017. module.exports = 'onload';
  133018. /***/ }),
  133019. /* 1048 */
  133020. /***/ (function(module, exports) {
  133021. /**
  133022. * @author Richard Davey <rich@photonstorm.com>
  133023. * @copyright 2019 Photon Storm Ltd.
  133024. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133025. */
  133026. /**
  133027. * The Texture Load Error Event.
  133028. *
  133029. * This event is dispatched by the Texture Manager when a texture it requested to load failed.
  133030. * This only happens when base64 encoded textures fail. All other texture types are loaded via the Loader Plugin.
  133031. *
  133032. * Listen to this event from within a Scene using: `this.textures.on('onerror', listener)`.
  133033. *
  133034. * @event Phaser.Textures.Events#ERROR
  133035. *
  133036. * @param {string} key - The key of the Texture that failed to load into the Texture Manager.
  133037. */
  133038. module.exports = 'onerror';
  133039. /***/ }),
  133040. /* 1049 */
  133041. /***/ (function(module, exports) {
  133042. /**
  133043. * @author Richard Davey <rich@photonstorm.com>
  133044. * @copyright 2019 Photon Storm Ltd.
  133045. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133046. */
  133047. /**
  133048. * The Texture Add Event.
  133049. *
  133050. * This event is dispatched by the Texture Manager when a texture is added to it.
  133051. *
  133052. * Listen to this event from within a Scene using: `this.textures.on('addtexture', listener)`.
  133053. *
  133054. * @event Phaser.Textures.Events#ADD
  133055. *
  133056. * @param {string} key - The key of the Texture that was added to the Texture Manager.
  133057. * @param {Phaser.Textures.Texture} texture - A reference to the Texture that was added to the Texture Manager.
  133058. */
  133059. module.exports = 'addtexture';
  133060. /***/ }),
  133061. /* 1050 */
  133062. /***/ (function(module, exports, __webpack_require__) {
  133063. /**
  133064. * @author Richard Davey <rich@photonstorm.com>
  133065. * @copyright 2019 Photon Storm Ltd.
  133066. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133067. */
  133068. var Vector3 = __webpack_require__(182);
  133069. var Matrix4 = __webpack_require__(369);
  133070. var Quaternion = __webpack_require__(368);
  133071. var tmpMat4 = new Matrix4();
  133072. var tmpQuat = new Quaternion();
  133073. var tmpVec3 = new Vector3();
  133074. /**
  133075. * Rotates a vector in place by axis angle.
  133076. *
  133077. * This is the same as transforming a point by an
  133078. * axis-angle quaternion, but it has higher precision.
  133079. *
  133080. * @function Phaser.Math.RotateVec3
  133081. * @since 3.0.0
  133082. *
  133083. * @param {Phaser.Math.Vector3} vec - The vector to be rotated.
  133084. * @param {Phaser.Math.Vector3} axis - The axis to rotate around.
  133085. * @param {number} radians - The angle of rotation in radians.
  133086. *
  133087. * @return {Phaser.Math.Vector3} The given vector.
  133088. */
  133089. var RotateVec3 = function (vec, axis, radians)
  133090. {
  133091. // Set the quaternion to our axis angle
  133092. tmpQuat.setAxisAngle(axis, radians);
  133093. // Create a rotation matrix from the axis angle
  133094. tmpMat4.fromRotationTranslation(tmpQuat, tmpVec3.set(0, 0, 0));
  133095. // Multiply our vector by the rotation matrix
  133096. return vec.transformMat4(tmpMat4);
  133097. };
  133098. module.exports = RotateVec3;
  133099. /***/ }),
  133100. /* 1051 */
  133101. /***/ (function(module, exports, __webpack_require__) {
  133102. /**
  133103. * @author Richard Davey <rich@photonstorm.com>
  133104. * @copyright 2019 Photon Storm Ltd.
  133105. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133106. */
  133107. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  133108. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  133109. var Class = __webpack_require__(0);
  133110. /**
  133111. * @classdesc
  133112. * A representation of a vector in 4D space.
  133113. *
  133114. * A four-component vector.
  133115. *
  133116. * @class Vector4
  133117. * @memberof Phaser.Math
  133118. * @constructor
  133119. * @since 3.0.0
  133120. *
  133121. * @param {number} [x] - The x component.
  133122. * @param {number} [y] - The y component.
  133123. * @param {number} [z] - The z component.
  133124. * @param {number} [w] - The w component.
  133125. */
  133126. var Vector4 = new Class({
  133127. initialize:
  133128. function Vector4 (x, y, z, w)
  133129. {
  133130. /**
  133131. * The x component of this Vector.
  133132. *
  133133. * @name Phaser.Math.Vector4#x
  133134. * @type {number}
  133135. * @default 0
  133136. * @since 3.0.0
  133137. */
  133138. this.x = 0;
  133139. /**
  133140. * The y component of this Vector.
  133141. *
  133142. * @name Phaser.Math.Vector4#y
  133143. * @type {number}
  133144. * @default 0
  133145. * @since 3.0.0
  133146. */
  133147. this.y = 0;
  133148. /**
  133149. * The z component of this Vector.
  133150. *
  133151. * @name Phaser.Math.Vector4#z
  133152. * @type {number}
  133153. * @default 0
  133154. * @since 3.0.0
  133155. */
  133156. this.z = 0;
  133157. /**
  133158. * The w component of this Vector.
  133159. *
  133160. * @name Phaser.Math.Vector4#w
  133161. * @type {number}
  133162. * @default 0
  133163. * @since 3.0.0
  133164. */
  133165. this.w = 0;
  133166. if (typeof x === 'object')
  133167. {
  133168. this.x = x.x || 0;
  133169. this.y = x.y || 0;
  133170. this.z = x.z || 0;
  133171. this.w = x.w || 0;
  133172. }
  133173. else
  133174. {
  133175. this.x = x || 0;
  133176. this.y = y || 0;
  133177. this.z = z || 0;
  133178. this.w = w || 0;
  133179. }
  133180. },
  133181. /**
  133182. * Make a clone of this Vector4.
  133183. *
  133184. * @method Phaser.Math.Vector4#clone
  133185. * @since 3.0.0
  133186. *
  133187. * @return {Phaser.Math.Vector4} A clone of this Vector4.
  133188. */
  133189. clone: function ()
  133190. {
  133191. return new Vector4(this.x, this.y, this.z, this.w);
  133192. },
  133193. /**
  133194. * Copy the components of a given Vector into this Vector.
  133195. *
  133196. * @method Phaser.Math.Vector4#copy
  133197. * @since 3.0.0
  133198. *
  133199. * @param {Phaser.Math.Vector4} src - The Vector to copy the components from.
  133200. *
  133201. * @return {Phaser.Math.Vector4} This Vector4.
  133202. */
  133203. copy: function (src)
  133204. {
  133205. this.x = src.x;
  133206. this.y = src.y;
  133207. this.z = src.z || 0;
  133208. this.w = src.w || 0;
  133209. return this;
  133210. },
  133211. /**
  133212. * Check whether this Vector is equal to a given Vector.
  133213. *
  133214. * Performs a strict quality check against each Vector's components.
  133215. *
  133216. * @method Phaser.Math.Vector4#equals
  133217. * @since 3.0.0
  133218. *
  133219. * @param {Phaser.Math.Vector4} v - The vector to check equality with.
  133220. *
  133221. * @return {boolean} A boolean indicating whether the two Vectors are equal or not.
  133222. */
  133223. equals: function (v)
  133224. {
  133225. return ((this.x === v.x) && (this.y === v.y) && (this.z === v.z) && (this.w === v.w));
  133226. },
  133227. /**
  133228. * Set the `x`, `y`, `z` and `w` components of the this Vector to the given `x`, `y`, `z` and `w` values.
  133229. *
  133230. * @method Phaser.Math.Vector4#set
  133231. * @since 3.0.0
  133232. *
  133233. * @param {(number|object)} x - The x value to set for this Vector, or an object containing x, y, z and w components.
  133234. * @param {number} y - The y value to set for this Vector.
  133235. * @param {number} z - The z value to set for this Vector.
  133236. * @param {number} w - The z value to set for this Vector.
  133237. *
  133238. * @return {Phaser.Math.Vector4} This Vector4.
  133239. */
  133240. set: function (x, y, z, w)
  133241. {
  133242. if (typeof x === 'object')
  133243. {
  133244. this.x = x.x || 0;
  133245. this.y = x.y || 0;
  133246. this.z = x.z || 0;
  133247. this.w = x.w || 0;
  133248. }
  133249. else
  133250. {
  133251. this.x = x || 0;
  133252. this.y = y || 0;
  133253. this.z = z || 0;
  133254. this.w = w || 0;
  133255. }
  133256. return this;
  133257. },
  133258. /**
  133259. * Add a given Vector to this Vector. Addition is component-wise.
  133260. *
  133261. * @method Phaser.Math.Vector4#add
  133262. * @since 3.0.0
  133263. *
  133264. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to add to this Vector.
  133265. *
  133266. * @return {Phaser.Math.Vector4} This Vector4.
  133267. */
  133268. add: function (v)
  133269. {
  133270. this.x += v.x;
  133271. this.y += v.y;
  133272. this.z += v.z || 0;
  133273. this.w += v.w || 0;
  133274. return this;
  133275. },
  133276. /**
  133277. * Subtract the given Vector from this Vector. Subtraction is component-wise.
  133278. *
  133279. * @method Phaser.Math.Vector4#subtract
  133280. * @since 3.0.0
  133281. *
  133282. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to subtract from this Vector.
  133283. *
  133284. * @return {Phaser.Math.Vector4} This Vector4.
  133285. */
  133286. subtract: function (v)
  133287. {
  133288. this.x -= v.x;
  133289. this.y -= v.y;
  133290. this.z -= v.z || 0;
  133291. this.w -= v.w || 0;
  133292. return this;
  133293. },
  133294. /**
  133295. * Scale this Vector by the given value.
  133296. *
  133297. * @method Phaser.Math.Vector4#scale
  133298. * @since 3.0.0
  133299. *
  133300. * @param {number} scale - The value to scale this Vector by.
  133301. *
  133302. * @return {Phaser.Math.Vector4} This Vector4.
  133303. */
  133304. scale: function (scale)
  133305. {
  133306. this.x *= scale;
  133307. this.y *= scale;
  133308. this.z *= scale;
  133309. this.w *= scale;
  133310. return this;
  133311. },
  133312. /**
  133313. * Calculate the length (or magnitude) of this Vector.
  133314. *
  133315. * @method Phaser.Math.Vector4#length
  133316. * @since 3.0.0
  133317. *
  133318. * @return {number} The length of this Vector.
  133319. */
  133320. length: function ()
  133321. {
  133322. var x = this.x;
  133323. var y = this.y;
  133324. var z = this.z;
  133325. var w = this.w;
  133326. return Math.sqrt(x * x + y * y + z * z + w * w);
  133327. },
  133328. /**
  133329. * Calculate the length of this Vector squared.
  133330. *
  133331. * @method Phaser.Math.Vector4#lengthSq
  133332. * @since 3.0.0
  133333. *
  133334. * @return {number} The length of this Vector, squared.
  133335. */
  133336. lengthSq: function ()
  133337. {
  133338. var x = this.x;
  133339. var y = this.y;
  133340. var z = this.z;
  133341. var w = this.w;
  133342. return x * x + y * y + z * z + w * w;
  133343. },
  133344. /**
  133345. * Normalize this Vector.
  133346. *
  133347. * Makes the vector a unit length vector (magnitude of 1) in the same direction.
  133348. *
  133349. * @method Phaser.Math.Vector4#normalize
  133350. * @since 3.0.0
  133351. *
  133352. * @return {Phaser.Math.Vector4} This Vector4.
  133353. */
  133354. normalize: function ()
  133355. {
  133356. var x = this.x;
  133357. var y = this.y;
  133358. var z = this.z;
  133359. var w = this.w;
  133360. var len = x * x + y * y + z * z + w * w;
  133361. if (len > 0)
  133362. {
  133363. len = 1 / Math.sqrt(len);
  133364. this.x = x * len;
  133365. this.y = y * len;
  133366. this.z = z * len;
  133367. this.w = w * len;
  133368. }
  133369. return this;
  133370. },
  133371. /**
  133372. * Calculate the dot product of this Vector and the given Vector.
  133373. *
  133374. * @method Phaser.Math.Vector4#dot
  133375. * @since 3.0.0
  133376. *
  133377. * @param {Phaser.Math.Vector4} v - The Vector4 to dot product with this Vector4.
  133378. *
  133379. * @return {number} The dot product of this Vector and the given Vector.
  133380. */
  133381. dot: function (v)
  133382. {
  133383. return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
  133384. },
  133385. /**
  133386. * Linearly interpolate between this Vector and the given Vector.
  133387. *
  133388. * Interpolates this Vector towards the given Vector.
  133389. *
  133390. * @method Phaser.Math.Vector4#lerp
  133391. * @since 3.0.0
  133392. *
  133393. * @param {Phaser.Math.Vector4} v - The Vector4 to interpolate towards.
  133394. * @param {number} [t=0] - The interpolation percentage, between 0 and 1.
  133395. *
  133396. * @return {Phaser.Math.Vector4} This Vector4.
  133397. */
  133398. lerp: function (v, t)
  133399. {
  133400. if (t === undefined) { t = 0; }
  133401. var ax = this.x;
  133402. var ay = this.y;
  133403. var az = this.z;
  133404. var aw = this.w;
  133405. this.x = ax + t * (v.x - ax);
  133406. this.y = ay + t * (v.y - ay);
  133407. this.z = az + t * (v.z - az);
  133408. this.w = aw + t * (v.w - aw);
  133409. return this;
  133410. },
  133411. /**
  133412. * Perform a component-wise multiplication between this Vector and the given Vector.
  133413. *
  133414. * Multiplies this Vector by the given Vector.
  133415. *
  133416. * @method Phaser.Math.Vector4#multiply
  133417. * @since 3.0.0
  133418. *
  133419. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to multiply this Vector by.
  133420. *
  133421. * @return {Phaser.Math.Vector4} This Vector4.
  133422. */
  133423. multiply: function (v)
  133424. {
  133425. this.x *= v.x;
  133426. this.y *= v.y;
  133427. this.z *= v.z || 1;
  133428. this.w *= v.w || 1;
  133429. return this;
  133430. },
  133431. /**
  133432. * Perform a component-wise division between this Vector and the given Vector.
  133433. *
  133434. * Divides this Vector by the given Vector.
  133435. *
  133436. * @method Phaser.Math.Vector4#divide
  133437. * @since 3.0.0
  133438. *
  133439. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to divide this Vector by.
  133440. *
  133441. * @return {Phaser.Math.Vector4} This Vector4.
  133442. */
  133443. divide: function (v)
  133444. {
  133445. this.x /= v.x;
  133446. this.y /= v.y;
  133447. this.z /= v.z || 1;
  133448. this.w /= v.w || 1;
  133449. return this;
  133450. },
  133451. /**
  133452. * Calculate the distance between this Vector and the given Vector.
  133453. *
  133454. * @method Phaser.Math.Vector4#distance
  133455. * @since 3.0.0
  133456. *
  133457. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to calculate the distance to.
  133458. *
  133459. * @return {number} The distance from this Vector to the given Vector.
  133460. */
  133461. distance: function (v)
  133462. {
  133463. var dx = v.x - this.x;
  133464. var dy = v.y - this.y;
  133465. var dz = v.z - this.z || 0;
  133466. var dw = v.w - this.w || 0;
  133467. return Math.sqrt(dx * dx + dy * dy + dz * dz + dw * dw);
  133468. },
  133469. /**
  133470. * Calculate the distance between this Vector and the given Vector, squared.
  133471. *
  133472. * @method Phaser.Math.Vector4#distanceSq
  133473. * @since 3.0.0
  133474. *
  133475. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to calculate the distance to.
  133476. *
  133477. * @return {number} The distance from this Vector to the given Vector, squared.
  133478. */
  133479. distanceSq: function (v)
  133480. {
  133481. var dx = v.x - this.x;
  133482. var dy = v.y - this.y;
  133483. var dz = v.z - this.z || 0;
  133484. var dw = v.w - this.w || 0;
  133485. return dx * dx + dy * dy + dz * dz + dw * dw;
  133486. },
  133487. /**
  133488. * Negate the `x`, `y`, `z` and `w` components of this Vector.
  133489. *
  133490. * @method Phaser.Math.Vector4#negate
  133491. * @since 3.0.0
  133492. *
  133493. * @return {Phaser.Math.Vector4} This Vector4.
  133494. */
  133495. negate: function ()
  133496. {
  133497. this.x = -this.x;
  133498. this.y = -this.y;
  133499. this.z = -this.z;
  133500. this.w = -this.w;
  133501. return this;
  133502. },
  133503. /**
  133504. * Transform this Vector with the given Matrix.
  133505. *
  133506. * @method Phaser.Math.Vector4#transformMat4
  133507. * @since 3.0.0
  133508. *
  133509. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to transform this Vector4 with.
  133510. *
  133511. * @return {Phaser.Math.Vector4} This Vector4.
  133512. */
  133513. transformMat4: function (mat)
  133514. {
  133515. var x = this.x;
  133516. var y = this.y;
  133517. var z = this.z;
  133518. var w = this.w;
  133519. var m = mat.val;
  133520. this.x = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
  133521. this.y = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
  133522. this.z = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
  133523. this.w = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
  133524. return this;
  133525. },
  133526. /**
  133527. * Transform this Vector with the given Quaternion.
  133528. *
  133529. * @method Phaser.Math.Vector4#transformQuat
  133530. * @since 3.0.0
  133531. *
  133532. * @param {Phaser.Math.Quaternion} q - The Quaternion to transform this Vector with.
  133533. *
  133534. * @return {Phaser.Math.Vector4} This Vector4.
  133535. */
  133536. transformQuat: function (q)
  133537. {
  133538. // TODO: is this really the same as Vector3?
  133539. // Also, what about this: http://molecularmusings.wordpress.com/2013/05/24/a-faster-quaternion-vector-multiplication/
  133540. // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations
  133541. var x = this.x;
  133542. var y = this.y;
  133543. var z = this.z;
  133544. var qx = q.x;
  133545. var qy = q.y;
  133546. var qz = q.z;
  133547. var qw = q.w;
  133548. // calculate quat * vec
  133549. var ix = qw * x + qy * z - qz * y;
  133550. var iy = qw * y + qz * x - qx * z;
  133551. var iz = qw * z + qx * y - qy * x;
  133552. var iw = -qx * x - qy * y - qz * z;
  133553. // calculate result * inverse quat
  133554. this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
  133555. this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
  133556. this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
  133557. return this;
  133558. },
  133559. /**
  133560. * Make this Vector the zero vector (0, 0, 0, 0).
  133561. *
  133562. * @method Phaser.Math.Vector4#reset
  133563. * @since 3.0.0
  133564. *
  133565. * @return {Phaser.Math.Vector4} This Vector4.
  133566. */
  133567. reset: function ()
  133568. {
  133569. this.x = 0;
  133570. this.y = 0;
  133571. this.z = 0;
  133572. this.w = 0;
  133573. return this;
  133574. }
  133575. });
  133576. // TODO: Check if these are required internally, if not, remove.
  133577. Vector4.prototype.sub = Vector4.prototype.subtract;
  133578. Vector4.prototype.mul = Vector4.prototype.multiply;
  133579. Vector4.prototype.div = Vector4.prototype.divide;
  133580. Vector4.prototype.dist = Vector4.prototype.distance;
  133581. Vector4.prototype.distSq = Vector4.prototype.distanceSq;
  133582. Vector4.prototype.len = Vector4.prototype.length;
  133583. Vector4.prototype.lenSq = Vector4.prototype.lengthSq;
  133584. module.exports = Vector4;
  133585. /***/ }),
  133586. /* 1052 */
  133587. /***/ (function(module, exports) {
  133588. /**
  133589. * @author Richard Davey <rich@photonstorm.com>
  133590. * @copyright 2019 Photon Storm Ltd.
  133591. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133592. */
  133593. /**
  133594. * Checks if the two values are within the given `tolerance` of each other.
  133595. *
  133596. * @function Phaser.Math.Within
  133597. * @since 3.0.0
  133598. *
  133599. * @param {number} a - The first value to use in the calculation.
  133600. * @param {number} b - The second value to use in the calculation.
  133601. * @param {number} tolerance - The tolerance. Anything equal to or less than this value is considered as being within range.
  133602. *
  133603. * @return {boolean} Returns `true` if `a` is less than or equal to the tolerance of `b`.
  133604. */
  133605. var Within = function (a, b, tolerance)
  133606. {
  133607. return (Math.abs(a - b) <= tolerance);
  133608. };
  133609. module.exports = Within;
  133610. /***/ }),
  133611. /* 1053 */
  133612. /***/ (function(module, exports) {
  133613. /**
  133614. * @author Richard Davey <rich@photonstorm.com>
  133615. * @copyright 2019 Photon Storm Ltd.
  133616. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133617. */
  133618. /**
  133619. * @typedef {object} SinCosTable
  133620. *
  133621. * @property {number} sin - The sine value.
  133622. * @property {number} cos - The cosine value.
  133623. * @property {number} length - The length.
  133624. */
  133625. /**
  133626. * Generate a series of sine and cosine values.
  133627. *
  133628. * @function Phaser.Math.SinCosTableGenerator
  133629. * @since 3.0.0
  133630. *
  133631. * @param {number} length - The number of values to generate.
  133632. * @param {number} [sinAmp=1] - The sine value amplitude.
  133633. * @param {number} [cosAmp=1] - The cosine value amplitude.
  133634. * @param {number} [frequency=1] - The frequency of the values.
  133635. *
  133636. * @return {SinCosTable} The generated values.
  133637. */
  133638. var SinCosTableGenerator = function (length, sinAmp, cosAmp, frequency)
  133639. {
  133640. if (sinAmp === undefined) { sinAmp = 1; }
  133641. if (cosAmp === undefined) { cosAmp = 1; }
  133642. if (frequency === undefined) { frequency = 1; }
  133643. frequency *= Math.PI / length;
  133644. var cos = [];
  133645. var sin = [];
  133646. for (var c = 0; c < length; c++)
  133647. {
  133648. cosAmp -= sinAmp * frequency;
  133649. sinAmp += cosAmp * frequency;
  133650. cos[c] = cosAmp;
  133651. sin[c] = sinAmp;
  133652. }
  133653. return {
  133654. sin: sin,
  133655. cos: cos,
  133656. length: length
  133657. };
  133658. };
  133659. module.exports = SinCosTableGenerator;
  133660. /***/ }),
  133661. /* 1054 */
  133662. /***/ (function(module, exports) {
  133663. /**
  133664. * @author Richard Davey <rich@photonstorm.com>
  133665. * @copyright 2019 Photon Storm Ltd.
  133666. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133667. */
  133668. /**
  133669. * Round a value to a given decimal place.
  133670. *
  133671. * @function Phaser.Math.RoundTo
  133672. * @since 3.0.0
  133673. *
  133674. * @param {number} value - The value to round.
  133675. * @param {integer} [place=0] - The place to round to.
  133676. * @param {integer} [base=10] - The base to round in. Default is 10 for decimal.
  133677. *
  133678. * @return {number} The rounded value.
  133679. */
  133680. var RoundTo = function (value, place, base)
  133681. {
  133682. if (place === undefined) { place = 0; }
  133683. if (base === undefined) { base = 10; }
  133684. var p = Math.pow(base, -place);
  133685. return Math.round(value * p) / p;
  133686. };
  133687. module.exports = RoundTo;
  133688. /***/ }),
  133689. /* 1055 */
  133690. /***/ (function(module, exports) {
  133691. /**
  133692. * @author Richard Davey <rich@photonstorm.com>
  133693. * @copyright 2019 Photon Storm Ltd.
  133694. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133695. */
  133696. /**
  133697. * Compute a random four-dimensional vector.
  133698. *
  133699. * @function Phaser.Math.RandomXYZW
  133700. * @since 3.0.0
  133701. *
  133702. * @param {Phaser.Math.Vector4} vec4 - The Vector to compute random values for.
  133703. * @param {number} [scale=1] - The scale of the random values.
  133704. *
  133705. * @return {Phaser.Math.Vector4} The given Vector.
  133706. */
  133707. var RandomXYZW = function (vec4, scale)
  133708. {
  133709. if (scale === undefined) { scale = 1; }
  133710. // TODO: Not spherical; should fix this for more uniform distribution
  133711. vec4.x = (Math.random() * 2 - 1) * scale;
  133712. vec4.y = (Math.random() * 2 - 1) * scale;
  133713. vec4.z = (Math.random() * 2 - 1) * scale;
  133714. vec4.w = (Math.random() * 2 - 1) * scale;
  133715. return vec4;
  133716. };
  133717. module.exports = RandomXYZW;
  133718. /***/ }),
  133719. /* 1056 */
  133720. /***/ (function(module, exports) {
  133721. /**
  133722. * @author Richard Davey <rich@photonstorm.com>
  133723. * @copyright 2019 Photon Storm Ltd.
  133724. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133725. */
  133726. /**
  133727. * Compute a random position vector in a spherical area, optionally defined by the given radius.
  133728. *
  133729. * @function Phaser.Math.RandomXYZ
  133730. * @since 3.0.0
  133731. *
  133732. * @param {Phaser.Math.Vector3} vec3 - The Vector to compute random values for.
  133733. * @param {number} [radius=1] - The radius.
  133734. *
  133735. * @return {Phaser.Math.Vector3} The given Vector.
  133736. */
  133737. var RandomXYZ = function (vec3, radius)
  133738. {
  133739. if (radius === undefined) { radius = 1; }
  133740. var r = Math.random() * 2 * Math.PI;
  133741. var z = (Math.random() * 2) - 1;
  133742. var zScale = Math.sqrt(1 - z * z) * radius;
  133743. vec3.x = Math.cos(r) * zScale;
  133744. vec3.y = Math.sin(r) * zScale;
  133745. vec3.z = z * radius;
  133746. return vec3;
  133747. };
  133748. module.exports = RandomXYZ;
  133749. /***/ }),
  133750. /* 1057 */
  133751. /***/ (function(module, exports) {
  133752. /**
  133753. * @author Richard Davey <rich@photonstorm.com>
  133754. * @copyright 2019 Photon Storm Ltd.
  133755. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133756. */
  133757. /**
  133758. * Compute a random unit vector.
  133759. *
  133760. * Computes random values for the given vector between -1 and 1 that can be used to represent a direction.
  133761. *
  133762. * Optionally accepts a scale value to scale the resulting vector by.
  133763. *
  133764. * @function Phaser.Math.RandomXY
  133765. * @since 3.0.0
  133766. *
  133767. * @param {Phaser.Math.Vector2} vector - The Vector to compute random values for.
  133768. * @param {number} [scale=1] - The scale of the random values.
  133769. *
  133770. * @return {Phaser.Math.Vector2} The given Vector.
  133771. */
  133772. var RandomXY = function (vector, scale)
  133773. {
  133774. if (scale === undefined) { scale = 1; }
  133775. var r = Math.random() * 2 * Math.PI;
  133776. vector.x = Math.cos(r) * scale;
  133777. vector.y = Math.sin(r) * scale;
  133778. return vector;
  133779. };
  133780. module.exports = RandomXY;
  133781. /***/ }),
  133782. /* 1058 */
  133783. /***/ (function(module, exports) {
  133784. /**
  133785. * @author Richard Davey <rich@photonstorm.com>
  133786. * @copyright 2019 Photon Storm Ltd.
  133787. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133788. */
  133789. /**
  133790. * Work out what percentage `value` is of the range between `min` and `max`.
  133791. * If `max` isn't given then it will return the percentage of `value` to `min`.
  133792. *
  133793. * You can optionally specify an `upperMax` value, which is a mid-way point in the range that represents 100%, after which the % starts to go down to zero again.
  133794. *
  133795. * @function Phaser.Math.Percent
  133796. * @since 3.0.0
  133797. *
  133798. * @param {number} value - The value to determine the percentage of.
  133799. * @param {number} min - The minimum value.
  133800. * @param {number} [max] - The maximum value.
  133801. * @param {number} [upperMax] - The mid-way point in the range that represents 100%.
  133802. *
  133803. * @return {number} A value between 0 and 1 representing the percentage.
  133804. */
  133805. var Percent = function (value, min, max, upperMax)
  133806. {
  133807. if (max === undefined) { max = min + 1; }
  133808. var percentage = (value - min) / (max - min);
  133809. if (percentage > 1)
  133810. {
  133811. if (upperMax !== undefined)
  133812. {
  133813. percentage = ((upperMax - value)) / (upperMax - max);
  133814. if (percentage < 0)
  133815. {
  133816. percentage = 0;
  133817. }
  133818. }
  133819. else
  133820. {
  133821. percentage = 1;
  133822. }
  133823. }
  133824. else if (percentage < 0)
  133825. {
  133826. percentage = 0;
  133827. }
  133828. return percentage;
  133829. };
  133830. module.exports = Percent;
  133831. /***/ }),
  133832. /* 1059 */
  133833. /***/ (function(module, exports) {
  133834. /**
  133835. * @author Richard Davey <rich@photonstorm.com>
  133836. * @copyright 2019 Photon Storm Ltd.
  133837. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133838. */
  133839. /**
  133840. * Subtract an `amount` from `value`, limiting the minimum result to `min`.
  133841. *
  133842. * @function Phaser.Math.MinSub
  133843. * @since 3.0.0
  133844. *
  133845. * @param {number} value - The value to subtract from.
  133846. * @param {number} amount - The amount to subtract.
  133847. * @param {number} min - The minimum value to return.
  133848. *
  133849. * @return {number} The resulting value.
  133850. */
  133851. var MinSub = function (value, amount, min)
  133852. {
  133853. return Math.max(value - amount, min);
  133854. };
  133855. module.exports = MinSub;
  133856. /***/ }),
  133857. /* 1060 */
  133858. /***/ (function(module, exports) {
  133859. /**
  133860. * @author Richard Davey <rich@photonstorm.com>
  133861. * @copyright 2019 Photon Storm Ltd.
  133862. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133863. */
  133864. /**
  133865. * Add an `amount` to a `value`, limiting the maximum result to `max`.
  133866. *
  133867. * @function Phaser.Math.MaxAdd
  133868. * @since 3.0.0
  133869. *
  133870. * @param {number} value - The value to add to.
  133871. * @param {number} amount - The amount to add.
  133872. * @param {number} max - The maximum value to return.
  133873. *
  133874. * @return {number} The resulting value.
  133875. */
  133876. var MaxAdd = function (value, amount, max)
  133877. {
  133878. return Math.min(value + amount, max);
  133879. };
  133880. module.exports = MaxAdd;
  133881. /***/ }),
  133882. /* 1061 */
  133883. /***/ (function(module, exports) {
  133884. /**
  133885. * @author Richard Davey <rich@photonstorm.com>
  133886. * @copyright 2019 Photon Storm Ltd.
  133887. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133888. */
  133889. /**
  133890. * Check if a given value is an even number using a strict type check.
  133891. *
  133892. * @function Phaser.Math.IsEvenStrict
  133893. * @since 3.0.0
  133894. *
  133895. * @param {number} value - The number to perform the check with.
  133896. *
  133897. * @return {boolean} Whether the number is even or not.
  133898. */
  133899. var IsEvenStrict = function (value)
  133900. {
  133901. // Use strict equality === for "is number" test
  133902. return (value === parseFloat(value)) ? !(value % 2) : void 0;
  133903. };
  133904. module.exports = IsEvenStrict;
  133905. /***/ }),
  133906. /* 1062 */
  133907. /***/ (function(module, exports) {
  133908. /**
  133909. * @author Richard Davey <rich@photonstorm.com>
  133910. * @copyright 2019 Photon Storm Ltd.
  133911. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133912. */
  133913. /**
  133914. * Check if a given value is an even number.
  133915. *
  133916. * @function Phaser.Math.IsEven
  133917. * @since 3.0.0
  133918. *
  133919. * @param {number} value - The number to perform the check with.
  133920. *
  133921. * @return {boolean} Whether the number is even or not.
  133922. */
  133923. var IsEven = function (value)
  133924. {
  133925. // Use abstract equality == for "is number" test
  133926. // eslint-disable-next-line eqeqeq
  133927. return (value == parseFloat(value)) ? !(value % 2) : void 0;
  133928. };
  133929. module.exports = IsEven;
  133930. /***/ }),
  133931. /* 1063 */
  133932. /***/ (function(module, exports) {
  133933. /**
  133934. * @author Richard Davey <rich@photonstorm.com>
  133935. * @copyright 2019 Photon Storm Ltd.
  133936. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133937. */
  133938. /**
  133939. * Calculate the speed required to cover a distance in the time given.
  133940. *
  133941. * @function Phaser.Math.GetSpeed
  133942. * @since 3.0.0
  133943. *
  133944. * @param {number} distance - The distance to travel in pixels.
  133945. * @param {integer} time - The time, in ms, to cover the distance in.
  133946. *
  133947. * @return {number} The amount you will need to increment the position by each step in order to cover the distance in the time given.
  133948. */
  133949. var GetSpeed = function (distance, time)
  133950. {
  133951. return (distance / time) / 1000;
  133952. };
  133953. module.exports = GetSpeed;
  133954. /***/ }),
  133955. /* 1064 */
  133956. /***/ (function(module, exports) {
  133957. /**
  133958. * @author Richard Davey <rich@photonstorm.com>
  133959. * @copyright 2019 Photon Storm Ltd.
  133960. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133961. */
  133962. /**
  133963. * Floors to some place comparative to a `base`, default is 10 for decimal place.
  133964. *
  133965. * The `place` is represented by the power applied to `base` to get that place.
  133966. *
  133967. * @function Phaser.Math.FloorTo
  133968. * @since 3.0.0
  133969. *
  133970. * @param {number} value - The value to round.
  133971. * @param {integer} [place=0] - The place to round to.
  133972. * @param {integer} [base=10] - The base to round in. Default is 10 for decimal.
  133973. *
  133974. * @return {number} The rounded value.
  133975. */
  133976. var FloorTo = function (value, place, base)
  133977. {
  133978. if (place === undefined) { place = 0; }
  133979. if (base === undefined) { base = 10; }
  133980. var p = Math.pow(base, -place);
  133981. return Math.floor(value * p) / p;
  133982. };
  133983. module.exports = FloorTo;
  133984. /***/ }),
  133985. /* 1065 */
  133986. /***/ (function(module, exports) {
  133987. /**
  133988. * @author Richard Davey <rich@photonstorm.com>
  133989. * @copyright 2019 Photon Storm Ltd.
  133990. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133991. */
  133992. /**
  133993. * Calculates the positive difference of two given numbers.
  133994. *
  133995. * @function Phaser.Math.Difference
  133996. * @since 3.0.0
  133997. *
  133998. * @param {number} a - The first number in the calculation.
  133999. * @param {number} b - The second number in the calculation.
  134000. *
  134001. * @return {number} The positive difference of the two given numbers.
  134002. */
  134003. var Difference = function (a, b)
  134004. {
  134005. return Math.abs(a - b);
  134006. };
  134007. module.exports = Difference;
  134008. /***/ }),
  134009. /* 1066 */
  134010. /***/ (function(module, exports) {
  134011. /**
  134012. * @author Richard Davey <rich@photonstorm.com>
  134013. * @copyright 2019 Photon Storm Ltd.
  134014. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134015. */
  134016. /**
  134017. * Ceils to some place comparative to a `base`, default is 10 for decimal place.
  134018. *
  134019. * The `place` is represented by the power applied to `base` to get that place.
  134020. *
  134021. * @function Phaser.Math.CeilTo
  134022. * @since 3.0.0
  134023. *
  134024. * @param {number} value - The value to round.
  134025. * @param {number} [place=0] - The place to round to.
  134026. * @param {integer} [base=10] - The base to round in. Default is 10 for decimal.
  134027. *
  134028. * @return {number} The rounded value.
  134029. */
  134030. var CeilTo = function (value, place, base)
  134031. {
  134032. if (place === undefined) { place = 0; }
  134033. if (base === undefined) { base = 10; }
  134034. var p = Math.pow(base, -place);
  134035. return Math.ceil(value * p) / p;
  134036. };
  134037. module.exports = CeilTo;
  134038. /***/ }),
  134039. /* 1067 */
  134040. /***/ (function(module, exports) {
  134041. /**
  134042. * @author Richard Davey <rich@photonstorm.com>
  134043. * @copyright 2019 Photon Storm Ltd.
  134044. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134045. */
  134046. /**
  134047. * Calculate the mean average of the given values.
  134048. *
  134049. * @function Phaser.Math.Average
  134050. * @since 3.0.0
  134051. *
  134052. * @param {number[]} values - The values to average.
  134053. *
  134054. * @return {number} The average value.
  134055. */
  134056. var Average = function (values)
  134057. {
  134058. var sum = 0;
  134059. for (var i = 0; i < values.length; i++)
  134060. {
  134061. sum += (+values[i]);
  134062. }
  134063. return sum / values.length;
  134064. };
  134065. module.exports = Average;
  134066. /***/ }),
  134067. /* 1068 */
  134068. /***/ (function(module, exports, __webpack_require__) {
  134069. /**
  134070. * @author Richard Davey <rich@photonstorm.com>
  134071. * @copyright 2019 Photon Storm Ltd.
  134072. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134073. */
  134074. var Class = __webpack_require__(0);
  134075. /**
  134076. * @classdesc
  134077. * A seeded Random Data Generator.
  134078. *
  134079. * Access via `Phaser.Math.RND` which is an instance of this class pre-defined
  134080. * by Phaser. Or, create your own instance to use as you require.
  134081. *
  134082. * The `Math.RND` generator is seeded by the Game Config property value `seed`.
  134083. * If no such config property exists, a random number is used.
  134084. *
  134085. * If you create your own instance of this class you should provide a seed for it.
  134086. * If no seed is given it will use a 'random' one based on Date.now.
  134087. *
  134088. * @class RandomDataGenerator
  134089. * @memberof Phaser.Math
  134090. * @constructor
  134091. * @since 3.0.0
  134092. *
  134093. * @param {(string|string[])} [seeds] - The seeds to use for the random number generator.
  134094. */
  134095. var RandomDataGenerator = new Class({
  134096. initialize:
  134097. function RandomDataGenerator (seeds)
  134098. {
  134099. if (seeds === undefined) { seeds = [ (Date.now() * Math.random()).toString() ]; }
  134100. /**
  134101. * Internal var.
  134102. *
  134103. * @name Phaser.Math.RandomDataGenerator#c
  134104. * @type {number}
  134105. * @default 1
  134106. * @private
  134107. * @since 3.0.0
  134108. */
  134109. this.c = 1;
  134110. /**
  134111. * Internal var.
  134112. *
  134113. * @name Phaser.Math.RandomDataGenerator#s0
  134114. * @type {number}
  134115. * @default 0
  134116. * @private
  134117. * @since 3.0.0
  134118. */
  134119. this.s0 = 0;
  134120. /**
  134121. * Internal var.
  134122. *
  134123. * @name Phaser.Math.RandomDataGenerator#s1
  134124. * @type {number}
  134125. * @default 0
  134126. * @private
  134127. * @since 3.0.0
  134128. */
  134129. this.s1 = 0;
  134130. /**
  134131. * Internal var.
  134132. *
  134133. * @name Phaser.Math.RandomDataGenerator#s2
  134134. * @type {number}
  134135. * @default 0
  134136. * @private
  134137. * @since 3.0.0
  134138. */
  134139. this.s2 = 0;
  134140. /**
  134141. * Internal var.
  134142. *
  134143. * @name Phaser.Math.RandomDataGenerator#n
  134144. * @type {number}
  134145. * @default 0
  134146. * @private
  134147. * @since 3.2.0
  134148. */
  134149. this.n = 0;
  134150. /**
  134151. * Signs to choose from.
  134152. *
  134153. * @name Phaser.Math.RandomDataGenerator#signs
  134154. * @type {number[]}
  134155. * @since 3.0.0
  134156. */
  134157. this.signs = [ -1, 1 ];
  134158. if (seeds)
  134159. {
  134160. this.init(seeds);
  134161. }
  134162. },
  134163. /**
  134164. * Private random helper.
  134165. *
  134166. * @method Phaser.Math.RandomDataGenerator#rnd
  134167. * @since 3.0.0
  134168. * @private
  134169. *
  134170. * @return {number} A random number.
  134171. */
  134172. rnd: function ()
  134173. {
  134174. var t = 2091639 * this.s0 + this.c * 2.3283064365386963e-10; // 2^-32
  134175. this.c = t | 0;
  134176. this.s0 = this.s1;
  134177. this.s1 = this.s2;
  134178. this.s2 = t - this.c;
  134179. return this.s2;
  134180. },
  134181. /**
  134182. * Internal method that creates a seed hash.
  134183. *
  134184. * @method Phaser.Math.RandomDataGenerator#hash
  134185. * @since 3.0.0
  134186. * @private
  134187. *
  134188. * @param {string} data - The value to hash.
  134189. *
  134190. * @return {number} The hashed value.
  134191. */
  134192. hash: function (data)
  134193. {
  134194. var h;
  134195. var n = this.n;
  134196. data = data.toString();
  134197. for (var i = 0; i < data.length; i++)
  134198. {
  134199. n += data.charCodeAt(i);
  134200. h = 0.02519603282416938 * n;
  134201. n = h >>> 0;
  134202. h -= n;
  134203. h *= n;
  134204. n = h >>> 0;
  134205. h -= n;
  134206. n += h * 0x100000000;// 2^32
  134207. }
  134208. this.n = n;
  134209. return (n >>> 0) * 2.3283064365386963e-10;// 2^-32
  134210. },
  134211. /**
  134212. * Initialize the state of the random data generator.
  134213. *
  134214. * @method Phaser.Math.RandomDataGenerator#init
  134215. * @since 3.0.0
  134216. *
  134217. * @param {(string|string[])} seeds - The seeds to initialize the random data generator with.
  134218. */
  134219. init: function (seeds)
  134220. {
  134221. if (typeof seeds === 'string')
  134222. {
  134223. this.state(seeds);
  134224. }
  134225. else
  134226. {
  134227. this.sow(seeds);
  134228. }
  134229. },
  134230. /**
  134231. * Reset the seed of the random data generator.
  134232. *
  134233. * _Note_: the seed array is only processed up to the first `undefined` (or `null`) value, should such be present.
  134234. *
  134235. * @method Phaser.Math.RandomDataGenerator#sow
  134236. * @since 3.0.0
  134237. *
  134238. * @param {string[]} seeds - The array of seeds: the `toString()` of each value is used.
  134239. */
  134240. sow: function (seeds)
  134241. {
  134242. // Always reset to default seed
  134243. this.n = 0xefc8249d;
  134244. this.s0 = this.hash(' ');
  134245. this.s1 = this.hash(' ');
  134246. this.s2 = this.hash(' ');
  134247. this.c = 1;
  134248. if (!seeds)
  134249. {
  134250. return;
  134251. }
  134252. // Apply any seeds
  134253. for (var i = 0; i < seeds.length && (seeds[i] != null); i++)
  134254. {
  134255. var seed = seeds[i];
  134256. this.s0 -= this.hash(seed);
  134257. this.s0 += ~~(this.s0 < 0);
  134258. this.s1 -= this.hash(seed);
  134259. this.s1 += ~~(this.s1 < 0);
  134260. this.s2 -= this.hash(seed);
  134261. this.s2 += ~~(this.s2 < 0);
  134262. }
  134263. },
  134264. /**
  134265. * Returns a random integer between 0 and 2^32.
  134266. *
  134267. * @method Phaser.Math.RandomDataGenerator#integer
  134268. * @since 3.0.0
  134269. *
  134270. * @return {number} A random integer between 0 and 2^32.
  134271. */
  134272. integer: function ()
  134273. {
  134274. // 2^32
  134275. return this.rnd() * 0x100000000;
  134276. },
  134277. /**
  134278. * Returns a random real number between 0 and 1.
  134279. *
  134280. * @method Phaser.Math.RandomDataGenerator#frac
  134281. * @since 3.0.0
  134282. *
  134283. * @return {number} A random real number between 0 and 1.
  134284. */
  134285. frac: function ()
  134286. {
  134287. // 2^-53
  134288. return this.rnd() + (this.rnd() * 0x200000 | 0) * 1.1102230246251565e-16;
  134289. },
  134290. /**
  134291. * Returns a random real number between 0 and 2^32.
  134292. *
  134293. * @method Phaser.Math.RandomDataGenerator#real
  134294. * @since 3.0.0
  134295. *
  134296. * @return {number} A random real number between 0 and 2^32.
  134297. */
  134298. real: function ()
  134299. {
  134300. return this.integer() + this.frac();
  134301. },
  134302. /**
  134303. * Returns a random integer between and including min and max.
  134304. *
  134305. * @method Phaser.Math.RandomDataGenerator#integerInRange
  134306. * @since 3.0.0
  134307. *
  134308. * @param {number} min - The minimum value in the range.
  134309. * @param {number} max - The maximum value in the range.
  134310. *
  134311. * @return {number} A random number between min and max.
  134312. */
  134313. integerInRange: function (min, max)
  134314. {
  134315. return Math.floor(this.realInRange(0, max - min + 1) + min);
  134316. },
  134317. /**
  134318. * Returns a random integer between and including min and max.
  134319. * This method is an alias for RandomDataGenerator.integerInRange.
  134320. *
  134321. * @method Phaser.Math.RandomDataGenerator#between
  134322. * @since 3.0.0
  134323. *
  134324. * @param {number} min - The minimum value in the range.
  134325. * @param {number} max - The maximum value in the range.
  134326. *
  134327. * @return {number} A random number between min and max.
  134328. */
  134329. between: function (min, max)
  134330. {
  134331. return Math.floor(this.realInRange(0, max - min + 1) + min);
  134332. },
  134333. /**
  134334. * Returns a random real number between min and max.
  134335. *
  134336. * @method Phaser.Math.RandomDataGenerator#realInRange
  134337. * @since 3.0.0
  134338. *
  134339. * @param {number} min - The minimum value in the range.
  134340. * @param {number} max - The maximum value in the range.
  134341. *
  134342. * @return {number} A random number between min and max.
  134343. */
  134344. realInRange: function (min, max)
  134345. {
  134346. return this.frac() * (max - min) + min;
  134347. },
  134348. /**
  134349. * Returns a random real number between -1 and 1.
  134350. *
  134351. * @method Phaser.Math.RandomDataGenerator#normal
  134352. * @since 3.0.0
  134353. *
  134354. * @return {number} A random real number between -1 and 1.
  134355. */
  134356. normal: function ()
  134357. {
  134358. return 1 - (2 * this.frac());
  134359. },
  134360. /**
  134361. * Returns a valid RFC4122 version4 ID hex string from https://gist.github.com/1308368
  134362. *
  134363. * @method Phaser.Math.RandomDataGenerator#uuid
  134364. * @since 3.0.0
  134365. *
  134366. * @return {string} A valid RFC4122 version4 ID hex string
  134367. */
  134368. uuid: function ()
  134369. {
  134370. var a = '';
  134371. var b = '';
  134372. for (b = a = ''; a++ < 36; b += ~a % 5 | a * 3 & 4 ? (a ^ 15 ? 8 ^ this.frac() * (a ^ 20 ? 16 : 4) : 4).toString(16) : '-')
  134373. {
  134374. // eslint-disable-next-line no-empty
  134375. }
  134376. return b;
  134377. },
  134378. /**
  134379. * Returns a random element from within the given array.
  134380. *
  134381. * @method Phaser.Math.RandomDataGenerator#pick
  134382. * @since 3.0.0
  134383. *
  134384. * @param {array} array - The array to pick a random element from.
  134385. *
  134386. * @return {*} A random member of the array.
  134387. */
  134388. pick: function (array)
  134389. {
  134390. return array[this.integerInRange(0, array.length - 1)];
  134391. },
  134392. /**
  134393. * Returns a sign to be used with multiplication operator.
  134394. *
  134395. * @method Phaser.Math.RandomDataGenerator#sign
  134396. * @since 3.0.0
  134397. *
  134398. * @return {number} -1 or +1.
  134399. */
  134400. sign: function ()
  134401. {
  134402. return this.pick(this.signs);
  134403. },
  134404. /**
  134405. * Returns a random element from within the given array, favoring the earlier entries.
  134406. *
  134407. * @method Phaser.Math.RandomDataGenerator#weightedPick
  134408. * @since 3.0.0
  134409. *
  134410. * @param {array} array - The array to pick a random element from.
  134411. *
  134412. * @return {*} A random member of the array.
  134413. */
  134414. weightedPick: function (array)
  134415. {
  134416. return array[~~(Math.pow(this.frac(), 2) * (array.length - 1) + 0.5)];
  134417. },
  134418. /**
  134419. * Returns a random timestamp between min and max, or between the beginning of 2000 and the end of 2020 if min and max aren't specified.
  134420. *
  134421. * @method Phaser.Math.RandomDataGenerator#timestamp
  134422. * @since 3.0.0
  134423. *
  134424. * @param {number} min - The minimum value in the range.
  134425. * @param {number} max - The maximum value in the range.
  134426. *
  134427. * @return {number} A random timestamp between min and max.
  134428. */
  134429. timestamp: function (min, max)
  134430. {
  134431. return this.realInRange(min || 946684800000, max || 1577862000000);
  134432. },
  134433. /**
  134434. * Returns a random angle between -180 and 180.
  134435. *
  134436. * @method Phaser.Math.RandomDataGenerator#angle
  134437. * @since 3.0.0
  134438. *
  134439. * @return {number} A random number between -180 and 180.
  134440. */
  134441. angle: function ()
  134442. {
  134443. return this.integerInRange(-180, 180);
  134444. },
  134445. /**
  134446. * Returns a random rotation in radians, between -3.141 and 3.141
  134447. *
  134448. * @method Phaser.Math.RandomDataGenerator#rotation
  134449. * @since 3.0.0
  134450. *
  134451. * @return {number} A random number between -3.141 and 3.141
  134452. */
  134453. rotation: function ()
  134454. {
  134455. return this.realInRange(-3.1415926, 3.1415926);
  134456. },
  134457. /**
  134458. * Gets or Sets the state of the generator. This allows you to retain the values
  134459. * that the generator is using between games, i.e. in a game save file.
  134460. *
  134461. * To seed this generator with a previously saved state you can pass it as the
  134462. * `seed` value in your game config, or call this method directly after Phaser has booted.
  134463. *
  134464. * Call this method with no parameters to return the current state.
  134465. *
  134466. * If providing a state it should match the same format that this method
  134467. * returns, which is a string with a header `!rnd` followed by the `c`,
  134468. * `s0`, `s1` and `s2` values respectively, each comma-delimited.
  134469. *
  134470. * @method Phaser.Math.RandomDataGenerator#state
  134471. * @since 3.0.0
  134472. *
  134473. * @param {string} [state] - Generator state to be set.
  134474. *
  134475. * @return {string} The current state of the generator.
  134476. */
  134477. state: function (state)
  134478. {
  134479. if (typeof state === 'string' && state.match(/^!rnd/))
  134480. {
  134481. state = state.split(',');
  134482. this.c = parseFloat(state[1]);
  134483. this.s0 = parseFloat(state[2]);
  134484. this.s1 = parseFloat(state[3]);
  134485. this.s2 = parseFloat(state[4]);
  134486. }
  134487. return [ '!rnd', this.c, this.s0, this.s1, this.s2 ].join(',');
  134488. },
  134489. /**
  134490. * Shuffles the given array, using the current seed.
  134491. *
  134492. * @method Phaser.Math.RandomDataGenerator#shuffle
  134493. * @since 3.7.0
  134494. *
  134495. * @param {array} [array] - The array to be shuffled.
  134496. *
  134497. * @return {array} The shuffled array.
  134498. */
  134499. shuffle: function (array)
  134500. {
  134501. var len = array.length - 1;
  134502. for (var i = len; i > 0; i--)
  134503. {
  134504. var randomIndex = Math.floor(this.frac() * (i + 1));
  134505. var itemAtIndex = array[randomIndex];
  134506. array[randomIndex] = array[i];
  134507. array[i] = itemAtIndex;
  134508. }
  134509. return array;
  134510. }
  134511. });
  134512. module.exports = RandomDataGenerator;
  134513. /***/ }),
  134514. /* 1069 */
  134515. /***/ (function(module, exports) {
  134516. /**
  134517. * @author Richard Davey <rich@photonstorm.com>
  134518. * @copyright 2019 Photon Storm Ltd.
  134519. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134520. */
  134521. /**
  134522. * Snap a value to nearest grid slice, using rounding.
  134523. *
  134524. * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `10` whereas `14` will snap to `15`.
  134525. *
  134526. * @function Phaser.Math.Snap.To
  134527. * @since 3.0.0
  134528. *
  134529. * @param {number} value - The value to snap.
  134530. * @param {number} gap - The interval gap of the grid.
  134531. * @param {number} [start=0] - Optional starting offset for gap.
  134532. * @param {boolean} [divide=false] - If `true` it will divide the snapped value by the gap before returning.
  134533. *
  134534. * @return {number} The snapped value.
  134535. */
  134536. var SnapTo = function (value, gap, start, divide)
  134537. {
  134538. if (start === undefined) { start = 0; }
  134539. if (gap === 0)
  134540. {
  134541. return value;
  134542. }
  134543. value -= start;
  134544. value = gap * Math.round(value / gap);
  134545. return (divide) ? (start + value) / gap : start + value;
  134546. };
  134547. module.exports = SnapTo;
  134548. /***/ }),
  134549. /* 1070 */
  134550. /***/ (function(module, exports, __webpack_require__) {
  134551. /**
  134552. * @author Richard Davey <rich@photonstorm.com>
  134553. * @copyright 2019 Photon Storm Ltd.
  134554. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134555. */
  134556. /**
  134557. * @namespace Phaser.Math.Snap
  134558. */
  134559. module.exports = {
  134560. Ceil: __webpack_require__(375),
  134561. Floor: __webpack_require__(98),
  134562. To: __webpack_require__(1069)
  134563. };
  134564. /***/ }),
  134565. /* 1071 */
  134566. /***/ (function(module, exports) {
  134567. /**
  134568. * @author Richard Davey <rich@photonstorm.com>
  134569. * @copyright 2019 Photon Storm Ltd.
  134570. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134571. */
  134572. /**
  134573. * Tests the value and returns `true` if it is a power of two.
  134574. *
  134575. * @function Phaser.Math.Pow2.IsValuePowerOfTwo
  134576. * @since 3.0.0
  134577. *
  134578. * @param {number} value - The value to check if it's a power of two.
  134579. *
  134580. * @return {boolean} Returns `true` if `value` is a power of two, otherwise `false`.
  134581. */
  134582. var IsValuePowerOfTwo = function (value)
  134583. {
  134584. return (value > 0 && (value & (value - 1)) === 0);
  134585. };
  134586. module.exports = IsValuePowerOfTwo;
  134587. /***/ }),
  134588. /* 1072 */
  134589. /***/ (function(module, exports, __webpack_require__) {
  134590. /**
  134591. * @author Richard Davey <rich@photonstorm.com>
  134592. * @copyright 2019 Photon Storm Ltd.
  134593. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134594. */
  134595. /**
  134596. * @namespace Phaser.Math.Pow2
  134597. */
  134598. module.exports = {
  134599. GetNext: __webpack_require__(376),
  134600. IsSize: __webpack_require__(127),
  134601. IsValue: __webpack_require__(1071)
  134602. };
  134603. /***/ }),
  134604. /* 1073 */
  134605. /***/ (function(module, exports, __webpack_require__) {
  134606. /**
  134607. * @author Richard Davey <rich@photonstorm.com>
  134608. * @copyright 2019 Photon Storm Ltd.
  134609. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134610. */
  134611. var SmootherStep = __webpack_require__(196);
  134612. /**
  134613. * A Smoother Step interpolation method.
  134614. *
  134615. * @function Phaser.Math.Interpolation.SmootherStep
  134616. * @since 3.9.0
  134617. * @see {@link https://en.wikipedia.org/wiki/Smoothstep#Variations}
  134618. *
  134619. * @param {number} t - The percentage of interpolation, between 0 and 1.
  134620. * @param {number} min - The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'.
  134621. * @param {number} max - The maximum value, also known as the 'right edge', assumed greater than the 'left edge'.
  134622. *
  134623. * @return {number} The interpolated value.
  134624. */
  134625. var SmootherStepInterpolation = function (t, min, max)
  134626. {
  134627. return min + (max - min) * SmootherStep(t, 0, 1);
  134628. };
  134629. module.exports = SmootherStepInterpolation;
  134630. /***/ }),
  134631. /* 1074 */
  134632. /***/ (function(module, exports, __webpack_require__) {
  134633. /**
  134634. * @author Richard Davey <rich@photonstorm.com>
  134635. * @copyright 2019 Photon Storm Ltd.
  134636. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134637. */
  134638. var Linear = __webpack_require__(129);
  134639. /**
  134640. * A linear interpolation method.
  134641. *
  134642. * @function Phaser.Math.Interpolation.Linear
  134643. * @since 3.0.0
  134644. * @see {@link https://en.wikipedia.org/wiki/Linear_interpolation}
  134645. *
  134646. * @param {number[]} v - The input array of values to interpolate between.
  134647. * @param {!number} k - The percentage of interpolation, between 0 and 1.
  134648. *
  134649. * @return {!number} The interpolated value.
  134650. */
  134651. var LinearInterpolation = function (v, k)
  134652. {
  134653. var m = v.length - 1;
  134654. var f = m * k;
  134655. var i = Math.floor(f);
  134656. if (k < 0)
  134657. {
  134658. return Linear(v[0], v[1], f);
  134659. }
  134660. else if (k > 1)
  134661. {
  134662. return Linear(v[m], v[m - 1], m - f);
  134663. }
  134664. else
  134665. {
  134666. return Linear(v[i], v[(i + 1 > m) ? m : i + 1], f - i);
  134667. }
  134668. };
  134669. module.exports = LinearInterpolation;
  134670. /***/ }),
  134671. /* 1075 */
  134672. /***/ (function(module, exports, __webpack_require__) {
  134673. /**
  134674. * @author Richard Davey <rich@photonstorm.com>
  134675. * @copyright 2019 Photon Storm Ltd.
  134676. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134677. */
  134678. var CatmullRom = __webpack_require__(185);
  134679. /**
  134680. * A Catmull-Rom interpolation method.
  134681. *
  134682. * @function Phaser.Math.Interpolation.CatmullRom
  134683. * @since 3.0.0
  134684. *
  134685. * @param {number[]} v - The input array of values to interpolate between.
  134686. * @param {number} k - The percentage of interpolation, between 0 and 1.
  134687. *
  134688. * @return {number} The interpolated value.
  134689. */
  134690. var CatmullRomInterpolation = function (v, k)
  134691. {
  134692. var m = v.length - 1;
  134693. var f = m * k;
  134694. var i = Math.floor(f);
  134695. if (v[0] === v[m])
  134696. {
  134697. if (k < 0)
  134698. {
  134699. i = Math.floor(f = m * (1 + k));
  134700. }
  134701. return CatmullRom(f - i, v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m]);
  134702. }
  134703. else
  134704. {
  134705. if (k < 0)
  134706. {
  134707. return v[0] - (CatmullRom(-f, v[0], v[0], v[1], v[1]) - v[0]);
  134708. }
  134709. if (k > 1)
  134710. {
  134711. return v[m] - (CatmullRom(f - m, v[m], v[m], v[m - 1], v[m - 1]) - v[m]);
  134712. }
  134713. return CatmullRom(f - i, v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2]);
  134714. }
  134715. };
  134716. module.exports = CatmullRomInterpolation;
  134717. /***/ }),
  134718. /* 1076 */
  134719. /***/ (function(module, exports, __webpack_require__) {
  134720. /**
  134721. * @author Richard Davey <rich@photonstorm.com>
  134722. * @copyright 2019 Photon Storm Ltd.
  134723. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134724. */
  134725. var Bernstein = __webpack_require__(381);
  134726. /**
  134727. * A bezier interpolation method.
  134728. *
  134729. * @function Phaser.Math.Interpolation.Bezier
  134730. * @since 3.0.0
  134731. *
  134732. * @param {number[]} v - The input array of values to interpolate between.
  134733. * @param {number} k - The percentage of interpolation, between 0 and 1.
  134734. *
  134735. * @return {number} The interpolated value.
  134736. */
  134737. var BezierInterpolation = function (v, k)
  134738. {
  134739. var b = 0;
  134740. var n = v.length - 1;
  134741. for (var i = 0; i <= n; i++)
  134742. {
  134743. b += Math.pow(1 - k, n - i) * Math.pow(k, i) * v[i] * Bernstein(n, i);
  134744. }
  134745. return b;
  134746. };
  134747. module.exports = BezierInterpolation;
  134748. /***/ }),
  134749. /* 1077 */
  134750. /***/ (function(module, exports, __webpack_require__) {
  134751. /**
  134752. * @author Richard Davey <rich@photonstorm.com>
  134753. * @copyright 2019 Photon Storm Ltd.
  134754. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134755. */
  134756. /**
  134757. * @namespace Phaser.Math.Interpolation
  134758. */
  134759. module.exports = {
  134760. Bezier: __webpack_require__(1076),
  134761. CatmullRom: __webpack_require__(1075),
  134762. CubicBezier: __webpack_require__(379),
  134763. Linear: __webpack_require__(1074),
  134764. QuadraticBezier: __webpack_require__(378),
  134765. SmoothStep: __webpack_require__(377),
  134766. SmootherStep: __webpack_require__(1073)
  134767. };
  134768. /***/ }),
  134769. /* 1078 */
  134770. /***/ (function(module, exports) {
  134771. /**
  134772. * @author Richard Davey <rich@photonstorm.com>
  134773. * @copyright 2019 Photon Storm Ltd.
  134774. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134775. */
  134776. /**
  134777. * Calculate the fuzzy floor of the given value.
  134778. *
  134779. * @function Phaser.Math.Fuzzy.Floor
  134780. * @since 3.0.0
  134781. *
  134782. * @param {number} value - The value.
  134783. * @param {number} [epsilon=0.0001] - The epsilon.
  134784. *
  134785. * @return {number} The floor of the value.
  134786. */
  134787. var Floor = function (value, epsilon)
  134788. {
  134789. if (epsilon === undefined) { epsilon = 0.0001; }
  134790. return Math.floor(value + epsilon);
  134791. };
  134792. module.exports = Floor;
  134793. /***/ }),
  134794. /* 1079 */
  134795. /***/ (function(module, exports) {
  134796. /**
  134797. * @author Richard Davey <rich@photonstorm.com>
  134798. * @copyright 2019 Photon Storm Ltd.
  134799. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134800. */
  134801. /**
  134802. * Calculate the fuzzy ceiling of the given value.
  134803. *
  134804. * @function Phaser.Math.Fuzzy.Ceil
  134805. * @since 3.0.0
  134806. *
  134807. * @param {number} value - The value.
  134808. * @param {number} [epsilon=0.0001] - The epsilon.
  134809. *
  134810. * @return {number} The fuzzy ceiling of the value.
  134811. */
  134812. var Ceil = function (value, epsilon)
  134813. {
  134814. if (epsilon === undefined) { epsilon = 0.0001; }
  134815. return Math.ceil(value - epsilon);
  134816. };
  134817. module.exports = Ceil;
  134818. /***/ }),
  134819. /* 1080 */
  134820. /***/ (function(module, exports, __webpack_require__) {
  134821. /**
  134822. * @author Richard Davey <rich@photonstorm.com>
  134823. * @copyright 2019 Photon Storm Ltd.
  134824. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134825. */
  134826. /**
  134827. * @namespace Phaser.Math.Fuzzy
  134828. */
  134829. module.exports = {
  134830. Ceil: __webpack_require__(1079),
  134831. Equal: __webpack_require__(186),
  134832. Floor: __webpack_require__(1078),
  134833. GreaterThan: __webpack_require__(383),
  134834. LessThan: __webpack_require__(382)
  134835. };
  134836. /***/ }),
  134837. /* 1081 */
  134838. /***/ (function(module, exports, __webpack_require__) {
  134839. /**
  134840. * @author Richard Davey <rich@photonstorm.com>
  134841. * @copyright 2019 Photon Storm Ltd.
  134842. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134843. */
  134844. /**
  134845. * @namespace Phaser.Math.Easing
  134846. */
  134847. module.exports = {
  134848. Back: __webpack_require__(402),
  134849. Bounce: __webpack_require__(401),
  134850. Circular: __webpack_require__(400),
  134851. Cubic: __webpack_require__(399),
  134852. Elastic: __webpack_require__(398),
  134853. Expo: __webpack_require__(397),
  134854. Linear: __webpack_require__(396),
  134855. Quadratic: __webpack_require__(395),
  134856. Quartic: __webpack_require__(394),
  134857. Quintic: __webpack_require__(393),
  134858. Sine: __webpack_require__(392),
  134859. Stepped: __webpack_require__(391)
  134860. };
  134861. /***/ }),
  134862. /* 1082 */
  134863. /***/ (function(module, exports) {
  134864. /**
  134865. * @author Richard Davey <rich@photonstorm.com>
  134866. * @copyright 2019 Photon Storm Ltd.
  134867. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134868. */
  134869. /**
  134870. * Calculate the distance between two sets of coordinates (points) to the power of `pow`.
  134871. *
  134872. * @function Phaser.Math.Distance.Power
  134873. * @since 3.0.0
  134874. *
  134875. * @param {number} x1 - The x coordinate of the first point.
  134876. * @param {number} y1 - The y coordinate of the first point.
  134877. * @param {number} x2 - The x coordinate of the second point.
  134878. * @param {number} y2 - The y coordinate of the second point.
  134879. * @param {number} pow - The exponent.
  134880. *
  134881. * @return {number} The distance between each point.
  134882. */
  134883. var DistancePower = function (x1, y1, x2, y2, pow)
  134884. {
  134885. if (pow === undefined) { pow = 2; }
  134886. return Math.sqrt(Math.pow(x2 - x1, pow) + Math.pow(y2 - y1, pow));
  134887. };
  134888. module.exports = DistancePower;
  134889. /***/ }),
  134890. /* 1083 */
  134891. /***/ (function(module, exports, __webpack_require__) {
  134892. /**
  134893. * @author Richard Davey <rich@photonstorm.com>
  134894. * @copyright 2019 Photon Storm Ltd.
  134895. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134896. */
  134897. /**
  134898. * @namespace Phaser.Math.Distance
  134899. */
  134900. module.exports = {
  134901. Between: __webpack_require__(56),
  134902. Power: __webpack_require__(1082),
  134903. Squared: __webpack_require__(384)
  134904. };
  134905. /***/ }),
  134906. /* 1084 */
  134907. /***/ (function(module, exports) {
  134908. /**
  134909. * @author Richard Davey <rich@photonstorm.com>
  134910. * @copyright 2019 Photon Storm Ltd.
  134911. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134912. */
  134913. /**
  134914. * Gets the shortest angle between `angle1` and `angle2`.
  134915. *
  134916. * Both angles must be in the range -180 to 180, which is the same clamped
  134917. * range that `sprite.angle` uses, so you can pass in two sprite angles to
  134918. * this method and get the shortest angle back between the two of them.
  134919. *
  134920. * The angle returned will be in the same range. If the returned angle is
  134921. * greater than 0 then it's a counter-clockwise rotation, if < 0 then it's
  134922. * a clockwise rotation.
  134923. *
  134924. * TODO: Wrap the angles in this function?
  134925. *
  134926. * @function Phaser.Math.Angle.ShortestBetween
  134927. * @since 3.0.0
  134928. *
  134929. * @param {number} angle1 - The first angle in the range -180 to 180.
  134930. * @param {number} angle2 - The second angle in the range -180 to 180.
  134931. *
  134932. * @return {number} The shortest angle, in degrees. If greater than zero it's a counter-clockwise rotation.
  134933. */
  134934. var ShortestBetween = function (angle1, angle2)
  134935. {
  134936. var difference = angle2 - angle1;
  134937. if (difference === 0)
  134938. {
  134939. return 0;
  134940. }
  134941. var times = Math.floor((difference - (-180)) / 360);
  134942. return difference - (times * 360);
  134943. };
  134944. module.exports = ShortestBetween;
  134945. /***/ }),
  134946. /* 1085 */
  134947. /***/ (function(module, exports, __webpack_require__) {
  134948. /**
  134949. * @author Richard Davey <rich@photonstorm.com>
  134950. * @copyright 2019 Photon Storm Ltd.
  134951. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134952. */
  134953. var MATH_CONST = __webpack_require__(20);
  134954. /**
  134955. * Rotates `currentAngle` towards `targetAngle`, taking the shortest rotation distance. The `lerp` argument is the amount to rotate by in this call.
  134956. *
  134957. * @function Phaser.Math.Angle.RotateTo
  134958. * @since 3.0.0
  134959. *
  134960. * @param {number} currentAngle - The current angle, in radians.
  134961. * @param {number} targetAngle - The target angle to rotate to, in radians.
  134962. * @param {number} [lerp=0.05] - The lerp value to add to the current angle.
  134963. *
  134964. * @return {number} The adjusted angle.
  134965. */
  134966. var RotateTo = function (currentAngle, targetAngle, lerp)
  134967. {
  134968. if (lerp === undefined) { lerp = 0.05; }
  134969. if (currentAngle === targetAngle)
  134970. {
  134971. return currentAngle;
  134972. }
  134973. if (Math.abs(targetAngle - currentAngle) <= lerp || Math.abs(targetAngle - currentAngle) >= (MATH_CONST.PI2 - lerp))
  134974. {
  134975. currentAngle = targetAngle;
  134976. }
  134977. else
  134978. {
  134979. if (Math.abs(targetAngle - currentAngle) > Math.PI)
  134980. {
  134981. if (targetAngle < currentAngle)
  134982. {
  134983. targetAngle += MATH_CONST.PI2;
  134984. }
  134985. else
  134986. {
  134987. targetAngle -= MATH_CONST.PI2;
  134988. }
  134989. }
  134990. if (targetAngle > currentAngle)
  134991. {
  134992. currentAngle += lerp;
  134993. }
  134994. else if (targetAngle < currentAngle)
  134995. {
  134996. currentAngle -= lerp;
  134997. }
  134998. }
  134999. return currentAngle;
  135000. };
  135001. module.exports = RotateTo;
  135002. /***/ }),
  135003. /* 1086 */
  135004. /***/ (function(module, exports, __webpack_require__) {
  135005. /**
  135006. * @author Richard Davey <rich@photonstorm.com>
  135007. * @copyright 2019 Photon Storm Ltd.
  135008. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135009. */
  135010. var Normalize = __webpack_require__(385);
  135011. /**
  135012. * Reverse the given angle.
  135013. *
  135014. * @function Phaser.Math.Angle.Reverse
  135015. * @since 3.0.0
  135016. *
  135017. * @param {number} angle - The angle to reverse, in radians.
  135018. *
  135019. * @return {number} The reversed angle, in radians.
  135020. */
  135021. var Reverse = function (angle)
  135022. {
  135023. return Normalize(angle + Math.PI);
  135024. };
  135025. module.exports = Reverse;
  135026. /***/ }),
  135027. /* 1087 */
  135028. /***/ (function(module, exports, __webpack_require__) {
  135029. /**
  135030. * @author Richard Davey <rich@photonstorm.com>
  135031. * @copyright 2019 Photon Storm Ltd.
  135032. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135033. */
  135034. var CONST = __webpack_require__(20);
  135035. /**
  135036. * Takes an angle in Phasers default clockwise format and converts it so that
  135037. * 0 is North, 90 is West, 180 is South and 270 is East,
  135038. * therefore running counter-clockwise instead of clockwise.
  135039. *
  135040. * You can pass in the angle from a Game Object using:
  135041. *
  135042. * ```javascript
  135043. * var converted = CounterClockwise(gameobject.rotation);
  135044. * ```
  135045. *
  135046. * All values for this function are in radians.
  135047. *
  135048. * @function Phaser.Math.Angle.CounterClockwise
  135049. * @since 3.16.0
  135050. *
  135051. * @param {number} angle - The angle to convert, in radians.
  135052. *
  135053. * @return {number} The converted angle, in radians.
  135054. */
  135055. var CounterClockwise = function (angle)
  135056. {
  135057. return Math.abs((((angle + CONST.TAU) % CONST.PI2) - CONST.PI2) % CONST.PI2);
  135058. };
  135059. module.exports = CounterClockwise;
  135060. /***/ }),
  135061. /* 1088 */
  135062. /***/ (function(module, exports) {
  135063. /**
  135064. * @author Richard Davey <rich@photonstorm.com>
  135065. * @copyright 2019 Photon Storm Ltd.
  135066. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135067. */
  135068. /**
  135069. * Find the angle of a segment from (x1, y1) -> (x2, y2).
  135070. *
  135071. * The difference between this method and {@link Phaser.Math.Angle.Between} is that this assumes the y coordinate
  135072. * travels down the screen.
  135073. *
  135074. * @function Phaser.Math.Angle.BetweenY
  135075. * @since 3.0.0
  135076. *
  135077. * @param {number} x1 - The x coordinate of the first point.
  135078. * @param {number} y1 - The y coordinate of the first point.
  135079. * @param {number} x2 - The x coordinate of the second point.
  135080. * @param {number} y2 - The y coordinate of the second point.
  135081. *
  135082. * @return {number} The angle in radians.
  135083. */
  135084. var BetweenY = function (x1, y1, x2, y2)
  135085. {
  135086. return Math.atan2(x2 - x1, y2 - y1);
  135087. };
  135088. module.exports = BetweenY;
  135089. /***/ }),
  135090. /* 1089 */
  135091. /***/ (function(module, exports) {
  135092. /**
  135093. * @author Richard Davey <rich@photonstorm.com>
  135094. * @copyright 2019 Photon Storm Ltd.
  135095. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135096. */
  135097. /**
  135098. * Find the angle of a segment from (point1.x, point1.y) -> (point2.x, point2.y).
  135099. *
  135100. * The difference between this method and {@link Phaser.Math.Angle.BetweenPoints} is that this assumes the y coordinate
  135101. * travels down the screen.
  135102. *
  135103. * @function Phaser.Math.Angle.BetweenPointsY
  135104. * @since 3.0.0
  135105. *
  135106. * @param {(Phaser.Geom.Point|object)} point1 - The first point.
  135107. * @param {(Phaser.Geom.Point|object)} point2 - The second point.
  135108. *
  135109. * @return {number} The angle in radians.
  135110. */
  135111. var BetweenPointsY = function (point1, point2)
  135112. {
  135113. return Math.atan2(point2.x - point1.x, point2.y - point1.y);
  135114. };
  135115. module.exports = BetweenPointsY;
  135116. /***/ }),
  135117. /* 1090 */
  135118. /***/ (function(module, exports) {
  135119. /**
  135120. * @author Richard Davey <rich@photonstorm.com>
  135121. * @copyright 2019 Photon Storm Ltd.
  135122. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135123. */
  135124. /**
  135125. * Find the angle of a segment from (point1.x, point1.y) -> (point2.x, point2.y).
  135126. *
  135127. * Calculates the angle of the vector from the first point to the second point.
  135128. *
  135129. * @function Phaser.Math.Angle.BetweenPoints
  135130. * @since 3.0.0
  135131. *
  135132. * @param {(Phaser.Geom.Point|object)} point1 - The first point.
  135133. * @param {(Phaser.Geom.Point|object)} point2 - The second point.
  135134. *
  135135. * @return {number} The angle in radians.
  135136. */
  135137. var BetweenPoints = function (point1, point2)
  135138. {
  135139. return Math.atan2(point2.y - point1.y, point2.x - point1.x);
  135140. };
  135141. module.exports = BetweenPoints;
  135142. /***/ }),
  135143. /* 1091 */
  135144. /***/ (function(module, exports, __webpack_require__) {
  135145. /**
  135146. * @author Richard Davey <rich@photonstorm.com>
  135147. * @copyright 2019 Photon Storm Ltd.
  135148. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135149. */
  135150. /**
  135151. * @namespace Phaser.Math.Angle
  135152. */
  135153. module.exports = {
  135154. Between: __webpack_require__(386),
  135155. BetweenPoints: __webpack_require__(1090),
  135156. BetweenPointsY: __webpack_require__(1089),
  135157. BetweenY: __webpack_require__(1088),
  135158. CounterClockwise: __webpack_require__(1087),
  135159. Normalize: __webpack_require__(385),
  135160. Reverse: __webpack_require__(1086),
  135161. RotateTo: __webpack_require__(1085),
  135162. ShortestBetween: __webpack_require__(1084),
  135163. Wrap: __webpack_require__(214),
  135164. WrapDegrees: __webpack_require__(213)
  135165. };
  135166. /***/ }),
  135167. /* 1092 */
  135168. /***/ (function(module, exports) {
  135169. /**
  135170. * @author Richard Davey <rich@photonstorm.com>
  135171. * @copyright 2019 Photon Storm Ltd.
  135172. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135173. */
  135174. /**
  135175. * Determines the full screen support of the browser running this Phaser Game instance.
  135176. * These values are read-only and populated during the boot sequence of the game.
  135177. * They are then referenced by internal game systems and are available for you to access
  135178. * via `this.sys.game.device.fullscreen` from within any Scene.
  135179. *
  135180. * @typedef {object} Phaser.Device.Fullscreen
  135181. * @since 3.0.0
  135182. *
  135183. * @property {boolean} available - Does the browser support the Full Screen API?
  135184. * @property {boolean} keyboard - Does the browser support access to the Keyboard during Full Screen mode?
  135185. * @property {string} cancel - If the browser supports the Full Screen API this holds the call you need to use to cancel it.
  135186. * @property {string} request - If the browser supports the Full Screen API this holds the call you need to use to activate it.
  135187. */
  135188. var Fullscreen = {
  135189. available: false,
  135190. cancel: '',
  135191. keyboard: false,
  135192. request: ''
  135193. };
  135194. /**
  135195. * Checks for support of the Full Screen API.
  135196. */
  135197. function init ()
  135198. {
  135199. var i;
  135200. var suffix1 = 'Fullscreen';
  135201. var suffix2 = 'FullScreen';
  135202. var fs = [
  135203. 'request' + suffix1,
  135204. 'request' + suffix2,
  135205. 'webkitRequest' + suffix1,
  135206. 'webkitRequest' + suffix2,
  135207. 'msRequest' + suffix1,
  135208. 'msRequest' + suffix2,
  135209. 'mozRequest' + suffix2,
  135210. 'mozRequest' + suffix1
  135211. ];
  135212. for (i = 0; i < fs.length; i++)
  135213. {
  135214. if (document.documentElement[fs[i]])
  135215. {
  135216. Fullscreen.available = true;
  135217. Fullscreen.request = fs[i];
  135218. break;
  135219. }
  135220. }
  135221. var cfs = [
  135222. 'cancel' + suffix2,
  135223. 'exit' + suffix1,
  135224. 'webkitCancel' + suffix2,
  135225. 'webkitExit' + suffix1,
  135226. 'msCancel' + suffix2,
  135227. 'msExit' + suffix1,
  135228. 'mozCancel' + suffix2,
  135229. 'mozExit' + suffix1
  135230. ];
  135231. if (Fullscreen.available)
  135232. {
  135233. for (i = 0; i < cfs.length; i++)
  135234. {
  135235. if (document[cfs[i]])
  135236. {
  135237. Fullscreen.cancel = cfs[i];
  135238. break;
  135239. }
  135240. }
  135241. }
  135242. // Keyboard Input?
  135243. // Safari 5.1 says it supports fullscreen keyboard, but is lying.
  135244. if (window['Element'] && Element['ALLOW_KEYBOARD_INPUT'] && !(/ Version\/5\.1(?:\.\d+)? Safari\//).test(navigator.userAgent))
  135245. {
  135246. Fullscreen.keyboard = true;
  135247. }
  135248. Object.defineProperty(Fullscreen, 'active', { get: function () { return !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement); } });
  135249. return Fullscreen;
  135250. }
  135251. module.exports = init();
  135252. /***/ }),
  135253. /* 1093 */
  135254. /***/ (function(module, exports) {
  135255. /**
  135256. * @author Richard Davey <rich@photonstorm.com>
  135257. * @copyright 2019 Photon Storm Ltd.
  135258. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135259. */
  135260. /**
  135261. * Determines the video support of the browser running this Phaser Game instance.
  135262. * These values are read-only and populated during the boot sequence of the game.
  135263. * They are then referenced by internal game systems and are available for you to access
  135264. * via `this.sys.game.device.video` from within any Scene.
  135265. *
  135266. * @typedef {object} Phaser.Device.Video
  135267. * @since 3.0.0
  135268. *
  135269. * @property {boolean} h264Video - Can this device play h264 mp4 video files?
  135270. * @property {boolean} hlsVideo - Can this device play hls video files?
  135271. * @property {boolean} mp4Video - Can this device play h264 mp4 video files?
  135272. * @property {boolean} oggVideo - Can this device play ogg video files?
  135273. * @property {boolean} vp9Video - Can this device play vp9 video files?
  135274. * @property {boolean} webmVideo - Can this device play webm video files?
  135275. */
  135276. var Video = {
  135277. h264Video: false,
  135278. hlsVideo: false,
  135279. mp4Video: false,
  135280. oggVideo: false,
  135281. vp9Video: false,
  135282. webmVideo: false
  135283. };
  135284. function init ()
  135285. {
  135286. var videoElement = document.createElement('video');
  135287. var result = !!videoElement.canPlayType;
  135288. try
  135289. {
  135290. if (result)
  135291. {
  135292. if (videoElement.canPlayType('video/ogg; codecs="theora"').replace(/^no$/, ''))
  135293. {
  135294. Video.oggVideo = true;
  135295. }
  135296. if (videoElement.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/, ''))
  135297. {
  135298. // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546
  135299. Video.h264Video = true;
  135300. Video.mp4Video = true;
  135301. }
  135302. if (videoElement.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/, ''))
  135303. {
  135304. Video.webmVideo = true;
  135305. }
  135306. if (videoElement.canPlayType('video/webm; codecs="vp9"').replace(/^no$/, ''))
  135307. {
  135308. Video.vp9Video = true;
  135309. }
  135310. if (videoElement.canPlayType('application/x-mpegURL; codecs="avc1.42E01E"').replace(/^no$/, ''))
  135311. {
  135312. Video.hlsVideo = true;
  135313. }
  135314. }
  135315. }
  135316. catch (e)
  135317. {
  135318. // Nothing to do
  135319. }
  135320. return Video;
  135321. }
  135322. module.exports = init();
  135323. /***/ }),
  135324. /* 1094 */
  135325. /***/ (function(module, exports, __webpack_require__) {
  135326. /**
  135327. * @author Richard Davey <rich@photonstorm.com>
  135328. * @copyright 2019 Photon Storm Ltd.
  135329. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135330. */
  135331. var Browser = __webpack_require__(128);
  135332. /**
  135333. * Determines the audio playback capabilities of the device running this Phaser Game instance.
  135334. * These values are read-only and populated during the boot sequence of the game.
  135335. * They are then referenced by internal game systems and are available for you to access
  135336. * via `this.sys.game.device.audio` from within any Scene.
  135337. *
  135338. * @typedef {object} Phaser.Device.Audio
  135339. * @since 3.0.0
  135340. *
  135341. * @property {boolean} audioData - Can this device play HTML Audio tags?
  135342. * @property {boolean} dolby - Can this device play EC-3 Dolby Digital Plus files?
  135343. * @property {boolean} m4a - Can this device can play m4a files.
  135344. * @property {boolean} mp3 - Can this device play mp3 files?
  135345. * @property {boolean} ogg - Can this device play ogg files?
  135346. * @property {boolean} opus - Can this device play opus files?
  135347. * @property {boolean} wav - Can this device play wav files?
  135348. * @property {boolean} webAudio - Does this device have the Web Audio API?
  135349. * @property {boolean} webm - Can this device play webm files?
  135350. */
  135351. var Audio = {
  135352. audioData: false,
  135353. dolby: false,
  135354. m4a: false,
  135355. mp3: false,
  135356. ogg: false,
  135357. opus: false,
  135358. wav: false,
  135359. webAudio: false,
  135360. webm: false
  135361. };
  135362. function init ()
  135363. {
  135364. Audio.audioData = !!(window['Audio']);
  135365. Audio.webAudio = !!(window['AudioContext'] || window['webkitAudioContext']);
  135366. var audioElement = document.createElement('audio');
  135367. var result = !!audioElement.canPlayType;
  135368. try
  135369. {
  135370. if (result)
  135371. {
  135372. if (audioElement.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''))
  135373. {
  135374. Audio.ogg = true;
  135375. }
  135376. if (audioElement.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/, '') || audioElement.canPlayType('audio/opus;').replace(/^no$/, ''))
  135377. {
  135378. Audio.opus = true;
  135379. }
  135380. if (audioElement.canPlayType('audio/mpeg;').replace(/^no$/, ''))
  135381. {
  135382. Audio.mp3 = true;
  135383. }
  135384. // Mimetypes accepted:
  135385. // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
  135386. // bit.ly/iphoneoscodecs
  135387. if (audioElement.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ''))
  135388. {
  135389. Audio.wav = true;
  135390. }
  135391. if (audioElement.canPlayType('audio/x-m4a;') || audioElement.canPlayType('audio/aac;').replace(/^no$/, ''))
  135392. {
  135393. Audio.m4a = true;
  135394. }
  135395. if (audioElement.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''))
  135396. {
  135397. Audio.webm = true;
  135398. }
  135399. if (audioElement.canPlayType('audio/mp4;codecs="ec-3"') !== '')
  135400. {
  135401. if (Browser.edge)
  135402. {
  135403. Audio.dolby = true;
  135404. }
  135405. else if (Browser.safari && Browser.safariVersion >= 9)
  135406. {
  135407. if ((/Mac OS X (\d+)_(\d+)/).test(navigator.userAgent))
  135408. {
  135409. var major = parseInt(RegExp.$1, 10);
  135410. var minor = parseInt(RegExp.$2, 10);
  135411. if ((major === 10 && minor >= 11) || major > 10)
  135412. {
  135413. Audio.dolby = true;
  135414. }
  135415. }
  135416. }
  135417. }
  135418. }
  135419. }
  135420. catch (e)
  135421. {
  135422. // Nothing to do here
  135423. }
  135424. return Audio;
  135425. }
  135426. module.exports = init();
  135427. /***/ }),
  135428. /* 1095 */
  135429. /***/ (function(module, exports, __webpack_require__) {
  135430. /**
  135431. * @author Richard Davey <rich@photonstorm.com>
  135432. * @copyright 2019 Photon Storm Ltd.
  135433. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135434. */
  135435. var OS = __webpack_require__(99);
  135436. var Browser = __webpack_require__(128);
  135437. /**
  135438. * Determines the input support of the browser running this Phaser Game instance.
  135439. * These values are read-only and populated during the boot sequence of the game.
  135440. * They are then referenced by internal game systems and are available for you to access
  135441. * via `this.sys.game.device.input` from within any Scene.
  135442. *
  135443. * @typedef {object} Phaser.Device.Input
  135444. * @since 3.0.0
  135445. *
  135446. * @property {?string} wheelType - The newest type of Wheel/Scroll event supported: 'wheel', 'mousewheel', 'DOMMouseScroll'
  135447. * @property {boolean} gamepads - Is navigator.getGamepads available?
  135448. * @property {boolean} mspointer - Is mspointer available?
  135449. * @property {boolean} touch - Is touch available?
  135450. */
  135451. var Input = {
  135452. gamepads: false,
  135453. mspointer: false,
  135454. touch: false,
  135455. wheelEvent: null
  135456. };
  135457. function init ()
  135458. {
  135459. if ('ontouchstart' in document.documentElement || (navigator.maxTouchPoints && navigator.maxTouchPoints >= 1))
  135460. {
  135461. Input.touch = true;
  135462. }
  135463. if (navigator.msPointerEnabled || navigator.pointerEnabled)
  135464. {
  135465. Input.mspointer = true;
  135466. }
  135467. if (navigator.getGamepads)
  135468. {
  135469. Input.gamepads = true;
  135470. }
  135471. if (!OS.cocoonJS)
  135472. {
  135473. // See https://developer.mozilla.org/en-US/docs/Web/Events/wheel
  135474. if ('onwheel' in window || (Browser.ie && 'WheelEvent' in window))
  135475. {
  135476. // DOM3 Wheel Event: FF 17+, IE 9+, Chrome 31+, Safari 7+
  135477. Input.wheelEvent = 'wheel';
  135478. }
  135479. else if ('onmousewheel' in window)
  135480. {
  135481. // Non-FF legacy: IE 6-9, Chrome 1-31, Safari 5-7.
  135482. Input.wheelEvent = 'mousewheel';
  135483. }
  135484. else if (Browser.firefox && 'MouseScrollEvent' in window)
  135485. {
  135486. // FF prior to 17. This should probably be scrubbed.
  135487. Input.wheelEvent = 'DOMMouseScroll';
  135488. }
  135489. }
  135490. return Input;
  135491. }
  135492. module.exports = init();
  135493. /***/ }),
  135494. /* 1096 */
  135495. /***/ (function(module, exports) {
  135496. // shim for using process in browser
  135497. var process = module.exports = {};
  135498. // cached from whatever global is present so that test runners that stub it
  135499. // don't break things. But we need to wrap it in a try catch in case it is
  135500. // wrapped in strict mode code which doesn't define any globals. It's inside a
  135501. // function because try/catches deoptimize in certain engines.
  135502. var cachedSetTimeout;
  135503. var cachedClearTimeout;
  135504. function defaultSetTimout() {
  135505. throw new Error('setTimeout has not been defined');
  135506. }
  135507. function defaultClearTimeout () {
  135508. throw new Error('clearTimeout has not been defined');
  135509. }
  135510. (function () {
  135511. try {
  135512. if (typeof setTimeout === 'function') {
  135513. cachedSetTimeout = setTimeout;
  135514. } else {
  135515. cachedSetTimeout = defaultSetTimout;
  135516. }
  135517. } catch (e) {
  135518. cachedSetTimeout = defaultSetTimout;
  135519. }
  135520. try {
  135521. if (typeof clearTimeout === 'function') {
  135522. cachedClearTimeout = clearTimeout;
  135523. } else {
  135524. cachedClearTimeout = defaultClearTimeout;
  135525. }
  135526. } catch (e) {
  135527. cachedClearTimeout = defaultClearTimeout;
  135528. }
  135529. } ())
  135530. function runTimeout(fun) {
  135531. if (cachedSetTimeout === setTimeout) {
  135532. //normal enviroments in sane situations
  135533. return setTimeout(fun, 0);
  135534. }
  135535. // if setTimeout wasn't available but was latter defined
  135536. if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
  135537. cachedSetTimeout = setTimeout;
  135538. return setTimeout(fun, 0);
  135539. }
  135540. try {
  135541. // when when somebody has screwed with setTimeout but no I.E. maddness
  135542. return cachedSetTimeout(fun, 0);
  135543. } catch(e){
  135544. try {
  135545. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  135546. return cachedSetTimeout.call(null, fun, 0);
  135547. } catch(e){
  135548. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
  135549. return cachedSetTimeout.call(this, fun, 0);
  135550. }
  135551. }
  135552. }
  135553. function runClearTimeout(marker) {
  135554. if (cachedClearTimeout === clearTimeout) {
  135555. //normal enviroments in sane situations
  135556. return clearTimeout(marker);
  135557. }
  135558. // if clearTimeout wasn't available but was latter defined
  135559. if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
  135560. cachedClearTimeout = clearTimeout;
  135561. return clearTimeout(marker);
  135562. }
  135563. try {
  135564. // when when somebody has screwed with setTimeout but no I.E. maddness
  135565. return cachedClearTimeout(marker);
  135566. } catch (e){
  135567. try {
  135568. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  135569. return cachedClearTimeout.call(null, marker);
  135570. } catch (e){
  135571. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
  135572. // Some versions of I.E. have different rules for clearTimeout vs setTimeout
  135573. return cachedClearTimeout.call(this, marker);
  135574. }
  135575. }
  135576. }
  135577. var queue = [];
  135578. var draining = false;
  135579. var currentQueue;
  135580. var queueIndex = -1;
  135581. function cleanUpNextTick() {
  135582. if (!draining || !currentQueue) {
  135583. return;
  135584. }
  135585. draining = false;
  135586. if (currentQueue.length) {
  135587. queue = currentQueue.concat(queue);
  135588. } else {
  135589. queueIndex = -1;
  135590. }
  135591. if (queue.length) {
  135592. drainQueue();
  135593. }
  135594. }
  135595. function drainQueue() {
  135596. if (draining) {
  135597. return;
  135598. }
  135599. var timeout = runTimeout(cleanUpNextTick);
  135600. draining = true;
  135601. var len = queue.length;
  135602. while(len) {
  135603. currentQueue = queue;
  135604. queue = [];
  135605. while (++queueIndex < len) {
  135606. if (currentQueue) {
  135607. currentQueue[queueIndex].run();
  135608. }
  135609. }
  135610. queueIndex = -1;
  135611. len = queue.length;
  135612. }
  135613. currentQueue = null;
  135614. draining = false;
  135615. runClearTimeout(timeout);
  135616. }
  135617. process.nextTick = function (fun) {
  135618. var args = new Array(arguments.length - 1);
  135619. if (arguments.length > 1) {
  135620. for (var i = 1; i < arguments.length; i++) {
  135621. args[i - 1] = arguments[i];
  135622. }
  135623. }
  135624. queue.push(new Item(fun, args));
  135625. if (queue.length === 1 && !draining) {
  135626. runTimeout(drainQueue);
  135627. }
  135628. };
  135629. // v8 likes predictible objects
  135630. function Item(fun, array) {
  135631. this.fun = fun;
  135632. this.array = array;
  135633. }
  135634. Item.prototype.run = function () {
  135635. this.fun.apply(null, this.array);
  135636. };
  135637. process.title = 'browser';
  135638. process.browser = true;
  135639. process.env = {};
  135640. process.argv = [];
  135641. process.version = ''; // empty string to avoid regexp issues
  135642. process.versions = {};
  135643. function noop() {}
  135644. process.on = noop;
  135645. process.addListener = noop;
  135646. process.once = noop;
  135647. process.off = noop;
  135648. process.removeListener = noop;
  135649. process.removeAllListeners = noop;
  135650. process.emit = noop;
  135651. process.prependListener = noop;
  135652. process.prependOnceListener = noop;
  135653. process.listeners = function (name) { return [] }
  135654. process.binding = function (name) {
  135655. throw new Error('process.binding is not supported');
  135656. };
  135657. process.cwd = function () { return '/' };
  135658. process.chdir = function (dir) {
  135659. throw new Error('process.chdir is not supported');
  135660. };
  135661. process.umask = function() { return 0; };
  135662. /***/ }),
  135663. /* 1097 */
  135664. /***/ (function(module, exports, __webpack_require__) {
  135665. /**
  135666. * @author Richard Davey <rich@photonstorm.com>
  135667. * @copyright 2019 Photon Storm Ltd.
  135668. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135669. */
  135670. /**
  135671. * @namespace Phaser.Core
  135672. */
  135673. module.exports = {
  135674. Config: __webpack_require__(390),
  135675. CreateRenderer: __webpack_require__(367),
  135676. DebugHeader: __webpack_require__(365),
  135677. Events: __webpack_require__(26),
  135678. TimeStep: __webpack_require__(364),
  135679. VisibilityHandler: __webpack_require__(362)
  135680. };
  135681. /***/ }),
  135682. /* 1098 */
  135683. /***/ (function(module, exports) {
  135684. /**
  135685. * @author Richard Davey <rich@photonstorm.com>
  135686. * @copyright 2019 Photon Storm Ltd.
  135687. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135688. */
  135689. /**
  135690. * The Scene Systems Wake Event.
  135691. *
  135692. * This event is dispatched by a Scene when it is woken from sleep, either directly via the `wake` method,
  135693. * or as an action from another Scene.
  135694. *
  135695. * Listen to it from a Scene using `this.scene.events.on('wake', listener)`.
  135696. *
  135697. * @event Phaser.Scenes.Events#WAKE
  135698. *
  135699. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  135700. * @param {any} [data] - An optional data object that was passed to this Scene when it was woken up.
  135701. */
  135702. module.exports = 'wake';
  135703. /***/ }),
  135704. /* 1099 */
  135705. /***/ (function(module, exports) {
  135706. /**
  135707. * @author Richard Davey <rich@photonstorm.com>
  135708. * @copyright 2019 Photon Storm Ltd.
  135709. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135710. */
  135711. /**
  135712. * The Scene Systems Update Event.
  135713. *
  135714. * This event is dispatched by a Scene during the main game loop step.
  135715. *
  135716. * The event flow for a single step of a Scene is as follows:
  135717. *
  135718. * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE}
  135719. * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE}
  135720. * 3. The `Scene.update` method is called, if it exists
  135721. * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE}
  135722. * 5. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER}
  135723. *
  135724. * Listen to it from a Scene using `this.scene.events.on('update', listener)`.
  135725. *
  135726. * A Scene will only run its step if it is active.
  135727. *
  135728. * @event Phaser.Scenes.Events#UPDATE
  135729. *
  135730. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  135731. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  135732. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  135733. */
  135734. module.exports = 'update';
  135735. /***/ }),
  135736. /* 1100 */
  135737. /***/ (function(module, exports) {
  135738. /**
  135739. * @author Richard Davey <rich@photonstorm.com>
  135740. * @copyright 2019 Photon Storm Ltd.
  135741. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135742. */
  135743. /**
  135744. * The Scene Transition Wake Event.
  135745. *
  135746. * This event is dispatched by the Target Scene of a transition, only if that Scene was asleep before
  135747. * the transition began. If the Scene was not asleep the [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} event is dispatched instead.
  135748. *
  135749. * Listen to it from a Scene using `this.scene.events.on('transitionwake', listener)`.
  135750. *
  135751. * The Scene Transition event flow is as follows:
  135752. *
  135753. * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event.
  135754. * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method.
  135755. * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ...
  135756. * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to.
  135757. * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes.
  135758. *
  135759. * @event Phaser.Scenes.Events#TRANSITION_WAKE
  135760. *
  135761. * @param {Phaser.Scene} from - A reference to the Scene that is being transitioned from.
  135762. * @param {number} duration - The duration of the transition in ms.
  135763. */
  135764. module.exports = 'transitionwake';
  135765. /***/ }),
  135766. /* 1101 */
  135767. /***/ (function(module, exports) {
  135768. /**
  135769. * @author Richard Davey <rich@photonstorm.com>
  135770. * @copyright 2019 Photon Storm Ltd.
  135771. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135772. */
  135773. /**
  135774. * The Scene Transition Start Event.
  135775. *
  135776. * This event is dispatched by the Target Scene of a transition, only if that Scene was not asleep.
  135777. *
  135778. * It happens immediately after the `Scene.create` method is called. If the Scene does not have a `create` method,
  135779. * this event is dispatched anyway.
  135780. *
  135781. * If the Target Scene was sleeping then the [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} event is
  135782. * dispatched instead of this event.
  135783. *
  135784. * Listen to it from a Scene using `this.scene.events.on('transitionstart', listener)`.
  135785. *
  135786. * The Scene Transition event flow is as follows:
  135787. *
  135788. * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event.
  135789. * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method.
  135790. * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ...
  135791. * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to.
  135792. * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes.
  135793. *
  135794. * @event Phaser.Scenes.Events#TRANSITION_START
  135795. *
  135796. * @param {Phaser.Scene} from - A reference to the Scene that is being transitioned from.
  135797. * @param {number} duration - The duration of the transition in ms.
  135798. */
  135799. module.exports = 'transitionstart';
  135800. /***/ }),
  135801. /* 1102 */
  135802. /***/ (function(module, exports) {
  135803. /**
  135804. * @author Richard Davey <rich@photonstorm.com>
  135805. * @copyright 2019 Photon Storm Ltd.
  135806. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135807. */
  135808. /**
  135809. * The Scene Transition Out Event.
  135810. *
  135811. * This event is dispatched by a Scene when it initiates a transition to another Scene.
  135812. *
  135813. * Listen to it from a Scene using `this.scene.events.on('transitionout', listener)`.
  135814. *
  135815. * The Scene Transition event flow is as follows:
  135816. *
  135817. * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event.
  135818. * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method.
  135819. * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ...
  135820. * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to.
  135821. * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes.
  135822. *
  135823. * @event Phaser.Scenes.Events#TRANSITION_OUT
  135824. *
  135825. * @param {Phaser.Scene} target - A reference to the Scene that is being transitioned to.
  135826. * @param {number} duration - The duration of the transition in ms.
  135827. */
  135828. module.exports = 'transitionout';
  135829. /***/ }),
  135830. /* 1103 */
  135831. /***/ (function(module, exports) {
  135832. /**
  135833. * @author Richard Davey <rich@photonstorm.com>
  135834. * @copyright 2019 Photon Storm Ltd.
  135835. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135836. */
  135837. /**
  135838. * The Scene Transition Init Event.
  135839. *
  135840. * This event is dispatched by the Target Scene of a transition.
  135841. *
  135842. * It happens immediately after the `Scene.init` method is called. If the Scene does not have an `init` method,
  135843. * this event is not dispatched.
  135844. *
  135845. * Listen to it from a Scene using `this.scene.events.on('transitioninit', listener)`.
  135846. *
  135847. * The Scene Transition event flow is as follows:
  135848. *
  135849. * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event.
  135850. * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method.
  135851. * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ...
  135852. * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to.
  135853. * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes.
  135854. *
  135855. * @event Phaser.Scenes.Events#TRANSITION_INIT
  135856. *
  135857. * @param {Phaser.Scene} from - A reference to the Scene that is being transitioned from.
  135858. * @param {number} duration - The duration of the transition in ms.
  135859. */
  135860. module.exports = 'transitioninit';
  135861. /***/ }),
  135862. /* 1104 */
  135863. /***/ (function(module, exports) {
  135864. /**
  135865. * @author Richard Davey <rich@photonstorm.com>
  135866. * @copyright 2019 Photon Storm Ltd.
  135867. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135868. */
  135869. /**
  135870. * The Scene Transition Complete Event.
  135871. *
  135872. * This event is dispatched by the Target Scene of a transition.
  135873. *
  135874. * It happens when the transition process has completed. This occurs when the duration timer equals or exceeds the duration
  135875. * of the transition.
  135876. *
  135877. * Listen to it from a Scene using `this.scene.events.on('transitioncomplete', listener)`.
  135878. *
  135879. * The Scene Transition event flow is as follows:
  135880. *
  135881. * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event.
  135882. * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method.
  135883. * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ...
  135884. * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to.
  135885. * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes.
  135886. *
  135887. * @event Phaser.Scenes.Events#TRANSITION_COMPLETE
  135888. *
  135889. * @param {Phaser.Scene} scene -The Scene on which the transitioned completed.
  135890. */
  135891. module.exports = 'transitioncomplete';
  135892. /***/ }),
  135893. /* 1105 */
  135894. /***/ (function(module, exports) {
  135895. /**
  135896. * @author Richard Davey <rich@photonstorm.com>
  135897. * @copyright 2019 Photon Storm Ltd.
  135898. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135899. */
  135900. /**
  135901. * The Scene Systems Start Event.
  135902. *
  135903. * This event is dispatched by a Scene during the Scene Systems start process. Primarily used by Scene Plugins.
  135904. *
  135905. * Listen to it from a Scene using `this.scene.events.on('start', listener)`.
  135906. *
  135907. * @event Phaser.Scenes.Events#START
  135908. *
  135909. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  135910. */
  135911. module.exports = 'start';
  135912. /***/ }),
  135913. /* 1106 */
  135914. /***/ (function(module, exports) {
  135915. /**
  135916. * @author Richard Davey <rich@photonstorm.com>
  135917. * @copyright 2019 Photon Storm Ltd.
  135918. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135919. */
  135920. /**
  135921. * The Scene Systems Sleep Event.
  135922. *
  135923. * This event is dispatched by a Scene when it is sent to sleep, either directly via the `sleep` method,
  135924. * or as an action from another Scene.
  135925. *
  135926. * Listen to it from a Scene using `this.scene.events.on('sleep', listener)`.
  135927. *
  135928. * @event Phaser.Scenes.Events#SLEEP
  135929. *
  135930. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  135931. * @param {any} [data] - An optional data object that was passed to this Scene when it was sent to sleep.
  135932. */
  135933. module.exports = 'sleep';
  135934. /***/ }),
  135935. /* 1107 */
  135936. /***/ (function(module, exports) {
  135937. /**
  135938. * @author Richard Davey <rich@photonstorm.com>
  135939. * @copyright 2019 Photon Storm Ltd.
  135940. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135941. */
  135942. /**
  135943. * The Scene Systems Shutdown Event.
  135944. *
  135945. * This event is dispatched by a Scene during the Scene Systems shutdown process.
  135946. *
  135947. * Listen to it from a Scene using `this.scene.events.on('shutdown', listener)`.
  135948. *
  135949. * You should free-up any resources that may be in use by your Scene in this event handler, on the understanding
  135950. * that the Scene may, at any time, become active again. A shutdown Scene is not 'destroyed', it's simply not
  135951. * currently active. Use the [DESTROY]{@linkcode Phaser.Scenes.Events#event:DESTROY} event to completely clear resources.
  135952. *
  135953. * @event Phaser.Scenes.Events#SHUTDOWN
  135954. *
  135955. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  135956. * @param {any} [data] - An optional data object that was passed to this Scene when it was shutdown.
  135957. */
  135958. module.exports = 'shutdown';
  135959. /***/ }),
  135960. /* 1108 */
  135961. /***/ (function(module, exports) {
  135962. /**
  135963. * @author Richard Davey <rich@photonstorm.com>
  135964. * @copyright 2019 Photon Storm Ltd.
  135965. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135966. */
  135967. /**
  135968. * The Scene Systems Resume Event.
  135969. *
  135970. * This event is dispatched by a Scene when it is resumed from a paused state, either directly via the `resume` method,
  135971. * or as an action from another Scene.
  135972. *
  135973. * Listen to it from a Scene using `this.scene.events.on('resume', listener)`.
  135974. *
  135975. * @event Phaser.Scenes.Events#RESUME
  135976. *
  135977. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  135978. * @param {any} [data] - An optional data object that was passed to this Scene when it was resumed.
  135979. */
  135980. module.exports = 'resume';
  135981. /***/ }),
  135982. /* 1109 */
  135983. /***/ (function(module, exports) {
  135984. /**
  135985. * @author Richard Davey <rich@photonstorm.com>
  135986. * @copyright 2019 Photon Storm Ltd.
  135987. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135988. */
  135989. /**
  135990. * The Scene Systems Render Event.
  135991. *
  135992. * This event is dispatched by a Scene during the main game loop step.
  135993. *
  135994. * The event flow for a single step of a Scene is as follows:
  135995. *
  135996. * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE}
  135997. * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE}
  135998. * 3. The `Scene.update` method is called, if it exists
  135999. * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE}
  136000. * 5. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER}
  136001. *
  136002. * Listen to it from a Scene using `this.scene.events.on('render', listener)`.
  136003. *
  136004. * A Scene will only render if it is visible and active.
  136005. * By the time this event is dispatched, the Scene will have already been rendered.
  136006. *
  136007. * @event Phaser.Scenes.Events#RENDER
  136008. *
  136009. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The renderer that rendered the Scene.
  136010. */
  136011. module.exports = 'render';
  136012. /***/ }),
  136013. /* 1110 */
  136014. /***/ (function(module, exports) {
  136015. /**
  136016. * @author Richard Davey <rich@photonstorm.com>
  136017. * @copyright 2019 Photon Storm Ltd.
  136018. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136019. */
  136020. /**
  136021. * The Scene Systems Ready Event.
  136022. *
  136023. * This event is dispatched by a Scene during the Scene Systems start process.
  136024. * By this point in the process the Scene is now fully active and rendering.
  136025. * This event is meant for your game code to use, as all plugins have responded to the earlier 'start' event.
  136026. *
  136027. * Listen to it from a Scene using `this.scene.events.on('ready', listener)`.
  136028. *
  136029. * @event Phaser.Scenes.Events#READY
  136030. *
  136031. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  136032. * @param {any} [data] - An optional data object that was passed to this Scene when it was started.
  136033. */
  136034. module.exports = 'ready';
  136035. /***/ }),
  136036. /* 1111 */
  136037. /***/ (function(module, exports) {
  136038. /**
  136039. * @author Richard Davey <rich@photonstorm.com>
  136040. * @copyright 2019 Photon Storm Ltd.
  136041. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136042. */
  136043. /**
  136044. * The Scene Systems Pre Update Event.
  136045. *
  136046. * This event is dispatched by a Scene during the main game loop step.
  136047. *
  136048. * The event flow for a single step of a Scene is as follows:
  136049. *
  136050. * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE}
  136051. * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE}
  136052. * 3. The `Scene.update` method is called, if it exists
  136053. * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE}
  136054. * 5. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER}
  136055. *
  136056. * Listen to it from a Scene using `this.scene.events.on('preupdate', listener)`.
  136057. *
  136058. * A Scene will only run its step if it is active.
  136059. *
  136060. * @event Phaser.Scenes.Events#PRE_UPDATE
  136061. *
  136062. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  136063. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  136064. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  136065. */
  136066. module.exports = 'preupdate';
  136067. /***/ }),
  136068. /* 1112 */
  136069. /***/ (function(module, exports) {
  136070. /**
  136071. * @author Richard Davey <rich@photonstorm.com>
  136072. * @copyright 2019 Photon Storm Ltd.
  136073. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136074. */
  136075. /**
  136076. * The Scene Systems Post Update Event.
  136077. *
  136078. * This event is dispatched by a Scene during the main game loop step.
  136079. *
  136080. * The event flow for a single step of a Scene is as follows:
  136081. *
  136082. * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE}
  136083. * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE}
  136084. * 3. The `Scene.update` method is called, if it exists
  136085. * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE}
  136086. * 5. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER}
  136087. *
  136088. * Listen to it from a Scene using `this.scene.events.on('postupdate', listener)`.
  136089. *
  136090. * A Scene will only run its step if it is active.
  136091. *
  136092. * @event Phaser.Scenes.Events#POST_UPDATE
  136093. *
  136094. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  136095. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  136096. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  136097. */
  136098. module.exports = 'postupdate';
  136099. /***/ }),
  136100. /* 1113 */
  136101. /***/ (function(module, exports) {
  136102. /**
  136103. * @author Richard Davey <rich@photonstorm.com>
  136104. * @copyright 2019 Photon Storm Ltd.
  136105. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136106. */
  136107. /**
  136108. * The Scene Systems Pause Event.
  136109. *
  136110. * This event is dispatched by a Scene when it is paused, either directly via the `pause` method, or as an
  136111. * action from another Scene.
  136112. *
  136113. * Listen to it from a Scene using `this.scene.events.on('pause', listener)`.
  136114. *
  136115. * @event Phaser.Scenes.Events#PAUSE
  136116. *
  136117. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  136118. * @param {any} [data] - An optional data object that was passed to this Scene when it was paused.
  136119. */
  136120. module.exports = 'pause';
  136121. /***/ }),
  136122. /* 1114 */
  136123. /***/ (function(module, exports) {
  136124. /**
  136125. * @author Richard Davey <rich@photonstorm.com>
  136126. * @copyright 2019 Photon Storm Ltd.
  136127. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136128. */
  136129. /**
  136130. * The Scene Systems Destroy Event.
  136131. *
  136132. * This event is dispatched by a Scene during the Scene Systems destroy process.
  136133. *
  136134. * Listen to it from a Scene using `this.scene.events.on('destroy', listener)`.
  136135. *
  136136. * You should destroy any resources that may be in use by your Scene in this event handler.
  136137. *
  136138. * @event Phaser.Scenes.Events#DESTROY
  136139. *
  136140. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  136141. */
  136142. module.exports = 'destroy';
  136143. /***/ }),
  136144. /* 1115 */
  136145. /***/ (function(module, exports) {
  136146. /**
  136147. * @author Richard Davey <rich@photonstorm.com>
  136148. * @copyright 2019 Photon Storm Ltd.
  136149. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136150. */
  136151. /**
  136152. * The Scene Systems Boot Event.
  136153. *
  136154. * This event is dispatched by a Scene during the Scene Systems boot process. Primarily used by Scene Plugins.
  136155. *
  136156. * Listen to it from a Scene using `this.scene.events.on('boot', listener)`.
  136157. *
  136158. * @event Phaser.Scenes.Events#BOOT
  136159. *
  136160. * @param {Phaser.Scenes.Systems} sys - A reference to the Scene Systems class of the Scene that emitted this event.
  136161. */
  136162. module.exports = 'boot';
  136163. /***/ }),
  136164. /* 1116 */
  136165. /***/ (function(module, exports, __webpack_require__) {
  136166. /**
  136167. * @author Richard Davey <rich@photonstorm.com>
  136168. * @copyright 2019 Photon Storm Ltd.
  136169. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136170. */
  136171. var Camera = __webpack_require__(411);
  136172. var Class = __webpack_require__(0);
  136173. var GetFastValue = __webpack_require__(2);
  136174. var PluginCache = __webpack_require__(17);
  136175. var RectangleContains = __webpack_require__(42);
  136176. var SceneEvents = __webpack_require__(16);
  136177. /**
  136178. * @typedef {object} InputJSONCameraObject
  136179. *
  136180. * @property {string} [name=''] - The name of the Camera.
  136181. * @property {integer} [x=0] - The horizontal position of the Camera viewport.
  136182. * @property {integer} [y=0] - The vertical position of the Camera viewport.
  136183. * @property {integer} [width] - The width of the Camera viewport.
  136184. * @property {integer} [height] - The height of the Camera viewport.
  136185. * @property {number} [zoom=1] - The default zoom level of the Camera.
  136186. * @property {number} [rotation=0] - The rotation of the Camera, in radians.
  136187. * @property {boolean} [roundPixels=false] - Should the Camera round pixels before rendering?
  136188. * @property {number} [scrollX=0] - The horizontal scroll position of the Camera.
  136189. * @property {number} [scrollY=0] - The vertical scroll position of the Camera.
  136190. * @property {(false|string)} [backgroundColor=false] - A CSS color string controlling the Camera background color.
  136191. * @property {?object} [bounds] - Defines the Camera bounds.
  136192. * @property {number} [bounds.x=0] - The top-left extent of the Camera bounds.
  136193. * @property {number} [bounds.y=0] - The top-left extent of the Camera bounds.
  136194. * @property {number} [bounds.width] - The width of the Camera bounds.
  136195. * @property {number} [bounds.height] - The height of the Camera bounds.
  136196. */
  136197. /**
  136198. * @classdesc
  136199. * The Camera Manager is a plugin that belongs to a Scene and is responsible for managing all of the Scene Cameras.
  136200. *
  136201. * By default you can access the Camera Manager from within a Scene using `this.cameras`, although this can be changed
  136202. * in your game config.
  136203. *
  136204. * Create new Cameras using the `add` method. Or extend the Camera class with your own addition code and then add
  136205. * the new Camera in using the `addExisting` method.
  136206. *
  136207. * Cameras provide a view into your game world, and can be positioned, rotated, zoomed and scrolled accordingly.
  136208. *
  136209. * A Camera consists of two elements: The viewport and the scroll values.
  136210. *
  136211. * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are
  136212. * created the same size as your game, but their position and size can be set to anything. This means if you
  136213. * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game,
  136214. * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`).
  136215. *
  136216. * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this
  136217. * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the
  136218. * viewport, and changing the viewport has no impact on the scrolling.
  136219. *
  136220. * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method,
  136221. * allowing you to filter Game Objects out on a per-Camera basis. The Camera Manager can manage up to 31 unique
  136222. * 'Game Object ignore capable' Cameras. Any Cameras beyond 31 that you create will all be given a Camera ID of
  136223. * zero, meaning that they cannot be used for Game Object exclusion. This means if you need your Camera to ignore
  136224. * Game Objects, make sure it's one of the first 31 created.
  136225. *
  136226. * A Camera also has built-in special effects including Fade, Flash, Camera Shake, Pan and Zoom.
  136227. *
  136228. * @class CameraManager
  136229. * @memberof Phaser.Cameras.Scene2D
  136230. * @constructor
  136231. * @since 3.0.0
  136232. *
  136233. * @param {Phaser.Scene} scene - The Scene that owns the Camera Manager plugin.
  136234. */
  136235. var CameraManager = new Class({
  136236. initialize:
  136237. function CameraManager (scene)
  136238. {
  136239. /**
  136240. * The Scene that owns the Camera Manager plugin.
  136241. *
  136242. * @name Phaser.Cameras.Scene2D.CameraManager#scene
  136243. * @type {Phaser.Scene}
  136244. * @since 3.0.0
  136245. */
  136246. this.scene = scene;
  136247. /**
  136248. * A reference to the Scene.Systems handler for the Scene that owns the Camera Manager.
  136249. *
  136250. * @name Phaser.Cameras.Scene2D.CameraManager#systems
  136251. * @type {Phaser.Scenes.Systems}
  136252. * @since 3.0.0
  136253. */
  136254. this.systems = scene.sys;
  136255. /**
  136256. * All Cameras created by, or added to, this Camera Manager, will have their `roundPixels`
  136257. * property set to match this value. By default it is set to match the value set in the
  136258. * game configuration, but can be changed at any point. Equally, individual cameras can
  136259. * also be changed as needed.
  136260. *
  136261. * @name Phaser.Cameras.Scene2D.CameraManager#roundPixels
  136262. * @type {boolean}
  136263. * @since 3.11.0
  136264. */
  136265. this.roundPixels = scene.sys.game.config.roundPixels;
  136266. /**
  136267. * An Array of the Camera objects being managed by this Camera Manager.
  136268. * The Cameras are updated and rendered in the same order in which they appear in this array.
  136269. * Do not directly add or remove entries to this array. However, you can move the contents
  136270. * around the array should you wish to adjust the display order.
  136271. *
  136272. * @name Phaser.Cameras.Scene2D.CameraManager#cameras
  136273. * @type {Phaser.Cameras.Scene2D.Camera[]}
  136274. * @since 3.0.0
  136275. */
  136276. this.cameras = [];
  136277. /**
  136278. * A handy reference to the 'main' camera. By default this is the first Camera the
  136279. * Camera Manager creates. You can also set it directly, or use the `makeMain` argument
  136280. * in the `add` and `addExisting` methods. It allows you to access it from your game:
  136281. *
  136282. * ```javascript
  136283. * var cam = this.cameras.main;
  136284. * ```
  136285. *
  136286. * Also see the properties `camera1`, `camera2` and so on.
  136287. *
  136288. * @name Phaser.Cameras.Scene2D.CameraManager#main
  136289. * @type {Phaser.Cameras.Scene2D.Camera}
  136290. * @since 3.0.0
  136291. */
  136292. this.main;
  136293. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  136294. scene.sys.events.on(SceneEvents.START, this.start, this);
  136295. },
  136296. /**
  136297. * This method is called automatically, only once, when the Scene is first created.
  136298. * Do not invoke it directly.
  136299. *
  136300. * @method Phaser.Cameras.Scene2D.CameraManager#boot
  136301. * @private
  136302. * @listens Phaser.Scenes.Events#DESTROY
  136303. * @since 3.5.1
  136304. */
  136305. boot: function ()
  136306. {
  136307. var sys = this.systems;
  136308. if (sys.settings.cameras)
  136309. {
  136310. // We have cameras to create
  136311. this.fromJSON(sys.settings.cameras);
  136312. }
  136313. else
  136314. {
  136315. // Make one
  136316. this.add();
  136317. }
  136318. this.main = this.cameras[0];
  136319. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  136320. },
  136321. /**
  136322. * This method is called automatically by the Scene when it is starting up.
  136323. * It is responsible for creating local systems, properties and listening for Scene events.
  136324. * Do not invoke it directly.
  136325. *
  136326. * @method Phaser.Cameras.Scene2D.CameraManager#start
  136327. * @private
  136328. * @listens Phaser.Scenes.Events#UPDATE
  136329. * @listens Phaser.Scenes.Events#SHUTDOWN
  136330. * @since 3.5.0
  136331. */
  136332. start: function ()
  136333. {
  136334. if (!this.main)
  136335. {
  136336. var sys = this.systems;
  136337. if (sys.settings.cameras)
  136338. {
  136339. // We have cameras to create
  136340. this.fromJSON(sys.settings.cameras);
  136341. }
  136342. else
  136343. {
  136344. // Make one
  136345. this.add();
  136346. }
  136347. this.main = this.cameras[0];
  136348. }
  136349. var eventEmitter = this.systems.events;
  136350. eventEmitter.on(SceneEvents.UPDATE, this.update, this);
  136351. eventEmitter.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  136352. },
  136353. /**
  136354. * Adds a new Camera into the Camera Manager. The Camera Manager can support up to 31 different Cameras.
  136355. *
  136356. * Each Camera has its own viewport, which controls the size of the Camera and its position within the canvas.
  136357. *
  136358. * Use the `Camera.scrollX` and `Camera.scrollY` properties to change where the Camera is looking, or the
  136359. * Camera methods such as `centerOn`. Cameras also have built in special effects, such as fade, flash, shake,
  136360. * pan and zoom.
  136361. *
  136362. * By default Cameras are transparent and will render anything that they can see based on their `scrollX`
  136363. * and `scrollY` values. Game Objects can be set to be ignored by a Camera by using the `Camera.ignore` method.
  136364. *
  136365. * The Camera will have its `roundPixels` property set to whatever `CameraManager.roundPixels` is. You can change
  136366. * it after creation if required.
  136367. *
  136368. * See the Camera class documentation for more details.
  136369. *
  136370. * @method Phaser.Cameras.Scene2D.CameraManager#add
  136371. * @since 3.0.0
  136372. *
  136373. * @param {integer} [x=0] - The horizontal position of the Camera viewport.
  136374. * @param {integer} [y=0] - The vertical position of the Camera viewport.
  136375. * @param {integer} [width] - The width of the Camera viewport. If not given it'll be the game config size.
  136376. * @param {integer} [height] - The height of the Camera viewport. If not given it'll be the game config size.
  136377. * @param {boolean} [makeMain=false] - Set this Camera as being the 'main' camera. This just makes the property `main` a reference to it.
  136378. * @param {string} [name=''] - The name of the Camera.
  136379. *
  136380. * @return {Phaser.Cameras.Scene2D.Camera} The newly created Camera.
  136381. */
  136382. add: function (x, y, width, height, makeMain, name)
  136383. {
  136384. if (x === undefined) { x = 0; }
  136385. if (y === undefined) { y = 0; }
  136386. if (width === undefined) { width = this.scene.sys.scale.width; }
  136387. if (height === undefined) { height = this.scene.sys.scale.height; }
  136388. if (makeMain === undefined) { makeMain = false; }
  136389. if (name === undefined) { name = ''; }
  136390. var camera = new Camera(x, y, width, height);
  136391. camera.setName(name);
  136392. camera.setScene(this.scene);
  136393. camera.setRoundPixels(this.roundPixels);
  136394. camera.id = this.getNextID();
  136395. this.cameras.push(camera);
  136396. if (makeMain)
  136397. {
  136398. this.main = camera;
  136399. }
  136400. return camera;
  136401. },
  136402. /**
  136403. * Adds an existing Camera into the Camera Manager.
  136404. *
  136405. * The Camera should either be a `Phaser.Cameras.Scene2D.Camera` instance, or a class that extends from it.
  136406. *
  136407. * The Camera will have its `roundPixels` property set to whatever `CameraManager.roundPixels` is. You can change
  136408. * it after addition if required.
  136409. *
  136410. * The Camera will be assigned an ID, which is used for Game Object exclusion and then added to the
  136411. * manager. As long as it doesn't already exist in the manager it will be added then returned.
  136412. *
  136413. * If this method returns `null` then the Camera already exists in this Camera Manager.
  136414. *
  136415. * @method Phaser.Cameras.Scene2D.CameraManager#addExisting
  136416. * @since 3.0.0
  136417. *
  136418. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to be added to the Camera Manager.
  136419. * @param {boolean} [makeMain=false] - Set this Camera as being the 'main' camera. This just makes the property `main` a reference to it.
  136420. *
  136421. * @return {?Phaser.Cameras.Scene2D.Camera} The Camera that was added to the Camera Manager, or `null` if it couldn't be added.
  136422. */
  136423. addExisting: function (camera, makeMain)
  136424. {
  136425. if (makeMain === undefined) { makeMain = false; }
  136426. var index = this.cameras.indexOf(camera);
  136427. if (index === -1)
  136428. {
  136429. camera.id = this.getNextID();
  136430. camera.setRoundPixels(this.roundPixels);
  136431. this.cameras.push(camera);
  136432. if (makeMain)
  136433. {
  136434. this.main = camera;
  136435. }
  136436. return camera;
  136437. }
  136438. return null;
  136439. },
  136440. /**
  136441. * Gets the next available Camera ID number.
  136442. *
  136443. * The Camera Manager supports up to 31 unique cameras, after which the ID returned will always be zero.
  136444. * You can create additional cameras beyond 31, but they cannot be used for Game Object exclusion.
  136445. *
  136446. * @method Phaser.Cameras.Scene2D.CameraManager#getNextID
  136447. * @private
  136448. * @since 3.11.0
  136449. *
  136450. * @return {number} The next available Camera ID, or 0 if they're all already in use.
  136451. */
  136452. getNextID: function ()
  136453. {
  136454. var cameras = this.cameras;
  136455. var testID = 1;
  136456. // Find the first free camera ID we can use
  136457. for (var t = 0; t < 32; t++)
  136458. {
  136459. var found = false;
  136460. for (var i = 0; i < cameras.length; i++)
  136461. {
  136462. var camera = cameras[i];
  136463. if (camera && camera.id === testID)
  136464. {
  136465. found = true;
  136466. continue;
  136467. }
  136468. }
  136469. if (found)
  136470. {
  136471. testID = testID << 1;
  136472. }
  136473. else
  136474. {
  136475. return testID;
  136476. }
  136477. }
  136478. return 0;
  136479. },
  136480. /**
  136481. * Gets the total number of Cameras in this Camera Manager.
  136482. *
  136483. * If the optional `isVisible` argument is set it will only count Cameras that are currently visible.
  136484. *
  136485. * @method Phaser.Cameras.Scene2D.CameraManager#getTotal
  136486. * @since 3.11.0
  136487. *
  136488. * @param {boolean} [isVisible=false] - Set the `true` to only include visible Cameras in the total.
  136489. *
  136490. * @return {integer} The total number of Cameras in this Camera Manager.
  136491. */
  136492. getTotal: function (isVisible)
  136493. {
  136494. if (isVisible === undefined) { isVisible = false; }
  136495. var total = 0;
  136496. var cameras = this.cameras;
  136497. for (var i = 0; i < cameras.length; i++)
  136498. {
  136499. var camera = cameras[i];
  136500. if (!isVisible || (isVisible && camera.visible))
  136501. {
  136502. total++;
  136503. }
  136504. }
  136505. return total;
  136506. },
  136507. /**
  136508. * Populates this Camera Manager based on the given configuration object, or an array of config objects.
  136509. *
  136510. * See the `InputJSONCameraObject` documentation for details of the object structure.
  136511. *
  136512. * @method Phaser.Cameras.Scene2D.CameraManager#fromJSON
  136513. * @since 3.0.0
  136514. *
  136515. * @param {(InputJSONCameraObject|InputJSONCameraObject[])} config - A Camera configuration object, or an array of them, to be added to this Camera Manager.
  136516. *
  136517. * @return {Phaser.Cameras.Scene2D.CameraManager} This Camera Manager instance.
  136518. */
  136519. fromJSON: function (config)
  136520. {
  136521. if (!Array.isArray(config))
  136522. {
  136523. config = [ config ];
  136524. }
  136525. var gameWidth = this.scene.sys.scale.width;
  136526. var gameHeight = this.scene.sys.scale.height;
  136527. for (var i = 0; i < config.length; i++)
  136528. {
  136529. var cameraConfig = config[i];
  136530. var x = GetFastValue(cameraConfig, 'x', 0);
  136531. var y = GetFastValue(cameraConfig, 'y', 0);
  136532. var width = GetFastValue(cameraConfig, 'width', gameWidth);
  136533. var height = GetFastValue(cameraConfig, 'height', gameHeight);
  136534. var camera = this.add(x, y, width, height);
  136535. // Direct properties
  136536. camera.name = GetFastValue(cameraConfig, 'name', '');
  136537. camera.zoom = GetFastValue(cameraConfig, 'zoom', 1);
  136538. camera.rotation = GetFastValue(cameraConfig, 'rotation', 0);
  136539. camera.scrollX = GetFastValue(cameraConfig, 'scrollX', 0);
  136540. camera.scrollY = GetFastValue(cameraConfig, 'scrollY', 0);
  136541. camera.roundPixels = GetFastValue(cameraConfig, 'roundPixels', false);
  136542. camera.visible = GetFastValue(cameraConfig, 'visible', true);
  136543. // Background Color
  136544. var backgroundColor = GetFastValue(cameraConfig, 'backgroundColor', false);
  136545. if (backgroundColor)
  136546. {
  136547. camera.setBackgroundColor(backgroundColor);
  136548. }
  136549. // Bounds
  136550. var boundsConfig = GetFastValue(cameraConfig, 'bounds', null);
  136551. if (boundsConfig)
  136552. {
  136553. var bx = GetFastValue(boundsConfig, 'x', 0);
  136554. var by = GetFastValue(boundsConfig, 'y', 0);
  136555. var bwidth = GetFastValue(boundsConfig, 'width', gameWidth);
  136556. var bheight = GetFastValue(boundsConfig, 'height', gameHeight);
  136557. camera.setBounds(bx, by, bwidth, bheight);
  136558. }
  136559. }
  136560. return this;
  136561. },
  136562. /**
  136563. * Gets a Camera based on its name.
  136564. *
  136565. * Camera names are optional and don't have to be set, so this method is only of any use if you
  136566. * have given your Cameras unique names.
  136567. *
  136568. * @method Phaser.Cameras.Scene2D.CameraManager#getCamera
  136569. * @since 3.0.0
  136570. *
  136571. * @param {string} name - The name of the Camera.
  136572. *
  136573. * @return {?Phaser.Cameras.Scene2D.Camera} The first Camera with a name matching the given string, otherwise `null`.
  136574. */
  136575. getCamera: function (name)
  136576. {
  136577. var cameras = this.cameras;
  136578. for (var i = 0; i < cameras.length; i++)
  136579. {
  136580. if (cameras[i].name === name)
  136581. {
  136582. return cameras[i];
  136583. }
  136584. }
  136585. return null;
  136586. },
  136587. /**
  136588. * Returns an array of all cameras below the given Pointer.
  136589. *
  136590. * The first camera in the array is the top-most camera in the camera list.
  136591. *
  136592. * @method Phaser.Cameras.Scene2D.CameraManager#getCamerasBelowPointer
  136593. * @since 3.10.0
  136594. *
  136595. * @param {Phaser.Input.Pointer} pointer - The Pointer to check against.
  136596. *
  136597. * @return {Phaser.Cameras.Scene2D.Camera[]} An array of cameras below the Pointer.
  136598. */
  136599. getCamerasBelowPointer: function (pointer)
  136600. {
  136601. var cameras = this.cameras;
  136602. var x = pointer.x;
  136603. var y = pointer.y;
  136604. var output = [];
  136605. for (var i = 0; i < cameras.length; i++)
  136606. {
  136607. var camera = cameras[i];
  136608. if (camera.visible && camera.inputEnabled && RectangleContains(camera, x, y))
  136609. {
  136610. // So the top-most camera is at the top of the search array
  136611. output.unshift(camera);
  136612. }
  136613. }
  136614. return output;
  136615. },
  136616. /**
  136617. * Removes the given Camera, or an array of Cameras, from this Camera Manager.
  136618. *
  136619. * If found in the Camera Manager it will be immediately removed from the local cameras array.
  136620. * If also currently the 'main' camera, 'main' will be reset to be camera 0.
  136621. *
  136622. * The removed Cameras are automatically destroyed if the `runDestroy` argument is `true`, which is the default.
  136623. * If you wish to re-use the cameras then set this to `false`, but know that they will retain their references
  136624. * and internal data until destroyed or re-added to a Camera Manager.
  136625. *
  136626. * @method Phaser.Cameras.Scene2D.CameraManager#remove
  136627. * @since 3.0.0
  136628. *
  136629. * @param {(Phaser.Cameras.Scene2D.Camera|Phaser.Cameras.Scene2D.Camera[])} camera - The Camera, or an array of Cameras, to be removed from this Camera Manager.
  136630. * @param {boolean} [runDestroy=true] - Automatically call `Camera.destroy` on each Camera removed from this Camera Manager.
  136631. *
  136632. * @return {integer} The total number of Cameras removed.
  136633. */
  136634. remove: function (camera, runDestroy)
  136635. {
  136636. if (runDestroy === undefined) { runDestroy = true; }
  136637. if (!Array.isArray(camera))
  136638. {
  136639. camera = [ camera ];
  136640. }
  136641. var total = 0;
  136642. var cameras = this.cameras;
  136643. for (var i = 0; i < camera.length; i++)
  136644. {
  136645. var index = cameras.indexOf(camera[i]);
  136646. if (index !== -1)
  136647. {
  136648. if (runDestroy)
  136649. {
  136650. cameras[index].destroy();
  136651. }
  136652. cameras.splice(index, 1);
  136653. total++;
  136654. }
  136655. }
  136656. if (!this.main && cameras[0])
  136657. {
  136658. this.main = cameras[0];
  136659. }
  136660. return total;
  136661. },
  136662. /**
  136663. * The internal render method. This is called automatically by the Scene and should not be invoked directly.
  136664. *
  136665. * It will iterate through all local cameras and render them in turn, as long as they're visible and have
  136666. * an alpha level > 0.
  136667. *
  136668. * @method Phaser.Cameras.Scene2D.CameraManager#render
  136669. * @protected
  136670. * @since 3.0.0
  136671. *
  136672. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The Renderer that will render the children to this camera.
  136673. * @param {Phaser.GameObjects.GameObject[]} children - An array of renderable Game Objects.
  136674. * @param {number} interpolation - Interpolation value. Reserved for future use.
  136675. */
  136676. render: function (renderer, children, interpolation)
  136677. {
  136678. var scene = this.scene;
  136679. var cameras = this.cameras;
  136680. for (var i = 0; i < this.cameras.length; i++)
  136681. {
  136682. var camera = cameras[i];
  136683. if (camera.visible && camera.alpha > 0)
  136684. {
  136685. // Hard-coded to 1 for now
  136686. camera.preRender(1);
  136687. renderer.render(scene, children, interpolation, camera);
  136688. }
  136689. }
  136690. },
  136691. /**
  136692. * Resets this Camera Manager.
  136693. *
  136694. * This will iterate through all current Cameras, destroying them all, then it will reset the
  136695. * cameras array, reset the ID counter and create 1 new single camera using the default values.
  136696. *
  136697. * @method Phaser.Cameras.Scene2D.CameraManager#resetAll
  136698. * @since 3.0.0
  136699. *
  136700. * @return {Phaser.Cameras.Scene2D.Camera} The freshly created main Camera.
  136701. */
  136702. resetAll: function ()
  136703. {
  136704. for (var i = 0; i < this.cameras.length; i++)
  136705. {
  136706. this.cameras[i].destroy();
  136707. }
  136708. this.cameras = [];
  136709. this.main = this.add();
  136710. return this.main;
  136711. },
  136712. /**
  136713. * The main update loop. Called automatically when the Scene steps.
  136714. *
  136715. * @method Phaser.Cameras.Scene2D.CameraManager#update
  136716. * @protected
  136717. * @since 3.0.0
  136718. *
  136719. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  136720. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  136721. */
  136722. update: function (time, delta)
  136723. {
  136724. for (var i = 0; i < this.cameras.length; i++)
  136725. {
  136726. this.cameras[i].update(time, delta);
  136727. }
  136728. },
  136729. /**
  136730. * Resizes all cameras to the given dimensions.
  136731. *
  136732. * @method Phaser.Cameras.Scene2D.CameraManager#resize
  136733. * @since 3.2.0
  136734. *
  136735. * @param {number} width - The new width of the camera.
  136736. * @param {number} height - The new height of the camera.
  136737. */
  136738. resize: function (width, height)
  136739. {
  136740. for (var i = 0; i < this.cameras.length; i++)
  136741. {
  136742. this.cameras[i].setSize(width, height);
  136743. }
  136744. },
  136745. /**
  136746. * The Scene that owns this plugin is shutting down.
  136747. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  136748. *
  136749. * @method Phaser.Cameras.Scene2D.CameraManager#shutdown
  136750. * @private
  136751. * @since 3.0.0
  136752. */
  136753. shutdown: function ()
  136754. {
  136755. this.main = undefined;
  136756. for (var i = 0; i < this.cameras.length; i++)
  136757. {
  136758. this.cameras[i].destroy();
  136759. }
  136760. this.cameras = [];
  136761. var eventEmitter = this.systems.events;
  136762. eventEmitter.off(SceneEvents.UPDATE, this.update, this);
  136763. eventEmitter.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  136764. },
  136765. /**
  136766. * The Scene that owns this plugin is being destroyed.
  136767. * We need to shutdown and then kill off all external references.
  136768. *
  136769. * @method Phaser.Cameras.Scene2D.CameraManager#destroy
  136770. * @private
  136771. * @since 3.0.0
  136772. */
  136773. destroy: function ()
  136774. {
  136775. this.shutdown();
  136776. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  136777. this.scene = null;
  136778. this.systems = null;
  136779. }
  136780. });
  136781. PluginCache.register('CameraManager', CameraManager, 'cameras');
  136782. module.exports = CameraManager;
  136783. /***/ }),
  136784. /* 1117 */
  136785. /***/ (function(module, exports, __webpack_require__) {
  136786. /**
  136787. * @author Richard Davey <rich@photonstorm.com>
  136788. * @copyright 2019 Photon Storm Ltd.
  136789. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136790. */
  136791. var Clamp = __webpack_require__(23);
  136792. var Class = __webpack_require__(0);
  136793. var EaseMap = __webpack_require__(188);
  136794. var Events = __webpack_require__(40);
  136795. /**
  136796. * @classdesc
  136797. * A Camera Zoom effect.
  136798. *
  136799. * This effect will zoom the Camera to the given scale, over the duration and with the ease specified.
  136800. *
  136801. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  136802. * which is invoked each frame for the duration of the effect if required.
  136803. *
  136804. * @class Zoom
  136805. * @memberof Phaser.Cameras.Scene2D.Effects
  136806. * @constructor
  136807. * @since 3.11.0
  136808. *
  136809. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  136810. */
  136811. var Zoom = new Class({
  136812. initialize:
  136813. function Zoom (camera)
  136814. {
  136815. /**
  136816. * The Camera this effect belongs to.
  136817. *
  136818. * @name Phaser.Cameras.Scene2D.Effects.Zoom#camera
  136819. * @type {Phaser.Cameras.Scene2D.Camera}
  136820. * @readonly
  136821. * @since 3.11.0
  136822. */
  136823. this.camera = camera;
  136824. /**
  136825. * Is this effect actively running?
  136826. *
  136827. * @name Phaser.Cameras.Scene2D.Effects.Zoom#isRunning
  136828. * @type {boolean}
  136829. * @readonly
  136830. * @default false
  136831. * @since 3.11.0
  136832. */
  136833. this.isRunning = false;
  136834. /**
  136835. * The duration of the effect, in milliseconds.
  136836. *
  136837. * @name Phaser.Cameras.Scene2D.Effects.Zoom#duration
  136838. * @type {integer}
  136839. * @readonly
  136840. * @default 0
  136841. * @since 3.11.0
  136842. */
  136843. this.duration = 0;
  136844. /**
  136845. * The starting zoom value;
  136846. *
  136847. * @name Phaser.Cameras.Scene2D.Effects.Zoom#source
  136848. * @type {number}
  136849. * @since 3.11.0
  136850. */
  136851. this.source = 1;
  136852. /**
  136853. * The destination zoom value.
  136854. *
  136855. * @name Phaser.Cameras.Scene2D.Effects.Zoom#destination
  136856. * @type {number}
  136857. * @since 3.11.0
  136858. */
  136859. this.destination = 1;
  136860. /**
  136861. * The ease function to use during the zoom.
  136862. *
  136863. * @name Phaser.Cameras.Scene2D.Effects.Zoom#ease
  136864. * @type {function}
  136865. * @since 3.11.0
  136866. */
  136867. this.ease;
  136868. /**
  136869. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  136870. *
  136871. * @name Phaser.Cameras.Scene2D.Effects.Zoom#progress
  136872. * @type {number}
  136873. * @since 3.11.0
  136874. */
  136875. this.progress = 0;
  136876. /**
  136877. * Effect elapsed timer.
  136878. *
  136879. * @name Phaser.Cameras.Scene2D.Effects.Zoom#_elapsed
  136880. * @type {number}
  136881. * @private
  136882. * @since 3.11.0
  136883. */
  136884. this._elapsed = 0;
  136885. /**
  136886. * @callback CameraZoomCallback
  136887. *
  136888. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  136889. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  136890. * @param {number} zoom - The Camera's new zoom value.
  136891. */
  136892. /**
  136893. * This callback is invoked every frame for the duration of the effect.
  136894. *
  136895. * @name Phaser.Cameras.Scene2D.Effects.Zoom#_onUpdate
  136896. * @type {?CameraZoomCallback}
  136897. * @private
  136898. * @default null
  136899. * @since 3.11.0
  136900. */
  136901. this._onUpdate;
  136902. /**
  136903. * On Complete callback scope.
  136904. *
  136905. * @name Phaser.Cameras.Scene2D.Effects.Zoom#_onUpdateScope
  136906. * @type {any}
  136907. * @private
  136908. * @since 3.11.0
  136909. */
  136910. this._onUpdateScope;
  136911. },
  136912. /**
  136913. * This effect will zoom the Camera to the given scale, over the duration and with the ease specified.
  136914. *
  136915. * @method Phaser.Cameras.Scene2D.Effects.Zoom#start
  136916. * @fires Phaser.Cameras.Scene2D.Events#ZOOM_START
  136917. * @fires Phaser.Cameras.Scene2D.Events#ZOOM_COMPLETE
  136918. * @since 3.11.0
  136919. *
  136920. * @param {number} zoom - The target Camera zoom value.
  136921. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  136922. * @param {(string|function)} [ease='Linear'] - The ease to use for the Zoom. Can be any of the Phaser Easing constants or a custom function.
  136923. * @param {boolean} [force=false] - Force the zoom effect to start immediately, even if already running.
  136924. * @param {CameraZoomCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  136925. * It is sent three arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is,
  136926. * and the current camera zoom value.
  136927. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  136928. *
  136929. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  136930. */
  136931. start: function (zoom, duration, ease, force, callback, context)
  136932. {
  136933. if (duration === undefined) { duration = 1000; }
  136934. if (ease === undefined) { ease = EaseMap.Linear; }
  136935. if (force === undefined) { force = false; }
  136936. if (callback === undefined) { callback = null; }
  136937. if (context === undefined) { context = this.camera.scene; }
  136938. var cam = this.camera;
  136939. if (!force && this.isRunning)
  136940. {
  136941. return cam;
  136942. }
  136943. this.isRunning = true;
  136944. this.duration = duration;
  136945. this.progress = 0;
  136946. // Starting from
  136947. this.source = cam.zoom;
  136948. // Zooming to
  136949. this.destination = zoom;
  136950. // Using this ease
  136951. if (typeof ease === 'string' && EaseMap.hasOwnProperty(ease))
  136952. {
  136953. this.ease = EaseMap[ease];
  136954. }
  136955. else if (typeof ease === 'function')
  136956. {
  136957. this.ease = ease;
  136958. }
  136959. this._elapsed = 0;
  136960. this._onUpdate = callback;
  136961. this._onUpdateScope = context;
  136962. this.camera.emit(Events.ZOOM_START, this.camera, this, duration, zoom);
  136963. return cam;
  136964. },
  136965. /**
  136966. * The main update loop for this effect. Called automatically by the Camera.
  136967. *
  136968. * @method Phaser.Cameras.Scene2D.Effects.Zoom#update
  136969. * @since 3.11.0
  136970. *
  136971. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  136972. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  136973. */
  136974. update: function (time, delta)
  136975. {
  136976. if (!this.isRunning)
  136977. {
  136978. return;
  136979. }
  136980. this._elapsed += delta;
  136981. this.progress = Clamp(this._elapsed / this.duration, 0, 1);
  136982. if (this._elapsed < this.duration)
  136983. {
  136984. this.camera.zoom = this.source + ((this.destination - this.source) * this.ease(this.progress));
  136985. if (this._onUpdate)
  136986. {
  136987. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress, this.camera.zoom);
  136988. }
  136989. }
  136990. else
  136991. {
  136992. this.camera.zoom = this.destination;
  136993. if (this._onUpdate)
  136994. {
  136995. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress, this.destination);
  136996. }
  136997. this.effectComplete();
  136998. }
  136999. },
  137000. /**
  137001. * Called internally when the effect completes.
  137002. *
  137003. * @method Phaser.Cameras.Scene2D.Effects.Zoom#effectComplete
  137004. * @fires Phaser.Cameras.Scene2D.Events#ZOOM_COMPLETE
  137005. * @since 3.11.0
  137006. */
  137007. effectComplete: function ()
  137008. {
  137009. this._onUpdate = null;
  137010. this._onUpdateScope = null;
  137011. this.isRunning = false;
  137012. this.camera.emit(Events.ZOOM_COMPLETE, this.camera, this);
  137013. },
  137014. /**
  137015. * Resets this camera effect.
  137016. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  137017. *
  137018. * @method Phaser.Cameras.Scene2D.Effects.Zoom#reset
  137019. * @since 3.11.0
  137020. */
  137021. reset: function ()
  137022. {
  137023. this.isRunning = false;
  137024. this._onUpdate = null;
  137025. this._onUpdateScope = null;
  137026. },
  137027. /**
  137028. * Destroys this effect, releasing it from the Camera.
  137029. *
  137030. * @method Phaser.Cameras.Scene2D.Effects.Zoom#destroy
  137031. * @since 3.11.0
  137032. */
  137033. destroy: function ()
  137034. {
  137035. this.reset();
  137036. this.camera = null;
  137037. }
  137038. });
  137039. module.exports = Zoom;
  137040. /***/ }),
  137041. /* 1118 */
  137042. /***/ (function(module, exports, __webpack_require__) {
  137043. /**
  137044. * @author Richard Davey <rich@photonstorm.com>
  137045. * @copyright 2019 Photon Storm Ltd.
  137046. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137047. */
  137048. var Clamp = __webpack_require__(23);
  137049. var Class = __webpack_require__(0);
  137050. var Events = __webpack_require__(40);
  137051. var Vector2 = __webpack_require__(3);
  137052. /**
  137053. * @classdesc
  137054. * A Camera Shake effect.
  137055. *
  137056. * This effect will shake the camera viewport by a random amount, bounded by the specified intensity, each frame.
  137057. *
  137058. * Only the camera viewport is moved. None of the objects it is displaying are impacted, i.e. their positions do
  137059. * not change.
  137060. *
  137061. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  137062. * which is invoked each frame for the duration of the effect if required.
  137063. *
  137064. * @class Shake
  137065. * @memberof Phaser.Cameras.Scene2D.Effects
  137066. * @constructor
  137067. * @since 3.5.0
  137068. *
  137069. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  137070. */
  137071. var Shake = new Class({
  137072. initialize:
  137073. function Shake (camera)
  137074. {
  137075. /**
  137076. * The Camera this effect belongs to.
  137077. *
  137078. * @name Phaser.Cameras.Scene2D.Effects.Shake#camera
  137079. * @type {Phaser.Cameras.Scene2D.Camera}
  137080. * @readonly
  137081. * @since 3.5.0
  137082. */
  137083. this.camera = camera;
  137084. /**
  137085. * Is this effect actively running?
  137086. *
  137087. * @name Phaser.Cameras.Scene2D.Effects.Shake#isRunning
  137088. * @type {boolean}
  137089. * @readonly
  137090. * @default false
  137091. * @since 3.5.0
  137092. */
  137093. this.isRunning = false;
  137094. /**
  137095. * The duration of the effect, in milliseconds.
  137096. *
  137097. * @name Phaser.Cameras.Scene2D.Effects.Shake#duration
  137098. * @type {integer}
  137099. * @readonly
  137100. * @default 0
  137101. * @since 3.5.0
  137102. */
  137103. this.duration = 0;
  137104. /**
  137105. * The intensity of the effect. Use small float values. The default when the effect starts is 0.05.
  137106. * This is a Vector2 object, allowing you to control the shake intensity independently across x and y.
  137107. * You can modify this value while the effect is active to create more varied shake effects.
  137108. *
  137109. * @name Phaser.Cameras.Scene2D.Effects.Shake#intensity
  137110. * @type {Phaser.Math.Vector2}
  137111. * @since 3.5.0
  137112. */
  137113. this.intensity = new Vector2();
  137114. /**
  137115. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  137116. *
  137117. * @name Phaser.Cameras.Scene2D.Effects.Shake#progress
  137118. * @type {number}
  137119. * @since 3.5.0
  137120. */
  137121. this.progress = 0;
  137122. /**
  137123. * Effect elapsed timer.
  137124. *
  137125. * @name Phaser.Cameras.Scene2D.Effects.Shake#_elapsed
  137126. * @type {number}
  137127. * @private
  137128. * @since 3.5.0
  137129. */
  137130. this._elapsed = 0;
  137131. /**
  137132. * How much to offset the camera by horizontally.
  137133. *
  137134. * @name Phaser.Cameras.Scene2D.Effects.Shake#_offsetX
  137135. * @type {number}
  137136. * @private
  137137. * @default 0
  137138. * @since 3.0.0
  137139. */
  137140. this._offsetX = 0;
  137141. /**
  137142. * How much to offset the camera by vertically.
  137143. *
  137144. * @name Phaser.Cameras.Scene2D.Effects.Shake#_offsetY
  137145. * @type {number}
  137146. * @private
  137147. * @default 0
  137148. * @since 3.0.0
  137149. */
  137150. this._offsetY = 0;
  137151. /**
  137152. * @callback CameraShakeCallback
  137153. *
  137154. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  137155. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  137156. */
  137157. /**
  137158. * This callback is invoked every frame for the duration of the effect.
  137159. *
  137160. * @name Phaser.Cameras.Scene2D.Effects.Shake#_onUpdate
  137161. * @type {?CameraShakeCallback}
  137162. * @private
  137163. * @default null
  137164. * @since 3.5.0
  137165. */
  137166. this._onUpdate;
  137167. /**
  137168. * On Complete callback scope.
  137169. *
  137170. * @name Phaser.Cameras.Scene2D.Effects.Shake#_onUpdateScope
  137171. * @type {any}
  137172. * @private
  137173. * @since 3.5.0
  137174. */
  137175. this._onUpdateScope;
  137176. },
  137177. /**
  137178. * Shakes the Camera by the given intensity over the duration specified.
  137179. *
  137180. * @method Phaser.Cameras.Scene2D.Effects.Shake#start
  137181. * @fires Phaser.Cameras.Scene2D.Events#SHAKE_START
  137182. * @fires Phaser.Cameras.Scene2D.Events#SHAKE_COMPLETE
  137183. * @since 3.5.0
  137184. *
  137185. * @param {integer} [duration=100] - The duration of the effect in milliseconds.
  137186. * @param {number} [intensity=0.05] - The intensity of the shake.
  137187. * @param {boolean} [force=false] - Force the shake effect to start immediately, even if already running.
  137188. * @param {CameraShakeCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  137189. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  137190. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  137191. *
  137192. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  137193. */
  137194. start: function (duration, intensity, force, callback, context)
  137195. {
  137196. if (duration === undefined) { duration = 100; }
  137197. if (intensity === undefined) { intensity = 0.05; }
  137198. if (force === undefined) { force = false; }
  137199. if (callback === undefined) { callback = null; }
  137200. if (context === undefined) { context = this.camera.scene; }
  137201. if (!force && this.isRunning)
  137202. {
  137203. return this.camera;
  137204. }
  137205. this.isRunning = true;
  137206. this.duration = duration;
  137207. this.progress = 0;
  137208. if (typeof intensity === 'number')
  137209. {
  137210. this.intensity.set(intensity);
  137211. }
  137212. else
  137213. {
  137214. this.intensity.set(intensity.x, intensity.y);
  137215. }
  137216. this._elapsed = 0;
  137217. this._offsetX = 0;
  137218. this._offsetY = 0;
  137219. this._onUpdate = callback;
  137220. this._onUpdateScope = context;
  137221. this.camera.emit(Events.SHAKE_START, this.camera, this, duration, intensity);
  137222. return this.camera;
  137223. },
  137224. /**
  137225. * The pre-render step for this effect. Called automatically by the Camera.
  137226. *
  137227. * @method Phaser.Cameras.Scene2D.Effects.Shake#preRender
  137228. * @since 3.5.0
  137229. */
  137230. preRender: function ()
  137231. {
  137232. if (this.isRunning)
  137233. {
  137234. this.camera.matrix.translate(this._offsetX, this._offsetY);
  137235. }
  137236. },
  137237. /**
  137238. * The main update loop for this effect. Called automatically by the Camera.
  137239. *
  137240. * @method Phaser.Cameras.Scene2D.Effects.Shake#update
  137241. * @since 3.5.0
  137242. *
  137243. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  137244. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  137245. */
  137246. update: function (time, delta)
  137247. {
  137248. if (!this.isRunning)
  137249. {
  137250. return;
  137251. }
  137252. this._elapsed += delta;
  137253. this.progress = Clamp(this._elapsed / this.duration, 0, 1);
  137254. if (this._onUpdate)
  137255. {
  137256. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress);
  137257. }
  137258. if (this._elapsed < this.duration)
  137259. {
  137260. var intensity = this.intensity;
  137261. var width = this.camera._cw;
  137262. var height = this.camera._ch;
  137263. var zoom = this.camera.zoom;
  137264. this._offsetX = (Math.random() * intensity.x * width * 2 - intensity.x * width) * zoom;
  137265. this._offsetY = (Math.random() * intensity.y * height * 2 - intensity.y * height) * zoom;
  137266. if (this.camera.roundPixels)
  137267. {
  137268. this._offsetX = Math.round(this._offsetX);
  137269. this._offsetY = Math.round(this._offsetY);
  137270. }
  137271. }
  137272. else
  137273. {
  137274. this.effectComplete();
  137275. }
  137276. },
  137277. /**
  137278. * Called internally when the effect completes.
  137279. *
  137280. * @method Phaser.Cameras.Scene2D.Effects.Shake#effectComplete
  137281. * @fires Phaser.Cameras.Scene2D.Events#SHAKE_COMPLETE
  137282. * @since 3.5.0
  137283. */
  137284. effectComplete: function ()
  137285. {
  137286. this._offsetX = 0;
  137287. this._offsetY = 0;
  137288. this._onUpdate = null;
  137289. this._onUpdateScope = null;
  137290. this.isRunning = false;
  137291. this.camera.emit(Events.SHAKE_COMPLETE, this.camera, this);
  137292. },
  137293. /**
  137294. * Resets this camera effect.
  137295. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  137296. *
  137297. * @method Phaser.Cameras.Scene2D.Effects.Shake#reset
  137298. * @since 3.5.0
  137299. */
  137300. reset: function ()
  137301. {
  137302. this.isRunning = false;
  137303. this._offsetX = 0;
  137304. this._offsetY = 0;
  137305. this._onUpdate = null;
  137306. this._onUpdateScope = null;
  137307. },
  137308. /**
  137309. * Destroys this effect, releasing it from the Camera.
  137310. *
  137311. * @method Phaser.Cameras.Scene2D.Effects.Shake#destroy
  137312. * @since 3.5.0
  137313. */
  137314. destroy: function ()
  137315. {
  137316. this.reset();
  137317. this.camera = null;
  137318. this.intensity = null;
  137319. }
  137320. });
  137321. module.exports = Shake;
  137322. /***/ }),
  137323. /* 1119 */
  137324. /***/ (function(module, exports) {
  137325. /**
  137326. * @author Richard Davey <rich@photonstorm.com>
  137327. * @copyright 2019 Photon Storm Ltd.
  137328. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137329. */
  137330. /**
  137331. * Stepped easing.
  137332. *
  137333. * @function Phaser.Math.Easing.Stepped.Stepped
  137334. * @since 3.0.0
  137335. *
  137336. * @param {number} v - The value to be tweened.
  137337. * @param {number} [steps=1] - The number of steps in the ease.
  137338. *
  137339. * @return {number} The tweened value.
  137340. */
  137341. var Stepped = function (v, steps)
  137342. {
  137343. if (steps === undefined) { steps = 1; }
  137344. if (v <= 0)
  137345. {
  137346. return 0;
  137347. }
  137348. else if (v >= 1)
  137349. {
  137350. return 1;
  137351. }
  137352. else
  137353. {
  137354. return (((steps * v) | 0) + 1) * (1 / steps);
  137355. }
  137356. };
  137357. module.exports = Stepped;
  137358. /***/ }),
  137359. /* 1120 */
  137360. /***/ (function(module, exports) {
  137361. /**
  137362. * @author Richard Davey <rich@photonstorm.com>
  137363. * @copyright 2019 Photon Storm Ltd.
  137364. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137365. */
  137366. /**
  137367. * Sinusoidal ease-in/out.
  137368. *
  137369. * @function Phaser.Math.Easing.Sine.InOut
  137370. * @since 3.0.0
  137371. *
  137372. * @param {number} v - The value to be tweened.
  137373. *
  137374. * @return {number} The tweened value.
  137375. */
  137376. var InOut = function (v)
  137377. {
  137378. if (v === 0)
  137379. {
  137380. return 0;
  137381. }
  137382. else if (v === 1)
  137383. {
  137384. return 1;
  137385. }
  137386. else
  137387. {
  137388. return 0.5 * (1 - Math.cos(Math.PI * v));
  137389. }
  137390. };
  137391. module.exports = InOut;
  137392. /***/ }),
  137393. /* 1121 */
  137394. /***/ (function(module, exports) {
  137395. /**
  137396. * @author Richard Davey <rich@photonstorm.com>
  137397. * @copyright 2019 Photon Storm Ltd.
  137398. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137399. */
  137400. /**
  137401. * Sinusoidal ease-out.
  137402. *
  137403. * @function Phaser.Math.Easing.Sine.Out
  137404. * @since 3.0.0
  137405. *
  137406. * @param {number} v - The value to be tweened.
  137407. *
  137408. * @return {number} The tweened value.
  137409. */
  137410. var Out = function (v)
  137411. {
  137412. if (v === 0)
  137413. {
  137414. return 0;
  137415. }
  137416. else if (v === 1)
  137417. {
  137418. return 1;
  137419. }
  137420. else
  137421. {
  137422. return Math.sin(v * Math.PI / 2);
  137423. }
  137424. };
  137425. module.exports = Out;
  137426. /***/ }),
  137427. /* 1122 */
  137428. /***/ (function(module, exports) {
  137429. /**
  137430. * @author Richard Davey <rich@photonstorm.com>
  137431. * @copyright 2019 Photon Storm Ltd.
  137432. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137433. */
  137434. /**
  137435. * Sinusoidal ease-in.
  137436. *
  137437. * @function Phaser.Math.Easing.Sine.In
  137438. * @since 3.0.0
  137439. *
  137440. * @param {number} v - The value to be tweened.
  137441. *
  137442. * @return {number} The tweened value.
  137443. */
  137444. var In = function (v)
  137445. {
  137446. if (v === 0)
  137447. {
  137448. return 0;
  137449. }
  137450. else if (v === 1)
  137451. {
  137452. return 1;
  137453. }
  137454. else
  137455. {
  137456. return 1 - Math.cos(v * Math.PI / 2);
  137457. }
  137458. };
  137459. module.exports = In;
  137460. /***/ }),
  137461. /* 1123 */
  137462. /***/ (function(module, exports) {
  137463. /**
  137464. * @author Richard Davey <rich@photonstorm.com>
  137465. * @copyright 2019 Photon Storm Ltd.
  137466. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137467. */
  137468. /**
  137469. * Quintic ease-in/out.
  137470. *
  137471. * @function Phaser.Math.Easing.Quintic.InOut
  137472. * @since 3.0.0
  137473. *
  137474. * @param {number} v - The value to be tweened.
  137475. *
  137476. * @return {number} The tweened value.
  137477. */
  137478. var InOut = function (v)
  137479. {
  137480. if ((v *= 2) < 1)
  137481. {
  137482. return 0.5 * v * v * v * v * v;
  137483. }
  137484. else
  137485. {
  137486. return 0.5 * ((v -= 2) * v * v * v * v + 2);
  137487. }
  137488. };
  137489. module.exports = InOut;
  137490. /***/ }),
  137491. /* 1124 */
  137492. /***/ (function(module, exports) {
  137493. /**
  137494. * @author Richard Davey <rich@photonstorm.com>
  137495. * @copyright 2019 Photon Storm Ltd.
  137496. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137497. */
  137498. /**
  137499. * Quintic ease-out.
  137500. *
  137501. * @function Phaser.Math.Easing.Quintic.Out
  137502. * @since 3.0.0
  137503. *
  137504. * @param {number} v - The value to be tweened.
  137505. *
  137506. * @return {number} The tweened value.
  137507. */
  137508. var Out = function (v)
  137509. {
  137510. return --v * v * v * v * v + 1;
  137511. };
  137512. module.exports = Out;
  137513. /***/ }),
  137514. /* 1125 */
  137515. /***/ (function(module, exports) {
  137516. /**
  137517. * @author Richard Davey <rich@photonstorm.com>
  137518. * @copyright 2019 Photon Storm Ltd.
  137519. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137520. */
  137521. /**
  137522. * Quintic ease-in.
  137523. *
  137524. * @function Phaser.Math.Easing.Quintic.In
  137525. * @since 3.0.0
  137526. *
  137527. * @param {number} v - The value to be tweened.
  137528. *
  137529. * @return {number} The tweened value.
  137530. */
  137531. var In = function (v)
  137532. {
  137533. return v * v * v * v * v;
  137534. };
  137535. module.exports = In;
  137536. /***/ }),
  137537. /* 1126 */
  137538. /***/ (function(module, exports) {
  137539. /**
  137540. * @author Richard Davey <rich@photonstorm.com>
  137541. * @copyright 2019 Photon Storm Ltd.
  137542. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137543. */
  137544. /**
  137545. * Quartic ease-in/out.
  137546. *
  137547. * @function Phaser.Math.Easing.Quartic.InOut
  137548. * @since 3.0.0
  137549. *
  137550. * @param {number} v - The value to be tweened.
  137551. *
  137552. * @return {number} The tweened value.
  137553. */
  137554. var InOut = function (v)
  137555. {
  137556. if ((v *= 2) < 1)
  137557. {
  137558. return 0.5 * v * v * v * v;
  137559. }
  137560. else
  137561. {
  137562. return -0.5 * ((v -= 2) * v * v * v - 2);
  137563. }
  137564. };
  137565. module.exports = InOut;
  137566. /***/ }),
  137567. /* 1127 */
  137568. /***/ (function(module, exports) {
  137569. /**
  137570. * @author Richard Davey <rich@photonstorm.com>
  137571. * @copyright 2019 Photon Storm Ltd.
  137572. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137573. */
  137574. /**
  137575. * Quartic ease-out.
  137576. *
  137577. * @function Phaser.Math.Easing.Quartic.Out
  137578. * @since 3.0.0
  137579. *
  137580. * @param {number} v - The value to be tweened.
  137581. *
  137582. * @return {number} The tweened value.
  137583. */
  137584. var Out = function (v)
  137585. {
  137586. return 1 - (--v * v * v * v);
  137587. };
  137588. module.exports = Out;
  137589. /***/ }),
  137590. /* 1128 */
  137591. /***/ (function(module, exports) {
  137592. /**
  137593. * @author Richard Davey <rich@photonstorm.com>
  137594. * @copyright 2019 Photon Storm Ltd.
  137595. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137596. */
  137597. /**
  137598. * Quartic ease-in.
  137599. *
  137600. * @function Phaser.Math.Easing.Quartic.In
  137601. * @since 3.0.0
  137602. *
  137603. * @param {number} v - The value to be tweened.
  137604. *
  137605. * @return {number} The tweened value.
  137606. */
  137607. var In = function (v)
  137608. {
  137609. return v * v * v * v;
  137610. };
  137611. module.exports = In;
  137612. /***/ }),
  137613. /* 1129 */
  137614. /***/ (function(module, exports) {
  137615. /**
  137616. * @author Richard Davey <rich@photonstorm.com>
  137617. * @copyright 2019 Photon Storm Ltd.
  137618. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137619. */
  137620. /**
  137621. * Quadratic ease-in/out.
  137622. *
  137623. * @function Phaser.Math.Easing.Quadratic.InOut
  137624. * @since 3.0.0
  137625. *
  137626. * @param {number} v - The value to be tweened.
  137627. *
  137628. * @return {number} The tweened value.
  137629. */
  137630. var InOut = function (v)
  137631. {
  137632. if ((v *= 2) < 1)
  137633. {
  137634. return 0.5 * v * v;
  137635. }
  137636. else
  137637. {
  137638. return -0.5 * (--v * (v - 2) - 1);
  137639. }
  137640. };
  137641. module.exports = InOut;
  137642. /***/ }),
  137643. /* 1130 */
  137644. /***/ (function(module, exports) {
  137645. /**
  137646. * @author Richard Davey <rich@photonstorm.com>
  137647. * @copyright 2019 Photon Storm Ltd.
  137648. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137649. */
  137650. /**
  137651. * Quadratic ease-out.
  137652. *
  137653. * @function Phaser.Math.Easing.Quadratic.Out
  137654. * @since 3.0.0
  137655. *
  137656. * @param {number} v - The value to be tweened.
  137657. *
  137658. * @return {number} The tweened value.
  137659. */
  137660. var Out = function (v)
  137661. {
  137662. return v * (2 - v);
  137663. };
  137664. module.exports = Out;
  137665. /***/ }),
  137666. /* 1131 */
  137667. /***/ (function(module, exports) {
  137668. /**
  137669. * @author Richard Davey <rich@photonstorm.com>
  137670. * @copyright 2019 Photon Storm Ltd.
  137671. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137672. */
  137673. /**
  137674. * Quadratic ease-in.
  137675. *
  137676. * @function Phaser.Math.Easing.Quadratic.In
  137677. * @since 3.0.0
  137678. *
  137679. * @param {number} v - The value to be tweened.
  137680. *
  137681. * @return {number} The tweened value.
  137682. */
  137683. var In = function (v)
  137684. {
  137685. return v * v;
  137686. };
  137687. module.exports = In;
  137688. /***/ }),
  137689. /* 1132 */
  137690. /***/ (function(module, exports) {
  137691. /**
  137692. * @author Richard Davey <rich@photonstorm.com>
  137693. * @copyright 2019 Photon Storm Ltd.
  137694. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137695. */
  137696. /**
  137697. * Linear easing (no variation).
  137698. *
  137699. * @function Phaser.Math.Easing.Linear.Linear
  137700. * @since 3.0.0
  137701. *
  137702. * @param {number} v - The value to be tweened.
  137703. *
  137704. * @return {number} The tweened value.
  137705. */
  137706. var Linear = function (v)
  137707. {
  137708. return v;
  137709. };
  137710. module.exports = Linear;
  137711. /***/ }),
  137712. /* 1133 */
  137713. /***/ (function(module, exports) {
  137714. /**
  137715. * @author Richard Davey <rich@photonstorm.com>
  137716. * @copyright 2019 Photon Storm Ltd.
  137717. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137718. */
  137719. /**
  137720. * Exponential ease-in/out.
  137721. *
  137722. * @function Phaser.Math.Easing.Expo.InOut
  137723. * @since 3.0.0
  137724. *
  137725. * @param {number} v - The value to be tweened.
  137726. *
  137727. * @return {number} The tweened value.
  137728. */
  137729. var InOut = function (v)
  137730. {
  137731. if ((v *= 2) < 1)
  137732. {
  137733. return 0.5 * Math.pow(2, 10 * (v - 1));
  137734. }
  137735. else
  137736. {
  137737. return 0.5 * (2 - Math.pow(2, -10 * (v - 1)));
  137738. }
  137739. };
  137740. module.exports = InOut;
  137741. /***/ }),
  137742. /* 1134 */
  137743. /***/ (function(module, exports) {
  137744. /**
  137745. * @author Richard Davey <rich@photonstorm.com>
  137746. * @copyright 2019 Photon Storm Ltd.
  137747. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137748. */
  137749. /**
  137750. * Exponential ease-out.
  137751. *
  137752. * @function Phaser.Math.Easing.Expo.Out
  137753. * @since 3.0.0
  137754. *
  137755. * @param {number} v - The value to be tweened.
  137756. *
  137757. * @return {number} The tweened value.
  137758. */
  137759. var Out = function (v)
  137760. {
  137761. return 1 - Math.pow(2, -10 * v);
  137762. };
  137763. module.exports = Out;
  137764. /***/ }),
  137765. /* 1135 */
  137766. /***/ (function(module, exports) {
  137767. /**
  137768. * @author Richard Davey <rich@photonstorm.com>
  137769. * @copyright 2019 Photon Storm Ltd.
  137770. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137771. */
  137772. /**
  137773. * Exponential ease-in.
  137774. *
  137775. * @function Phaser.Math.Easing.Expo.In
  137776. * @since 3.0.0
  137777. *
  137778. * @param {number} v - The value to be tweened.
  137779. *
  137780. * @return {number} The tweened value.
  137781. */
  137782. var In = function (v)
  137783. {
  137784. return Math.pow(2, 10 * (v - 1)) - 0.001;
  137785. };
  137786. module.exports = In;
  137787. /***/ }),
  137788. /* 1136 */
  137789. /***/ (function(module, exports) {
  137790. /**
  137791. * @author Richard Davey <rich@photonstorm.com>
  137792. * @copyright 2019 Photon Storm Ltd.
  137793. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137794. */
  137795. /**
  137796. * Elastic ease-in/out.
  137797. *
  137798. * @function Phaser.Math.Easing.Elastic.InOut
  137799. * @since 3.0.0
  137800. *
  137801. * @param {number} v - The value to be tweened.
  137802. * @param {number} [amplitude=0.1] - The amplitude of the elastic ease.
  137803. * @param {number} [period=0.1] - Sets how tight the sine-wave is, where smaller values are tighter waves, which result in more cycles.
  137804. *
  137805. * @return {number} The tweened value.
  137806. */
  137807. var InOut = function (v, amplitude, period)
  137808. {
  137809. if (amplitude === undefined) { amplitude = 0.1; }
  137810. if (period === undefined) { period = 0.1; }
  137811. if (v === 0)
  137812. {
  137813. return 0;
  137814. }
  137815. else if (v === 1)
  137816. {
  137817. return 1;
  137818. }
  137819. else
  137820. {
  137821. var s = period / 4;
  137822. if (amplitude < 1)
  137823. {
  137824. amplitude = 1;
  137825. }
  137826. else
  137827. {
  137828. s = period * Math.asin(1 / amplitude) / (2 * Math.PI);
  137829. }
  137830. if ((v *= 2) < 1)
  137831. {
  137832. return -0.5 * (amplitude * Math.pow(2, 10 * (v -= 1)) * Math.sin((v - s) * (2 * Math.PI) / period));
  137833. }
  137834. else
  137835. {
  137836. return amplitude * Math.pow(2, -10 * (v -= 1)) * Math.sin((v - s) * (2 * Math.PI) / period) * 0.5 + 1;
  137837. }
  137838. }
  137839. };
  137840. module.exports = InOut;
  137841. /***/ }),
  137842. /* 1137 */
  137843. /***/ (function(module, exports) {
  137844. /**
  137845. * @author Richard Davey <rich@photonstorm.com>
  137846. * @copyright 2019 Photon Storm Ltd.
  137847. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137848. */
  137849. /**
  137850. * Elastic ease-out.
  137851. *
  137852. * @function Phaser.Math.Easing.Elastic.Out
  137853. * @since 3.0.0
  137854. *
  137855. * @param {number} v - The value to be tweened.
  137856. * @param {number} [amplitude=0.1] - The amplitude of the elastic ease.
  137857. * @param {number} [period=0.1] - Sets how tight the sine-wave is, where smaller values are tighter waves, which result in more cycles.
  137858. *
  137859. * @return {number} The tweened value.
  137860. */
  137861. var Out = function (v, amplitude, period)
  137862. {
  137863. if (amplitude === undefined) { amplitude = 0.1; }
  137864. if (period === undefined) { period = 0.1; }
  137865. if (v === 0)
  137866. {
  137867. return 0;
  137868. }
  137869. else if (v === 1)
  137870. {
  137871. return 1;
  137872. }
  137873. else
  137874. {
  137875. var s = period / 4;
  137876. if (amplitude < 1)
  137877. {
  137878. amplitude = 1;
  137879. }
  137880. else
  137881. {
  137882. s = period * Math.asin(1 / amplitude) / (2 * Math.PI);
  137883. }
  137884. return (amplitude * Math.pow(2, -10 * v) * Math.sin((v - s) * (2 * Math.PI) / period) + 1);
  137885. }
  137886. };
  137887. module.exports = Out;
  137888. /***/ }),
  137889. /* 1138 */
  137890. /***/ (function(module, exports) {
  137891. /**
  137892. * @author Richard Davey <rich@photonstorm.com>
  137893. * @copyright 2019 Photon Storm Ltd.
  137894. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137895. */
  137896. /**
  137897. * Elastic ease-in.
  137898. *
  137899. * @function Phaser.Math.Easing.Elastic.In
  137900. * @since 3.0.0
  137901. *
  137902. * @param {number} v - The value to be tweened.
  137903. * @param {number} [amplitude=0.1] - The amplitude of the elastic ease.
  137904. * @param {number} [period=0.1] - Sets how tight the sine-wave is, where smaller values are tighter waves, which result in more cycles.
  137905. *
  137906. * @return {number} The tweened value.
  137907. */
  137908. var In = function (v, amplitude, period)
  137909. {
  137910. if (amplitude === undefined) { amplitude = 0.1; }
  137911. if (period === undefined) { period = 0.1; }
  137912. if (v === 0)
  137913. {
  137914. return 0;
  137915. }
  137916. else if (v === 1)
  137917. {
  137918. return 1;
  137919. }
  137920. else
  137921. {
  137922. var s = period / 4;
  137923. if (amplitude < 1)
  137924. {
  137925. amplitude = 1;
  137926. }
  137927. else
  137928. {
  137929. s = period * Math.asin(1 / amplitude) / (2 * Math.PI);
  137930. }
  137931. return -(amplitude * Math.pow(2, 10 * (v -= 1)) * Math.sin((v - s) * (2 * Math.PI) / period));
  137932. }
  137933. };
  137934. module.exports = In;
  137935. /***/ }),
  137936. /* 1139 */
  137937. /***/ (function(module, exports) {
  137938. /**
  137939. * @author Richard Davey <rich@photonstorm.com>
  137940. * @copyright 2019 Photon Storm Ltd.
  137941. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137942. */
  137943. /**
  137944. * Cubic ease-in/out.
  137945. *
  137946. * @function Phaser.Math.Easing.Cubic.InOut
  137947. * @since 3.0.0
  137948. *
  137949. * @param {number} v - The value to be tweened.
  137950. *
  137951. * @return {number} The tweened value.
  137952. */
  137953. var InOut = function (v)
  137954. {
  137955. if ((v *= 2) < 1)
  137956. {
  137957. return 0.5 * v * v * v;
  137958. }
  137959. else
  137960. {
  137961. return 0.5 * ((v -= 2) * v * v + 2);
  137962. }
  137963. };
  137964. module.exports = InOut;
  137965. /***/ }),
  137966. /* 1140 */
  137967. /***/ (function(module, exports) {
  137968. /**
  137969. * @author Richard Davey <rich@photonstorm.com>
  137970. * @copyright 2019 Photon Storm Ltd.
  137971. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137972. */
  137973. /**
  137974. * Cubic ease-out.
  137975. *
  137976. * @function Phaser.Math.Easing.Cubic.Out
  137977. * @since 3.0.0
  137978. *
  137979. * @param {number} v - The value to be tweened.
  137980. *
  137981. * @return {number} The tweened value.
  137982. */
  137983. var Out = function (v)
  137984. {
  137985. return --v * v * v + 1;
  137986. };
  137987. module.exports = Out;
  137988. /***/ }),
  137989. /* 1141 */
  137990. /***/ (function(module, exports) {
  137991. /**
  137992. * @author Richard Davey <rich@photonstorm.com>
  137993. * @copyright 2019 Photon Storm Ltd.
  137994. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  137995. */
  137996. /**
  137997. * Cubic ease-in.
  137998. *
  137999. * @function Phaser.Math.Easing.Cubic.In
  138000. * @since 3.0.0
  138001. *
  138002. * @param {number} v - The value to be tweened.
  138003. *
  138004. * @return {number} The tweened value.
  138005. */
  138006. var In = function (v)
  138007. {
  138008. return v * v * v;
  138009. };
  138010. module.exports = In;
  138011. /***/ }),
  138012. /* 1142 */
  138013. /***/ (function(module, exports) {
  138014. /**
  138015. * @author Richard Davey <rich@photonstorm.com>
  138016. * @copyright 2019 Photon Storm Ltd.
  138017. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138018. */
  138019. /**
  138020. * Circular ease-in/out.
  138021. *
  138022. * @function Phaser.Math.Easing.Circular.InOut
  138023. * @since 3.0.0
  138024. *
  138025. * @param {number} v - The value to be tweened.
  138026. *
  138027. * @return {number} The tweened value.
  138028. */
  138029. var InOut = function (v)
  138030. {
  138031. if ((v *= 2) < 1)
  138032. {
  138033. return -0.5 * (Math.sqrt(1 - v * v) - 1);
  138034. }
  138035. else
  138036. {
  138037. return 0.5 * (Math.sqrt(1 - (v -= 2) * v) + 1);
  138038. }
  138039. };
  138040. module.exports = InOut;
  138041. /***/ }),
  138042. /* 1143 */
  138043. /***/ (function(module, exports) {
  138044. /**
  138045. * @author Richard Davey <rich@photonstorm.com>
  138046. * @copyright 2019 Photon Storm Ltd.
  138047. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138048. */
  138049. /**
  138050. * Circular ease-out.
  138051. *
  138052. * @function Phaser.Math.Easing.Circular.Out
  138053. * @since 3.0.0
  138054. *
  138055. * @param {number} v - The value to be tweened.
  138056. *
  138057. * @return {number} The tweened value.
  138058. */
  138059. var Out = function (v)
  138060. {
  138061. return Math.sqrt(1 - (--v * v));
  138062. };
  138063. module.exports = Out;
  138064. /***/ }),
  138065. /* 1144 */
  138066. /***/ (function(module, exports) {
  138067. /**
  138068. * @author Richard Davey <rich@photonstorm.com>
  138069. * @copyright 2019 Photon Storm Ltd.
  138070. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138071. */
  138072. /**
  138073. * Circular ease-in.
  138074. *
  138075. * @function Phaser.Math.Easing.Circular.In
  138076. * @since 3.0.0
  138077. *
  138078. * @param {number} v - The value to be tweened.
  138079. *
  138080. * @return {number} The tweened value.
  138081. */
  138082. var In = function (v)
  138083. {
  138084. return 1 - Math.sqrt(1 - v * v);
  138085. };
  138086. module.exports = In;
  138087. /***/ }),
  138088. /* 1145 */
  138089. /***/ (function(module, exports) {
  138090. /**
  138091. * @author Richard Davey <rich@photonstorm.com>
  138092. * @copyright 2019 Photon Storm Ltd.
  138093. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138094. */
  138095. /**
  138096. * Bounce ease-in/out.
  138097. *
  138098. * @function Phaser.Math.Easing.Bounce.InOut
  138099. * @since 3.0.0
  138100. *
  138101. * @param {number} v - The value to be tweened.
  138102. *
  138103. * @return {number} The tweened value.
  138104. */
  138105. var InOut = function (v)
  138106. {
  138107. var reverse = false;
  138108. if (v < 0.5)
  138109. {
  138110. v = 1 - (v * 2);
  138111. reverse = true;
  138112. }
  138113. else
  138114. {
  138115. v = (v * 2) - 1;
  138116. }
  138117. if (v < 1 / 2.75)
  138118. {
  138119. v = 7.5625 * v * v;
  138120. }
  138121. else if (v < 2 / 2.75)
  138122. {
  138123. v = 7.5625 * (v -= 1.5 / 2.75) * v + 0.75;
  138124. }
  138125. else if (v < 2.5 / 2.75)
  138126. {
  138127. v = 7.5625 * (v -= 2.25 / 2.75) * v + 0.9375;
  138128. }
  138129. else
  138130. {
  138131. v = 7.5625 * (v -= 2.625 / 2.75) * v + 0.984375;
  138132. }
  138133. if (reverse)
  138134. {
  138135. return (1 - v) * 0.5;
  138136. }
  138137. else
  138138. {
  138139. return v * 0.5 + 0.5;
  138140. }
  138141. };
  138142. module.exports = InOut;
  138143. /***/ }),
  138144. /* 1146 */
  138145. /***/ (function(module, exports) {
  138146. /**
  138147. * @author Richard Davey <rich@photonstorm.com>
  138148. * @copyright 2019 Photon Storm Ltd.
  138149. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138150. */
  138151. /**
  138152. * Bounce ease-out.
  138153. *
  138154. * @function Phaser.Math.Easing.Bounce.Out
  138155. * @since 3.0.0
  138156. *
  138157. * @param {number} v - The value to be tweened.
  138158. *
  138159. * @return {number} The tweened value.
  138160. */
  138161. var Out = function (v)
  138162. {
  138163. if (v < 1 / 2.75)
  138164. {
  138165. return 7.5625 * v * v;
  138166. }
  138167. else if (v < 2 / 2.75)
  138168. {
  138169. return 7.5625 * (v -= 1.5 / 2.75) * v + 0.75;
  138170. }
  138171. else if (v < 2.5 / 2.75)
  138172. {
  138173. return 7.5625 * (v -= 2.25 / 2.75) * v + 0.9375;
  138174. }
  138175. else
  138176. {
  138177. return 7.5625 * (v -= 2.625 / 2.75) * v + 0.984375;
  138178. }
  138179. };
  138180. module.exports = Out;
  138181. /***/ }),
  138182. /* 1147 */
  138183. /***/ (function(module, exports) {
  138184. /**
  138185. * @author Richard Davey <rich@photonstorm.com>
  138186. * @copyright 2019 Photon Storm Ltd.
  138187. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138188. */
  138189. /**
  138190. * Bounce ease-in.
  138191. *
  138192. * @function Phaser.Math.Easing.Bounce.In
  138193. * @since 3.0.0
  138194. *
  138195. * @param {number} v - The value to be tweened.
  138196. *
  138197. * @return {number} The tweened value.
  138198. */
  138199. var In = function (v)
  138200. {
  138201. v = 1 - v;
  138202. if (v < 1 / 2.75)
  138203. {
  138204. return 1 - (7.5625 * v * v);
  138205. }
  138206. else if (v < 2 / 2.75)
  138207. {
  138208. return 1 - (7.5625 * (v -= 1.5 / 2.75) * v + 0.75);
  138209. }
  138210. else if (v < 2.5 / 2.75)
  138211. {
  138212. return 1 - (7.5625 * (v -= 2.25 / 2.75) * v + 0.9375);
  138213. }
  138214. else
  138215. {
  138216. return 1 - (7.5625 * (v -= 2.625 / 2.75) * v + 0.984375);
  138217. }
  138218. };
  138219. module.exports = In;
  138220. /***/ }),
  138221. /* 1148 */
  138222. /***/ (function(module, exports) {
  138223. /**
  138224. * @author Richard Davey <rich@photonstorm.com>
  138225. * @copyright 2019 Photon Storm Ltd.
  138226. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138227. */
  138228. /**
  138229. * Back ease-in/out.
  138230. *
  138231. * @function Phaser.Math.Easing.Back.InOut
  138232. * @since 3.0.0
  138233. *
  138234. * @param {number} v - The value to be tweened.
  138235. * @param {number} [overshoot=1.70158] - The overshoot amount.
  138236. *
  138237. * @return {number} The tweened value.
  138238. */
  138239. var InOut = function (v, overshoot)
  138240. {
  138241. if (overshoot === undefined) { overshoot = 1.70158; }
  138242. var s = overshoot * 1.525;
  138243. if ((v *= 2) < 1)
  138244. {
  138245. return 0.5 * (v * v * ((s + 1) * v - s));
  138246. }
  138247. else
  138248. {
  138249. return 0.5 * ((v -= 2) * v * ((s + 1) * v + s) + 2);
  138250. }
  138251. };
  138252. module.exports = InOut;
  138253. /***/ }),
  138254. /* 1149 */
  138255. /***/ (function(module, exports) {
  138256. /**
  138257. * @author Richard Davey <rich@photonstorm.com>
  138258. * @copyright 2019 Photon Storm Ltd.
  138259. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138260. */
  138261. /**
  138262. * Back ease-out.
  138263. *
  138264. * @function Phaser.Math.Easing.Back.Out
  138265. * @since 3.0.0
  138266. *
  138267. * @param {number} v - The value to be tweened.
  138268. * @param {number} [overshoot=1.70158] - The overshoot amount.
  138269. *
  138270. * @return {number} The tweened value.
  138271. */
  138272. var Out = function (v, overshoot)
  138273. {
  138274. if (overshoot === undefined) { overshoot = 1.70158; }
  138275. return --v * v * ((overshoot + 1) * v + overshoot) + 1;
  138276. };
  138277. module.exports = Out;
  138278. /***/ }),
  138279. /* 1150 */
  138280. /***/ (function(module, exports) {
  138281. /**
  138282. * @author Richard Davey <rich@photonstorm.com>
  138283. * @copyright 2019 Photon Storm Ltd.
  138284. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138285. */
  138286. /**
  138287. * Back ease-in.
  138288. *
  138289. * @function Phaser.Math.Easing.Back.In
  138290. * @since 3.0.0
  138291. *
  138292. * @param {number} v - The value to be tweened.
  138293. * @param {number} [overshoot=1.70158] - The overshoot amount.
  138294. *
  138295. * @return {number} The tweened value.
  138296. */
  138297. var In = function (v, overshoot)
  138298. {
  138299. if (overshoot === undefined) { overshoot = 1.70158; }
  138300. return v * v * ((overshoot + 1) * v - overshoot);
  138301. };
  138302. module.exports = In;
  138303. /***/ }),
  138304. /* 1151 */
  138305. /***/ (function(module, exports, __webpack_require__) {
  138306. /**
  138307. * @author Richard Davey <rich@photonstorm.com>
  138308. * @copyright 2019 Photon Storm Ltd.
  138309. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138310. */
  138311. var Clamp = __webpack_require__(23);
  138312. var Class = __webpack_require__(0);
  138313. var EaseMap = __webpack_require__(188);
  138314. var Events = __webpack_require__(40);
  138315. var Vector2 = __webpack_require__(3);
  138316. /**
  138317. * @classdesc
  138318. * A Camera Pan effect.
  138319. *
  138320. * This effect will scroll the Camera so that the center of its viewport finishes at the given destination,
  138321. * over the duration and with the ease specified.
  138322. *
  138323. * Only the camera scroll is moved. None of the objects it is displaying are impacted, i.e. their positions do
  138324. * not change.
  138325. *
  138326. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  138327. * which is invoked each frame for the duration of the effect if required.
  138328. *
  138329. * @class Pan
  138330. * @memberof Phaser.Cameras.Scene2D.Effects
  138331. * @constructor
  138332. * @since 3.11.0
  138333. *
  138334. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  138335. */
  138336. var Pan = new Class({
  138337. initialize:
  138338. function Pan (camera)
  138339. {
  138340. /**
  138341. * The Camera this effect belongs to.
  138342. *
  138343. * @name Phaser.Cameras.Scene2D.Effects.Pan#camera
  138344. * @type {Phaser.Cameras.Scene2D.Camera}
  138345. * @readonly
  138346. * @since 3.11.0
  138347. */
  138348. this.camera = camera;
  138349. /**
  138350. * Is this effect actively running?
  138351. *
  138352. * @name Phaser.Cameras.Scene2D.Effects.Pan#isRunning
  138353. * @type {boolean}
  138354. * @readonly
  138355. * @default false
  138356. * @since 3.11.0
  138357. */
  138358. this.isRunning = false;
  138359. /**
  138360. * The duration of the effect, in milliseconds.
  138361. *
  138362. * @name Phaser.Cameras.Scene2D.Effects.Pan#duration
  138363. * @type {integer}
  138364. * @readonly
  138365. * @default 0
  138366. * @since 3.11.0
  138367. */
  138368. this.duration = 0;
  138369. /**
  138370. * The starting scroll coordinates to pan the camera from.
  138371. *
  138372. * @name Phaser.Cameras.Scene2D.Effects.Pan#source
  138373. * @type {Phaser.Math.Vector2}
  138374. * @since 3.11.0
  138375. */
  138376. this.source = new Vector2();
  138377. /**
  138378. * The constantly updated value based on zoom.
  138379. *
  138380. * @name Phaser.Cameras.Scene2D.Effects.Pan#current
  138381. * @type {Phaser.Math.Vector2}
  138382. * @since 3.11.0
  138383. */
  138384. this.current = new Vector2();
  138385. /**
  138386. * The destination scroll coordinates to pan the camera to.
  138387. *
  138388. * @name Phaser.Cameras.Scene2D.Effects.Pan#destination
  138389. * @type {Phaser.Math.Vector2}
  138390. * @since 3.11.0
  138391. */
  138392. this.destination = new Vector2();
  138393. /**
  138394. * The ease function to use during the pan.
  138395. *
  138396. * @name Phaser.Cameras.Scene2D.Effects.Pan#ease
  138397. * @type {function}
  138398. * @since 3.11.0
  138399. */
  138400. this.ease;
  138401. /**
  138402. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  138403. *
  138404. * @name Phaser.Cameras.Scene2D.Effects.Pan#progress
  138405. * @type {number}
  138406. * @since 3.11.0
  138407. */
  138408. this.progress = 0;
  138409. /**
  138410. * Effect elapsed timer.
  138411. *
  138412. * @name Phaser.Cameras.Scene2D.Effects.Pan#_elapsed
  138413. * @type {number}
  138414. * @private
  138415. * @since 3.11.0
  138416. */
  138417. this._elapsed = 0;
  138418. /**
  138419. * @callback CameraPanCallback
  138420. *
  138421. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  138422. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  138423. * @param {number} x - The Camera's new scrollX coordinate.
  138424. * @param {number} y - The Camera's new scrollY coordinate.
  138425. */
  138426. /**
  138427. * This callback is invoked every frame for the duration of the effect.
  138428. *
  138429. * @name Phaser.Cameras.Scene2D.Effects.Pan#_onUpdate
  138430. * @type {?CameraPanCallback}
  138431. * @private
  138432. * @default null
  138433. * @since 3.11.0
  138434. */
  138435. this._onUpdate;
  138436. /**
  138437. * On Complete callback scope.
  138438. *
  138439. * @name Phaser.Cameras.Scene2D.Effects.Pan#_onUpdateScope
  138440. * @type {any}
  138441. * @private
  138442. * @since 3.11.0
  138443. */
  138444. this._onUpdateScope;
  138445. },
  138446. /**
  138447. * This effect will scroll the Camera so that the center of its viewport finishes at the given destination,
  138448. * over the duration and with the ease specified.
  138449. *
  138450. * @method Phaser.Cameras.Scene2D.Effects.Pan#start
  138451. * @fires Phaser.Cameras.Scene2D.Events#PAN_START
  138452. * @fires Phaser.Cameras.Scene2D.Events#PAN_COMPLETE
  138453. * @since 3.11.0
  138454. *
  138455. * @param {number} x - The destination x coordinate to scroll the center of the Camera viewport to.
  138456. * @param {number} y - The destination y coordinate to scroll the center of the Camera viewport to.
  138457. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  138458. * @param {(string|function)} [ease='Linear'] - The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function.
  138459. * @param {boolean} [force=false] - Force the pan effect to start immediately, even if already running.
  138460. * @param {CameraPanCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  138461. * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is,
  138462. * the current camera scroll x coordinate and the current camera scroll y coordinate.
  138463. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  138464. *
  138465. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  138466. */
  138467. start: function (x, y, duration, ease, force, callback, context)
  138468. {
  138469. if (duration === undefined) { duration = 1000; }
  138470. if (ease === undefined) { ease = EaseMap.Linear; }
  138471. if (force === undefined) { force = false; }
  138472. if (callback === undefined) { callback = null; }
  138473. if (context === undefined) { context = this.camera.scene; }
  138474. var cam = this.camera;
  138475. if (!force && this.isRunning)
  138476. {
  138477. return cam;
  138478. }
  138479. this.isRunning = true;
  138480. this.duration = duration;
  138481. this.progress = 0;
  138482. // Starting from
  138483. this.source.set(cam.scrollX, cam.scrollY);
  138484. // Destination
  138485. this.destination.set(x, y);
  138486. // Zoom factored version
  138487. cam.getScroll(x, y, this.current);
  138488. // Using this ease
  138489. if (typeof ease === 'string' && EaseMap.hasOwnProperty(ease))
  138490. {
  138491. this.ease = EaseMap[ease];
  138492. }
  138493. else if (typeof ease === 'function')
  138494. {
  138495. this.ease = ease;
  138496. }
  138497. this._elapsed = 0;
  138498. this._onUpdate = callback;
  138499. this._onUpdateScope = context;
  138500. this.camera.emit(Events.PAN_START, this.camera, this, duration, x, y);
  138501. return cam;
  138502. },
  138503. /**
  138504. * The main update loop for this effect. Called automatically by the Camera.
  138505. *
  138506. * @method Phaser.Cameras.Scene2D.Effects.Pan#update
  138507. * @since 3.11.0
  138508. *
  138509. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  138510. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  138511. */
  138512. update: function (time, delta)
  138513. {
  138514. if (!this.isRunning)
  138515. {
  138516. return;
  138517. }
  138518. this._elapsed += delta;
  138519. var progress = Clamp(this._elapsed / this.duration, 0, 1);
  138520. this.progress = progress;
  138521. var cam = this.camera;
  138522. if (this._elapsed < this.duration)
  138523. {
  138524. var v = this.ease(progress);
  138525. cam.getScroll(this.destination.x, this.destination.y, this.current);
  138526. var x = this.source.x + ((this.current.x - this.source.x) * v);
  138527. var y = this.source.y + ((this.current.y - this.source.y) * v);
  138528. cam.setScroll(x, y);
  138529. if (this._onUpdate)
  138530. {
  138531. this._onUpdate.call(this._onUpdateScope, cam, progress, x, y);
  138532. }
  138533. }
  138534. else
  138535. {
  138536. cam.centerOn(this.destination.x, this.destination.y);
  138537. if (this._onUpdate)
  138538. {
  138539. this._onUpdate.call(this._onUpdateScope, cam, progress, cam.scrollX, cam.scrollY);
  138540. }
  138541. this.effectComplete();
  138542. }
  138543. },
  138544. /**
  138545. * Called internally when the effect completes.
  138546. *
  138547. * @method Phaser.Cameras.Scene2D.Effects.Pan#effectComplete
  138548. * @fires Phaser.Cameras.Scene2D.Events#PAN_COMPLETE
  138549. * @since 3.11.0
  138550. */
  138551. effectComplete: function ()
  138552. {
  138553. this._onUpdate = null;
  138554. this._onUpdateScope = null;
  138555. this.isRunning = false;
  138556. this.camera.emit(Events.PAN_COMPLETE, this.camera, this);
  138557. },
  138558. /**
  138559. * Resets this camera effect.
  138560. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  138561. *
  138562. * @method Phaser.Cameras.Scene2D.Effects.Pan#reset
  138563. * @since 3.11.0
  138564. */
  138565. reset: function ()
  138566. {
  138567. this.isRunning = false;
  138568. this._onUpdate = null;
  138569. this._onUpdateScope = null;
  138570. },
  138571. /**
  138572. * Destroys this effect, releasing it from the Camera.
  138573. *
  138574. * @method Phaser.Cameras.Scene2D.Effects.Pan#destroy
  138575. * @since 3.11.0
  138576. */
  138577. destroy: function ()
  138578. {
  138579. this.reset();
  138580. this.camera = null;
  138581. this.source = null;
  138582. this.destination = null;
  138583. }
  138584. });
  138585. module.exports = Pan;
  138586. /***/ }),
  138587. /* 1152 */
  138588. /***/ (function(module, exports, __webpack_require__) {
  138589. /**
  138590. * @author Richard Davey <rich@photonstorm.com>
  138591. * @copyright 2019 Photon Storm Ltd.
  138592. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138593. */
  138594. var Clamp = __webpack_require__(23);
  138595. var Class = __webpack_require__(0);
  138596. var Events = __webpack_require__(40);
  138597. /**
  138598. * @classdesc
  138599. * A Camera Flash effect.
  138600. *
  138601. * This effect will flash the camera viewport to the given color, over the duration specified.
  138602. *
  138603. * Only the camera viewport is flashed. None of the objects it is displaying are impacted, i.e. their colors do
  138604. * not change.
  138605. *
  138606. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  138607. * which is invoked each frame for the duration of the effect, if required.
  138608. *
  138609. * @class Flash
  138610. * @memberof Phaser.Cameras.Scene2D.Effects
  138611. * @constructor
  138612. * @since 3.5.0
  138613. *
  138614. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  138615. */
  138616. var Flash = new Class({
  138617. initialize:
  138618. function Flash (camera)
  138619. {
  138620. /**
  138621. * The Camera this effect belongs to.
  138622. *
  138623. * @name Phaser.Cameras.Scene2D.Effects.Flash#camera
  138624. * @type {Phaser.Cameras.Scene2D.Camera}
  138625. * @readonly
  138626. * @since 3.5.0
  138627. */
  138628. this.camera = camera;
  138629. /**
  138630. * Is this effect actively running?
  138631. *
  138632. * @name Phaser.Cameras.Scene2D.Effects.Flash#isRunning
  138633. * @type {boolean}
  138634. * @readonly
  138635. * @default false
  138636. * @since 3.5.0
  138637. */
  138638. this.isRunning = false;
  138639. /**
  138640. * The duration of the effect, in milliseconds.
  138641. *
  138642. * @name Phaser.Cameras.Scene2D.Effects.Flash#duration
  138643. * @type {integer}
  138644. * @readonly
  138645. * @default 0
  138646. * @since 3.5.0
  138647. */
  138648. this.duration = 0;
  138649. /**
  138650. * The value of the red color channel the camera will use for the fade effect.
  138651. * A value between 0 and 255.
  138652. *
  138653. * @name Phaser.Cameras.Scene2D.Effects.Flash#red
  138654. * @type {integer}
  138655. * @private
  138656. * @since 3.5.0
  138657. */
  138658. this.red = 0;
  138659. /**
  138660. * The value of the green color channel the camera will use for the fade effect.
  138661. * A value between 0 and 255.
  138662. *
  138663. * @name Phaser.Cameras.Scene2D.Effects.Flash#green
  138664. * @type {integer}
  138665. * @private
  138666. * @since 3.5.0
  138667. */
  138668. this.green = 0;
  138669. /**
  138670. * The value of the blue color channel the camera will use for the fade effect.
  138671. * A value between 0 and 255.
  138672. *
  138673. * @name Phaser.Cameras.Scene2D.Effects.Flash#blue
  138674. * @type {integer}
  138675. * @private
  138676. * @since 3.5.0
  138677. */
  138678. this.blue = 0;
  138679. /**
  138680. * The value of the alpha channel used during the fade effect.
  138681. * A value between 0 and 1.
  138682. *
  138683. * @name Phaser.Cameras.Scene2D.Effects.Flash#alpha
  138684. * @type {number}
  138685. * @private
  138686. * @since 3.5.0
  138687. */
  138688. this.alpha = 0;
  138689. /**
  138690. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  138691. *
  138692. * @name Phaser.Cameras.Scene2D.Effects.Flash#progress
  138693. * @type {number}
  138694. * @since 3.5.0
  138695. */
  138696. this.progress = 0;
  138697. /**
  138698. * Effect elapsed timer.
  138699. *
  138700. * @name Phaser.Cameras.Scene2D.Effects.Flash#_elapsed
  138701. * @type {number}
  138702. * @private
  138703. * @since 3.5.0
  138704. */
  138705. this._elapsed = 0;
  138706. /**
  138707. * @callback CameraFlashCallback
  138708. *
  138709. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  138710. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  138711. */
  138712. /**
  138713. * This callback is invoked every frame for the duration of the effect.
  138714. *
  138715. * @name Phaser.Cameras.Scene2D.Effects.Flash#_onUpdate
  138716. * @type {?CameraFlashCallback}
  138717. * @private
  138718. * @default null
  138719. * @since 3.5.0
  138720. */
  138721. this._onUpdate;
  138722. /**
  138723. * On Complete callback scope.
  138724. *
  138725. * @name Phaser.Cameras.Scene2D.Effects.Flash#_onUpdateScope
  138726. * @type {any}
  138727. * @private
  138728. * @since 3.5.0
  138729. */
  138730. this._onUpdateScope;
  138731. },
  138732. /**
  138733. * Flashes the Camera to or from the given color over the duration specified.
  138734. *
  138735. * @method Phaser.Cameras.Scene2D.Effects.Flash#start
  138736. * @fires Phaser.Cameras.Scene2D.Events#FLASH_START
  138737. * @fires Phaser.Cameras.Scene2D.Events#FLASH_COMPLETE
  138738. * @since 3.5.0
  138739. *
  138740. * @param {integer} [duration=250] - The duration of the effect in milliseconds.
  138741. * @param {integer} [red=255] - The amount to fade the red channel towards. A value between 0 and 255.
  138742. * @param {integer} [green=255] - The amount to fade the green channel towards. A value between 0 and 255.
  138743. * @param {integer} [blue=255] - The amount to fade the blue channel towards. A value between 0 and 255.
  138744. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  138745. * @param {CameraFlashCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  138746. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  138747. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  138748. *
  138749. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  138750. */
  138751. start: function (duration, red, green, blue, force, callback, context)
  138752. {
  138753. if (duration === undefined) { duration = 250; }
  138754. if (red === undefined) { red = 255; }
  138755. if (green === undefined) { green = 255; }
  138756. if (blue === undefined) { blue = 255; }
  138757. if (force === undefined) { force = false; }
  138758. if (callback === undefined) { callback = null; }
  138759. if (context === undefined) { context = this.camera.scene; }
  138760. if (!force && this.isRunning)
  138761. {
  138762. return this.camera;
  138763. }
  138764. this.isRunning = true;
  138765. this.duration = duration;
  138766. this.progress = 0;
  138767. this.red = red;
  138768. this.green = green;
  138769. this.blue = blue;
  138770. this.alpha = 1;
  138771. this._elapsed = 0;
  138772. this._onUpdate = callback;
  138773. this._onUpdateScope = context;
  138774. this.camera.emit(Events.FLASH_START, this.camera, this, duration, red, green, blue);
  138775. return this.camera;
  138776. },
  138777. /**
  138778. * The main update loop for this effect. Called automatically by the Camera.
  138779. *
  138780. * @method Phaser.Cameras.Scene2D.Effects.Flash#update
  138781. * @since 3.5.0
  138782. *
  138783. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  138784. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  138785. */
  138786. update: function (time, delta)
  138787. {
  138788. if (!this.isRunning)
  138789. {
  138790. return;
  138791. }
  138792. this._elapsed += delta;
  138793. this.progress = Clamp(this._elapsed / this.duration, 0, 1);
  138794. if (this._onUpdate)
  138795. {
  138796. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress);
  138797. }
  138798. if (this._elapsed < this.duration)
  138799. {
  138800. this.alpha = 1 - this.progress;
  138801. }
  138802. else
  138803. {
  138804. this.effectComplete();
  138805. }
  138806. },
  138807. /**
  138808. * Called internally by the Canvas Renderer.
  138809. *
  138810. * @method Phaser.Cameras.Scene2D.Effects.Flash#postRenderCanvas
  138811. * @since 3.5.0
  138812. *
  138813. * @param {CanvasRenderingContext2D} ctx - The Canvas context to render to.
  138814. *
  138815. * @return {boolean} `true` if the effect drew to the renderer, otherwise `false`.
  138816. */
  138817. postRenderCanvas: function (ctx)
  138818. {
  138819. if (!this.isRunning)
  138820. {
  138821. return false;
  138822. }
  138823. var camera = this.camera;
  138824. ctx.fillStyle = 'rgba(' + this.red + ',' + this.green + ',' + this.blue + ',' + this.alpha + ')';
  138825. ctx.fillRect(camera._cx, camera._cy, camera._cw, camera._ch);
  138826. return true;
  138827. },
  138828. /**
  138829. * Called internally by the WebGL Renderer.
  138830. *
  138831. * @method Phaser.Cameras.Scene2D.Effects.Flash#postRenderWebGL
  138832. * @since 3.5.0
  138833. *
  138834. * @param {Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline} pipeline - The WebGL Pipeline to render to.
  138835. * @param {function} getTintFunction - A function that will return the gl safe tint colors.
  138836. *
  138837. * @return {boolean} `true` if the effect drew to the renderer, otherwise `false`.
  138838. */
  138839. postRenderWebGL: function (pipeline, getTintFunction)
  138840. {
  138841. if (!this.isRunning)
  138842. {
  138843. return false;
  138844. }
  138845. var camera = this.camera;
  138846. var red = this.red / 255;
  138847. var blue = this.blue / 255;
  138848. var green = this.green / 255;
  138849. pipeline.drawFillRect(
  138850. camera._cx, camera._cy, camera._cw, camera._ch,
  138851. getTintFunction(red, green, blue, 1),
  138852. this.alpha
  138853. );
  138854. return true;
  138855. },
  138856. /**
  138857. * Called internally when the effect completes.
  138858. *
  138859. * @method Phaser.Cameras.Scene2D.Effects.Flash#effectComplete
  138860. * @fires Phaser.Cameras.Scene2D.Events#FLASH_COMPLETE
  138861. * @since 3.5.0
  138862. */
  138863. effectComplete: function ()
  138864. {
  138865. this._onUpdate = null;
  138866. this._onUpdateScope = null;
  138867. this.isRunning = false;
  138868. this.camera.emit(Events.FLASH_COMPLETE, this.camera, this);
  138869. },
  138870. /**
  138871. * Resets this camera effect.
  138872. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  138873. *
  138874. * @method Phaser.Cameras.Scene2D.Effects.Flash#reset
  138875. * @since 3.5.0
  138876. */
  138877. reset: function ()
  138878. {
  138879. this.isRunning = false;
  138880. this._onUpdate = null;
  138881. this._onUpdateScope = null;
  138882. },
  138883. /**
  138884. * Destroys this effect, releasing it from the Camera.
  138885. *
  138886. * @method Phaser.Cameras.Scene2D.Effects.Flash#destroy
  138887. * @since 3.5.0
  138888. */
  138889. destroy: function ()
  138890. {
  138891. this.reset();
  138892. this.camera = null;
  138893. }
  138894. });
  138895. module.exports = Flash;
  138896. /***/ }),
  138897. /* 1153 */
  138898. /***/ (function(module, exports, __webpack_require__) {
  138899. /**
  138900. * @author Richard Davey <rich@photonstorm.com>
  138901. * @copyright 2019 Photon Storm Ltd.
  138902. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  138903. */
  138904. var Clamp = __webpack_require__(23);
  138905. var Class = __webpack_require__(0);
  138906. var Events = __webpack_require__(40);
  138907. /**
  138908. * @classdesc
  138909. * A Camera Fade effect.
  138910. *
  138911. * This effect will fade the camera viewport to the given color, over the duration specified.
  138912. *
  138913. * Only the camera viewport is faded. None of the objects it is displaying are impacted, i.e. their colors do
  138914. * not change.
  138915. *
  138916. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  138917. * which is invoked each frame for the duration of the effect, if required.
  138918. *
  138919. * @class Fade
  138920. * @memberof Phaser.Cameras.Scene2D.Effects
  138921. * @constructor
  138922. * @since 3.5.0
  138923. *
  138924. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  138925. */
  138926. var Fade = new Class({
  138927. initialize:
  138928. function Fade (camera)
  138929. {
  138930. /**
  138931. * The Camera this effect belongs to.
  138932. *
  138933. * @name Phaser.Cameras.Scene2D.Effects.Fade#camera
  138934. * @type {Phaser.Cameras.Scene2D.Camera}
  138935. * @readonly
  138936. * @since 3.5.0
  138937. */
  138938. this.camera = camera;
  138939. /**
  138940. * Is this effect actively running?
  138941. *
  138942. * @name Phaser.Cameras.Scene2D.Effects.Fade#isRunning
  138943. * @type {boolean}
  138944. * @readonly
  138945. * @default false
  138946. * @since 3.5.0
  138947. */
  138948. this.isRunning = false;
  138949. /**
  138950. * Has this effect finished running?
  138951. *
  138952. * This is different from `isRunning` because it remains set to `true` when the effect is over,
  138953. * until the effect is either reset or started again.
  138954. *
  138955. * @name Phaser.Cameras.Scene2D.Effects.Fade#isComplete
  138956. * @type {boolean}
  138957. * @readonly
  138958. * @default false
  138959. * @since 3.5.0
  138960. */
  138961. this.isComplete = false;
  138962. /**
  138963. * The direction of the fade.
  138964. * `true` = fade out (transparent to color), `false` = fade in (color to transparent)
  138965. *
  138966. * @name Phaser.Cameras.Scene2D.Effects.Fade#direction
  138967. * @type {boolean}
  138968. * @readonly
  138969. * @since 3.5.0
  138970. */
  138971. this.direction = true;
  138972. /**
  138973. * The duration of the effect, in milliseconds.
  138974. *
  138975. * @name Phaser.Cameras.Scene2D.Effects.Fade#duration
  138976. * @type {integer}
  138977. * @readonly
  138978. * @default 0
  138979. * @since 3.5.0
  138980. */
  138981. this.duration = 0;
  138982. /**
  138983. * The value of the red color channel the camera will use for the fade effect.
  138984. * A value between 0 and 255.
  138985. *
  138986. * @name Phaser.Cameras.Scene2D.Effects.Fade#red
  138987. * @type {integer}
  138988. * @private
  138989. * @since 3.5.0
  138990. */
  138991. this.red = 0;
  138992. /**
  138993. * The value of the green color channel the camera will use for the fade effect.
  138994. * A value between 0 and 255.
  138995. *
  138996. * @name Phaser.Cameras.Scene2D.Effects.Fade#green
  138997. * @type {integer}
  138998. * @private
  138999. * @since 3.5.0
  139000. */
  139001. this.green = 0;
  139002. /**
  139003. * The value of the blue color channel the camera will use for the fade effect.
  139004. * A value between 0 and 255.
  139005. *
  139006. * @name Phaser.Cameras.Scene2D.Effects.Fade#blue
  139007. * @type {integer}
  139008. * @private
  139009. * @since 3.5.0
  139010. */
  139011. this.blue = 0;
  139012. /**
  139013. * The value of the alpha channel used during the fade effect.
  139014. * A value between 0 and 1.
  139015. *
  139016. * @name Phaser.Cameras.Scene2D.Effects.Fade#alpha
  139017. * @type {number}
  139018. * @private
  139019. * @since 3.5.0
  139020. */
  139021. this.alpha = 0;
  139022. /**
  139023. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  139024. *
  139025. * @name Phaser.Cameras.Scene2D.Effects.Fade#progress
  139026. * @type {number}
  139027. * @since 3.5.0
  139028. */
  139029. this.progress = 0;
  139030. /**
  139031. * Effect elapsed timer.
  139032. *
  139033. * @name Phaser.Cameras.Scene2D.Effects.Fade#_elapsed
  139034. * @type {number}
  139035. * @private
  139036. * @since 3.5.0
  139037. */
  139038. this._elapsed = 0;
  139039. /**
  139040. * @callback CameraFadeCallback
  139041. *
  139042. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  139043. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  139044. */
  139045. /**
  139046. * This callback is invoked every frame for the duration of the effect.
  139047. *
  139048. * @name Phaser.Cameras.Scene2D.Effects.Fade#_onUpdate
  139049. * @type {?CameraFadeCallback}
  139050. * @private
  139051. * @default null
  139052. * @since 3.5.0
  139053. */
  139054. this._onUpdate;
  139055. /**
  139056. * On Complete callback scope.
  139057. *
  139058. * @name Phaser.Cameras.Scene2D.Effects.Fade#_onUpdateScope
  139059. * @type {any}
  139060. * @private
  139061. * @since 3.5.0
  139062. */
  139063. this._onUpdateScope;
  139064. },
  139065. /**
  139066. * Fades the Camera to or from the given color over the duration specified.
  139067. *
  139068. * @method Phaser.Cameras.Scene2D.Effects.Fade#start
  139069. * @fires Phaser.Cameras.Scene2D.Events#FADE_IN_START
  139070. * @fires Phaser.Cameras.Scene2D.Events#FADE_OUT_START
  139071. * @since 3.5.0
  139072. *
  139073. * @param {boolean} [direction=true] - The direction of the fade. `true` = fade out (transparent to color), `false` = fade in (color to transparent)
  139074. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  139075. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  139076. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  139077. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  139078. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  139079. * @param {CameraFadeCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  139080. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  139081. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  139082. *
  139083. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  139084. */
  139085. start: function (direction, duration, red, green, blue, force, callback, context)
  139086. {
  139087. if (direction === undefined) { direction = true; }
  139088. if (duration === undefined) { duration = 1000; }
  139089. if (red === undefined) { red = 0; }
  139090. if (green === undefined) { green = 0; }
  139091. if (blue === undefined) { blue = 0; }
  139092. if (force === undefined) { force = false; }
  139093. if (callback === undefined) { callback = null; }
  139094. if (context === undefined) { context = this.camera.scene; }
  139095. if (!force && this.isRunning)
  139096. {
  139097. return this.camera;
  139098. }
  139099. this.isRunning = true;
  139100. this.isComplete = false;
  139101. this.duration = duration;
  139102. this.direction = direction;
  139103. this.progress = 0;
  139104. this.red = red;
  139105. this.green = green;
  139106. this.blue = blue;
  139107. this.alpha = (direction) ? Number.MIN_VALUE : 1;
  139108. this._elapsed = 0;
  139109. this._onUpdate = callback;
  139110. this._onUpdateScope = context;
  139111. var eventName = (direction) ? Events.FADE_OUT_START : Events.FADE_IN_START;
  139112. this.camera.emit(eventName, this.camera, this, duration, red, green, blue);
  139113. return this.camera;
  139114. },
  139115. /**
  139116. * The main update loop for this effect. Called automatically by the Camera.
  139117. *
  139118. * @method Phaser.Cameras.Scene2D.Effects.Fade#update
  139119. * @since 3.5.0
  139120. *
  139121. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  139122. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  139123. */
  139124. update: function (time, delta)
  139125. {
  139126. if (!this.isRunning)
  139127. {
  139128. return;
  139129. }
  139130. this._elapsed += delta;
  139131. this.progress = Clamp(this._elapsed / this.duration, 0, 1);
  139132. if (this._onUpdate)
  139133. {
  139134. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress);
  139135. }
  139136. if (this._elapsed < this.duration)
  139137. {
  139138. this.alpha = (this.direction) ? this.progress : 1 - this.progress;
  139139. }
  139140. else
  139141. {
  139142. this.effectComplete();
  139143. }
  139144. },
  139145. /**
  139146. * Called internally by the Canvas Renderer.
  139147. *
  139148. * @method Phaser.Cameras.Scene2D.Effects.Fade#postRenderCanvas
  139149. * @since 3.5.0
  139150. *
  139151. * @param {CanvasRenderingContext2D} ctx - The Canvas context to render to.
  139152. *
  139153. * @return {boolean} `true` if the effect drew to the renderer, otherwise `false`.
  139154. */
  139155. postRenderCanvas: function (ctx)
  139156. {
  139157. if (!this.isRunning && !this.isComplete)
  139158. {
  139159. return false;
  139160. }
  139161. var camera = this.camera;
  139162. ctx.fillStyle = 'rgba(' + this.red + ',' + this.green + ',' + this.blue + ',' + this.alpha + ')';
  139163. ctx.fillRect(camera._cx, camera._cy, camera._cw, camera._ch);
  139164. return true;
  139165. },
  139166. /**
  139167. * Called internally by the WebGL Renderer.
  139168. *
  139169. * @method Phaser.Cameras.Scene2D.Effects.Fade#postRenderWebGL
  139170. * @since 3.5.0
  139171. *
  139172. * @param {Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline} pipeline - The WebGL Pipeline to render to.
  139173. * @param {function} getTintFunction - A function that will return the gl safe tint colors.
  139174. *
  139175. * @return {boolean} `true` if the effect drew to the renderer, otherwise `false`.
  139176. */
  139177. postRenderWebGL: function (pipeline, getTintFunction)
  139178. {
  139179. if (!this.isRunning && !this.isComplete)
  139180. {
  139181. return false;
  139182. }
  139183. var camera = this.camera;
  139184. var red = this.red / 255;
  139185. var blue = this.blue / 255;
  139186. var green = this.green / 255;
  139187. pipeline.drawFillRect(
  139188. camera._cx, camera._cy, camera._cw, camera._ch,
  139189. getTintFunction(red, green, blue, 1),
  139190. this.alpha
  139191. );
  139192. return true;
  139193. },
  139194. /**
  139195. * Called internally when the effect completes.
  139196. *
  139197. * @method Phaser.Cameras.Scene2D.Effects.Fade#effectComplete
  139198. * @fires Phaser.Cameras.Scene2D.Events#FADE_IN_COMPLETE
  139199. * @fires Phaser.Cameras.Scene2D.Events#FADE_OUT_COMPLETE
  139200. * @since 3.5.0
  139201. */
  139202. effectComplete: function ()
  139203. {
  139204. this._onUpdate = null;
  139205. this._onUpdateScope = null;
  139206. this.isRunning = false;
  139207. this.isComplete = true;
  139208. var eventName = (this.direction) ? Events.FADE_OUT_COMPLETE : Events.FADE_IN_COMPLETE;
  139209. this.camera.emit(eventName, this.camera, this);
  139210. },
  139211. /**
  139212. * Resets this camera effect.
  139213. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  139214. *
  139215. * @method Phaser.Cameras.Scene2D.Effects.Fade#reset
  139216. * @since 3.5.0
  139217. */
  139218. reset: function ()
  139219. {
  139220. this.isRunning = false;
  139221. this.isComplete = false;
  139222. this._onUpdate = null;
  139223. this._onUpdateScope = null;
  139224. },
  139225. /**
  139226. * Destroys this effect, releasing it from the Camera.
  139227. *
  139228. * @method Phaser.Cameras.Scene2D.Effects.Fade#destroy
  139229. * @since 3.5.0
  139230. */
  139231. destroy: function ()
  139232. {
  139233. this.reset();
  139234. this.camera = null;
  139235. }
  139236. });
  139237. module.exports = Fade;
  139238. /***/ }),
  139239. /* 1154 */
  139240. /***/ (function(module, exports) {
  139241. /**
  139242. * @author Richard Davey <rich@photonstorm.com>
  139243. * @copyright 2019 Photon Storm Ltd.
  139244. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139245. */
  139246. /**
  139247. * The Camera Zoom Start Event.
  139248. *
  139249. * This event is dispatched by a Camera instance when the Zoom Effect starts.
  139250. *
  139251. * @event Phaser.Cameras.Scene2D.Events#ZOOM_START
  139252. *
  139253. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139254. * @param {Phaser.Cameras.Scene2D.Effects.Zoom} effect - A reference to the effect instance.
  139255. * @param {integer} duration - The duration of the effect.
  139256. * @param {number} zoom - The destination zoom value.
  139257. */
  139258. module.exports = 'camerazoomstart';
  139259. /***/ }),
  139260. /* 1155 */
  139261. /***/ (function(module, exports) {
  139262. /**
  139263. * @author Richard Davey <rich@photonstorm.com>
  139264. * @copyright 2019 Photon Storm Ltd.
  139265. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139266. */
  139267. /**
  139268. * The Camera Zoom Complete Event.
  139269. *
  139270. * This event is dispatched by a Camera instance when the Zoom Effect completes.
  139271. *
  139272. * @event Phaser.Cameras.Scene2D.Events#ZOOM_COMPLETE
  139273. *
  139274. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139275. * @param {Phaser.Cameras.Scene2D.Effects.Zoom} effect - A reference to the effect instance.
  139276. */
  139277. module.exports = 'camerazoomcomplete';
  139278. /***/ }),
  139279. /* 1156 */
  139280. /***/ (function(module, exports) {
  139281. /**
  139282. * @author Richard Davey <rich@photonstorm.com>
  139283. * @copyright 2019 Photon Storm Ltd.
  139284. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139285. */
  139286. /**
  139287. * The Camera Shake Start Event.
  139288. *
  139289. * This event is dispatched by a Camera instance when the Shake Effect starts.
  139290. *
  139291. * @event Phaser.Cameras.Scene2D.Events#SHAKE_START
  139292. *
  139293. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139294. * @param {Phaser.Cameras.Scene2D.Effects.Shake} effect - A reference to the effect instance.
  139295. * @param {integer} duration - The duration of the effect.
  139296. * @param {number} intensity - The intensity of the effect.
  139297. */
  139298. module.exports = 'camerashakestart';
  139299. /***/ }),
  139300. /* 1157 */
  139301. /***/ (function(module, exports) {
  139302. /**
  139303. * @author Richard Davey <rich@photonstorm.com>
  139304. * @copyright 2019 Photon Storm Ltd.
  139305. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139306. */
  139307. /**
  139308. * The Camera Shake Complete Event.
  139309. *
  139310. * This event is dispatched by a Camera instance when the Shake Effect completes.
  139311. *
  139312. * @event Phaser.Cameras.Scene2D.Events#SHAKE_COMPLETE
  139313. *
  139314. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139315. * @param {Phaser.Cameras.Scene2D.Effects.Shake} effect - A reference to the effect instance.
  139316. */
  139317. module.exports = 'camerashakecomplete';
  139318. /***/ }),
  139319. /* 1158 */
  139320. /***/ (function(module, exports) {
  139321. /**
  139322. * @author Richard Davey <rich@photonstorm.com>
  139323. * @copyright 2019 Photon Storm Ltd.
  139324. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139325. */
  139326. /**
  139327. * The Camera Pre-Render Event.
  139328. *
  139329. * This event is dispatched by a Camera instance when it is about to render.
  139330. * It is only dispatched if the Camera is rendering to a texture.
  139331. *
  139332. * Listen to it from a Camera instance using: `camera.on('prerender', listener)`.
  139333. *
  139334. * @event Phaser.Cameras.Scene2D.Events#PRE_RENDER
  139335. *
  139336. * @param {Phaser.Cameras.Scene2D.BaseCamera} camera - The camera that is about to render to a texture.
  139337. */
  139338. module.exports = 'prerender';
  139339. /***/ }),
  139340. /* 1159 */
  139341. /***/ (function(module, exports) {
  139342. /**
  139343. * @author Richard Davey <rich@photonstorm.com>
  139344. * @copyright 2019 Photon Storm Ltd.
  139345. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139346. */
  139347. /**
  139348. * The Camera Post-Render Event.
  139349. *
  139350. * This event is dispatched by a Camera instance after is has finished rendering.
  139351. * It is only dispatched if the Camera is rendering to a texture.
  139352. *
  139353. * Listen to it from a Camera instance using: `camera.on('postrender', listener)`.
  139354. *
  139355. * @event Phaser.Cameras.Scene2D.Events#POST_RENDER
  139356. *
  139357. * @param {Phaser.Cameras.Scene2D.BaseCamera} camera - The camera that has finished rendering to a texture.
  139358. */
  139359. module.exports = 'postrender';
  139360. /***/ }),
  139361. /* 1160 */
  139362. /***/ (function(module, exports) {
  139363. /**
  139364. * @author Richard Davey <rich@photonstorm.com>
  139365. * @copyright 2019 Photon Storm Ltd.
  139366. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139367. */
  139368. /**
  139369. * The Camera Pan Start Event.
  139370. *
  139371. * This event is dispatched by a Camera instance when the Pan Effect starts.
  139372. *
  139373. * @event Phaser.Cameras.Scene2D.Events#PAN_START
  139374. *
  139375. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139376. * @param {Phaser.Cameras.Scene2D.Effects.Pan} effect - A reference to the effect instance.
  139377. * @param {integer} duration - The duration of the effect.
  139378. * @param {number} x - The destination scroll x coordinate.
  139379. * @param {number} y - The destination scroll y coordinate.
  139380. */
  139381. module.exports = 'camerapanstart';
  139382. /***/ }),
  139383. /* 1161 */
  139384. /***/ (function(module, exports) {
  139385. /**
  139386. * @author Richard Davey <rich@photonstorm.com>
  139387. * @copyright 2019 Photon Storm Ltd.
  139388. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139389. */
  139390. /**
  139391. * The Camera Pan Complete Event.
  139392. *
  139393. * This event is dispatched by a Camera instance when the Pan Effect completes.
  139394. *
  139395. * @event Phaser.Cameras.Scene2D.Events#PAN_COMPLETE
  139396. *
  139397. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139398. * @param {Phaser.Cameras.Scene2D.Effects.Pan} effect - A reference to the effect instance.
  139399. */
  139400. module.exports = 'camerapancomplete';
  139401. /***/ }),
  139402. /* 1162 */
  139403. /***/ (function(module, exports) {
  139404. /**
  139405. * @author Richard Davey <rich@photonstorm.com>
  139406. * @copyright 2019 Photon Storm Ltd.
  139407. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139408. */
  139409. /**
  139410. * The Camera Flash Start Event.
  139411. *
  139412. * This event is dispatched by a Camera instance when the Flash Effect starts.
  139413. *
  139414. * @event Phaser.Cameras.Scene2D.Events#FLASH_START
  139415. *
  139416. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139417. * @param {Phaser.Cameras.Scene2D.Effects.Flash} effect - A reference to the effect instance.
  139418. * @param {integer} duration - The duration of the effect.
  139419. * @param {integer} red - The red color channel value.
  139420. * @param {integer} green - The green color channel value.
  139421. * @param {integer} blue - The blue color channel value.
  139422. */
  139423. module.exports = 'cameraflashstart';
  139424. /***/ }),
  139425. /* 1163 */
  139426. /***/ (function(module, exports) {
  139427. /**
  139428. * @author Richard Davey <rich@photonstorm.com>
  139429. * @copyright 2019 Photon Storm Ltd.
  139430. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139431. */
  139432. /**
  139433. * The Camera Flash Complete Event.
  139434. *
  139435. * This event is dispatched by a Camera instance when the Flash Effect completes.
  139436. *
  139437. * @event Phaser.Cameras.Scene2D.Events#FLASH_COMPLETE
  139438. *
  139439. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139440. * @param {Phaser.Cameras.Scene2D.Effects.Flash} effect - A reference to the effect instance.
  139441. */
  139442. module.exports = 'cameraflashcomplete';
  139443. /***/ }),
  139444. /* 1164 */
  139445. /***/ (function(module, exports) {
  139446. /**
  139447. * @author Richard Davey <rich@photonstorm.com>
  139448. * @copyright 2019 Photon Storm Ltd.
  139449. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139450. */
  139451. /**
  139452. * The Camera Fade Out Start Event.
  139453. *
  139454. * This event is dispatched by a Camera instance when the Fade Out Effect starts.
  139455. *
  139456. * Listen to it from a Camera instance using `Camera.on('camerafadeoutstart', listener)`.
  139457. *
  139458. * @event Phaser.Cameras.Scene2D.Events#FADE_OUT_START
  139459. *
  139460. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139461. * @param {Phaser.Cameras.Scene2D.Effects.Fade} effect - A reference to the effect instance.
  139462. * @param {integer} duration - The duration of the effect.
  139463. * @param {integer} red - The red color channel value.
  139464. * @param {integer} green - The green color channel value.
  139465. * @param {integer} blue - The blue color channel value.
  139466. */
  139467. module.exports = 'camerafadeoutstart';
  139468. /***/ }),
  139469. /* 1165 */
  139470. /***/ (function(module, exports) {
  139471. /**
  139472. * @author Richard Davey <rich@photonstorm.com>
  139473. * @copyright 2019 Photon Storm Ltd.
  139474. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139475. */
  139476. /**
  139477. * The Camera Fade Out Complete Event.
  139478. *
  139479. * This event is dispatched by a Camera instance when the Fade Out Effect completes.
  139480. *
  139481. * Listen to it from a Camera instance using `Camera.on('camerafadeoutcomplete', listener)`.
  139482. *
  139483. * @event Phaser.Cameras.Scene2D.Events#FADE_OUT_COMPLETE
  139484. *
  139485. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139486. * @param {Phaser.Cameras.Scene2D.Effects.Fade} effect - A reference to the effect instance.
  139487. */
  139488. module.exports = 'camerafadeoutcomplete';
  139489. /***/ }),
  139490. /* 1166 */
  139491. /***/ (function(module, exports) {
  139492. /**
  139493. * @author Richard Davey <rich@photonstorm.com>
  139494. * @copyright 2019 Photon Storm Ltd.
  139495. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139496. */
  139497. /**
  139498. * The Camera Fade In Start Event.
  139499. *
  139500. * This event is dispatched by a Camera instance when the Fade In Effect starts.
  139501. *
  139502. * Listen to it from a Camera instance using `Camera.on('camerafadeinstart', listener)`.
  139503. *
  139504. * @event Phaser.Cameras.Scene2D.Events#FADE_IN_START
  139505. *
  139506. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139507. * @param {Phaser.Cameras.Scene2D.Effects.Fade} effect - A reference to the effect instance.
  139508. * @param {integer} duration - The duration of the effect.
  139509. * @param {integer} red - The red color channel value.
  139510. * @param {integer} green - The green color channel value.
  139511. * @param {integer} blue - The blue color channel value.
  139512. */
  139513. module.exports = 'camerafadeinstart';
  139514. /***/ }),
  139515. /* 1167 */
  139516. /***/ (function(module, exports) {
  139517. /**
  139518. * @author Richard Davey <rich@photonstorm.com>
  139519. * @copyright 2019 Photon Storm Ltd.
  139520. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139521. */
  139522. /**
  139523. * The Camera Fade In Complete Event.
  139524. *
  139525. * This event is dispatched by a Camera instance when the Fade In Effect completes.
  139526. *
  139527. * Listen to it from a Camera instance using `Camera.on('camerafadeincomplete', listener)`.
  139528. *
  139529. * @event Phaser.Cameras.Scene2D.Events#FADE_IN_COMPLETE
  139530. *
  139531. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  139532. * @param {Phaser.Cameras.Scene2D.Effects.Fade} effect - A reference to the effect instance.
  139533. */
  139534. module.exports = 'camerafadeincomplete';
  139535. /***/ }),
  139536. /* 1168 */
  139537. /***/ (function(module, exports) {
  139538. /**
  139539. * @author Richard Davey <rich@photonstorm.com>
  139540. * @copyright 2019 Photon Storm Ltd.
  139541. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139542. */
  139543. /**
  139544. * The Destroy Camera Event.
  139545. *
  139546. * This event is dispatched by a Camera instance when it is destroyed by the Camera Manager.
  139547. *
  139548. * @event Phaser.Cameras.Scene2D.Events#DESTROY
  139549. *
  139550. * @param {Phaser.Cameras.Scene2D.BaseCamera} camera - The camera that was destroyed.
  139551. */
  139552. module.exports = 'cameradestroy';
  139553. /***/ }),
  139554. /* 1169 */
  139555. /***/ (function(module, exports, __webpack_require__) {
  139556. /**
  139557. * @author Richard Davey <rich@photonstorm.com>
  139558. * @copyright 2019 Photon Storm Ltd.
  139559. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139560. */
  139561. /**
  139562. * @namespace Phaser.Cameras.Scene2D
  139563. */
  139564. module.exports = {
  139565. Camera: __webpack_require__(411),
  139566. CameraManager: __webpack_require__(1116),
  139567. Effects: __webpack_require__(403),
  139568. Events: __webpack_require__(40)
  139569. };
  139570. /***/ }),
  139571. /* 1170 */
  139572. /***/ (function(module, exports, __webpack_require__) {
  139573. /**
  139574. * @author Richard Davey <rich@photonstorm.com>
  139575. * @copyright 2019 Photon Storm Ltd.
  139576. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  139577. */
  139578. var Class = __webpack_require__(0);
  139579. var GetValue = __webpack_require__(4);
  139580. /**
  139581. * @typedef {object} SmoothedKeyControlConfig
  139582. *
  139583. * @property {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera that this Control will update.
  139584. * @property {Phaser.Input.Keyboard.Key} [left] - The Key to be pressed that will move the Camera left.
  139585. * @property {Phaser.Input.Keyboard.Key} [right] - The Key to be pressed that will move the Camera right.
  139586. * @property {Phaser.Input.Keyboard.Key} [up] - The Key to be pressed that will move the Camera up.
  139587. * @property {Phaser.Input.Keyboard.Key} [zoomIn] - The Key to be pressed that will zoom the Camera in.
  139588. * @property {Phaser.Input.Keyboard.Key} [zoomOut] - The Key to be pressed that will zoom the Camera out.
  139589. * @property {number} [zoomSpeed=0.01] - The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed.
  139590. * @property {(number|{x:number,y:number})} [acceleration=0] - The horizontal and vertical acceleration the camera will move.
  139591. * @property {(number|{x:number,y:number})} [drag=0] - The horizontal and vertical drag applied to the camera when it is moving.
  139592. * @property {(number|{x:number,y:number})} [maxSpeed=0] - The maximum horizontal and vertical speed the camera will move.
  139593. */
  139594. /**
  139595. * @classdesc
  139596. * A Smoothed Key Camera Control.
  139597. *
  139598. * This allows you to control the movement and zoom of a camera using the defined keys.
  139599. * Unlike the Fixed Camera Control you can also provide physics values for acceleration, drag and maxSpeed for smoothing effects.
  139600. *
  139601. * ```javascript
  139602. *
  139603. * var controlConfig = {
  139604. * camera: this.cameras.main,
  139605. * left: cursors.left,
  139606. * right: cursors.right,
  139607. * up: cursors.up,
  139608. * down: cursors.down,
  139609. * zoomIn: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.Q),
  139610. * zoomOut: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.E),
  139611. * zoomSpeed: 0.02,
  139612. * acceleration: 0.06,
  139613. * drag: 0.0005,
  139614. * maxSpeed: 1.0
  139615. * };
  139616. * ```
  139617. *
  139618. * You must call the `update` method of this controller every frame.
  139619. *
  139620. * @class SmoothedKeyControl
  139621. * @memberof Phaser.Cameras.Controls
  139622. * @constructor
  139623. * @since 3.0.0
  139624. *
  139625. * @param {SmoothedKeyControlConfig} config - The Smoothed Key Control configuration object.
  139626. */
  139627. var SmoothedKeyControl = new Class({
  139628. initialize:
  139629. function SmoothedKeyControl (config)
  139630. {
  139631. /**
  139632. * The Camera that this Control will update.
  139633. *
  139634. * @name Phaser.Cameras.Controls.SmoothedKeyControl#camera
  139635. * @type {?Phaser.Cameras.Scene2D.Camera}
  139636. * @default null
  139637. * @since 3.0.0
  139638. */
  139639. this.camera = GetValue(config, 'camera', null);
  139640. /**
  139641. * The Key to be pressed that will move the Camera left.
  139642. *
  139643. * @name Phaser.Cameras.Controls.SmoothedKeyControl#left
  139644. * @type {?Phaser.Input.Keyboard.Key}
  139645. * @default null
  139646. * @since 3.0.0
  139647. */
  139648. this.left = GetValue(config, 'left', null);
  139649. /**
  139650. * The Key to be pressed that will move the Camera right.
  139651. *
  139652. * @name Phaser.Cameras.Controls.SmoothedKeyControl#right
  139653. * @type {?Phaser.Input.Keyboard.Key}
  139654. * @default null
  139655. * @since 3.0.0
  139656. */
  139657. this.right = GetValue(config, 'right', null);
  139658. /**
  139659. * The Key to be pressed that will move the Camera up.
  139660. *
  139661. * @name Phaser.Cameras.Controls.SmoothedKeyControl#up
  139662. * @type {?Phaser.Input.Keyboard.Key}
  139663. * @default null
  139664. * @since 3.0.0
  139665. */
  139666. this.up = GetValue(config, 'up', null);
  139667. /**
  139668. * The Key to be pressed that will move the Camera down.
  139669. *
  139670. * @name Phaser.Cameras.Controls.SmoothedKeyControl#down
  139671. * @type {?Phaser.Input.Keyboard.Key}
  139672. * @default null
  139673. * @since 3.0.0
  139674. */
  139675. this.down = GetValue(config, 'down', null);
  139676. /**
  139677. * The Key to be pressed that will zoom the Camera in.
  139678. *
  139679. * @name Phaser.Cameras.Controls.SmoothedKeyControl#zoomIn
  139680. * @type {?Phaser.Input.Keyboard.Key}
  139681. * @default null
  139682. * @since 3.0.0
  139683. */
  139684. this.zoomIn = GetValue(config, 'zoomIn', null);
  139685. /**
  139686. * The Key to be pressed that will zoom the Camera out.
  139687. *
  139688. * @name Phaser.Cameras.Controls.SmoothedKeyControl#zoomOut
  139689. * @type {?Phaser.Input.Keyboard.Key}
  139690. * @default null
  139691. * @since 3.0.0
  139692. */
  139693. this.zoomOut = GetValue(config, 'zoomOut', null);
  139694. /**
  139695. * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed.
  139696. *
  139697. * @name Phaser.Cameras.Controls.SmoothedKeyControl#zoomSpeed
  139698. * @type {number}
  139699. * @default 0.01
  139700. * @since 3.0.0
  139701. */
  139702. this.zoomSpeed = GetValue(config, 'zoomSpeed', 0.01);
  139703. /**
  139704. * The horizontal acceleration the camera will move.
  139705. *
  139706. * @name Phaser.Cameras.Controls.SmoothedKeyControl#accelX
  139707. * @type {number}
  139708. * @default 0
  139709. * @since 3.0.0
  139710. */
  139711. this.accelX = 0;
  139712. /**
  139713. * The vertical acceleration the camera will move.
  139714. *
  139715. * @name Phaser.Cameras.Controls.SmoothedKeyControl#accelY
  139716. * @type {number}
  139717. * @default 0
  139718. * @since 3.0.0
  139719. */
  139720. this.accelY = 0;
  139721. var accel = GetValue(config, 'acceleration', null);
  139722. if (typeof accel === 'number')
  139723. {
  139724. this.accelX = accel;
  139725. this.accelY = accel;
  139726. }
  139727. else
  139728. {
  139729. this.accelX = GetValue(config, 'acceleration.x', 0);
  139730. this.accelY = GetValue(config, 'acceleration.y', 0);
  139731. }
  139732. /**
  139733. * The horizontal drag applied to the camera when it is moving.
  139734. *
  139735. * @name Phaser.Cameras.Controls.SmoothedKeyControl#dragX
  139736. * @type {number}
  139737. * @default 0
  139738. * @since 3.0.0
  139739. */
  139740. this.dragX = 0;
  139741. /**
  139742. * The vertical drag applied to the camera when it is moving.
  139743. *
  139744. * @name Phaser.Cameras.Controls.SmoothedKeyControl#dragY
  139745. * @type {number}
  139746. * @default 0
  139747. * @since 3.0.0
  139748. */
  139749. this.dragY = 0;
  139750. var drag = GetValue(config, 'drag', null);
  139751. if (typeof drag === 'number')
  139752. {
  139753. this.dragX = drag;
  139754. this.dragY = drag;
  139755. }
  139756. else
  139757. {
  139758. this.dragX = GetValue(config, 'drag.x', 0);
  139759. this.dragY = GetValue(config, 'drag.y', 0);
  139760. }
  139761. /**
  139762. * The maximum horizontal speed the camera will move.
  139763. *
  139764. * @name Phaser.Cameras.Controls.SmoothedKeyControl#maxSpeedX
  139765. * @type {number}
  139766. * @default 0
  139767. * @since 3.0.0
  139768. */
  139769. this.maxSpeedX = 0;
  139770. /**
  139771. * The maximum vertical speed the camera will move.
  139772. *
  139773. * @name Phaser.Cameras.Controls.SmoothedKeyControl#maxSpeedY
  139774. * @type {number}
  139775. * @default 0
  139776. * @since 3.0.0
  139777. */
  139778. this.maxSpeedY = 0;
  139779. var maxSpeed = GetValue(config, 'maxSpeed', null);
  139780. if (typeof maxSpeed === 'number')
  139781. {
  139782. this.maxSpeedX = maxSpeed;
  139783. this.maxSpeedY = maxSpeed;
  139784. }
  139785. else
  139786. {
  139787. this.maxSpeedX = GetValue(config, 'maxSpeed.x', 0);
  139788. this.maxSpeedY = GetValue(config, 'maxSpeed.y', 0);
  139789. }
  139790. /**
  139791. * Internal property to track the speed of the control.
  139792. *
  139793. * @name Phaser.Cameras.Controls.SmoothedKeyControl#_speedX
  139794. * @type {number}
  139795. * @private
  139796. * @default 0
  139797. * @since 3.0.0
  139798. */
  139799. this._speedX = 0;
  139800. /**
  139801. * Internal property to track the speed of the control.
  139802. *
  139803. * @name Phaser.Cameras.Controls.SmoothedKeyControl#_speedY
  139804. * @type {number}
  139805. * @private
  139806. * @default 0
  139807. * @since 3.0.0
  139808. */
  139809. this._speedY = 0;
  139810. /**
  139811. * Internal property to track the zoom of the control.
  139812. *
  139813. * @name Phaser.Cameras.Controls.SmoothedKeyControl#_zoom
  139814. * @type {number}
  139815. * @private
  139816. * @default 0
  139817. * @since 3.0.0
  139818. */
  139819. this._zoom = 0;
  139820. /**
  139821. * A flag controlling if the Controls will update the Camera or not.
  139822. *
  139823. * @name Phaser.Cameras.Controls.SmoothedKeyControl#active
  139824. * @type {boolean}
  139825. * @since 3.0.0
  139826. */
  139827. this.active = (this.camera !== null);
  139828. },
  139829. /**
  139830. * Starts the Key Control running, providing it has been linked to a camera.
  139831. *
  139832. * @method Phaser.Cameras.Controls.SmoothedKeyControl#start
  139833. * @since 3.0.0
  139834. *
  139835. * @return {Phaser.Cameras.Controls.SmoothedKeyControl} This Key Control instance.
  139836. */
  139837. start: function ()
  139838. {
  139839. this.active = (this.camera !== null);
  139840. return this;
  139841. },
  139842. /**
  139843. * Stops this Key Control from running. Call `start` to start it again.
  139844. *
  139845. * @method Phaser.Cameras.Controls.SmoothedKeyControl#stop
  139846. * @since 3.0.0
  139847. *
  139848. * @return {Phaser.Cameras.Controls.SmoothedKeyControl} This Key Control instance.
  139849. */
  139850. stop: function ()
  139851. {
  139852. this.active = false;
  139853. return this;
  139854. },
  139855. /**
  139856. * Binds this Key Control to a camera.
  139857. *
  139858. * @method Phaser.Cameras.Controls.SmoothedKeyControl#setCamera
  139859. * @since 3.0.0
  139860. *
  139861. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera to bind this Key Control to.
  139862. *
  139863. * @return {Phaser.Cameras.Controls.SmoothedKeyControl} This Key Control instance.
  139864. */
  139865. setCamera: function (camera)
  139866. {
  139867. this.camera = camera;
  139868. return this;
  139869. },
  139870. /**
  139871. * Applies the results of pressing the control keys to the Camera.
  139872. *
  139873. * You must call this every step, it is not called automatically.
  139874. *
  139875. * @method Phaser.Cameras.Controls.SmoothedKeyControl#update
  139876. * @since 3.0.0
  139877. *
  139878. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  139879. */
  139880. update: function (delta)
  139881. {
  139882. if (!this.active)
  139883. {
  139884. return;
  139885. }
  139886. if (delta === undefined) { delta = 1; }
  139887. var cam = this.camera;
  139888. // Apply Deceleration
  139889. if (this._speedX > 0)
  139890. {
  139891. this._speedX -= this.dragX * delta;
  139892. if (this._speedX < 0)
  139893. {
  139894. this._speedX = 0;
  139895. }
  139896. }
  139897. else if (this._speedX < 0)
  139898. {
  139899. this._speedX += this.dragX * delta;
  139900. if (this._speedX > 0)
  139901. {
  139902. this._speedX = 0;
  139903. }
  139904. }
  139905. if (this._speedY > 0)
  139906. {
  139907. this._speedY -= this.dragY * delta;
  139908. if (this._speedY < 0)
  139909. {
  139910. this._speedY = 0;
  139911. }
  139912. }
  139913. else if (this._speedY < 0)
  139914. {
  139915. this._speedY += this.dragY * delta;
  139916. if (this._speedY > 0)
  139917. {
  139918. this._speedY = 0;
  139919. }
  139920. }
  139921. // Check for keys
  139922. if (this.up && this.up.isDown)
  139923. {
  139924. this._speedY += this.accelY;
  139925. if (this._speedY > this.maxSpeedY)
  139926. {
  139927. this._speedY = this.maxSpeedY;
  139928. }
  139929. }
  139930. else if (this.down && this.down.isDown)
  139931. {
  139932. this._speedY -= this.accelY;
  139933. if (this._speedY < -this.maxSpeedY)
  139934. {
  139935. this._speedY = -this.maxSpeedY;
  139936. }
  139937. }
  139938. if (this.left && this.left.isDown)
  139939. {
  139940. this._speedX += this.accelX;
  139941. if (this._speedX > this.maxSpeedX)
  139942. {
  139943. this._speedX = this.maxSpeedX;
  139944. }
  139945. }
  139946. else if (this.right && this.right.isDown)
  139947. {
  139948. this._speedX -= this.accelX;
  139949. if (this._speedX < -this.maxSpeedX)
  139950. {
  139951. this._speedX = -this.maxSpeedX;
  139952. }
  139953. }
  139954. // Camera zoom
  139955. if (this.zoomIn && this.zoomIn.isDown)
  139956. {
  139957. this._zoom = -this.zoomSpeed;
  139958. }
  139959. else if (this.zoomOut && this.zoomOut.isDown)
  139960. {
  139961. this._zoom = this.zoomSpeed;
  139962. }
  139963. else
  139964. {
  139965. this._zoom = 0;
  139966. }
  139967. // Apply to Camera
  139968. if (this._speedX !== 0)
  139969. {
  139970. cam.scrollX -= ((this._speedX * delta) | 0);
  139971. }
  139972. if (this._speedY !== 0)
  139973. {
  139974. cam.scrollY -= ((this._speedY * delta) | 0);
  139975. }
  139976. if (this._zoom !== 0)
  139977. {
  139978. cam.zoom += this._zoom;
  139979. if (cam.zoom < 0.1)
  139980. {
  139981. cam.zoom = 0.1;
  139982. }
  139983. }
  139984. },
  139985. /**
  139986. * Destroys this Key Control.
  139987. *
  139988. * @method Phaser.Cameras.Controls.SmoothedKeyControl#destroy
  139989. * @since 3.0.0
  139990. */
  139991. destroy: function ()
  139992. {
  139993. this.camera = null;
  139994. this.left = null;
  139995. this.right = null;
  139996. this.up = null;
  139997. this.down = null;
  139998. this.zoomIn = null;
  139999. this.zoomOut = null;
  140000. }
  140001. });
  140002. module.exports = SmoothedKeyControl;
  140003. /***/ }),
  140004. /* 1171 */
  140005. /***/ (function(module, exports, __webpack_require__) {
  140006. /**
  140007. * @author Richard Davey <rich@photonstorm.com>
  140008. * @copyright 2019 Photon Storm Ltd.
  140009. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140010. */
  140011. var Class = __webpack_require__(0);
  140012. var GetValue = __webpack_require__(4);
  140013. /**
  140014. * @typedef {object} FixedKeyControlConfig
  140015. *
  140016. * @property {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera that this Control will update.
  140017. * @property {Phaser.Input.Keyboard.Key} [left] - The Key to be pressed that will move the Camera left.
  140018. * @property {Phaser.Input.Keyboard.Key} [right] - The Key to be pressed that will move the Camera right.
  140019. * @property {Phaser.Input.Keyboard.Key} [up] - The Key to be pressed that will move the Camera up.
  140020. * @property {Phaser.Input.Keyboard.Key} [down] - The Key to be pressed that will move the Camera down.
  140021. * @property {Phaser.Input.Keyboard.Key} [zoomIn] - The Key to be pressed that will zoom the Camera in.
  140022. * @property {Phaser.Input.Keyboard.Key} [zoomOut] - The Key to be pressed that will zoom the Camera out.
  140023. * @property {number} [zoomSpeed=0.01] - The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed.
  140024. * @property {(number|{x:number,y:number})} [speed=0] - The horizontal and vertical speed the camera will move.
  140025. */
  140026. /**
  140027. * @classdesc
  140028. * A Fixed Key Camera Control.
  140029. *
  140030. * This allows you to control the movement and zoom of a camera using the defined keys.
  140031. *
  140032. * ```javascript
  140033. * var camControl = new FixedKeyControl({
  140034. * camera: this.cameras.main,
  140035. * left: cursors.left,
  140036. * right: cursors.right,
  140037. * speed: float OR { x: 0, y: 0 }
  140038. * });
  140039. * ```
  140040. *
  140041. * Movement is precise and has no 'smoothing' applied to it.
  140042. *
  140043. * You must call the `update` method of this controller every frame.
  140044. *
  140045. * @class FixedKeyControl
  140046. * @memberof Phaser.Cameras.Controls
  140047. * @constructor
  140048. * @since 3.0.0
  140049. *
  140050. * @param {FixedKeyControlConfig} config - The Fixed Key Control configuration object.
  140051. */
  140052. var FixedKeyControl = new Class({
  140053. initialize:
  140054. function FixedKeyControl (config)
  140055. {
  140056. /**
  140057. * The Camera that this Control will update.
  140058. *
  140059. * @name Phaser.Cameras.Controls.FixedKeyControl#camera
  140060. * @type {?Phaser.Cameras.Scene2D.Camera}
  140061. * @default null
  140062. * @since 3.0.0
  140063. */
  140064. this.camera = GetValue(config, 'camera', null);
  140065. /**
  140066. * The Key to be pressed that will move the Camera left.
  140067. *
  140068. * @name Phaser.Cameras.Controls.FixedKeyControl#left
  140069. * @type {?Phaser.Input.Keyboard.Key}
  140070. * @default null
  140071. * @since 3.0.0
  140072. */
  140073. this.left = GetValue(config, 'left', null);
  140074. /**
  140075. * The Key to be pressed that will move the Camera right.
  140076. *
  140077. * @name Phaser.Cameras.Controls.FixedKeyControl#right
  140078. * @type {?Phaser.Input.Keyboard.Key}
  140079. * @default null
  140080. * @since 3.0.0
  140081. */
  140082. this.right = GetValue(config, 'right', null);
  140083. /**
  140084. * The Key to be pressed that will move the Camera up.
  140085. *
  140086. * @name Phaser.Cameras.Controls.FixedKeyControl#up
  140087. * @type {?Phaser.Input.Keyboard.Key}
  140088. * @default null
  140089. * @since 3.0.0
  140090. */
  140091. this.up = GetValue(config, 'up', null);
  140092. /**
  140093. * The Key to be pressed that will move the Camera down.
  140094. *
  140095. * @name Phaser.Cameras.Controls.FixedKeyControl#down
  140096. * @type {?Phaser.Input.Keyboard.Key}
  140097. * @default null
  140098. * @since 3.0.0
  140099. */
  140100. this.down = GetValue(config, 'down', null);
  140101. /**
  140102. * The Key to be pressed that will zoom the Camera in.
  140103. *
  140104. * @name Phaser.Cameras.Controls.FixedKeyControl#zoomIn
  140105. * @type {?Phaser.Input.Keyboard.Key}
  140106. * @default null
  140107. * @since 3.0.0
  140108. */
  140109. this.zoomIn = GetValue(config, 'zoomIn', null);
  140110. /**
  140111. * The Key to be pressed that will zoom the Camera out.
  140112. *
  140113. * @name Phaser.Cameras.Controls.FixedKeyControl#zoomOut
  140114. * @type {?Phaser.Input.Keyboard.Key}
  140115. * @default null
  140116. * @since 3.0.0
  140117. */
  140118. this.zoomOut = GetValue(config, 'zoomOut', null);
  140119. /**
  140120. * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed.
  140121. *
  140122. * @name Phaser.Cameras.Controls.FixedKeyControl#zoomSpeed
  140123. * @type {number}
  140124. * @default 0.01
  140125. * @since 3.0.0
  140126. */
  140127. this.zoomSpeed = GetValue(config, 'zoomSpeed', 0.01);
  140128. /**
  140129. * The horizontal speed the camera will move.
  140130. *
  140131. * @name Phaser.Cameras.Controls.FixedKeyControl#speedX
  140132. * @type {number}
  140133. * @default 0
  140134. * @since 3.0.0
  140135. */
  140136. this.speedX = 0;
  140137. /**
  140138. * The vertical speed the camera will move.
  140139. *
  140140. * @name Phaser.Cameras.Controls.FixedKeyControl#speedY
  140141. * @type {number}
  140142. * @default 0
  140143. * @since 3.0.0
  140144. */
  140145. this.speedY = 0;
  140146. var speed = GetValue(config, 'speed', null);
  140147. if (typeof speed === 'number')
  140148. {
  140149. this.speedX = speed;
  140150. this.speedY = speed;
  140151. }
  140152. else
  140153. {
  140154. this.speedX = GetValue(config, 'speed.x', 0);
  140155. this.speedY = GetValue(config, 'speed.y', 0);
  140156. }
  140157. /**
  140158. * Internal property to track the current zoom level.
  140159. *
  140160. * @name Phaser.Cameras.Controls.FixedKeyControl#_zoom
  140161. * @type {number}
  140162. * @private
  140163. * @default 0
  140164. * @since 3.0.0
  140165. */
  140166. this._zoom = 0;
  140167. /**
  140168. * A flag controlling if the Controls will update the Camera or not.
  140169. *
  140170. * @name Phaser.Cameras.Controls.FixedKeyControl#active
  140171. * @type {boolean}
  140172. * @since 3.0.0
  140173. */
  140174. this.active = (this.camera !== null);
  140175. },
  140176. /**
  140177. * Starts the Key Control running, providing it has been linked to a camera.
  140178. *
  140179. * @method Phaser.Cameras.Controls.FixedKeyControl#start
  140180. * @since 3.0.0
  140181. *
  140182. * @return {Phaser.Cameras.Controls.FixedKeyControl} This Key Control instance.
  140183. */
  140184. start: function ()
  140185. {
  140186. this.active = (this.camera !== null);
  140187. return this;
  140188. },
  140189. /**
  140190. * Stops this Key Control from running. Call `start` to start it again.
  140191. *
  140192. * @method Phaser.Cameras.Controls.FixedKeyControl#stop
  140193. * @since 3.0.0
  140194. *
  140195. * @return {Phaser.Cameras.Controls.FixedKeyControl} This Key Control instance.
  140196. */
  140197. stop: function ()
  140198. {
  140199. this.active = false;
  140200. return this;
  140201. },
  140202. /**
  140203. * Binds this Key Control to a camera.
  140204. *
  140205. * @method Phaser.Cameras.Controls.FixedKeyControl#setCamera
  140206. * @since 3.0.0
  140207. *
  140208. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera to bind this Key Control to.
  140209. *
  140210. * @return {Phaser.Cameras.Controls.FixedKeyControl} This Key Control instance.
  140211. */
  140212. setCamera: function (camera)
  140213. {
  140214. this.camera = camera;
  140215. return this;
  140216. },
  140217. /**
  140218. * Applies the results of pressing the control keys to the Camera.
  140219. *
  140220. * You must call this every step, it is not called automatically.
  140221. *
  140222. * @method Phaser.Cameras.Controls.FixedKeyControl#update
  140223. * @since 3.0.0
  140224. *
  140225. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  140226. */
  140227. update: function (delta)
  140228. {
  140229. if (!this.active)
  140230. {
  140231. return;
  140232. }
  140233. if (delta === undefined) { delta = 1; }
  140234. var cam = this.camera;
  140235. if (this.up && this.up.isDown)
  140236. {
  140237. cam.scrollY -= ((this.speedY * delta) | 0);
  140238. }
  140239. else if (this.down && this.down.isDown)
  140240. {
  140241. cam.scrollY += ((this.speedY * delta) | 0);
  140242. }
  140243. if (this.left && this.left.isDown)
  140244. {
  140245. cam.scrollX -= ((this.speedX * delta) | 0);
  140246. }
  140247. else if (this.right && this.right.isDown)
  140248. {
  140249. cam.scrollX += ((this.speedX * delta) | 0);
  140250. }
  140251. // Camera zoom
  140252. if (this.zoomIn && this.zoomIn.isDown)
  140253. {
  140254. cam.zoom -= this.zoomSpeed;
  140255. if (cam.zoom < 0.1)
  140256. {
  140257. cam.zoom = 0.1;
  140258. }
  140259. }
  140260. else if (this.zoomOut && this.zoomOut.isDown)
  140261. {
  140262. cam.zoom += this.zoomSpeed;
  140263. }
  140264. },
  140265. /**
  140266. * Destroys this Key Control.
  140267. *
  140268. * @method Phaser.Cameras.Controls.FixedKeyControl#destroy
  140269. * @since 3.0.0
  140270. */
  140271. destroy: function ()
  140272. {
  140273. this.camera = null;
  140274. this.left = null;
  140275. this.right = null;
  140276. this.up = null;
  140277. this.down = null;
  140278. this.zoomIn = null;
  140279. this.zoomOut = null;
  140280. }
  140281. });
  140282. module.exports = FixedKeyControl;
  140283. /***/ }),
  140284. /* 1172 */
  140285. /***/ (function(module, exports, __webpack_require__) {
  140286. /**
  140287. * @author Richard Davey <rich@photonstorm.com>
  140288. * @copyright 2019 Photon Storm Ltd.
  140289. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140290. */
  140291. /**
  140292. * @namespace Phaser.Cameras.Controls
  140293. */
  140294. module.exports = {
  140295. FixedKeyControl: __webpack_require__(1171),
  140296. SmoothedKeyControl: __webpack_require__(1170)
  140297. };
  140298. /***/ }),
  140299. /* 1173 */
  140300. /***/ (function(module, exports, __webpack_require__) {
  140301. /**
  140302. * @author Richard Davey <rich@photonstorm.com>
  140303. * @copyright 2019 Photon Storm Ltd.
  140304. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140305. */
  140306. /**
  140307. * @namespace Phaser.Cameras
  140308. */
  140309. module.exports = {
  140310. Controls: __webpack_require__(1172),
  140311. Scene2D: __webpack_require__(1169)
  140312. };
  140313. /***/ }),
  140314. /* 1174 */
  140315. /***/ (function(module, exports) {
  140316. /**
  140317. * @author Richard Davey <rich@photonstorm.com>
  140318. * @copyright 2019 Photon Storm Ltd.
  140319. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140320. */
  140321. /**
  140322. * The Cache Remove Event.
  140323. *
  140324. * This event is dispatched by any Cache that extends the BaseCache each time an object is removed from it.
  140325. *
  140326. * @event Phaser.Cache.Events#REMOVE
  140327. *
  140328. * @param {Phaser.Cache.BaseCache} cache - The cache from which the object was removed.
  140329. * @param {string} key - The key of the object removed from the cache.
  140330. * @param {*} object - A reference to the object that was removed from the cache.
  140331. */
  140332. module.exports = 'remove';
  140333. /***/ }),
  140334. /* 1175 */
  140335. /***/ (function(module, exports) {
  140336. /**
  140337. * @author Richard Davey <rich@photonstorm.com>
  140338. * @copyright 2019 Photon Storm Ltd.
  140339. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140340. */
  140341. /**
  140342. * The Cache Add Event.
  140343. *
  140344. * This event is dispatched by any Cache that extends the BaseCache each time a new object is added to it.
  140345. *
  140346. * @event Phaser.Cache.Events#ADD
  140347. *
  140348. * @param {Phaser.Cache.BaseCache} cache - The cache to which the object was added.
  140349. * @param {string} key - The key of the object added to the cache.
  140350. * @param {*} object - A reference to the object that was added to the cache.
  140351. */
  140352. module.exports = 'add';
  140353. /***/ }),
  140354. /* 1176 */
  140355. /***/ (function(module, exports, __webpack_require__) {
  140356. /**
  140357. * @author Richard Davey <rich@photonstorm.com>
  140358. * @copyright 2019 Photon Storm Ltd.
  140359. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140360. */
  140361. /**
  140362. * @namespace Phaser.Cache
  140363. */
  140364. module.exports = {
  140365. BaseCache: __webpack_require__(414),
  140366. CacheManager: __webpack_require__(412),
  140367. Events: __webpack_require__(413)
  140368. };
  140369. /***/ }),
  140370. /* 1177 */
  140371. /***/ (function(module, exports) {
  140372. /**
  140373. * @author Richard Davey <rich@photonstorm.com>
  140374. * @copyright 2019 Photon Storm Ltd.
  140375. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140376. */
  140377. /**
  140378. * The Game Visible Event.
  140379. *
  140380. * This event is dispatched by the Game Visibility Handler when the document in which the Game instance is embedded
  140381. * enters a visible state, previously having been hidden.
  140382. *
  140383. * Only browsers that support the Visibility API will cause this event to be emitted.
  140384. *
  140385. * @event Phaser.Core.Events#VISIBLE
  140386. */
  140387. module.exports = 'visible';
  140388. /***/ }),
  140389. /* 1178 */
  140390. /***/ (function(module, exports) {
  140391. /**
  140392. * @author Richard Davey <rich@photonstorm.com>
  140393. * @copyright 2019 Photon Storm Ltd.
  140394. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140395. */
  140396. /**
  140397. * The Game Step Event.
  140398. *
  140399. * This event is dispatched after the Game Pre-Step and before the Scene Manager steps.
  140400. * Hook into it from plugins or systems that need to update before the Scene Manager does, but after the core Systems have.
  140401. *
  140402. * @event Phaser.Core.Events#STEP
  140403. *
  140404. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  140405. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  140406. */
  140407. module.exports = 'step';
  140408. /***/ }),
  140409. /* 1179 */
  140410. /***/ (function(module, exports) {
  140411. /**
  140412. * @author Richard Davey <rich@photonstorm.com>
  140413. * @copyright 2019 Photon Storm Ltd.
  140414. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140415. */
  140416. /**
  140417. * The Game Resume Event.
  140418. *
  140419. * This event is dispatched when the game loop leaves a paused state and resumes running.
  140420. *
  140421. * @event Phaser.Core.Events#RESUME
  140422. */
  140423. module.exports = 'resume';
  140424. /***/ }),
  140425. /* 1180 */
  140426. /***/ (function(module, exports) {
  140427. /**
  140428. * @author Richard Davey <rich@photonstorm.com>
  140429. * @copyright 2019 Photon Storm Ltd.
  140430. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140431. */
  140432. /**
  140433. * The Game Ready Event.
  140434. *
  140435. * This event is dispatched when the Phaser Game instance has finished booting, the Texture Manager is fully ready,
  140436. * and all local systems are now able to start.
  140437. *
  140438. * @event Phaser.Core.Events#READY
  140439. */
  140440. module.exports = 'ready';
  140441. /***/ }),
  140442. /* 1181 */
  140443. /***/ (function(module, exports) {
  140444. /**
  140445. * @author Richard Davey <rich@photonstorm.com>
  140446. * @copyright 2019 Photon Storm Ltd.
  140447. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140448. */
  140449. /**
  140450. * The Game Pre-Step Event.
  140451. *
  140452. * This event is dispatched before the main Game Step starts. By this point in the game cycle none of the Scene updates have yet happened.
  140453. * Hook into it from plugins or systems that need to update before the Scene Manager does.
  140454. *
  140455. * @event Phaser.Core.Events#PRE_STEP
  140456. *
  140457. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  140458. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  140459. */
  140460. module.exports = 'prestep';
  140461. /***/ }),
  140462. /* 1182 */
  140463. /***/ (function(module, exports) {
  140464. /**
  140465. * @author Richard Davey <rich@photonstorm.com>
  140466. * @copyright 2019 Photon Storm Ltd.
  140467. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140468. */
  140469. /**
  140470. * The Game Pre-Render Event.
  140471. *
  140472. * This event is dispatched immediately before any of the Scenes have started to render.
  140473. *
  140474. * The renderer will already have been initialized this frame, clearing itself and preparing to receive the Scenes for rendering, but it won't have actually drawn anything yet.
  140475. *
  140476. * @event Phaser.Core.Events#PRE_RENDER
  140477. *
  140478. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - A reference to the current renderer being used by the Game instance.
  140479. */
  140480. module.exports = 'prerender';
  140481. /***/ }),
  140482. /* 1183 */
  140483. /***/ (function(module, exports) {
  140484. /**
  140485. * @author Richard Davey <rich@photonstorm.com>
  140486. * @copyright 2019 Photon Storm Ltd.
  140487. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140488. */
  140489. /**
  140490. * The Game Post-Step Event.
  140491. *
  140492. * This event is dispatched after the Scene Manager has updated.
  140493. * Hook into it from plugins or systems that need to do things before the render starts.
  140494. *
  140495. * @event Phaser.Core.Events#POST_STEP
  140496. *
  140497. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  140498. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  140499. */
  140500. module.exports = 'poststep';
  140501. /***/ }),
  140502. /* 1184 */
  140503. /***/ (function(module, exports) {
  140504. /**
  140505. * @author Richard Davey <rich@photonstorm.com>
  140506. * @copyright 2019 Photon Storm Ltd.
  140507. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140508. */
  140509. /**
  140510. * The Game Post-Render Event.
  140511. *
  140512. * This event is dispatched right at the end of the render process.
  140513. *
  140514. * Every Scene will have rendered and been drawn to the canvas by the time this event is fired.
  140515. * Use it for any last minute post-processing before the next game step begins.
  140516. *
  140517. * @event Phaser.Core.Events#POST_RENDER
  140518. *
  140519. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - A reference to the current renderer being used by the Game instance.
  140520. */
  140521. module.exports = 'postrender';
  140522. /***/ }),
  140523. /* 1185 */
  140524. /***/ (function(module, exports) {
  140525. /**
  140526. * @author Richard Davey <rich@photonstorm.com>
  140527. * @copyright 2019 Photon Storm Ltd.
  140528. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140529. */
  140530. /**
  140531. * The Game Pause Event.
  140532. *
  140533. * This event is dispatched when the Game loop enters a paused state, usually as a result of the Visibility Handler.
  140534. *
  140535. * @event Phaser.Core.Events#PAUSE
  140536. */
  140537. module.exports = 'pause';
  140538. /***/ }),
  140539. /* 1186 */
  140540. /***/ (function(module, exports) {
  140541. /**
  140542. * @author Richard Davey <rich@photonstorm.com>
  140543. * @copyright 2019 Photon Storm Ltd.
  140544. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140545. */
  140546. /**
  140547. * The Game Hidden Event.
  140548. *
  140549. * This event is dispatched by the Game Visibility Handler when the document in which the Game instance is embedded
  140550. * enters a hidden state. Only browsers that support the Visibility API will cause this event to be emitted.
  140551. *
  140552. * In most modern browsers, when the document enters a hidden state, the Request Animation Frame and setTimeout, which
  140553. * control the main game loop, will automatically pause. There is no way to stop this from happening. It is something
  140554. * your game should account for in its own code, should the pause be an issue (i.e. for multiplayer games)
  140555. *
  140556. * @event Phaser.Core.Events#HIDDEN
  140557. */
  140558. module.exports = 'hidden';
  140559. /***/ }),
  140560. /* 1187 */
  140561. /***/ (function(module, exports) {
  140562. /**
  140563. * @author Richard Davey <rich@photonstorm.com>
  140564. * @copyright 2019 Photon Storm Ltd.
  140565. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140566. */
  140567. /**
  140568. * The Game Focus Event.
  140569. *
  140570. * This event is dispatched by the Game Visibility Handler when the window in which the Game instance is embedded
  140571. * enters a focused state. The focus event is raised when the window re-gains focus, having previously lost it.
  140572. *
  140573. * @event Phaser.Core.Events#FOCUS
  140574. */
  140575. module.exports = 'focus';
  140576. /***/ }),
  140577. /* 1188 */
  140578. /***/ (function(module, exports) {
  140579. /**
  140580. * @author Richard Davey <rich@photonstorm.com>
  140581. * @copyright 2019 Photon Storm Ltd.
  140582. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140583. */
  140584. /**
  140585. * The Game Destroy Event.
  140586. *
  140587. * This event is dispatched when the game instance has been told to destroy itself.
  140588. * Lots of internal systems listen to this event in order to clear themselves out.
  140589. * Custom plugins and game code should also do the same.
  140590. *
  140591. * @event Phaser.Core.Events#DESTROY
  140592. */
  140593. module.exports = 'destroy';
  140594. /***/ }),
  140595. /* 1189 */
  140596. /***/ (function(module, exports) {
  140597. /**
  140598. * @author Richard Davey <rich@photonstorm.com>
  140599. * @copyright 2019 Photon Storm Ltd.
  140600. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140601. */
  140602. /**
  140603. * The Game Boot Event.
  140604. *
  140605. * This event is dispatched when the Phaser Game instance has finished booting, but before it is ready to start running.
  140606. * The global systems use this event to know when to set themselves up, dispatching their own `ready` events as required.
  140607. *
  140608. * @event Phaser.Core.Events#BOOT
  140609. */
  140610. module.exports = 'boot';
  140611. /***/ }),
  140612. /* 1190 */
  140613. /***/ (function(module, exports) {
  140614. /**
  140615. * @author Richard Davey <rich@photonstorm.com>
  140616. * @copyright 2019 Photon Storm Ltd.
  140617. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140618. */
  140619. /**
  140620. * The Game Blur Event.
  140621. *
  140622. * This event is dispatched by the Game Visibility Handler when the window in which the Game instance is embedded
  140623. * enters a blurred state. The blur event is raised when the window loses focus. This can happen if a user swaps
  140624. * tab, or if they simply remove focus from the browser to another app.
  140625. *
  140626. * @event Phaser.Core.Events#BLUR
  140627. */
  140628. module.exports = 'blur';
  140629. /***/ }),
  140630. /* 1191 */
  140631. /***/ (function(module, exports, __webpack_require__) {
  140632. /**
  140633. * @author Richard Davey <rich@photonstorm.com>
  140634. * @copyright 2019 Photon Storm Ltd.
  140635. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140636. */
  140637. /**
  140638. * @namespace Phaser.Animations
  140639. */
  140640. module.exports = {
  140641. Animation: __webpack_require__(205),
  140642. AnimationFrame: __webpack_require__(433),
  140643. AnimationManager: __webpack_require__(415),
  140644. Events: __webpack_require__(136)
  140645. };
  140646. /***/ }),
  140647. /* 1192 */
  140648. /***/ (function(module, exports, __webpack_require__) {
  140649. /**
  140650. * @author Richard Davey <rich@photonstorm.com>
  140651. * @author samme <samme.npm@gmail.com>
  140652. * @copyright 2019 Photon Storm Ltd.
  140653. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140654. */
  140655. var Wrap = __webpack_require__(57);
  140656. /**
  140657. * Wrap each item's coordinates within a rectangle's area.
  140658. *
  140659. * @function Phaser.Actions.WrapInRectangle
  140660. * @since 3.0.0
  140661. * @see Phaser.Math.Wrap
  140662. *
  140663. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  140664. *
  140665. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  140666. * @param {Phaser.Geom.Rectangle} rect - The rectangle.
  140667. * @param {number} [padding=0] - An amount added to each side of the rectangle during the operation.
  140668. *
  140669. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  140670. */
  140671. var WrapInRectangle = function (items, rect, padding)
  140672. {
  140673. if (padding === undefined)
  140674. {
  140675. padding = 0;
  140676. }
  140677. for (var i = 0; i < items.length; i++)
  140678. {
  140679. var item = items[i];
  140680. item.x = Wrap(item.x, rect.left - padding, rect.right + padding);
  140681. item.y = Wrap(item.y, rect.top - padding, rect.bottom + padding);
  140682. }
  140683. return items;
  140684. };
  140685. module.exports = WrapInRectangle;
  140686. /***/ }),
  140687. /* 1193 */
  140688. /***/ (function(module, exports) {
  140689. /**
  140690. * @author Richard Davey <rich@photonstorm.com>
  140691. * @copyright 2019 Photon Storm Ltd.
  140692. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140693. */
  140694. /**
  140695. * Takes an array of Game Objects and toggles the visibility of each one.
  140696. * Those previously `visible = false` will become `visible = true`, and vice versa.
  140697. *
  140698. * @function Phaser.Actions.ToggleVisible
  140699. * @since 3.0.0
  140700. *
  140701. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  140702. *
  140703. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  140704. *
  140705. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  140706. */
  140707. var ToggleVisible = function (items)
  140708. {
  140709. for (var i = 0; i < items.length; i++)
  140710. {
  140711. items[i].visible = !items[i].visible;
  140712. }
  140713. return items;
  140714. };
  140715. module.exports = ToggleVisible;
  140716. /***/ }),
  140717. /* 1194 */
  140718. /***/ (function(module, exports) {
  140719. /**
  140720. * @author Richard Davey <rich@photonstorm.com>
  140721. * @copyright 2019 Photon Storm Ltd.
  140722. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140723. */
  140724. /**
  140725. * Takes an array of Game Objects and then modifies their `property` so the value equals, or is incremented, the
  140726. * calculated spread value.
  140727. *
  140728. * The spread value is derived from the given `min` and `max` values and the total number of items in the array.//#endregion
  140729. *
  140730. * For example, to cause an array of Sprites to change in alpha from 0 to 1 you could call:
  140731. *
  140732. * ```javascript
  140733. * Phaser.Actions.Spread(itemsArray, 'alpha', 0, 1);
  140734. * ```
  140735. *
  140736. * @function Phaser.Actions.Spread
  140737. * @since 3.0.0
  140738. *
  140739. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  140740. *
  140741. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  140742. * @param {string} property - The property of the Game Object to spread.
  140743. * @param {number} min - The minimum value.
  140744. * @param {number} max - The maximum value.
  140745. * @param {boolean} [inc=false] - Should the values be incremented? `true` or set (`false`)
  140746. *
  140747. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that were passed to this Action.
  140748. */
  140749. var Spread = function (items, property, min, max, inc)
  140750. {
  140751. if (inc === undefined) { inc = false; }
  140752. var step = Math.abs(max - min) / items.length;
  140753. var i;
  140754. if (inc)
  140755. {
  140756. for (i = 0; i < items.length; i++)
  140757. {
  140758. items[i][property] += i * step;
  140759. }
  140760. }
  140761. else
  140762. {
  140763. for (i = 0; i < items.length; i++)
  140764. {
  140765. items[i][property] = i * step;
  140766. }
  140767. }
  140768. return items;
  140769. };
  140770. module.exports = Spread;
  140771. /***/ }),
  140772. /* 1195 */
  140773. /***/ (function(module, exports, __webpack_require__) {
  140774. /**
  140775. * @author Richard Davey <rich@photonstorm.com>
  140776. * @copyright 2019 Photon Storm Ltd.
  140777. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140778. */
  140779. var MathSmoothStep = __webpack_require__(195);
  140780. /**
  140781. * Smoothstep is a sigmoid-like interpolation and clamping function.
  140782. *
  140783. * The function depends on three parameters, the input x, the "left edge" and the "right edge", with the left edge being assumed smaller than the right edge. The function receives a real number x as an argument and returns 0 if x is less than or equal to the left edge, 1 if x is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial, between 0 and 1 otherwise. The slope of the smoothstep function is zero at both edges. This is convenient for creating a sequence of transitions using smoothstep to interpolate each segment as an alternative to using more sophisticated or expensive interpolation techniques.
  140784. *
  140785. * @function Phaser.Actions.SmoothStep
  140786. * @since 3.0.0
  140787. *
  140788. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  140789. *
  140790. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  140791. * @param {string} property - The property of the Game Object to interpolate.
  140792. * @param {number} min - The minimum interpolation value.
  140793. * @param {number} max - The maximum interpolation value.
  140794. * @param {boolean} [inc=false] - Should the values be incremented? `true` or set (`false`)
  140795. *
  140796. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  140797. */
  140798. var SmoothStep = function (items, property, min, max, inc)
  140799. {
  140800. if (inc === undefined) { inc = false; }
  140801. var step = Math.abs(max - min) / items.length;
  140802. var i;
  140803. if (inc)
  140804. {
  140805. for (i = 0; i < items.length; i++)
  140806. {
  140807. items[i][property] += MathSmoothStep(i * step, min, max);
  140808. }
  140809. }
  140810. else
  140811. {
  140812. for (i = 0; i < items.length; i++)
  140813. {
  140814. items[i][property] = MathSmoothStep(i * step, min, max);
  140815. }
  140816. }
  140817. return items;
  140818. };
  140819. module.exports = SmoothStep;
  140820. /***/ }),
  140821. /* 1196 */
  140822. /***/ (function(module, exports, __webpack_require__) {
  140823. /**
  140824. * @author Richard Davey <rich@photonstorm.com>
  140825. * @copyright 2019 Photon Storm Ltd.
  140826. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140827. */
  140828. var MathSmootherStep = __webpack_require__(196);
  140829. /**
  140830. * Smootherstep is a sigmoid-like interpolation and clamping function.
  140831. *
  140832. * The function depends on three parameters, the input x, the "left edge" and the "right edge", with the left edge being assumed smaller than the right edge. The function receives a real number x as an argument and returns 0 if x is less than or equal to the left edge, 1 if x is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial, between 0 and 1 otherwise. The slope of the smoothstep function is zero at both edges. This is convenient for creating a sequence of transitions using smoothstep to interpolate each segment as an alternative to using more sophisticated or expensive interpolation techniques.
  140833. *
  140834. * @function Phaser.Actions.SmootherStep
  140835. * @since 3.0.0
  140836. *
  140837. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  140838. *
  140839. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  140840. * @param {string} property - The property of the Game Object to interpolate.
  140841. * @param {number} min - The minimum interpolation value.
  140842. * @param {number} max - The maximum interpolation value.
  140843. * @param {boolean} [inc=false] - Should the values be incremented? `true` or set (`false`)
  140844. *
  140845. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  140846. */
  140847. var SmootherStep = function (items, property, min, max, inc)
  140848. {
  140849. if (inc === undefined) { inc = false; }
  140850. var step = Math.abs(max - min) / items.length;
  140851. var i;
  140852. if (inc)
  140853. {
  140854. for (i = 0; i < items.length; i++)
  140855. {
  140856. items[i][property] += MathSmootherStep(i * step, min, max);
  140857. }
  140858. }
  140859. else
  140860. {
  140861. for (i = 0; i < items.length; i++)
  140862. {
  140863. items[i][property] = MathSmootherStep(i * step, min, max);
  140864. }
  140865. }
  140866. return items;
  140867. };
  140868. module.exports = SmootherStep;
  140869. /***/ }),
  140870. /* 1197 */
  140871. /***/ (function(module, exports, __webpack_require__) {
  140872. /**
  140873. * @author Richard Davey <rich@photonstorm.com>
  140874. * @copyright 2019 Photon Storm Ltd.
  140875. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140876. */
  140877. var ArrayShuffle = __webpack_require__(132);
  140878. /**
  140879. * Shuffles the array in place. The shuffled array is both modified and returned.
  140880. *
  140881. * @function Phaser.Actions.Shuffle
  140882. * @since 3.0.0
  140883. * @see Phaser.Utils.Array.Shuffle
  140884. *
  140885. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  140886. *
  140887. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  140888. *
  140889. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  140890. */
  140891. var Shuffle = function (items)
  140892. {
  140893. return ArrayShuffle(items);
  140894. };
  140895. module.exports = Shuffle;
  140896. /***/ }),
  140897. /* 1198 */
  140898. /***/ (function(module, exports, __webpack_require__) {
  140899. /**
  140900. * @author Richard Davey <rich@photonstorm.com>
  140901. * @copyright 2019 Photon Storm Ltd.
  140902. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  140903. */
  140904. var Vector2 = __webpack_require__(3);
  140905. /**
  140906. * Iterate through the items array changing the position of each element to be that of the element that came before
  140907. * it in the array (or after it if direction = 1)
  140908. *
  140909. * The first items position is set to x/y.
  140910. *
  140911. * The final x/y coords are returned
  140912. *
  140913. * @function Phaser.Actions.ShiftPosition
  140914. * @since 3.0.0
  140915. *
  140916. * @generic {Phaser.GameObjects.GameObject[]} G - [items]
  140917. * @generic {Phaser.Math.Vector2} O - [output,$return]
  140918. *
  140919. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  140920. * @param {number} x - The x coordinate to place the first item in the array at.
  140921. * @param {number} y - The y coordinate to place the first item in the array at.
  140922. * @param {integer} [direction=0] - The iteration direction. 0 = first to last and 1 = last to first.
  140923. * @param {(Phaser.Math.Vector2|object)} [output] - An optional objec to store the final objects position in.
  140924. *
  140925. * @return {Phaser.Math.Vector2} The output vector.
  140926. */
  140927. var ShiftPosition = function (items, x, y, direction, output)
  140928. {
  140929. if (direction === undefined) { direction = 0; }
  140930. if (output === undefined) { output = new Vector2(); }
  140931. var px;
  140932. var py;
  140933. if (items.length > 1)
  140934. {
  140935. var i;
  140936. var cx;
  140937. var cy;
  140938. var cur;
  140939. if (direction === 0)
  140940. {
  140941. // Bottom to Top
  140942. var len = items.length - 1;
  140943. px = items[len].x;
  140944. py = items[len].y;
  140945. for (i = len - 1; i >= 0; i--)
  140946. {
  140947. // Current item
  140948. cur = items[i];
  140949. // Get current item x/y, to be passed to the next item in the list
  140950. cx = cur.x;
  140951. cy = cur.y;
  140952. // Set current item to the previous items x/y
  140953. cur.x = px;
  140954. cur.y = py;
  140955. // Set current as previous
  140956. px = cx;
  140957. py = cy;
  140958. }
  140959. // Update the head item to the new x/y coordinates
  140960. items[len].x = x;
  140961. items[len].y = y;
  140962. }
  140963. else
  140964. {
  140965. // Top to Bottom
  140966. px = items[0].x;
  140967. py = items[0].y;
  140968. for (i = 1; i < items.length; i++)
  140969. {
  140970. // Current item
  140971. cur = items[i];
  140972. // Get current item x/y, to be passed to the next item in the list
  140973. cx = cur.x;
  140974. cy = cur.y;
  140975. // Set current item to the previous items x/y
  140976. cur.x = px;
  140977. cur.y = py;
  140978. // Set current as previous
  140979. px = cx;
  140980. py = cy;
  140981. }
  140982. // Update the head item to the new x/y coordinates
  140983. items[0].x = x;
  140984. items[0].y = y;
  140985. }
  140986. }
  140987. else
  140988. {
  140989. px = items[0].x;
  140990. py = items[0].y;
  140991. items[0].x = x;
  140992. items[0].y = y;
  140993. }
  140994. // Return the final set of coordinates as they're effectively lost from the shift and may be needed
  140995. output.x = px;
  140996. output.y = py;
  140997. return output;
  140998. };
  140999. module.exports = ShiftPosition;
  141000. /***/ }),
  141001. /* 1199 */
  141002. /***/ (function(module, exports, __webpack_require__) {
  141003. /**
  141004. * @author Richard Davey <rich@photonstorm.com>
  141005. * @copyright 2019 Photon Storm Ltd.
  141006. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141007. */
  141008. var PropertyValueSet = __webpack_require__(27);
  141009. /**
  141010. * Takes an array of Game Objects, or any objects that have the public property `y`
  141011. * and then sets it to the given value.
  141012. *
  141013. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141014. *
  141015. * To use this with a Group: `SetY(group.getChildren(), value, step)`
  141016. *
  141017. * @function Phaser.Actions.SetY
  141018. * @since 3.0.0
  141019. *
  141020. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141021. *
  141022. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141023. * @param {number} value - The amount to set the property to.
  141024. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141025. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141026. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141027. *
  141028. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141029. */
  141030. var SetY = function (items, value, step, index, direction)
  141031. {
  141032. return PropertyValueSet(items, 'y', value, step, index, direction);
  141033. };
  141034. module.exports = SetY;
  141035. /***/ }),
  141036. /* 1200 */
  141037. /***/ (function(module, exports, __webpack_require__) {
  141038. /**
  141039. * @author Richard Davey <rich@photonstorm.com>
  141040. * @copyright 2019 Photon Storm Ltd.
  141041. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141042. */
  141043. var PropertyValueSet = __webpack_require__(27);
  141044. /**
  141045. * Takes an array of Game Objects, or any objects that have the public properties `x` and `y`
  141046. * and then sets them to the given values.
  141047. *
  141048. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  141049. *
  141050. * To use this with a Group: `SetXY(group.getChildren(), x, y, stepX, stepY)`
  141051. *
  141052. * @function Phaser.Actions.SetXY
  141053. * @since 3.0.0
  141054. *
  141055. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141056. *
  141057. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141058. * @param {number} x - The amount to set the `x` property to.
  141059. * @param {number} [y=x] - The amount to set the `y` property to. If `undefined` or `null` it uses the `x` value.
  141060. * @param {number} [stepX=0] - This is added to the `x` amount, multiplied by the iteration counter.
  141061. * @param {number} [stepY=0] - This is added to the `y` amount, multiplied by the iteration counter.
  141062. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141063. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141064. *
  141065. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141066. */
  141067. var SetXY = function (items, x, y, stepX, stepY, index, direction)
  141068. {
  141069. if (y === undefined || y === null) { y = x; }
  141070. PropertyValueSet(items, 'x', x, stepX, index, direction);
  141071. return PropertyValueSet(items, 'y', y, stepY, index, direction);
  141072. };
  141073. module.exports = SetXY;
  141074. /***/ }),
  141075. /* 1201 */
  141076. /***/ (function(module, exports, __webpack_require__) {
  141077. /**
  141078. * @author Richard Davey <rich@photonstorm.com>
  141079. * @copyright 2019 Photon Storm Ltd.
  141080. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141081. */
  141082. var PropertyValueSet = __webpack_require__(27);
  141083. /**
  141084. * Takes an array of Game Objects, or any objects that have the public property `x`
  141085. * and then sets it to the given value.
  141086. *
  141087. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141088. *
  141089. * To use this with a Group: `SetX(group.getChildren(), value, step)`
  141090. *
  141091. * @function Phaser.Actions.SetX
  141092. * @since 3.0.0
  141093. *
  141094. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141095. *
  141096. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141097. * @param {number} value - The amount to set the property to.
  141098. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141099. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141100. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141101. *
  141102. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141103. */
  141104. var SetX = function (items, value, step, index, direction)
  141105. {
  141106. return PropertyValueSet(items, 'x', value, step, index, direction);
  141107. };
  141108. module.exports = SetX;
  141109. /***/ }),
  141110. /* 1202 */
  141111. /***/ (function(module, exports, __webpack_require__) {
  141112. /**
  141113. * @author Richard Davey <rich@photonstorm.com>
  141114. * @copyright 2019 Photon Storm Ltd.
  141115. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141116. */
  141117. var PropertyValueSet = __webpack_require__(27);
  141118. /**
  141119. * Takes an array of Game Objects, or any objects that have the public property `visible`
  141120. * and then sets it to the given value.
  141121. *
  141122. * To use this with a Group: `SetVisible(group.getChildren(), value)`
  141123. *
  141124. * @function Phaser.Actions.SetVisible
  141125. * @since 3.0.0
  141126. *
  141127. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141128. *
  141129. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141130. * @param {boolean} value - The value to set the property to.
  141131. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141132. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141133. *
  141134. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141135. */
  141136. var SetVisible = function (items, value, index, direction)
  141137. {
  141138. return PropertyValueSet(items, 'visible', value, 0, index, direction);
  141139. };
  141140. module.exports = SetVisible;
  141141. /***/ }),
  141142. /* 1203 */
  141143. /***/ (function(module, exports) {
  141144. /**
  141145. * @author Richard Davey <rich@photonstorm.com>
  141146. * @copyright 2019 Photon Storm Ltd.
  141147. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141148. */
  141149. /**
  141150. * Takes an array of Game Objects, or any objects that have the public method setTint() and then updates it to the given value(s). You can specify tint color per corner or provide only one color value for `topLeft` parameter, in which case whole item will be tinted with that color.
  141151. *
  141152. * @function Phaser.Actions.SetTint
  141153. * @since 3.0.0
  141154. *
  141155. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141156. *
  141157. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141158. * @param {number} topLeft - The tint being applied to top-left corner of item. If other parameters are given no value, this tint will be applied to whole item.
  141159. * @param {number} [topRight] - The tint to be applied to top-right corner of item.
  141160. * @param {number} [bottomLeft] - The tint to be applied to the bottom-left corner of item.
  141161. * @param {number} [bottomRight] - The tint to be applied to the bottom-right corner of item.
  141162. *
  141163. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141164. */
  141165. var SetTint = function (items, topLeft, topRight, bottomLeft, bottomRight)
  141166. {
  141167. for (var i = 0; i < items.length; i++)
  141168. {
  141169. items[i].setTint(topLeft, topRight, bottomLeft, bottomRight);
  141170. }
  141171. return items;
  141172. };
  141173. module.exports = SetTint;
  141174. /***/ }),
  141175. /* 1204 */
  141176. /***/ (function(module, exports, __webpack_require__) {
  141177. /**
  141178. * @author Richard Davey <rich@photonstorm.com>
  141179. * @copyright 2019 Photon Storm Ltd.
  141180. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141181. */
  141182. var PropertyValueSet = __webpack_require__(27);
  141183. /**
  141184. * Takes an array of Game Objects, or any objects that have the public property `scaleY`
  141185. * and then sets it to the given value.
  141186. *
  141187. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141188. *
  141189. * To use this with a Group: `SetScaleY(group.getChildren(), value, step)`
  141190. *
  141191. * @function Phaser.Actions.SetScaleY
  141192. * @since 3.0.0
  141193. *
  141194. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141195. *
  141196. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141197. * @param {number} value - The amount to set the property to.
  141198. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141199. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141200. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141201. *
  141202. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141203. */
  141204. var SetScaleY = function (items, value, step, index, direction)
  141205. {
  141206. return PropertyValueSet(items, 'scaleY', value, step, index, direction);
  141207. };
  141208. module.exports = SetScaleY;
  141209. /***/ }),
  141210. /* 1205 */
  141211. /***/ (function(module, exports, __webpack_require__) {
  141212. /**
  141213. * @author Richard Davey <rich@photonstorm.com>
  141214. * @copyright 2019 Photon Storm Ltd.
  141215. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141216. */
  141217. var PropertyValueSet = __webpack_require__(27);
  141218. /**
  141219. * Takes an array of Game Objects, or any objects that have the public property `scaleX`
  141220. * and then sets it to the given value.
  141221. *
  141222. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141223. *
  141224. * To use this with a Group: `SetScaleX(group.getChildren(), value, step)`
  141225. *
  141226. * @function Phaser.Actions.SetScaleX
  141227. * @since 3.0.0
  141228. *
  141229. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141230. *
  141231. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141232. * @param {number} value - The amount to set the property to.
  141233. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141234. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141235. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141236. *
  141237. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141238. */
  141239. var SetScaleX = function (items, value, step, index, direction)
  141240. {
  141241. return PropertyValueSet(items, 'scaleX', value, step, index, direction);
  141242. };
  141243. module.exports = SetScaleX;
  141244. /***/ }),
  141245. /* 1206 */
  141246. /***/ (function(module, exports, __webpack_require__) {
  141247. /**
  141248. * @author Richard Davey <rich@photonstorm.com>
  141249. * @copyright 2019 Photon Storm Ltd.
  141250. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141251. */
  141252. var PropertyValueSet = __webpack_require__(27);
  141253. /**
  141254. * Takes an array of Game Objects, or any objects that have the public properties `scaleX` and `scaleY`
  141255. * and then sets them to the given values.
  141256. *
  141257. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  141258. *
  141259. * To use this with a Group: `SetScale(group.getChildren(), scaleX, scaleY, stepX, stepY)`
  141260. *
  141261. * @function Phaser.Actions.SetScale
  141262. * @since 3.0.0
  141263. *
  141264. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141265. *
  141266. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141267. * @param {number} scaleX - The amount to set the `scaleX` property to.
  141268. * @param {number} [scaleY] - The amount to set the `scaleY` property to. If `undefined` or `null` it uses the `scaleX` value.
  141269. * @param {number} [stepX=0] - This is added to the `scaleX` amount, multiplied by the iteration counter.
  141270. * @param {number} [stepY=0] - This is added to the `scaleY` amount, multiplied by the iteration counter.
  141271. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141272. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141273. *
  141274. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141275. */
  141276. var SetScale = function (items, scaleX, scaleY, stepX, stepY, index, direction)
  141277. {
  141278. if (scaleY === undefined || scaleY === null) { scaleY = scaleX; }
  141279. PropertyValueSet(items, 'scaleX', scaleX, stepX, index, direction);
  141280. return PropertyValueSet(items, 'scaleY', scaleY, stepY, index, direction);
  141281. };
  141282. module.exports = SetScale;
  141283. /***/ }),
  141284. /* 1207 */
  141285. /***/ (function(module, exports, __webpack_require__) {
  141286. /**
  141287. * @author Richard Davey <rich@photonstorm.com>
  141288. * @copyright 2019 Photon Storm Ltd.
  141289. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141290. */
  141291. var PropertyValueSet = __webpack_require__(27);
  141292. /**
  141293. * Takes an array of Game Objects, or any objects that have the public property `rotation`
  141294. * and then sets it to the given value.
  141295. *
  141296. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141297. *
  141298. * To use this with a Group: `SetRotation(group.getChildren(), value, step)`
  141299. *
  141300. * @function Phaser.Actions.SetRotation
  141301. * @since 3.0.0
  141302. *
  141303. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141304. *
  141305. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141306. * @param {number} value - The amount to set the property to.
  141307. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141308. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141309. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141310. *
  141311. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141312. */
  141313. var SetRotation = function (items, value, step, index, direction)
  141314. {
  141315. return PropertyValueSet(items, 'rotation', value, step, index, direction);
  141316. };
  141317. module.exports = SetRotation;
  141318. /***/ }),
  141319. /* 1208 */
  141320. /***/ (function(module, exports, __webpack_require__) {
  141321. /**
  141322. * @author Richard Davey <rich@photonstorm.com>
  141323. * @copyright 2019 Photon Storm Ltd.
  141324. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141325. */
  141326. var PropertyValueSet = __webpack_require__(27);
  141327. /**
  141328. * Takes an array of Game Objects, or any objects that have the public properties `originX` and `originY`
  141329. * and then sets them to the given values.
  141330. *
  141331. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  141332. *
  141333. * To use this with a Group: `SetOrigin(group.getChildren(), originX, originY, stepX, stepY)`
  141334. *
  141335. * @function Phaser.Actions.SetOrigin
  141336. * @since 3.0.0
  141337. *
  141338. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141339. *
  141340. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141341. * @param {number} originX - The amount to set the `originX` property to.
  141342. * @param {number} [originY] - The amount to set the `originY` property to. If `undefined` or `null` it uses the `originX` value.
  141343. * @param {number} [stepX=0] - This is added to the `originX` amount, multiplied by the iteration counter.
  141344. * @param {number} [stepY=0] - This is added to the `originY` amount, multiplied by the iteration counter.
  141345. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141346. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141347. *
  141348. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141349. */
  141350. var SetOrigin = function (items, originX, originY, stepX, stepY, index, direction)
  141351. {
  141352. if (originY === undefined || originY === null) { originY = originX; }
  141353. PropertyValueSet(items, 'originX', originX, stepX, index, direction);
  141354. return PropertyValueSet(items, 'originY', originY, stepY, index, direction);
  141355. };
  141356. module.exports = SetOrigin;
  141357. /***/ }),
  141358. /* 1209 */
  141359. /***/ (function(module, exports) {
  141360. /**
  141361. * @author Richard Davey <rich@photonstorm.com>
  141362. * @copyright 2019 Photon Storm Ltd.
  141363. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141364. */
  141365. /**
  141366. * Passes all provided Game Objects to the Input Manager to enable them for input with identical areas and callbacks.
  141367. *
  141368. * @see {@link Phaser.GameObjects.GameObject#setInteractive}
  141369. *
  141370. * @function Phaser.Actions.SetHitArea
  141371. * @since 3.0.0
  141372. *
  141373. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141374. *
  141375. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141376. * @param {*} hitArea - Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not specified a Rectangle will be used.
  141377. * @param {HitAreaCallback} hitAreaCallback - A callback to be invoked when the Game Object is interacted with. If you provide a shape you must also provide a callback.
  141378. *
  141379. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141380. */
  141381. var SetHitArea = function (items, hitArea, hitAreaCallback)
  141382. {
  141383. for (var i = 0; i < items.length; i++)
  141384. {
  141385. items[i].setInteractive(hitArea, hitAreaCallback);
  141386. }
  141387. return items;
  141388. };
  141389. module.exports = SetHitArea;
  141390. /***/ }),
  141391. /* 1210 */
  141392. /***/ (function(module, exports, __webpack_require__) {
  141393. /**
  141394. * @author Richard Davey <rich@photonstorm.com>
  141395. * @copyright 2019 Photon Storm Ltd.
  141396. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141397. */
  141398. var PropertyValueSet = __webpack_require__(27);
  141399. /**
  141400. * Takes an array of Game Objects, or any objects that have the public property `depth`
  141401. * and then sets it to the given value.
  141402. *
  141403. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141404. *
  141405. * To use this with a Group: `SetDepth(group.getChildren(), value, step)`
  141406. *
  141407. * @function Phaser.Actions.SetDepth
  141408. * @since 3.0.0
  141409. *
  141410. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141411. *
  141412. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141413. * @param {number} value - The amount to set the property to.
  141414. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141415. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141416. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141417. *
  141418. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141419. */
  141420. var SetDepth = function (items, value, step, index, direction)
  141421. {
  141422. return PropertyValueSet(items, 'depth', value, step, index, direction);
  141423. };
  141424. module.exports = SetDepth;
  141425. /***/ }),
  141426. /* 1211 */
  141427. /***/ (function(module, exports, __webpack_require__) {
  141428. /**
  141429. * @author Richard Davey <rich@photonstorm.com>
  141430. * @copyright 2019 Photon Storm Ltd.
  141431. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141432. */
  141433. var PropertyValueSet = __webpack_require__(27);
  141434. /**
  141435. * Takes an array of Game Objects, or any objects that have the public property `blendMode`
  141436. * and then sets it to the given value.
  141437. *
  141438. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141439. *
  141440. * To use this with a Group: `SetBlendMode(group.getChildren(), value)`
  141441. *
  141442. * @function Phaser.Actions.SetBlendMode
  141443. * @since 3.0.0
  141444. *
  141445. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141446. *
  141447. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141448. * @param {number} value - The amount to set the property to.
  141449. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141450. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141451. *
  141452. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141453. */
  141454. var SetBlendMode = function (items, value, index, direction)
  141455. {
  141456. return PropertyValueSet(items, 'blendMode', value, 0, index, direction);
  141457. };
  141458. module.exports = SetBlendMode;
  141459. /***/ }),
  141460. /* 1212 */
  141461. /***/ (function(module, exports, __webpack_require__) {
  141462. /**
  141463. * @author Richard Davey <rich@photonstorm.com>
  141464. * @copyright 2019 Photon Storm Ltd.
  141465. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141466. */
  141467. var PropertyValueSet = __webpack_require__(27);
  141468. /**
  141469. * Takes an array of Game Objects, or any objects that have the public property `alpha`
  141470. * and then sets it to the given value.
  141471. *
  141472. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141473. *
  141474. * To use this with a Group: `SetAlpha(group.getChildren(), value, step)`
  141475. *
  141476. * @function Phaser.Actions.SetAlpha
  141477. * @since 3.0.0
  141478. *
  141479. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141480. *
  141481. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141482. * @param {number} value - The amount to set the property to.
  141483. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141484. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141485. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141486. *
  141487. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141488. */
  141489. var SetAlpha = function (items, value, step, index, direction)
  141490. {
  141491. return PropertyValueSet(items, 'alpha', value, step, index, direction);
  141492. };
  141493. module.exports = SetAlpha;
  141494. /***/ }),
  141495. /* 1213 */
  141496. /***/ (function(module, exports, __webpack_require__) {
  141497. /**
  141498. * @author Richard Davey <rich@photonstorm.com>
  141499. * @copyright 2019 Photon Storm Ltd.
  141500. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141501. */
  141502. var PropertyValueInc = __webpack_require__(35);
  141503. /**
  141504. * Takes an array of Game Objects, or any objects that have a public `scaleY` property,
  141505. * and then adds the given value to each of their `scaleY` properties.
  141506. *
  141507. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141508. *
  141509. * To use this with a Group: `ScaleY(group.getChildren(), value, step)`
  141510. *
  141511. * @function Phaser.Actions.ScaleY
  141512. * @since 3.0.0
  141513. *
  141514. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141515. *
  141516. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141517. * @param {number} value - The amount to be added to the `scaleY` property.
  141518. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141519. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141520. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141521. *
  141522. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141523. */
  141524. var ScaleY = function (items, value, step, index, direction)
  141525. {
  141526. return PropertyValueInc(items, 'scaleY', value, step, index, direction);
  141527. };
  141528. module.exports = ScaleY;
  141529. /***/ }),
  141530. /* 1214 */
  141531. /***/ (function(module, exports, __webpack_require__) {
  141532. /**
  141533. * @author Richard Davey <rich@photonstorm.com>
  141534. * @copyright 2019 Photon Storm Ltd.
  141535. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141536. */
  141537. var PropertyValueInc = __webpack_require__(35);
  141538. /**
  141539. * Takes an array of Game Objects, or any objects that have public `scaleX` and `scaleY` properties,
  141540. * and then adds the given value to each of them.
  141541. *
  141542. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  141543. *
  141544. * To use this with a Group: `ScaleXY(group.getChildren(), scaleX, scaleY, stepX, stepY)`
  141545. *
  141546. * @function Phaser.Actions.ScaleXY
  141547. * @since 3.0.0
  141548. *
  141549. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141550. *
  141551. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141552. * @param {number} scaleX - The amount to be added to the `scaleX` property.
  141553. * @param {number} [scaleY] - The amount to be added to the `scaleY` property. If `undefined` or `null` it uses the `scaleX` value.
  141554. * @param {number} [stepX=0] - This is added to the `scaleX` amount, multiplied by the iteration counter.
  141555. * @param {number} [stepY=0] - This is added to the `y` amount, multiplied by the iteration counter.
  141556. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141557. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141558. *
  141559. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141560. */
  141561. var ScaleXY = function (items, scaleX, scaleY, stepX, stepY, index, direction)
  141562. {
  141563. if (scaleY === undefined || scaleY === null) { scaleY = scaleX; }
  141564. PropertyValueInc(items, 'scaleX', scaleX, stepX, index, direction);
  141565. return PropertyValueInc(items, 'scaleY', scaleY, stepY, index, direction);
  141566. };
  141567. module.exports = ScaleXY;
  141568. /***/ }),
  141569. /* 1215 */
  141570. /***/ (function(module, exports, __webpack_require__) {
  141571. /**
  141572. * @author Richard Davey <rich@photonstorm.com>
  141573. * @copyright 2019 Photon Storm Ltd.
  141574. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141575. */
  141576. var PropertyValueInc = __webpack_require__(35);
  141577. /**
  141578. * Takes an array of Game Objects, or any objects that have a public `scaleX` property,
  141579. * and then adds the given value to each of their `scaleX` properties.
  141580. *
  141581. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141582. *
  141583. * To use this with a Group: `ScaleX(group.getChildren(), value, step)`
  141584. *
  141585. * @function Phaser.Actions.ScaleX
  141586. * @since 3.0.0
  141587. *
  141588. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141589. *
  141590. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141591. * @param {number} value - The amount to be added to the `scaleX` property.
  141592. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141593. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141594. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141595. *
  141596. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141597. */
  141598. var ScaleX = function (items, value, step, index, direction)
  141599. {
  141600. return PropertyValueInc(items, 'scaleX', value, step, index, direction);
  141601. };
  141602. module.exports = ScaleX;
  141603. /***/ }),
  141604. /* 1216 */
  141605. /***/ (function(module, exports, __webpack_require__) {
  141606. /**
  141607. * @author Richard Davey <rich@photonstorm.com>
  141608. * @copyright 2019 Photon Storm Ltd.
  141609. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141610. */
  141611. var MathRotateAroundDistance = __webpack_require__(197);
  141612. /**
  141613. * Rotates an array of Game Objects around a point by the given angle and distance.
  141614. *
  141615. * @function Phaser.Actions.RotateAroundDistance
  141616. * @since 3.0.0
  141617. *
  141618. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141619. *
  141620. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141621. * @param {object} point - Any object with public `x` and `y` properties.
  141622. * @param {number} angle - The angle to rotate by, in radians.
  141623. * @param {number} distance - The distance from the point of rotation in pixels.
  141624. *
  141625. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141626. */
  141627. var RotateAroundDistance = function (items, point, angle, distance)
  141628. {
  141629. var x = point.x;
  141630. var y = point.y;
  141631. // There's nothing to do
  141632. if (distance === 0)
  141633. {
  141634. return items;
  141635. }
  141636. for (var i = 0; i < items.length; i++)
  141637. {
  141638. MathRotateAroundDistance(items[i], x, y, angle, distance);
  141639. }
  141640. return items;
  141641. };
  141642. module.exports = RotateAroundDistance;
  141643. /***/ }),
  141644. /* 1217 */
  141645. /***/ (function(module, exports, __webpack_require__) {
  141646. /**
  141647. * @author Richard Davey <rich@photonstorm.com>
  141648. * @copyright 2019 Photon Storm Ltd.
  141649. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141650. */
  141651. var RotateAroundDistance = __webpack_require__(197);
  141652. var DistanceBetween = __webpack_require__(56);
  141653. /**
  141654. * Rotates each item around the given point by the given angle.
  141655. *
  141656. * @function Phaser.Actions.RotateAround
  141657. * @since 3.0.0
  141658. * @see Phaser.Math.RotateAroundDistance
  141659. *
  141660. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141661. *
  141662. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141663. * @param {object} point - Any object with public `x` and `y` properties.
  141664. * @param {number} angle - The angle to rotate by, in radians.
  141665. *
  141666. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141667. */
  141668. var RotateAround = function (items, point, angle)
  141669. {
  141670. var x = point.x;
  141671. var y = point.y;
  141672. for (var i = 0; i < items.length; i++)
  141673. {
  141674. var item = items[i];
  141675. RotateAroundDistance(item, x, y, angle, Math.max(1, DistanceBetween(item.x, item.y, x, y)));
  141676. }
  141677. return items;
  141678. };
  141679. module.exports = RotateAround;
  141680. /***/ }),
  141681. /* 1218 */
  141682. /***/ (function(module, exports, __webpack_require__) {
  141683. /**
  141684. * @author Richard Davey <rich@photonstorm.com>
  141685. * @copyright 2019 Photon Storm Ltd.
  141686. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141687. */
  141688. var PropertyValueInc = __webpack_require__(35);
  141689. /**
  141690. * Takes an array of Game Objects, or any objects that have a public `rotation` property,
  141691. * and then adds the given value to each of their `rotation` properties.
  141692. *
  141693. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  141694. *
  141695. * To use this with a Group: `Rotate(group.getChildren(), value, step)`
  141696. *
  141697. * @function Phaser.Actions.Rotate
  141698. * @since 3.0.0
  141699. *
  141700. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141701. *
  141702. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  141703. * @param {number} value - The amount to be added to the `rotation` property (in radians).
  141704. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  141705. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  141706. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  141707. *
  141708. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  141709. */
  141710. var Rotate = function (items, value, step, index, direction)
  141711. {
  141712. return PropertyValueInc(items, 'rotation', value, step, index, direction);
  141713. };
  141714. module.exports = Rotate;
  141715. /***/ }),
  141716. /* 1219 */
  141717. /***/ (function(module, exports, __webpack_require__) {
  141718. /**
  141719. * @author Richard Davey <rich@photonstorm.com>
  141720. * @copyright 2019 Photon Storm Ltd.
  141721. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141722. */
  141723. var Random = __webpack_require__(198);
  141724. /**
  141725. * Takes an array of Game Objects and positions them at random locations within the Triangle.
  141726. *
  141727. * If you wish to pass a `Phaser.GameObjects.Triangle` Shape to this function, you should pass its `geom` property.
  141728. *
  141729. * @function Phaser.Actions.RandomTriangle
  141730. * @since 3.0.0
  141731. *
  141732. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141733. *
  141734. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141735. * @param {Phaser.Geom.Triangle} triangle - The Triangle to position the Game Objects within.
  141736. *
  141737. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141738. */
  141739. var RandomTriangle = function (items, triangle)
  141740. {
  141741. for (var i = 0; i < items.length; i++)
  141742. {
  141743. Random(triangle, items[i]);
  141744. }
  141745. return items;
  141746. };
  141747. module.exports = RandomTriangle;
  141748. /***/ }),
  141749. /* 1220 */
  141750. /***/ (function(module, exports, __webpack_require__) {
  141751. /**
  141752. * @author Richard Davey <rich@photonstorm.com>
  141753. * @copyright 2019 Photon Storm Ltd.
  141754. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141755. */
  141756. var Random = __webpack_require__(201);
  141757. /**
  141758. * Takes an array of Game Objects and positions them at random locations within the Ellipse.
  141759. *
  141760. * @function Phaser.Actions.RandomRectangle
  141761. * @since 3.0.0
  141762. *
  141763. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141764. *
  141765. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141766. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to position the Game Objects within.
  141767. *
  141768. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141769. */
  141770. var RandomRectangle = function (items, rect)
  141771. {
  141772. for (var i = 0; i < items.length; i++)
  141773. {
  141774. Random(rect, items[i]);
  141775. }
  141776. return items;
  141777. };
  141778. module.exports = RandomRectangle;
  141779. /***/ }),
  141780. /* 1221 */
  141781. /***/ (function(module, exports, __webpack_require__) {
  141782. /**
  141783. * @author Richard Davey <rich@photonstorm.com>
  141784. * @copyright 2019 Photon Storm Ltd.
  141785. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141786. */
  141787. var Random = __webpack_require__(202);
  141788. /**
  141789. * Takes an array of Game Objects and positions them at random locations on the Line.
  141790. *
  141791. * If you wish to pass a `Phaser.GameObjects.Line` Shape to this function, you should pass its `geom` property.
  141792. *
  141793. * @function Phaser.Actions.RandomLine
  141794. * @since 3.0.0
  141795. *
  141796. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141797. *
  141798. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141799. * @param {Phaser.Geom.Line} line - The Line to position the Game Objects randomly on.
  141800. *
  141801. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141802. */
  141803. var RandomLine = function (items, line)
  141804. {
  141805. for (var i = 0; i < items.length; i++)
  141806. {
  141807. Random(line, items[i]);
  141808. }
  141809. return items;
  141810. };
  141811. module.exports = RandomLine;
  141812. /***/ }),
  141813. /* 1222 */
  141814. /***/ (function(module, exports, __webpack_require__) {
  141815. /**
  141816. * @author Richard Davey <rich@photonstorm.com>
  141817. * @copyright 2019 Photon Storm Ltd.
  141818. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141819. */
  141820. var Random = __webpack_require__(199);
  141821. /**
  141822. * Takes an array of Game Objects and positions them at random locations within the Ellipse.
  141823. *
  141824. * If you wish to pass a `Phaser.GameObjects.Ellipse` Shape to this function, you should pass its `geom` property.
  141825. *
  141826. * @function Phaser.Actions.RandomEllipse
  141827. * @since 3.0.0
  141828. *
  141829. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141830. *
  141831. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141832. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to position the Game Objects within.
  141833. *
  141834. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141835. */
  141836. var RandomEllipse = function (items, ellipse)
  141837. {
  141838. for (var i = 0; i < items.length; i++)
  141839. {
  141840. Random(ellipse, items[i]);
  141841. }
  141842. return items;
  141843. };
  141844. module.exports = RandomEllipse;
  141845. /***/ }),
  141846. /* 1223 */
  141847. /***/ (function(module, exports, __webpack_require__) {
  141848. /**
  141849. * @author Richard Davey <rich@photonstorm.com>
  141850. * @copyright 2019 Photon Storm Ltd.
  141851. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141852. */
  141853. var Random = __webpack_require__(206);
  141854. /**
  141855. * Takes an array of Game Objects and positions them at random locations within the Circle.
  141856. *
  141857. * If you wish to pass a `Phaser.GameObjects.Circle` Shape to this function, you should pass its `geom` property.
  141858. *
  141859. * @function Phaser.Actions.RandomCircle
  141860. * @since 3.0.0
  141861. *
  141862. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141863. *
  141864. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141865. * @param {Phaser.Geom.Circle} circle - The Circle to position the Game Objects within.
  141866. *
  141867. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141868. */
  141869. var RandomCircle = function (items, circle)
  141870. {
  141871. for (var i = 0; i < items.length; i++)
  141872. {
  141873. Random(circle, items[i]);
  141874. }
  141875. return items;
  141876. };
  141877. module.exports = RandomCircle;
  141878. /***/ }),
  141879. /* 1224 */
  141880. /***/ (function(module, exports) {
  141881. /**
  141882. * @author Richard Davey <rich@photonstorm.com>
  141883. * @copyright 2019 Photon Storm Ltd.
  141884. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141885. */
  141886. /**
  141887. * Play an animation with the given key, starting at the given startFrame on all Game Objects in items.
  141888. *
  141889. * @function Phaser.Actions.PlayAnimation
  141890. * @since 3.0.0
  141891. *
  141892. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141893. *
  141894. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141895. * @param {string} key - The name of the animation to play.
  141896. * @param {(string|integer)} [startFrame] - The starting frame of the animation with the given key.
  141897. *
  141898. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141899. */
  141900. var PlayAnimation = function (items, key, startFrame)
  141901. {
  141902. for (var i = 0; i < items.length; i++)
  141903. {
  141904. items[i].anims.play(key, startFrame);
  141905. }
  141906. return items;
  141907. };
  141908. module.exports = PlayAnimation;
  141909. /***/ }),
  141910. /* 1225 */
  141911. /***/ (function(module, exports, __webpack_require__) {
  141912. /**
  141913. * @author Richard Davey <rich@photonstorm.com>
  141914. * @copyright 2019 Photon Storm Ltd.
  141915. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141916. */
  141917. var BresenhamPoints = __webpack_require__(416);
  141918. /**
  141919. * Takes an array of Game Objects and positions them on evenly spaced points around the edges of a Triangle.
  141920. *
  141921. * If you wish to pass a `Phaser.GameObjects.Triangle` Shape to this function, you should pass its `geom` property.
  141922. *
  141923. * @function Phaser.Actions.PlaceOnTriangle
  141924. * @since 3.0.0
  141925. *
  141926. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141927. *
  141928. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141929. * @param {Phaser.Geom.Triangle} triangle - The Triangle to position the Game Objects on.
  141930. * @param {number} [stepRate=1] - An optional step rate, to increase or decrease the packing of the Game Objects on the lines.
  141931. *
  141932. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141933. */
  141934. var PlaceOnTriangle = function (items, triangle, stepRate)
  141935. {
  141936. var p1 = BresenhamPoints({ x1: triangle.x1, y1: triangle.y1, x2: triangle.x2, y2: triangle.y2 }, stepRate);
  141937. var p2 = BresenhamPoints({ x1: triangle.x2, y1: triangle.y2, x2: triangle.x3, y2: triangle.y3 }, stepRate);
  141938. var p3 = BresenhamPoints({ x1: triangle.x3, y1: triangle.y3, x2: triangle.x1, y2: triangle.y1 }, stepRate);
  141939. // Remove overlaps
  141940. p1.pop();
  141941. p2.pop();
  141942. p3.pop();
  141943. p1 = p1.concat(p2, p3);
  141944. var step = p1.length / items.length;
  141945. var p = 0;
  141946. for (var i = 0; i < items.length; i++)
  141947. {
  141948. var item = items[i];
  141949. var point = p1[Math.floor(p)];
  141950. item.x = point.x;
  141951. item.y = point.y;
  141952. p += step;
  141953. }
  141954. return items;
  141955. };
  141956. module.exports = PlaceOnTriangle;
  141957. /***/ }),
  141958. /* 1226 */
  141959. /***/ (function(module, exports, __webpack_require__) {
  141960. /**
  141961. * @author Richard Davey <rich@photonstorm.com>
  141962. * @copyright 2019 Photon Storm Ltd.
  141963. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  141964. */
  141965. var MarchingAnts = __webpack_require__(419);
  141966. var RotateLeft = __webpack_require__(418);
  141967. var RotateRight = __webpack_require__(417);
  141968. /**
  141969. * Takes an array of Game Objects and positions them on evenly spaced points around the perimeter of a Rectangle.
  141970. *
  141971. * Placement starts from the top-left of the rectangle, and proceeds in a clockwise direction.
  141972. * If the `shift` parameter is given you can offset where placement begins.
  141973. *
  141974. * @function Phaser.Actions.PlaceOnRectangle
  141975. * @since 3.0.0
  141976. *
  141977. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  141978. *
  141979. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  141980. * @param {Phaser.Geom.Rectangle} rect - The Rectangle to position the Game Objects on.
  141981. * @param {integer} [shift=1] - An optional positional offset.
  141982. *
  141983. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  141984. */
  141985. var PlaceOnRectangle = function (items, rect, shift)
  141986. {
  141987. if (shift === undefined) { shift = 0; }
  141988. var points = MarchingAnts(rect, false, items.length);
  141989. if (shift > 0)
  141990. {
  141991. RotateLeft(points, shift);
  141992. }
  141993. else if (shift < 0)
  141994. {
  141995. RotateRight(points, Math.abs(shift));
  141996. }
  141997. for (var i = 0; i < items.length; i++)
  141998. {
  141999. items[i].x = points[i].x;
  142000. items[i].y = points[i].y;
  142001. }
  142002. return items;
  142003. };
  142004. module.exports = PlaceOnRectangle;
  142005. /***/ }),
  142006. /* 1227 */
  142007. /***/ (function(module, exports, __webpack_require__) {
  142008. /**
  142009. * @author Richard Davey <rich@photonstorm.com>
  142010. * @copyright 2019 Photon Storm Ltd.
  142011. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142012. */
  142013. var GetPoints = __webpack_require__(203);
  142014. /**
  142015. * Positions an array of Game Objects on evenly spaced points of a Line.
  142016. *
  142017. * @function Phaser.Actions.PlaceOnLine
  142018. * @since 3.0.0
  142019. *
  142020. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  142021. *
  142022. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  142023. * @param {Phaser.Geom.Line} line - The Line to position the Game Objects on.
  142024. *
  142025. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  142026. */
  142027. var PlaceOnLine = function (items, line)
  142028. {
  142029. var points = GetPoints(line, items.length);
  142030. for (var i = 0; i < items.length; i++)
  142031. {
  142032. var item = items[i];
  142033. var point = points[i];
  142034. item.x = point.x;
  142035. item.y = point.y;
  142036. }
  142037. return items;
  142038. };
  142039. module.exports = PlaceOnLine;
  142040. /***/ }),
  142041. /* 1228 */
  142042. /***/ (function(module, exports) {
  142043. /**
  142044. * @author Richard Davey <rich@photonstorm.com>
  142045. * @copyright 2019 Photon Storm Ltd.
  142046. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142047. */
  142048. /**
  142049. * Takes an array of Game Objects and positions them on evenly spaced points around the perimeter of an Ellipse.
  142050. *
  142051. * If you wish to pass a `Phaser.GameObjects.Ellipse` Shape to this function, you should pass its `geom` property.
  142052. *
  142053. * @function Phaser.Actions.PlaceOnEllipse
  142054. * @since 3.0.0
  142055. *
  142056. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  142057. *
  142058. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  142059. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to position the Game Objects on.
  142060. * @param {number} [startAngle=0] - Optional angle to start position from, in radians.
  142061. * @param {number} [endAngle=6.28] - Optional angle to stop position at, in radians.
  142062. *
  142063. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  142064. */
  142065. var PlaceOnEllipse = function (items, ellipse, startAngle, endAngle)
  142066. {
  142067. if (startAngle === undefined) { startAngle = 0; }
  142068. if (endAngle === undefined) { endAngle = 6.28; }
  142069. var angle = startAngle;
  142070. var angleStep = (endAngle - startAngle) / items.length;
  142071. var a = ellipse.width / 2;
  142072. var b = ellipse.height / 2;
  142073. for (var i = 0; i < items.length; i++)
  142074. {
  142075. items[i].x = ellipse.x + a * Math.cos(angle);
  142076. items[i].y = ellipse.y + b * Math.sin(angle);
  142077. angle += angleStep;
  142078. }
  142079. return items;
  142080. };
  142081. module.exports = PlaceOnEllipse;
  142082. /***/ }),
  142083. /* 1229 */
  142084. /***/ (function(module, exports) {
  142085. /**
  142086. * @author Richard Davey <rich@photonstorm.com>
  142087. * @copyright 2019 Photon Storm Ltd.
  142088. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142089. */
  142090. /**
  142091. * Takes an array of Game Objects and positions them on evenly spaced points around the perimeter of a Circle.
  142092. *
  142093. * If you wish to pass a `Phaser.GameObjects.Circle` Shape to this function, you should pass its `geom` property.
  142094. *
  142095. * @function Phaser.Actions.PlaceOnCircle
  142096. * @since 3.0.0
  142097. *
  142098. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  142099. *
  142100. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  142101. * @param {Phaser.Geom.Circle} circle - The Circle to position the Game Objects on.
  142102. * @param {number} [startAngle=0] - Optional angle to start position from, in radians.
  142103. * @param {number} [endAngle=6.28] - Optional angle to stop position at, in radians.
  142104. *
  142105. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  142106. */
  142107. var PlaceOnCircle = function (items, circle, startAngle, endAngle)
  142108. {
  142109. if (startAngle === undefined) { startAngle = 0; }
  142110. if (endAngle === undefined) { endAngle = 6.28; }
  142111. var angle = startAngle;
  142112. var angleStep = (endAngle - startAngle) / items.length;
  142113. for (var i = 0; i < items.length; i++)
  142114. {
  142115. items[i].x = circle.x + (circle.radius * Math.cos(angle));
  142116. items[i].y = circle.y + (circle.radius * Math.sin(angle));
  142117. angle += angleStep;
  142118. }
  142119. return items;
  142120. };
  142121. module.exports = PlaceOnCircle;
  142122. /***/ }),
  142123. /* 1230 */
  142124. /***/ (function(module, exports, __webpack_require__) {
  142125. /**
  142126. * @author Richard Davey <rich@photonstorm.com>
  142127. * @copyright 2019 Photon Storm Ltd.
  142128. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142129. */
  142130. var PropertyValueInc = __webpack_require__(35);
  142131. /**
  142132. * Takes an array of Game Objects, or any objects that have a public `y` property,
  142133. * and then adds the given value to each of their `y` properties.
  142134. *
  142135. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  142136. *
  142137. * To use this with a Group: `IncY(group.getChildren(), value, step)`
  142138. *
  142139. * @function Phaser.Actions.IncY
  142140. * @since 3.0.0
  142141. *
  142142. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  142143. *
  142144. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  142145. * @param {number} value - The amount to be added to the `y` property.
  142146. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  142147. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  142148. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  142149. *
  142150. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  142151. */
  142152. var IncY = function (items, value, step, index, direction)
  142153. {
  142154. return PropertyValueInc(items, 'y', value, step, index, direction);
  142155. };
  142156. module.exports = IncY;
  142157. /***/ }),
  142158. /* 1231 */
  142159. /***/ (function(module, exports, __webpack_require__) {
  142160. /**
  142161. * @author Richard Davey <rich@photonstorm.com>
  142162. * @copyright 2019 Photon Storm Ltd.
  142163. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142164. */
  142165. var PropertyValueInc = __webpack_require__(35);
  142166. /**
  142167. * Takes an array of Game Objects, or any objects that have public `x` and `y` properties,
  142168. * and then adds the given value to each of them.
  142169. *
  142170. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  142171. *
  142172. * To use this with a Group: `IncXY(group.getChildren(), x, y, stepX, stepY)`
  142173. *
  142174. * @function Phaser.Actions.IncXY
  142175. * @since 3.0.0
  142176. *
  142177. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  142178. *
  142179. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  142180. * @param {number} x - The amount to be added to the `x` property.
  142181. * @param {number} [y=x] - The amount to be added to the `y` property. If `undefined` or `null` it uses the `x` value.
  142182. * @param {number} [stepX=0] - This is added to the `x` amount, multiplied by the iteration counter.
  142183. * @param {number} [stepY=0] - This is added to the `y` amount, multiplied by the iteration counter.
  142184. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  142185. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  142186. *
  142187. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  142188. */
  142189. var IncXY = function (items, x, y, stepX, stepY, index, direction)
  142190. {
  142191. if (y === undefined || y === null) { y = x; }
  142192. PropertyValueInc(items, 'x', x, stepX, index, direction);
  142193. return PropertyValueInc(items, 'y', y, stepY, index, direction);
  142194. };
  142195. module.exports = IncXY;
  142196. /***/ }),
  142197. /* 1232 */
  142198. /***/ (function(module, exports, __webpack_require__) {
  142199. /**
  142200. * @author Richard Davey <rich@photonstorm.com>
  142201. * @copyright 2019 Photon Storm Ltd.
  142202. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142203. */
  142204. var PropertyValueInc = __webpack_require__(35);
  142205. /**
  142206. * Takes an array of Game Objects, or any objects that have a public `x` property,
  142207. * and then adds the given value to each of their `x` properties.
  142208. *
  142209. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  142210. *
  142211. * To use this with a Group: `IncX(group.getChildren(), value, step)`
  142212. *
  142213. * @function Phaser.Actions.IncX
  142214. * @since 3.0.0
  142215. *
  142216. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  142217. *
  142218. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  142219. * @param {number} value - The amount to be added to the `x` property.
  142220. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  142221. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  142222. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  142223. *
  142224. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  142225. */
  142226. var IncX = function (items, value, step, index, direction)
  142227. {
  142228. return PropertyValueInc(items, 'x', value, step, index, direction);
  142229. };
  142230. module.exports = IncX;
  142231. /***/ }),
  142232. /* 1233 */
  142233. /***/ (function(module, exports, __webpack_require__) {
  142234. /**
  142235. * @author Richard Davey <rich@photonstorm.com>
  142236. * @copyright 2019 Photon Storm Ltd.
  142237. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142238. */
  142239. var PropertyValueInc = __webpack_require__(35);
  142240. /**
  142241. * Takes an array of Game Objects, or any objects that have a public `alpha` property,
  142242. * and then adds the given value to each of their `alpha` properties.
  142243. *
  142244. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  142245. *
  142246. * To use this with a Group: `IncAlpha(group.getChildren(), value, step)`
  142247. *
  142248. * @function Phaser.Actions.IncAlpha
  142249. * @since 3.0.0
  142250. *
  142251. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  142252. *
  142253. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  142254. * @param {number} value - The amount to be added to the `alpha` property.
  142255. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  142256. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  142257. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  142258. *
  142259. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  142260. */
  142261. var IncAlpha = function (items, value, step, index, direction)
  142262. {
  142263. return PropertyValueInc(items, 'alpha', value, step, index, direction);
  142264. };
  142265. module.exports = IncAlpha;
  142266. /***/ }),
  142267. /* 1234 */
  142268. /***/ (function(module, exports) {
  142269. /**
  142270. * @author Richard Davey <rich@photonstorm.com>
  142271. * @copyright 2019 Photon Storm Ltd.
  142272. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142273. */
  142274. /**
  142275. * The Game Object Destroy Event.
  142276. *
  142277. * This event is dispatched when a Game Object instance is being destroyed.
  142278. *
  142279. * Listen for it on a Game Object instance using `GameObject.on('destroy', listener)`.
  142280. *
  142281. * @event Phaser.GameObjects.Events#DESTROY
  142282. *
  142283. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object which is being destroyed.
  142284. */
  142285. module.exports = 'destroy';
  142286. /***/ }),
  142287. /* 1235 */
  142288. /***/ (function(module, exports) {
  142289. /**
  142290. * @author Richard Davey <rich@photonstorm.com>
  142291. * @copyright 2019 Photon Storm Ltd.
  142292. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142293. */
  142294. /**
  142295. * The Set Data Event.
  142296. *
  142297. * This event is dispatched by a Data Manager when a new item is added to the data store.
  142298. *
  142299. * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for
  142300. * the addition of a new data item on a Game Object you would use: `sprite.data.on('setdata', listener)`.
  142301. *
  142302. * @event Phaser.Data.Events#SET_DATA
  142303. *
  142304. * @param {any} parent - A reference to the object that owns the instance of the Data Manager responsible for this event.
  142305. * @param {string} key - The unique key of the data item within the Data Manager.
  142306. * @param {any} data - The item that was added to the Data Manager. This can be of any data type, i.e. a string, boolean, number, object or instance.
  142307. */
  142308. module.exports = 'setdata';
  142309. /***/ }),
  142310. /* 1236 */
  142311. /***/ (function(module, exports) {
  142312. /**
  142313. * @author Richard Davey <rich@photonstorm.com>
  142314. * @copyright 2019 Photon Storm Ltd.
  142315. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142316. */
  142317. /**
  142318. * The Remove Data Event.
  142319. *
  142320. * This event is dispatched by a Data Manager when an item is removed from it.
  142321. *
  142322. * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for
  142323. * the removal of a data item on a Game Object you would use: `sprite.data.on('removedata', listener)`.
  142324. *
  142325. * @event Phaser.Data.Events#REMOVE_DATA
  142326. *
  142327. * @param {any} parent - A reference to the object that owns the instance of the Data Manager responsible for this event.
  142328. * @param {string} key - The unique key of the data item within the Data Manager.
  142329. * @param {any} data - The item that was removed from the Data Manager. This can be of any data type, i.e. a string, boolean, number, object or instance.
  142330. */
  142331. module.exports = 'removedata';
  142332. /***/ }),
  142333. /* 1237 */
  142334. /***/ (function(module, exports) {
  142335. /**
  142336. * @author Richard Davey <rich@photonstorm.com>
  142337. * @copyright 2019 Photon Storm Ltd.
  142338. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142339. */
  142340. /**
  142341. * The Change Data Key Event.
  142342. *
  142343. * This event is dispatched by a Data Manager when an item in the data store is changed.
  142344. *
  142345. * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for
  142346. * the change of a specific data item from a Game Object you would use: `sprite.data.on('changedata-key', listener)`,
  142347. * where `key` is the unique string key of the data item. For example, if you have a data item stored called `gold`
  142348. * then you can listen for `sprite.data.on('changedata-gold')`.
  142349. *
  142350. * @event Phaser.Data.Events#CHANGE_DATA_KEY
  142351. *
  142352. * @param {any} parent - A reference to the object that owns the instance of the Data Manager responsible for this event.
  142353. * @param {string} key - The unique key of the data item within the Data Manager.
  142354. * @param {any} value - The item that was updated in the Data Manager. This can be of any data type, i.e. a string, boolean, number, object or instance.
  142355. * @param {any} previousValue - The previous item that was updated in the Data Manager. This can be of any data type, i.e. a string, boolean, number, object or instance.
  142356. */
  142357. module.exports = 'changedata-';
  142358. /***/ }),
  142359. /* 1238 */
  142360. /***/ (function(module, exports) {
  142361. /**
  142362. * @author Richard Davey <rich@photonstorm.com>
  142363. * @copyright 2019 Photon Storm Ltd.
  142364. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142365. */
  142366. /**
  142367. * The Change Data Event.
  142368. *
  142369. * This event is dispatched by a Data Manager when an item in the data store is changed.
  142370. *
  142371. * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for
  142372. * a change data event from a Game Object you would use: `sprite.data.on('changedata', listener)`.
  142373. *
  142374. * This event is dispatched for all items that change in the Data Manager.
  142375. * To listen for the change of a specific item, use the `CHANGE_DATA_KEY_EVENT` event.
  142376. *
  142377. * @event Phaser.Data.Events#CHANGE_DATA
  142378. *
  142379. * @param {any} parent - A reference to the object that the Data Manager responsible for this event belongs to.
  142380. * @param {string} key - The unique key of the data item within the Data Manager.
  142381. * @param {any} value - The new value of the item in the Data Manager.
  142382. * @param {any} previousValue - The previous value of the item in the Data Manager.
  142383. */
  142384. module.exports = 'changedata';
  142385. /***/ }),
  142386. /* 1239 */
  142387. /***/ (function(module, exports) {
  142388. /**
  142389. * @author Richard Davey <rich@photonstorm.com>
  142390. * @copyright 2019 Photon Storm Ltd.
  142391. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142392. */
  142393. /**
  142394. * @function GetColor
  142395. * @since 3.0.0
  142396. * @private
  142397. */
  142398. var GetColor = function (value)
  142399. {
  142400. return (value >> 16) + (value & 0xff00) + ((value & 0xff) << 16);
  142401. };
  142402. /**
  142403. * Provides methods used for setting the tint of a Game Object.
  142404. * Should be applied as a mixin and not used directly.
  142405. *
  142406. * @name Phaser.GameObjects.Components.Tint
  142407. * @webglOnly
  142408. * @since 3.0.0
  142409. */
  142410. var Tint = {
  142411. /**
  142412. * Private internal value. Holds the top-left tint value.
  142413. *
  142414. * @name Phaser.GameObjects.Components.Tint#_tintTL
  142415. * @type {number}
  142416. * @private
  142417. * @default 16777215
  142418. * @since 3.0.0
  142419. */
  142420. _tintTL: 16777215,
  142421. /**
  142422. * Private internal value. Holds the top-right tint value.
  142423. *
  142424. * @name Phaser.GameObjects.Components.Tint#_tintTR
  142425. * @type {number}
  142426. * @private
  142427. * @default 16777215
  142428. * @since 3.0.0
  142429. */
  142430. _tintTR: 16777215,
  142431. /**
  142432. * Private internal value. Holds the bottom-left tint value.
  142433. *
  142434. * @name Phaser.GameObjects.Components.Tint#_tintBL
  142435. * @type {number}
  142436. * @private
  142437. * @default 16777215
  142438. * @since 3.0.0
  142439. */
  142440. _tintBL: 16777215,
  142441. /**
  142442. * Private internal value. Holds the bottom-right tint value.
  142443. *
  142444. * @name Phaser.GameObjects.Components.Tint#_tintBR
  142445. * @type {number}
  142446. * @private
  142447. * @default 16777215
  142448. * @since 3.0.0
  142449. */
  142450. _tintBR: 16777215,
  142451. /**
  142452. * Private internal value. Holds if the Game Object is tinted or not.
  142453. *
  142454. * @name Phaser.GameObjects.Components.Tint#_isTinted
  142455. * @type {boolean}
  142456. * @private
  142457. * @default false
  142458. * @since 3.11.0
  142459. */
  142460. _isTinted: false,
  142461. /**
  142462. * Fill or additive?
  142463. *
  142464. * @name Phaser.GameObjects.Components.Tint#tintFill
  142465. * @type {boolean}
  142466. * @default false
  142467. * @since 3.11.0
  142468. */
  142469. tintFill: false,
  142470. /**
  142471. * Clears all tint values associated with this Game Object.
  142472. *
  142473. * Immediately sets the color values back to 0xffffff and the tint type to 'additive',
  142474. * which results in no visible change to the texture.
  142475. *
  142476. * @method Phaser.GameObjects.Components.Tint#clearTint
  142477. * @webglOnly
  142478. * @since 3.0.0
  142479. *
  142480. * @return {this} This Game Object instance.
  142481. */
  142482. clearTint: function ()
  142483. {
  142484. this.setTint(0xffffff);
  142485. this._isTinted = false;
  142486. return this;
  142487. },
  142488. /**
  142489. * Sets an additive tint on this Game Object.
  142490. *
  142491. * The tint works by taking the pixel color values from the Game Objects texture, and then
  142492. * multiplying it by the color value of the tint. You can provide either one color value,
  142493. * in which case the whole Game Object will be tinted in that color. Or you can provide a color
  142494. * per corner. The colors are blended together across the extent of the Game Object.
  142495. *
  142496. * To modify the tint color once set, either call this method again with new values or use the
  142497. * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight,
  142498. * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently.
  142499. *
  142500. * To remove a tint call `clearTint`.
  142501. *
  142502. * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`.
  142503. *
  142504. * @method Phaser.GameObjects.Components.Tint#setTint
  142505. * @webglOnly
  142506. * @since 3.0.0
  142507. *
  142508. * @param {integer} [topLeft=0xffffff] - The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object.
  142509. * @param {integer} [topRight] - The tint being applied to the top-right of the Game Object.
  142510. * @param {integer} [bottomLeft] - The tint being applied to the bottom-left of the Game Object.
  142511. * @param {integer} [bottomRight] - The tint being applied to the bottom-right of the Game Object.
  142512. *
  142513. * @return {this} This Game Object instance.
  142514. */
  142515. setTint: function (topLeft, topRight, bottomLeft, bottomRight)
  142516. {
  142517. if (topLeft === undefined) { topLeft = 0xffffff; }
  142518. if (topRight === undefined)
  142519. {
  142520. topRight = topLeft;
  142521. bottomLeft = topLeft;
  142522. bottomRight = topLeft;
  142523. }
  142524. this._tintTL = GetColor(topLeft);
  142525. this._tintTR = GetColor(topRight);
  142526. this._tintBL = GetColor(bottomLeft);
  142527. this._tintBR = GetColor(bottomRight);
  142528. this._isTinted = true;
  142529. this.tintFill = false;
  142530. return this;
  142531. },
  142532. /**
  142533. * Sets a fill-based tint on this Game Object.
  142534. *
  142535. * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture
  142536. * with those in the tint. You can use this for effects such as making a player flash 'white'
  142537. * if hit by something. You can provide either one color value, in which case the whole
  142538. * Game Object will be rendered in that color. Or you can provide a color per corner. The colors
  142539. * are blended together across the extent of the Game Object.
  142540. *
  142541. * To modify the tint color once set, either call this method again with new values or use the
  142542. * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight,
  142543. * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently.
  142544. *
  142545. * To remove a tint call `clearTint`.
  142546. *
  142547. * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`.
  142548. *
  142549. * @method Phaser.GameObjects.Components.Tint#setTintFill
  142550. * @webglOnly
  142551. * @since 3.11.0
  142552. *
  142553. * @param {integer} [topLeft=0xffffff] - The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object.
  142554. * @param {integer} [topRight] - The tint being applied to the top-right of the Game Object.
  142555. * @param {integer} [bottomLeft] - The tint being applied to the bottom-left of the Game Object.
  142556. * @param {integer} [bottomRight] - The tint being applied to the bottom-right of the Game Object.
  142557. *
  142558. * @return {this} This Game Object instance.
  142559. */
  142560. setTintFill: function (topLeft, topRight, bottomLeft, bottomRight)
  142561. {
  142562. this.setTint(topLeft, topRight, bottomLeft, bottomRight);
  142563. this.tintFill = true;
  142564. return this;
  142565. },
  142566. /**
  142567. * The tint value being applied to the top-left of the Game Object.
  142568. * This value is interpolated from the corner to the center of the Game Object.
  142569. *
  142570. * @name Phaser.GameObjects.Components.Tint#tintTopLeft
  142571. * @type {integer}
  142572. * @webglOnly
  142573. * @since 3.0.0
  142574. */
  142575. tintTopLeft: {
  142576. get: function ()
  142577. {
  142578. return this._tintTL;
  142579. },
  142580. set: function (value)
  142581. {
  142582. this._tintTL = GetColor(value);
  142583. this._isTinted = true;
  142584. }
  142585. },
  142586. /**
  142587. * The tint value being applied to the top-right of the Game Object.
  142588. * This value is interpolated from the corner to the center of the Game Object.
  142589. *
  142590. * @name Phaser.GameObjects.Components.Tint#tintTopRight
  142591. * @type {integer}
  142592. * @webglOnly
  142593. * @since 3.0.0
  142594. */
  142595. tintTopRight: {
  142596. get: function ()
  142597. {
  142598. return this._tintTR;
  142599. },
  142600. set: function (value)
  142601. {
  142602. this._tintTR = GetColor(value);
  142603. this._isTinted = true;
  142604. }
  142605. },
  142606. /**
  142607. * The tint value being applied to the bottom-left of the Game Object.
  142608. * This value is interpolated from the corner to the center of the Game Object.
  142609. *
  142610. * @name Phaser.GameObjects.Components.Tint#tintBottomLeft
  142611. * @type {integer}
  142612. * @webglOnly
  142613. * @since 3.0.0
  142614. */
  142615. tintBottomLeft: {
  142616. get: function ()
  142617. {
  142618. return this._tintBL;
  142619. },
  142620. set: function (value)
  142621. {
  142622. this._tintBL = GetColor(value);
  142623. this._isTinted = true;
  142624. }
  142625. },
  142626. /**
  142627. * The tint value being applied to the bottom-right of the Game Object.
  142628. * This value is interpolated from the corner to the center of the Game Object.
  142629. *
  142630. * @name Phaser.GameObjects.Components.Tint#tintBottomRight
  142631. * @type {integer}
  142632. * @webglOnly
  142633. * @since 3.0.0
  142634. */
  142635. tintBottomRight: {
  142636. get: function ()
  142637. {
  142638. return this._tintBR;
  142639. },
  142640. set: function (value)
  142641. {
  142642. this._tintBR = GetColor(value);
  142643. this._isTinted = true;
  142644. }
  142645. },
  142646. /**
  142647. * The tint value being applied to the whole of the Game Object.
  142648. *
  142649. * @name Phaser.GameObjects.Components.Tint#tint
  142650. * @type {integer}
  142651. * @webglOnly
  142652. * @since 3.0.0
  142653. */
  142654. tint: {
  142655. set: function (value)
  142656. {
  142657. this.setTint(value, value, value, value);
  142658. }
  142659. },
  142660. /**
  142661. * Does this Game Object have a tint applied to it or not?
  142662. *
  142663. * @name Phaser.GameObjects.Components.Tint#isTinted
  142664. * @type {boolean}
  142665. * @webglOnly
  142666. * @readonly
  142667. * @since 3.11.0
  142668. */
  142669. isTinted: {
  142670. get: function ()
  142671. {
  142672. return this._isTinted;
  142673. }
  142674. }
  142675. };
  142676. module.exports = Tint;
  142677. /***/ }),
  142678. /* 1240 */
  142679. /***/ (function(module, exports) {
  142680. /**
  142681. * @author Richard Davey <rich@photonstorm.com>
  142682. * @copyright 2019 Photon Storm Ltd.
  142683. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142684. */
  142685. // bitmask flag for GameObject.renderMask
  142686. var _FLAG = 8; // 1000
  142687. /**
  142688. * Provides methods used for getting and setting the texture of a Game Object.
  142689. *
  142690. * @name Phaser.GameObjects.Components.TextureCrop
  142691. * @since 3.0.0
  142692. */
  142693. var TextureCrop = {
  142694. /**
  142695. * The Texture this Game Object is using to render with.
  142696. *
  142697. * @name Phaser.GameObjects.Components.TextureCrop#texture
  142698. * @type {Phaser.Textures.Texture|Phaser.Textures.CanvasTexture}
  142699. * @since 3.0.0
  142700. */
  142701. texture: null,
  142702. /**
  142703. * The Texture Frame this Game Object is using to render with.
  142704. *
  142705. * @name Phaser.GameObjects.Components.TextureCrop#frame
  142706. * @type {Phaser.Textures.Frame}
  142707. * @since 3.0.0
  142708. */
  142709. frame: null,
  142710. /**
  142711. * A boolean flag indicating if this Game Object is being cropped or not.
  142712. * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off.
  142713. * Equally, calling `setCrop` with no arguments will reset the crop and disable it.
  142714. *
  142715. * @name Phaser.GameObjects.Components.TextureCrop#isCropped
  142716. * @type {boolean}
  142717. * @since 3.11.0
  142718. */
  142719. isCropped: false,
  142720. /**
  142721. * Applies a crop to a texture based Game Object, such as a Sprite or Image.
  142722. *
  142723. * The crop is a rectangle that limits the area of the texture frame that is visible during rendering.
  142724. *
  142725. * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just
  142726. * changes what is shown when rendered.
  142727. *
  142728. * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left.
  142729. *
  142730. * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left
  142731. * half of it, you could call `setCrop(0, 0, 400, 600)`.
  142732. *
  142733. * It is also scaled to match the Game Object scale automatically. Therefore a crop rect of 100x50 would crop
  142734. * an area of 200x100 when applied to a Game Object that had a scale factor of 2.
  142735. *
  142736. * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument.
  142737. *
  142738. * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`.
  142739. *
  142740. * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow
  142741. * the renderer to skip several internal calculations.
  142742. *
  142743. * @method Phaser.GameObjects.Components.TextureCrop#setCrop
  142744. * @since 3.11.0
  142745. *
  142746. * @param {(number|Phaser.Geom.Rectangle)} [x] - The x coordinate to start the crop from. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored.
  142747. * @param {number} [y] - The y coordinate to start the crop from.
  142748. * @param {number} [width] - The width of the crop rectangle in pixels.
  142749. * @param {number} [height] - The height of the crop rectangle in pixels.
  142750. *
  142751. * @return {this} This Game Object instance.
  142752. */
  142753. setCrop: function (x, y, width, height)
  142754. {
  142755. if (x === undefined)
  142756. {
  142757. this.isCropped = false;
  142758. }
  142759. else if (this.frame)
  142760. {
  142761. if (typeof x === 'number')
  142762. {
  142763. this.frame.setCropUVs(this._crop, x, y, width, height, this.flipX, this.flipY);
  142764. }
  142765. else
  142766. {
  142767. var rect = x;
  142768. this.frame.setCropUVs(this._crop, rect.x, rect.y, rect.width, rect.height, this.flipX, this.flipY);
  142769. }
  142770. this.isCropped = true;
  142771. }
  142772. return this;
  142773. },
  142774. /**
  142775. * Sets the texture and frame this Game Object will use to render with.
  142776. *
  142777. * Textures are referenced by their string-based keys, as stored in the Texture Manager.
  142778. *
  142779. * @method Phaser.GameObjects.Components.TextureCrop#setTexture
  142780. * @since 3.0.0
  142781. *
  142782. * @param {string} key - The key of the texture to be used, as stored in the Texture Manager.
  142783. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  142784. *
  142785. * @return {this} This Game Object instance.
  142786. */
  142787. setTexture: function (key, frame)
  142788. {
  142789. this.texture = this.scene.sys.textures.get(key);
  142790. return this.setFrame(frame);
  142791. },
  142792. /**
  142793. * Sets the frame this Game Object will use to render with.
  142794. *
  142795. * The Frame has to belong to the current Texture being used.
  142796. *
  142797. * It can be either a string or an index.
  142798. *
  142799. * Calling `setFrame` will modify the `width` and `height` properties of your Game Object.
  142800. * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer.
  142801. *
  142802. * @method Phaser.GameObjects.Components.TextureCrop#setFrame
  142803. * @since 3.0.0
  142804. *
  142805. * @param {(string|integer)} frame - The name or index of the frame within the Texture.
  142806. * @param {boolean} [updateSize=true] - Should this call adjust the size of the Game Object?
  142807. * @param {boolean} [updateOrigin=true] - Should this call adjust the origin of the Game Object?
  142808. *
  142809. * @return {this} This Game Object instance.
  142810. */
  142811. setFrame: function (frame, updateSize, updateOrigin)
  142812. {
  142813. if (updateSize === undefined) { updateSize = true; }
  142814. if (updateOrigin === undefined) { updateOrigin = true; }
  142815. this.frame = this.texture.get(frame);
  142816. if (!this.frame.cutWidth || !this.frame.cutHeight)
  142817. {
  142818. this.renderFlags &= ~_FLAG;
  142819. }
  142820. else
  142821. {
  142822. this.renderFlags |= _FLAG;
  142823. }
  142824. if (this._sizeComponent && updateSize)
  142825. {
  142826. this.setSizeToFrame();
  142827. }
  142828. if (this._originComponent && updateOrigin)
  142829. {
  142830. if (this.frame.customPivot)
  142831. {
  142832. this.setOrigin(this.frame.pivotX, this.frame.pivotY);
  142833. }
  142834. else
  142835. {
  142836. this.updateDisplayOrigin();
  142837. }
  142838. }
  142839. if (this.isCropped)
  142840. {
  142841. this.frame.updateCropUVs(this._crop, this.flipX, this.flipY);
  142842. }
  142843. return this;
  142844. },
  142845. /**
  142846. * Internal method that returns a blank, well-formed crop object for use by a Game Object.
  142847. *
  142848. * @method Phaser.GameObjects.Components.TextureCrop#resetCropObject
  142849. * @private
  142850. * @since 3.12.0
  142851. *
  142852. * @return {object} The crop object.
  142853. */
  142854. resetCropObject: function ()
  142855. {
  142856. return { u0: 0, v0: 0, u1: 0, v1: 0, width: 0, height: 0, x: 0, y: 0, flipX: false, flipY: false, cx: 0, cy: 0, cw: 0, ch: 0 };
  142857. }
  142858. };
  142859. module.exports = TextureCrop;
  142860. /***/ }),
  142861. /* 1241 */
  142862. /***/ (function(module, exports) {
  142863. /**
  142864. * @author Richard Davey <rich@photonstorm.com>
  142865. * @copyright 2019 Photon Storm Ltd.
  142866. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142867. */
  142868. // bitmask flag for GameObject.renderMask
  142869. var _FLAG = 8; // 1000
  142870. /**
  142871. * Provides methods used for getting and setting the texture of a Game Object.
  142872. *
  142873. * @name Phaser.GameObjects.Components.Texture
  142874. * @since 3.0.0
  142875. */
  142876. var Texture = {
  142877. /**
  142878. * The Texture this Game Object is using to render with.
  142879. *
  142880. * @name Phaser.GameObjects.Components.Texture#texture
  142881. * @type {Phaser.Textures.Texture|Phaser.Textures.CanvasTexture}
  142882. * @since 3.0.0
  142883. */
  142884. texture: null,
  142885. /**
  142886. * The Texture Frame this Game Object is using to render with.
  142887. *
  142888. * @name Phaser.GameObjects.Components.Texture#frame
  142889. * @type {Phaser.Textures.Frame}
  142890. * @since 3.0.0
  142891. */
  142892. frame: null,
  142893. /**
  142894. * Internal flag. Not to be set by this Game Object.
  142895. *
  142896. * @name Phaser.GameObjects.Components.Texture#isCropped
  142897. * @type {boolean}
  142898. * @private
  142899. * @since 3.11.0
  142900. */
  142901. isCropped: false,
  142902. /**
  142903. * Sets the texture and frame this Game Object will use to render with.
  142904. *
  142905. * Textures are referenced by their string-based keys, as stored in the Texture Manager.
  142906. *
  142907. * @method Phaser.GameObjects.Components.Texture#setTexture
  142908. * @since 3.0.0
  142909. *
  142910. * @param {string} key - The key of the texture to be used, as stored in the Texture Manager.
  142911. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  142912. *
  142913. * @return {this} This Game Object instance.
  142914. */
  142915. setTexture: function (key, frame)
  142916. {
  142917. this.texture = this.scene.sys.textures.get(key);
  142918. return this.setFrame(frame);
  142919. },
  142920. /**
  142921. * Sets the frame this Game Object will use to render with.
  142922. *
  142923. * The Frame has to belong to the current Texture being used.
  142924. *
  142925. * It can be either a string or an index.
  142926. *
  142927. * Calling `setFrame` will modify the `width` and `height` properties of your Game Object.
  142928. * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer.
  142929. *
  142930. * @method Phaser.GameObjects.Components.Texture#setFrame
  142931. * @since 3.0.0
  142932. *
  142933. * @param {(string|integer)} frame - The name or index of the frame within the Texture.
  142934. * @param {boolean} [updateSize=true] - Should this call adjust the size of the Game Object?
  142935. * @param {boolean} [updateOrigin=true] - Should this call adjust the origin of the Game Object?
  142936. *
  142937. * @return {this} This Game Object instance.
  142938. */
  142939. setFrame: function (frame, updateSize, updateOrigin)
  142940. {
  142941. if (updateSize === undefined) { updateSize = true; }
  142942. if (updateOrigin === undefined) { updateOrigin = true; }
  142943. this.frame = this.texture.get(frame);
  142944. if (!this.frame.cutWidth || !this.frame.cutHeight)
  142945. {
  142946. this.renderFlags &= ~_FLAG;
  142947. }
  142948. else
  142949. {
  142950. this.renderFlags |= _FLAG;
  142951. }
  142952. if (this._sizeComponent && updateSize)
  142953. {
  142954. this.setSizeToFrame();
  142955. }
  142956. if (this._originComponent && updateOrigin)
  142957. {
  142958. if (this.frame.customPivot)
  142959. {
  142960. this.setOrigin(this.frame.pivotX, this.frame.pivotY);
  142961. }
  142962. else
  142963. {
  142964. this.updateDisplayOrigin();
  142965. }
  142966. }
  142967. return this;
  142968. }
  142969. };
  142970. module.exports = Texture;
  142971. /***/ }),
  142972. /* 1242 */
  142973. /***/ (function(module, exports) {
  142974. /**
  142975. * @author Richard Davey <rich@photonstorm.com>
  142976. * @copyright 2019 Photon Storm Ltd.
  142977. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  142978. */
  142979. /**
  142980. * Provides methods used for getting and setting the size of a Game Object.
  142981. *
  142982. * @name Phaser.GameObjects.Components.Size
  142983. * @since 3.0.0
  142984. */
  142985. var Size = {
  142986. /**
  142987. * A property indicating that a Game Object has this component.
  142988. *
  142989. * @name Phaser.GameObjects.Components.Size#_sizeComponent
  142990. * @type {boolean}
  142991. * @private
  142992. * @default true
  142993. * @since 3.2.0
  142994. */
  142995. _sizeComponent: true,
  142996. /**
  142997. * The native (un-scaled) width of this Game Object.
  142998. *
  142999. * Changing this value will not change the size that the Game Object is rendered in-game.
  143000. * For that you need to either set the scale of the Game Object (`setScale`) or use
  143001. * the `displayWidth` property.
  143002. *
  143003. * @name Phaser.GameObjects.Components.Size#width
  143004. * @type {number}
  143005. * @since 3.0.0
  143006. */
  143007. width: 0,
  143008. /**
  143009. * The native (un-scaled) height of this Game Object.
  143010. *
  143011. * Changing this value will not change the size that the Game Object is rendered in-game.
  143012. * For that you need to either set the scale of the Game Object (`setScale`) or use
  143013. * the `displayHeight` property.
  143014. *
  143015. * @name Phaser.GameObjects.Components.Size#height
  143016. * @type {number}
  143017. * @since 3.0.0
  143018. */
  143019. height: 0,
  143020. /**
  143021. * The displayed width of this Game Object.
  143022. *
  143023. * This value takes into account the scale factor.
  143024. *
  143025. * Setting this value will adjust the Game Object's scale property.
  143026. *
  143027. * @name Phaser.GameObjects.Components.Size#displayWidth
  143028. * @type {number}
  143029. * @since 3.0.0
  143030. */
  143031. displayWidth: {
  143032. get: function ()
  143033. {
  143034. return this.scaleX * this.frame.realWidth;
  143035. },
  143036. set: function (value)
  143037. {
  143038. this.scaleX = value / this.frame.realWidth;
  143039. }
  143040. },
  143041. /**
  143042. * The displayed height of this Game Object.
  143043. *
  143044. * This value takes into account the scale factor.
  143045. *
  143046. * Setting this value will adjust the Game Object's scale property.
  143047. *
  143048. * @name Phaser.GameObjects.Components.Size#displayHeight
  143049. * @type {number}
  143050. * @since 3.0.0
  143051. */
  143052. displayHeight: {
  143053. get: function ()
  143054. {
  143055. return this.scaleY * this.frame.realHeight;
  143056. },
  143057. set: function (value)
  143058. {
  143059. this.scaleY = value / this.frame.realHeight;
  143060. }
  143061. },
  143062. /**
  143063. * Sets the size of this Game Object to be that of the given Frame.
  143064. *
  143065. * This will not change the size that the Game Object is rendered in-game.
  143066. * For that you need to either set the scale of the Game Object (`setScale`) or call the
  143067. * `setDisplaySize` method, which is the same thing as changing the scale but allows you
  143068. * to do so by giving pixel values.
  143069. *
  143070. * If you have enabled this Game Object for input, changing the size will _not_ change the
  143071. * size of the hit area. To do this you should adjust the `input.hitArea` object directly.
  143072. *
  143073. * @method Phaser.GameObjects.Components.Size#setSizeToFrame
  143074. * @since 3.0.0
  143075. *
  143076. * @param {Phaser.Textures.Frame} frame - The frame to base the size of this Game Object on.
  143077. *
  143078. * @return {this} This Game Object instance.
  143079. */
  143080. setSizeToFrame: function (frame)
  143081. {
  143082. if (frame === undefined) { frame = this.frame; }
  143083. this.width = frame.realWidth;
  143084. this.height = frame.realHeight;
  143085. return this;
  143086. },
  143087. /**
  143088. * Sets the internal size of this Game Object, as used for frame or physics body creation.
  143089. *
  143090. * This will not change the size that the Game Object is rendered in-game.
  143091. * For that you need to either set the scale of the Game Object (`setScale`) or call the
  143092. * `setDisplaySize` method, which is the same thing as changing the scale but allows you
  143093. * to do so by giving pixel values.
  143094. *
  143095. * If you have enabled this Game Object for input, changing the size will _not_ change the
  143096. * size of the hit area. To do this you should adjust the `input.hitArea` object directly.
  143097. *
  143098. * @method Phaser.GameObjects.Components.Size#setSize
  143099. * @since 3.0.0
  143100. *
  143101. * @param {number} width - The width of this Game Object.
  143102. * @param {number} height - The height of this Game Object.
  143103. *
  143104. * @return {this} This Game Object instance.
  143105. */
  143106. setSize: function (width, height)
  143107. {
  143108. this.width = width;
  143109. this.height = height;
  143110. return this;
  143111. },
  143112. /**
  143113. * Sets the display size of this Game Object.
  143114. *
  143115. * Calling this will adjust the scale.
  143116. *
  143117. * @method Phaser.GameObjects.Components.Size#setDisplaySize
  143118. * @since 3.0.0
  143119. *
  143120. * @param {number} width - The width of this Game Object.
  143121. * @param {number} height - The height of this Game Object.
  143122. *
  143123. * @return {this} This Game Object instance.
  143124. */
  143125. setDisplaySize: function (width, height)
  143126. {
  143127. this.displayWidth = width;
  143128. this.displayHeight = height;
  143129. return this;
  143130. }
  143131. };
  143132. module.exports = Size;
  143133. /***/ }),
  143134. /* 1243 */
  143135. /***/ (function(module, exports, __webpack_require__) {
  143136. /**
  143137. * @author Richard Davey <rich@photonstorm.com>
  143138. * @copyright 2019 Photon Storm Ltd.
  143139. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  143140. */
  143141. var ScaleModes = __webpack_require__(101);
  143142. /**
  143143. * Provides methods used for getting and setting the scale of a Game Object.
  143144. *
  143145. * @name Phaser.GameObjects.Components.ScaleMode
  143146. * @since 3.0.0
  143147. */
  143148. var ScaleMode = {
  143149. _scaleMode: ScaleModes.DEFAULT,
  143150. /**
  143151. * The Scale Mode being used by this Game Object.
  143152. * Can be either `ScaleModes.LINEAR` or `ScaleModes.NEAREST`.
  143153. *
  143154. * @name Phaser.GameObjects.Components.ScaleMode#scaleMode
  143155. * @type {Phaser.ScaleModes}
  143156. * @since 3.0.0
  143157. */
  143158. scaleMode: {
  143159. get: function ()
  143160. {
  143161. return this._scaleMode;
  143162. },
  143163. set: function (value)
  143164. {
  143165. if (value === ScaleModes.LINEAR || value === ScaleModes.NEAREST)
  143166. {
  143167. this._scaleMode = value;
  143168. }
  143169. }
  143170. },
  143171. /**
  143172. * Sets the Scale Mode being used by this Game Object.
  143173. * Can be either `ScaleModes.LINEAR` or `ScaleModes.NEAREST`.
  143174. *
  143175. * @method Phaser.GameObjects.Components.ScaleMode#setScaleMode
  143176. * @since 3.0.0
  143177. *
  143178. * @param {Phaser.ScaleModes} value - The Scale Mode to be used by this Game Object.
  143179. *
  143180. * @return {this} This Game Object instance.
  143181. */
  143182. setScaleMode: function (value)
  143183. {
  143184. this.scaleMode = value;
  143185. return this;
  143186. }
  143187. };
  143188. module.exports = ScaleMode;
  143189. /***/ }),
  143190. /* 1244 */
  143191. /***/ (function(module, exports) {
  143192. /**
  143193. * @author Richard Davey <rich@photonstorm.com>
  143194. * @copyright 2019 Photon Storm Ltd.
  143195. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  143196. */
  143197. /**
  143198. * Provides methods used for getting and setting the origin of a Game Object.
  143199. * Values are normalized, given in the range 0 to 1.
  143200. * Display values contain the calculated pixel values.
  143201. * Should be applied as a mixin and not used directly.
  143202. *
  143203. * @name Phaser.GameObjects.Components.Origin
  143204. * @since 3.0.0
  143205. */
  143206. var Origin = {
  143207. /**
  143208. * A property indicating that a Game Object has this component.
  143209. *
  143210. * @name Phaser.GameObjects.Components.Origin#_originComponent
  143211. * @type {boolean}
  143212. * @private
  143213. * @default true
  143214. * @since 3.2.0
  143215. */
  143216. _originComponent: true,
  143217. /**
  143218. * The horizontal origin of this Game Object.
  143219. * The origin maps the relationship between the size and position of the Game Object.
  143220. * The default value is 0.5, meaning all Game Objects are positioned based on their center.
  143221. * Setting the value to 0 means the position now relates to the left of the Game Object.
  143222. *
  143223. * @name Phaser.GameObjects.Components.Origin#originX
  143224. * @type {number}
  143225. * @default 0.5
  143226. * @since 3.0.0
  143227. */
  143228. originX: 0.5,
  143229. /**
  143230. * The vertical origin of this Game Object.
  143231. * The origin maps the relationship between the size and position of the Game Object.
  143232. * The default value is 0.5, meaning all Game Objects are positioned based on their center.
  143233. * Setting the value to 0 means the position now relates to the top of the Game Object.
  143234. *
  143235. * @name Phaser.GameObjects.Components.Origin#originY
  143236. * @type {number}
  143237. * @default 0.5
  143238. * @since 3.0.0
  143239. */
  143240. originY: 0.5,
  143241. // private + read only
  143242. _displayOriginX: 0,
  143243. _displayOriginY: 0,
  143244. /**
  143245. * The horizontal display origin of this Game Object.
  143246. * The origin is a normalized value between 0 and 1.
  143247. * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin.
  143248. *
  143249. * @name Phaser.GameObjects.Components.Origin#displayOriginX
  143250. * @type {number}
  143251. * @since 3.0.0
  143252. */
  143253. displayOriginX: {
  143254. get: function ()
  143255. {
  143256. return this._displayOriginX;
  143257. },
  143258. set: function (value)
  143259. {
  143260. this._displayOriginX = value;
  143261. this.originX = value / this.width;
  143262. }
  143263. },
  143264. /**
  143265. * The vertical display origin of this Game Object.
  143266. * The origin is a normalized value between 0 and 1.
  143267. * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin.
  143268. *
  143269. * @name Phaser.GameObjects.Components.Origin#displayOriginY
  143270. * @type {number}
  143271. * @since 3.0.0
  143272. */
  143273. displayOriginY: {
  143274. get: function ()
  143275. {
  143276. return this._displayOriginY;
  143277. },
  143278. set: function (value)
  143279. {
  143280. this._displayOriginY = value;
  143281. this.originY = value / this.height;
  143282. }
  143283. },
  143284. /**
  143285. * Sets the origin of this Game Object.
  143286. *
  143287. * The values are given in the range 0 to 1.
  143288. *
  143289. * @method Phaser.GameObjects.Components.Origin#setOrigin
  143290. * @since 3.0.0
  143291. *
  143292. * @param {number} [x=0.5] - The horizontal origin value.
  143293. * @param {number} [y=x] - The vertical origin value. If not defined it will be set to the value of `x`.
  143294. *
  143295. * @return {this} This Game Object instance.
  143296. */
  143297. setOrigin: function (x, y)
  143298. {
  143299. if (x === undefined) { x = 0.5; }
  143300. if (y === undefined) { y = x; }
  143301. this.originX = x;
  143302. this.originY = y;
  143303. return this.updateDisplayOrigin();
  143304. },
  143305. /**
  143306. * Sets the origin of this Game Object based on the Pivot values in its Frame.
  143307. *
  143308. * @method Phaser.GameObjects.Components.Origin#setOriginFromFrame
  143309. * @since 3.0.0
  143310. *
  143311. * @return {this} This Game Object instance.
  143312. */
  143313. setOriginFromFrame: function ()
  143314. {
  143315. if (!this.frame || !this.frame.customPivot)
  143316. {
  143317. return this.setOrigin();
  143318. }
  143319. else
  143320. {
  143321. this.originX = this.frame.pivotX;
  143322. this.originY = this.frame.pivotY;
  143323. }
  143324. return this.updateDisplayOrigin();
  143325. },
  143326. /**
  143327. * Sets the display origin of this Game Object.
  143328. * The difference between this and setting the origin is that you can use pixel values for setting the display origin.
  143329. *
  143330. * @method Phaser.GameObjects.Components.Origin#setDisplayOrigin
  143331. * @since 3.0.0
  143332. *
  143333. * @param {number} [x=0] - The horizontal display origin value.
  143334. * @param {number} [y=x] - The vertical display origin value. If not defined it will be set to the value of `x`.
  143335. *
  143336. * @return {this} This Game Object instance.
  143337. */
  143338. setDisplayOrigin: function (x, y)
  143339. {
  143340. if (x === undefined) { x = 0; }
  143341. if (y === undefined) { y = x; }
  143342. this.displayOriginX = x;
  143343. this.displayOriginY = y;
  143344. return this;
  143345. },
  143346. /**
  143347. * Updates the Display Origin cached values internally stored on this Game Object.
  143348. * You don't usually call this directly, but it is exposed for edge-cases where you may.
  143349. *
  143350. * @method Phaser.GameObjects.Components.Origin#updateDisplayOrigin
  143351. * @since 3.0.0
  143352. *
  143353. * @return {this} This Game Object instance.
  143354. */
  143355. updateDisplayOrigin: function ()
  143356. {
  143357. this._displayOriginX = Math.round(this.originX * this.width);
  143358. this._displayOriginY = Math.round(this.originY * this.height);
  143359. return this;
  143360. }
  143361. };
  143362. module.exports = Origin;
  143363. /***/ }),
  143364. /* 1245 */
  143365. /***/ (function(module, exports, __webpack_require__) {
  143366. /**
  143367. * @author Richard Davey <rich@photonstorm.com>
  143368. * @copyright 2019 Photon Storm Ltd.
  143369. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  143370. */
  143371. var Rectangle = __webpack_require__(10);
  143372. var RotateAround = __webpack_require__(428);
  143373. var Vector2 = __webpack_require__(3);
  143374. /**
  143375. * Provides methods used for obtaining the bounds of a Game Object.
  143376. * Should be applied as a mixin and not used directly.
  143377. *
  143378. * @name Phaser.GameObjects.Components.GetBounds
  143379. * @since 3.0.0
  143380. */
  143381. var GetBounds = {
  143382. /**
  143383. * Gets the center coordinate of this Game Object, regardless of origin.
  143384. * The returned point is calculated in local space and does not factor in any parent containers
  143385. *
  143386. * @method Phaser.GameObjects.Components.GetBounds#getCenter
  143387. * @since 3.0.0
  143388. *
  143389. * @generic {Phaser.Math.Vector2} O - [output,$return]
  143390. *
  143391. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  143392. *
  143393. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  143394. */
  143395. getCenter: function (output)
  143396. {
  143397. if (output === undefined) { output = new Vector2(); }
  143398. output.x = this.x - (this.displayWidth * this.originX) + (this.displayWidth / 2);
  143399. output.y = this.y - (this.displayHeight * this.originY) + (this.displayHeight / 2);
  143400. return output;
  143401. },
  143402. /**
  143403. * Gets the top-left corner coordinate of this Game Object, regardless of origin.
  143404. * The returned point is calculated in local space and does not factor in any parent containers
  143405. *
  143406. * @method Phaser.GameObjects.Components.GetBounds#getTopLeft
  143407. * @since 3.0.0
  143408. *
  143409. * @generic {Phaser.Math.Vector2} O - [output,$return]
  143410. *
  143411. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  143412. * @param {boolean} [includeParent=false] - If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector?
  143413. *
  143414. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  143415. */
  143416. getTopLeft: function (output, includeParent)
  143417. {
  143418. if (!output) { output = new Vector2(); }
  143419. if (includeParent === undefined) { includeParent = false; }
  143420. output.x = this.x - (this.displayWidth * this.originX);
  143421. output.y = this.y - (this.displayHeight * this.originY);
  143422. if (this.rotation !== 0)
  143423. {
  143424. RotateAround(output, this.x, this.y, this.rotation);
  143425. }
  143426. if (includeParent && this.parentContainer)
  143427. {
  143428. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  143429. parentMatrix.transformPoint(output.x, output.y, output);
  143430. }
  143431. return output;
  143432. },
  143433. /**
  143434. * Gets the top-right corner coordinate of this Game Object, regardless of origin.
  143435. * The returned point is calculated in local space and does not factor in any parent containers
  143436. *
  143437. * @method Phaser.GameObjects.Components.GetBounds#getTopRight
  143438. * @since 3.0.0
  143439. *
  143440. * @generic {Phaser.Math.Vector2} O - [output,$return]
  143441. *
  143442. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  143443. * @param {boolean} [includeParent=false] - If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector?
  143444. *
  143445. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  143446. */
  143447. getTopRight: function (output, includeParent)
  143448. {
  143449. if (!output) { output = new Vector2(); }
  143450. if (includeParent === undefined) { includeParent = false; }
  143451. output.x = (this.x - (this.displayWidth * this.originX)) + this.displayWidth;
  143452. output.y = this.y - (this.displayHeight * this.originY);
  143453. if (this.rotation !== 0)
  143454. {
  143455. RotateAround(output, this.x, this.y, this.rotation);
  143456. }
  143457. if (includeParent && this.parentContainer)
  143458. {
  143459. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  143460. parentMatrix.transformPoint(output.x, output.y, output);
  143461. }
  143462. return output;
  143463. },
  143464. /**
  143465. * Gets the bottom-left corner coordinate of this Game Object, regardless of origin.
  143466. * The returned point is calculated in local space and does not factor in any parent containers
  143467. *
  143468. * @method Phaser.GameObjects.Components.GetBounds#getBottomLeft
  143469. * @since 3.0.0
  143470. *
  143471. * @generic {Phaser.Math.Vector2} O - [output,$return]
  143472. *
  143473. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  143474. * @param {boolean} [includeParent=false] - If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector?
  143475. *
  143476. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  143477. */
  143478. getBottomLeft: function (output, includeParent)
  143479. {
  143480. if (!output) { output = new Vector2(); }
  143481. if (includeParent === undefined) { includeParent = false; }
  143482. output.x = this.x - (this.displayWidth * this.originX);
  143483. output.y = (this.y - (this.displayHeight * this.originY)) + this.displayHeight;
  143484. if (this.rotation !== 0)
  143485. {
  143486. RotateAround(output, this.x, this.y, this.rotation);
  143487. }
  143488. if (includeParent && this.parentContainer)
  143489. {
  143490. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  143491. parentMatrix.transformPoint(output.x, output.y, output);
  143492. }
  143493. return output;
  143494. },
  143495. /**
  143496. * Gets the bottom-right corner coordinate of this Game Object, regardless of origin.
  143497. * The returned point is calculated in local space and does not factor in any parent containers
  143498. *
  143499. * @method Phaser.GameObjects.Components.GetBounds#getBottomRight
  143500. * @since 3.0.0
  143501. *
  143502. * @generic {Phaser.Math.Vector2} O - [output,$return]
  143503. *
  143504. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  143505. * @param {boolean} [includeParent=false] - If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector?
  143506. *
  143507. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  143508. */
  143509. getBottomRight: function (output, includeParent)
  143510. {
  143511. if (!output) { output = new Vector2(); }
  143512. if (includeParent === undefined) { includeParent = false; }
  143513. output.x = (this.x - (this.displayWidth * this.originX)) + this.displayWidth;
  143514. output.y = (this.y - (this.displayHeight * this.originY)) + this.displayHeight;
  143515. if (this.rotation !== 0)
  143516. {
  143517. RotateAround(output, this.x, this.y, this.rotation);
  143518. }
  143519. if (includeParent && this.parentContainer)
  143520. {
  143521. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  143522. parentMatrix.transformPoint(output.x, output.y, output);
  143523. }
  143524. return output;
  143525. },
  143526. /**
  143527. * Gets the bounds of this Game Object, regardless of origin.
  143528. * The values are stored and returned in a Rectangle, or Rectangle-like, object.
  143529. *
  143530. * @method Phaser.GameObjects.Components.GetBounds#getBounds
  143531. * @since 3.0.0
  143532. *
  143533. * @generic {Phaser.Geom.Rectangle} O - [output,$return]
  143534. *
  143535. * @param {(Phaser.Geom.Rectangle|object)} [output] - An object to store the values in. If not provided a new Rectangle will be created.
  143536. *
  143537. * @return {(Phaser.Geom.Rectangle|object)} The values stored in the output object.
  143538. */
  143539. getBounds: function (output)
  143540. {
  143541. if (output === undefined) { output = new Rectangle(); }
  143542. // We can use the output object to temporarily store the x/y coords in:
  143543. var TLx, TLy, TRx, TRy, BLx, BLy, BRx, BRy;
  143544. // Instead of doing a check if parent container is
  143545. // defined per corner we only do it once.
  143546. if (this.parentContainer)
  143547. {
  143548. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  143549. this.getTopLeft(output);
  143550. parentMatrix.transformPoint(output.x, output.y, output);
  143551. TLx = output.x;
  143552. TLy = output.y;
  143553. this.getTopRight(output);
  143554. parentMatrix.transformPoint(output.x, output.y, output);
  143555. TRx = output.x;
  143556. TRy = output.y;
  143557. this.getBottomLeft(output);
  143558. parentMatrix.transformPoint(output.x, output.y, output);
  143559. BLx = output.x;
  143560. BLy = output.y;
  143561. this.getBottomRight(output);
  143562. parentMatrix.transformPoint(output.x, output.y, output);
  143563. BRx = output.x;
  143564. BRy = output.y;
  143565. }
  143566. else
  143567. {
  143568. this.getTopLeft(output);
  143569. TLx = output.x;
  143570. TLy = output.y;
  143571. this.getTopRight(output);
  143572. TRx = output.x;
  143573. TRy = output.y;
  143574. this.getBottomLeft(output);
  143575. BLx = output.x;
  143576. BLy = output.y;
  143577. this.getBottomRight(output);
  143578. BRx = output.x;
  143579. BRy = output.y;
  143580. }
  143581. output.x = Math.min(TLx, TRx, BLx, BRx);
  143582. output.y = Math.min(TLy, TRy, BLy, BRy);
  143583. output.width = Math.max(TLx, TRx, BLx, BRx) - output.x;
  143584. output.height = Math.max(TLy, TRy, BLy, BRy) - output.y;
  143585. return output;
  143586. }
  143587. };
  143588. module.exports = GetBounds;
  143589. /***/ }),
  143590. /* 1246 */
  143591. /***/ (function(module, exports) {
  143592. /**
  143593. * @author Richard Davey <rich@photonstorm.com>
  143594. * @copyright 2019 Photon Storm Ltd.
  143595. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  143596. */
  143597. /**
  143598. * Provides methods used for visually flipping a Game Object.
  143599. * Should be applied as a mixin and not used directly.
  143600. *
  143601. * @name Phaser.GameObjects.Components.Flip
  143602. * @since 3.0.0
  143603. */
  143604. var Flip = {
  143605. /**
  143606. * The horizontally flipped state of the Game Object.
  143607. * A Game Object that is flipped horizontally will render inversed on the horizontal axis.
  143608. * Flipping always takes place from the middle of the texture and does not impact the scale value.
  143609. *
  143610. * @name Phaser.GameObjects.Components.Flip#flipX
  143611. * @type {boolean}
  143612. * @default false
  143613. * @since 3.0.0
  143614. */
  143615. flipX: false,
  143616. /**
  143617. * The vertically flipped state of the Game Object.
  143618. * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down)
  143619. * Flipping always takes place from the middle of the texture and does not impact the scale value.
  143620. *
  143621. * @name Phaser.GameObjects.Components.Flip#flipY
  143622. * @type {boolean}
  143623. * @default false
  143624. * @since 3.0.0
  143625. */
  143626. flipY: false,
  143627. /**
  143628. * Toggles the horizontal flipped state of this Game Object.
  143629. *
  143630. * @method Phaser.GameObjects.Components.Flip#toggleFlipX
  143631. * @since 3.0.0
  143632. *
  143633. * @return {this} This Game Object instance.
  143634. */
  143635. toggleFlipX: function ()
  143636. {
  143637. this.flipX = !this.flipX;
  143638. return this;
  143639. },
  143640. /**
  143641. * Toggles the vertical flipped state of this Game Object.
  143642. *
  143643. * @method Phaser.GameObjects.Components.Flip#toggleFlipY
  143644. * @since 3.0.0
  143645. *
  143646. * @return {this} This Game Object instance.
  143647. */
  143648. toggleFlipY: function ()
  143649. {
  143650. this.flipY = !this.flipY;
  143651. return this;
  143652. },
  143653. /**
  143654. * Sets the horizontal flipped state of this Game Object.
  143655. *
  143656. * @method Phaser.GameObjects.Components.Flip#setFlipX
  143657. * @since 3.0.0
  143658. *
  143659. * @param {boolean} value - The flipped state. `false` for no flip, or `true` to be flipped.
  143660. *
  143661. * @return {this} This Game Object instance.
  143662. */
  143663. setFlipX: function (value)
  143664. {
  143665. this.flipX = value;
  143666. return this;
  143667. },
  143668. /**
  143669. * Sets the vertical flipped state of this Game Object.
  143670. *
  143671. * @method Phaser.GameObjects.Components.Flip#setFlipY
  143672. * @since 3.0.0
  143673. *
  143674. * @param {boolean} value - The flipped state. `false` for no flip, or `true` to be flipped.
  143675. *
  143676. * @return {this} This Game Object instance.
  143677. */
  143678. setFlipY: function (value)
  143679. {
  143680. this.flipY = value;
  143681. return this;
  143682. },
  143683. /**
  143684. * Sets the horizontal and vertical flipped state of this Game Object.
  143685. *
  143686. * @method Phaser.GameObjects.Components.Flip#setFlip
  143687. * @since 3.0.0
  143688. *
  143689. * @param {boolean} x - The horizontal flipped state. `false` for no flip, or `true` to be flipped.
  143690. * @param {boolean} y - The horizontal flipped state. `false` for no flip, or `true` to be flipped.
  143691. *
  143692. * @return {this} This Game Object instance.
  143693. */
  143694. setFlip: function (x, y)
  143695. {
  143696. this.flipX = x;
  143697. this.flipY = y;
  143698. return this;
  143699. },
  143700. /**
  143701. * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state.
  143702. *
  143703. * @method Phaser.GameObjects.Components.Flip#resetFlip
  143704. * @since 3.0.0
  143705. *
  143706. * @return {this} This Game Object instance.
  143707. */
  143708. resetFlip: function ()
  143709. {
  143710. this.flipX = false;
  143711. this.flipY = false;
  143712. return this;
  143713. }
  143714. };
  143715. module.exports = Flip;
  143716. /***/ }),
  143717. /* 1247 */
  143718. /***/ (function(module, exports) {
  143719. /**
  143720. * @author Richard Davey <rich@photonstorm.com>
  143721. * @copyright 2019 Photon Storm Ltd.
  143722. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  143723. */
  143724. /**
  143725. * Provides methods used for getting and setting the texture of a Game Object.
  143726. *
  143727. * @name Phaser.GameObjects.Components.Crop
  143728. * @since 3.12.0
  143729. */
  143730. var Crop = {
  143731. /**
  143732. * The Texture this Game Object is using to render with.
  143733. *
  143734. * @name Phaser.GameObjects.Components.Crop#texture
  143735. * @type {Phaser.Textures.Texture|Phaser.Textures.CanvasTexture}
  143736. * @since 3.0.0
  143737. */
  143738. texture: null,
  143739. /**
  143740. * The Texture Frame this Game Object is using to render with.
  143741. *
  143742. * @name Phaser.GameObjects.Components.Crop#frame
  143743. * @type {Phaser.Textures.Frame}
  143744. * @since 3.0.0
  143745. */
  143746. frame: null,
  143747. /**
  143748. * A boolean flag indicating if this Game Object is being cropped or not.
  143749. * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off.
  143750. * Equally, calling `setCrop` with no arguments will reset the crop and disable it.
  143751. *
  143752. * @name Phaser.GameObjects.Components.Crop#isCropped
  143753. * @type {boolean}
  143754. * @since 3.11.0
  143755. */
  143756. isCropped: false,
  143757. /**
  143758. * Applies a crop to a texture based Game Object, such as a Sprite or Image.
  143759. *
  143760. * The crop is a rectangle that limits the area of the texture frame that is visible during rendering.
  143761. *
  143762. * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just
  143763. * changes what is shown when rendered.
  143764. *
  143765. * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left.
  143766. *
  143767. * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left
  143768. * half of it, you could call `setCrop(0, 0, 400, 600)`.
  143769. *
  143770. * It is also scaled to match the Game Object scale automatically. Therefore a crop rect of 100x50 would crop
  143771. * an area of 200x100 when applied to a Game Object that had a scale factor of 2.
  143772. *
  143773. * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument.
  143774. *
  143775. * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`.
  143776. *
  143777. * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow
  143778. * the renderer to skip several internal calculations.
  143779. *
  143780. * @method Phaser.GameObjects.Components.Crop#setCrop
  143781. * @since 3.11.0
  143782. *
  143783. * @param {(number|Phaser.Geom.Rectangle)} [x] - The x coordinate to start the crop from. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored.
  143784. * @param {number} [y] - The y coordinate to start the crop from.
  143785. * @param {number} [width] - The width of the crop rectangle in pixels.
  143786. * @param {number} [height] - The height of the crop rectangle in pixels.
  143787. *
  143788. * @return {this} This Game Object instance.
  143789. */
  143790. setCrop: function (x, y, width, height)
  143791. {
  143792. if (x === undefined)
  143793. {
  143794. this.isCropped = false;
  143795. }
  143796. else if (this.frame)
  143797. {
  143798. if (typeof x === 'number')
  143799. {
  143800. this.frame.setCropUVs(this._crop, x, y, width, height, this.flipX, this.flipY);
  143801. }
  143802. else
  143803. {
  143804. var rect = x;
  143805. this.frame.setCropUVs(this._crop, rect.x, rect.y, rect.width, rect.height, this.flipX, this.flipY);
  143806. }
  143807. this.isCropped = true;
  143808. }
  143809. return this;
  143810. },
  143811. /**
  143812. * Internal method that returns a blank, well-formed crop object for use by a Game Object.
  143813. *
  143814. * @method Phaser.GameObjects.Components.Crop#resetCropObject
  143815. * @private
  143816. * @since 3.12.0
  143817. *
  143818. * @return {object} The crop object.
  143819. */
  143820. resetCropObject: function ()
  143821. {
  143822. return { u0: 0, v0: 0, u1: 0, v1: 0, width: 0, height: 0, x: 0, y: 0, flipX: false, flipY: false, cx: 0, cy: 0, cw: 0, ch: 0 };
  143823. }
  143824. };
  143825. module.exports = Crop;
  143826. /***/ }),
  143827. /* 1248 */
  143828. /***/ (function(module, exports) {
  143829. /**
  143830. * @author Richard Davey <rich@photonstorm.com>
  143831. * @copyright 2019 Photon Storm Ltd.
  143832. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  143833. */
  143834. /**
  143835. * Provides methods used for calculating and setting the size of a non-Frame based Game Object.
  143836. * Should be applied as a mixin and not used directly.
  143837. *
  143838. * @name Phaser.GameObjects.Components.ComputedSize
  143839. * @since 3.0.0
  143840. */
  143841. var ComputedSize = {
  143842. /**
  143843. * The native (un-scaled) width of this Game Object.
  143844. *
  143845. * Changing this value will not change the size that the Game Object is rendered in-game.
  143846. * For that you need to either set the scale of the Game Object (`setScale`) or use
  143847. * the `displayWidth` property.
  143848. *
  143849. * @name Phaser.GameObjects.Components.ComputedSize#width
  143850. * @type {number}
  143851. * @since 3.0.0
  143852. */
  143853. width: 0,
  143854. /**
  143855. * The native (un-scaled) height of this Game Object.
  143856. *
  143857. * Changing this value will not change the size that the Game Object is rendered in-game.
  143858. * For that you need to either set the scale of the Game Object (`setScale`) or use
  143859. * the `displayHeight` property.
  143860. *
  143861. * @name Phaser.GameObjects.Components.ComputedSize#height
  143862. * @type {number}
  143863. * @since 3.0.0
  143864. */
  143865. height: 0,
  143866. /**
  143867. * The displayed width of this Game Object.
  143868. *
  143869. * This value takes into account the scale factor.
  143870. *
  143871. * Setting this value will adjust the Game Object's scale property.
  143872. *
  143873. * @name Phaser.GameObjects.Components.ComputedSize#displayWidth
  143874. * @type {number}
  143875. * @since 3.0.0
  143876. */
  143877. displayWidth: {
  143878. get: function ()
  143879. {
  143880. return this.scaleX * this.width;
  143881. },
  143882. set: function (value)
  143883. {
  143884. this.scaleX = value / this.width;
  143885. }
  143886. },
  143887. /**
  143888. * The displayed height of this Game Object.
  143889. *
  143890. * This value takes into account the scale factor.
  143891. *
  143892. * Setting this value will adjust the Game Object's scale property.
  143893. *
  143894. * @name Phaser.GameObjects.Components.ComputedSize#displayHeight
  143895. * @type {number}
  143896. * @since 3.0.0
  143897. */
  143898. displayHeight: {
  143899. get: function ()
  143900. {
  143901. return this.scaleY * this.height;
  143902. },
  143903. set: function (value)
  143904. {
  143905. this.scaleY = value / this.height;
  143906. }
  143907. },
  143908. /**
  143909. * Sets the internal size of this Game Object, as used for frame or physics body creation.
  143910. *
  143911. * This will not change the size that the Game Object is rendered in-game.
  143912. * For that you need to either set the scale of the Game Object (`setScale`) or call the
  143913. * `setDisplaySize` method, which is the same thing as changing the scale but allows you
  143914. * to do so by giving pixel values.
  143915. *
  143916. * If you have enabled this Game Object for input, changing the size will _not_ change the
  143917. * size of the hit area. To do this you should adjust the `input.hitArea` object directly.
  143918. *
  143919. * @method Phaser.GameObjects.Components.ComputedSize#setSize
  143920. * @since 3.4.0
  143921. *
  143922. * @param {number} width - The width of this Game Object.
  143923. * @param {number} height - The height of this Game Object.
  143924. *
  143925. * @return {this} This Game Object instance.
  143926. */
  143927. setSize: function (width, height)
  143928. {
  143929. this.width = width;
  143930. this.height = height;
  143931. return this;
  143932. },
  143933. /**
  143934. * Sets the display size of this Game Object.
  143935. *
  143936. * Calling this will adjust the scale.
  143937. *
  143938. * @method Phaser.GameObjects.Components.ComputedSize#setDisplaySize
  143939. * @since 3.4.0
  143940. *
  143941. * @param {number} width - The width of this Game Object.
  143942. * @param {number} height - The height of this Game Object.
  143943. *
  143944. * @return {this} This Game Object instance.
  143945. */
  143946. setDisplaySize: function (width, height)
  143947. {
  143948. this.displayWidth = width;
  143949. this.displayHeight = height;
  143950. return this;
  143951. }
  143952. };
  143953. module.exports = ComputedSize;
  143954. /***/ }),
  143955. /* 1249 */
  143956. /***/ (function(module, exports) {
  143957. /**
  143958. * @author Richard Davey <rich@photonstorm.com>
  143959. * @copyright 2019 Photon Storm Ltd.
  143960. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  143961. */
  143962. /**
  143963. * The Sprite Animation Update Event.
  143964. *
  143965. * This event is dispatched by a Sprite when an animation playing on it updates. This happens when the animation changes frame,
  143966. * based on the animation frame rate and other factors like `timeScale` and `delay`.
  143967. *
  143968. * Listen for it on the Sprite using `sprite.on('animationupdate', listener)`
  143969. *
  143970. * This same event is dispatched for all animations. To listen for a specific animation, use the `SPRITE_ANIMATION_KEY_UPDATE` event.
  143971. *
  143972. * @event Phaser.Animations.Events#SPRITE_ANIMATION_UPDATE
  143973. *
  143974. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that has updated on the Sprite.
  143975. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame of the Animation.
  143976. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation updated.
  143977. */
  143978. module.exports = 'animationupdate';
  143979. /***/ }),
  143980. /* 1250 */
  143981. /***/ (function(module, exports) {
  143982. /**
  143983. * @author Richard Davey <rich@photonstorm.com>
  143984. * @copyright 2019 Photon Storm Ltd.
  143985. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  143986. */
  143987. /**
  143988. * The Sprite Animation Start Event.
  143989. *
  143990. * This event is dispatched by a Sprite when an animation starts playing on it.
  143991. *
  143992. * Listen for it on the Sprite using `sprite.on('animationstart', listener)`
  143993. *
  143994. * This same event is dispatched for all animations. To listen for a specific animation, use the `SPRITE_ANIMATION_KEY_START` event.
  143995. *
  143996. * @event Phaser.Animations.Events#SPRITE_ANIMATION_START
  143997. *
  143998. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that was started on the Sprite.
  143999. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation started with.
  144000. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation started playing.
  144001. */
  144002. module.exports = 'animationstart';
  144003. /***/ }),
  144004. /* 1251 */
  144005. /***/ (function(module, exports) {
  144006. /**
  144007. * @author Richard Davey <rich@photonstorm.com>
  144008. * @copyright 2019 Photon Storm Ltd.
  144009. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144010. */
  144011. /**
  144012. * The Sprite Animation Restart Event.
  144013. *
  144014. * This event is dispatched by a Sprite when an animation restarts playing on it.
  144015. *
  144016. * Listen for it on the Sprite using `sprite.on('animationrestart', listener)`
  144017. *
  144018. * This same event is dispatched for all animations. To listen for a specific animation, use the `SPRITE_ANIMATION_KEY_RESTART` event.
  144019. *
  144020. * @event Phaser.Animations.Events#SPRITE_ANIMATION_RESTART
  144021. *
  144022. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that was restarted on the Sprite.
  144023. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation restarted with.
  144024. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation restarted playing.
  144025. */
  144026. module.exports = 'animationrestart';
  144027. /***/ }),
  144028. /* 1252 */
  144029. /***/ (function(module, exports) {
  144030. /**
  144031. * @author Richard Davey <rich@photonstorm.com>
  144032. * @copyright 2019 Photon Storm Ltd.
  144033. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144034. */
  144035. /**
  144036. * The Sprite Animation Repeat Event.
  144037. *
  144038. * This event is dispatched by a Sprite when an animation repeats playing on it.
  144039. *
  144040. * Listen for it on the Sprite using `sprite.on('animationrepeat', listener)`
  144041. *
  144042. * This same event is dispatched for all animations. To listen for a specific animation, use the `SPRITE_ANIMATION_KEY_REPEAT` event.
  144043. *
  144044. * @event Phaser.Animations.Events#SPRITE_ANIMATION_REPEAT
  144045. *
  144046. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that is repeating on the Sprite.
  144047. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation started with.
  144048. * @param {integer} repeatCount - The number of times the Animation has repeated so far.
  144049. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation repeated playing.
  144050. */
  144051. module.exports = 'animationrepeat';
  144052. /***/ }),
  144053. /* 1253 */
  144054. /***/ (function(module, exports) {
  144055. /**
  144056. * @author Richard Davey <rich@photonstorm.com>
  144057. * @copyright 2019 Photon Storm Ltd.
  144058. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144059. */
  144060. /**
  144061. * The Sprite Animation Key Update Event.
  144062. *
  144063. * This event is dispatched by a Sprite when a specific animation playing on it updates. This happens when the animation changes frame,
  144064. * based on the animation frame rate and other factors like `timeScale` and `delay`.
  144065. *
  144066. * Listen for it on the Sprite using `sprite.on('animationupdate-key', listener)` where `key` is the key of
  144067. * the animation. For example, if you had an animation with the key 'explode' you should listen for `animationupdate-explode`.
  144068. *
  144069. * @event Phaser.Animations.Events#SPRITE_ANIMATION_KEY_UPDATE
  144070. *
  144071. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that has updated on the Sprite.
  144072. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame of the Animation.
  144073. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation updated.
  144074. */
  144075. module.exports = 'animationupdate-';
  144076. /***/ }),
  144077. /* 1254 */
  144078. /***/ (function(module, exports) {
  144079. /**
  144080. * @author Richard Davey <rich@photonstorm.com>
  144081. * @copyright 2019 Photon Storm Ltd.
  144082. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144083. */
  144084. /**
  144085. * The Sprite Animation Key Start Event.
  144086. *
  144087. * This event is dispatched by a Sprite when a specific animation starts playing on it.
  144088. *
  144089. * Listen for it on the Sprite using `sprite.on('animationstart-key', listener)` where `key` is the key of
  144090. * the animation. For example, if you had an animation with the key 'explode' you should listen for `animationstart-explode`.
  144091. *
  144092. * @event Phaser.Animations.Events#SPRITE_ANIMATION_KEY_START
  144093. *
  144094. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that was started on the Sprite.
  144095. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation started with.
  144096. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation started playing.
  144097. */
  144098. module.exports = 'animationstart-';
  144099. /***/ }),
  144100. /* 1255 */
  144101. /***/ (function(module, exports) {
  144102. /**
  144103. * @author Richard Davey <rich@photonstorm.com>
  144104. * @copyright 2019 Photon Storm Ltd.
  144105. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144106. */
  144107. /**
  144108. * The Sprite Animation Key Restart Event.
  144109. *
  144110. * This event is dispatched by a Sprite when a specific animation restarts playing on it.
  144111. *
  144112. * Listen for it on the Sprite using `sprite.on('animationrestart-key', listener)` where `key` is the key of
  144113. * the animation. For example, if you had an animation with the key 'explode' you should listen for `animationrestart-explode`.
  144114. *
  144115. * @event Phaser.Animations.Events#SPRITE_ANIMATION_KEY_RESTART
  144116. *
  144117. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that was restarted on the Sprite.
  144118. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation restarted with.
  144119. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation restarted playing.
  144120. */
  144121. module.exports = 'animationrestart-';
  144122. /***/ }),
  144123. /* 1256 */
  144124. /***/ (function(module, exports) {
  144125. /**
  144126. * @author Richard Davey <rich@photonstorm.com>
  144127. * @copyright 2019 Photon Storm Ltd.
  144128. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144129. */
  144130. /**
  144131. * The Sprite Animation Key Repeat Event.
  144132. *
  144133. * This event is dispatched by a Sprite when a specific animation repeats playing on it.
  144134. *
  144135. * Listen for it on the Sprite using `sprite.on('animationrepeat-key', listener)` where `key` is the key of
  144136. * the animation. For example, if you had an animation with the key 'explode' you should listen for `animationrepeat-explode`.
  144137. *
  144138. * @event Phaser.Animations.Events#SPRITE_ANIMATION_KEY_REPEAT
  144139. *
  144140. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that is repeating on the Sprite.
  144141. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation started with.
  144142. * @param {integer} repeatCount - The number of times the Animation has repeated so far.
  144143. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation repeated playing.
  144144. */
  144145. module.exports = 'animationrepeat-';
  144146. /***/ }),
  144147. /* 1257 */
  144148. /***/ (function(module, exports) {
  144149. /**
  144150. * @author Richard Davey <rich@photonstorm.com>
  144151. * @copyright 2019 Photon Storm Ltd.
  144152. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144153. */
  144154. /**
  144155. * The Sprite Animation Key Complete Event.
  144156. *
  144157. * This event is dispatched by a Sprite when a specific animation finishes playing on it.
  144158. *
  144159. * Listen for it on the Sprite using `sprite.on('animationcomplete-key', listener)` where `key` is the key of
  144160. * the animation. For example, if you had an animation with the key 'explode' you should listen for `animationcomplete-explode`.
  144161. *
  144162. * @event Phaser.Animations.Events#SPRITE_ANIMATION_KEY_COMPLETE
  144163. *
  144164. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that completed.
  144165. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation completed on.
  144166. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation completed.
  144167. */
  144168. module.exports = 'animationcomplete-';
  144169. /***/ }),
  144170. /* 1258 */
  144171. /***/ (function(module, exports) {
  144172. /**
  144173. * @author Richard Davey <rich@photonstorm.com>
  144174. * @copyright 2019 Photon Storm Ltd.
  144175. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144176. */
  144177. /**
  144178. * The Sprite Animation Complete Event.
  144179. *
  144180. * This event is dispatched by a Sprite when an animation finishes playing on it.
  144181. *
  144182. * Listen for it on the Sprite using `sprite.on('animationcomplete', listener)`
  144183. *
  144184. * This same event is dispatched for all animations. To listen for a specific animation, use the `SPRITE_ANIMATION_KEY_COMPLETE` event.
  144185. *
  144186. * @event Phaser.Animations.Events#SPRITE_ANIMATION_COMPLETE
  144187. *
  144188. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that completed.
  144189. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation completed on.
  144190. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation completed.
  144191. */
  144192. module.exports = 'animationcomplete';
  144193. /***/ }),
  144194. /* 1259 */
  144195. /***/ (function(module, exports) {
  144196. /**
  144197. * @author Richard Davey <rich@photonstorm.com>
  144198. * @copyright 2019 Photon Storm Ltd.
  144199. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144200. */
  144201. /**
  144202. * The Resume All Animations Event.
  144203. *
  144204. * This event is dispatched when the global Animation Manager resumes, having been previously paused.
  144205. *
  144206. * When this happens all current animations will continue updating again.
  144207. *
  144208. * @event Phaser.Animations.Events#RESUME_ALL
  144209. */
  144210. module.exports = 'resumeall';
  144211. /***/ }),
  144212. /* 1260 */
  144213. /***/ (function(module, exports) {
  144214. /**
  144215. * @author Richard Davey <rich@photonstorm.com>
  144216. * @copyright 2019 Photon Storm Ltd.
  144217. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144218. */
  144219. /**
  144220. * The Remove Animation Event.
  144221. *
  144222. * This event is dispatched when an animation is removed from the global Animation Manager.
  144223. *
  144224. * @event Phaser.Animations.Events#REMOVE_ANIMATION
  144225. *
  144226. * @param {string} key - The key of the Animation that was removed from the global Animation Manager.
  144227. * @param {Phaser.Animations.Animation} animation - An instance of the removed Animation.
  144228. */
  144229. module.exports = 'remove';
  144230. /***/ }),
  144231. /* 1261 */
  144232. /***/ (function(module, exports) {
  144233. /**
  144234. * @author Richard Davey <rich@photonstorm.com>
  144235. * @copyright 2019 Photon Storm Ltd.
  144236. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144237. */
  144238. /**
  144239. * The Pause All Animations Event.
  144240. *
  144241. * This event is dispatched when the global Animation Manager is told to pause.
  144242. *
  144243. * When this happens all current animations will stop updating, although it doesn't necessarily mean
  144244. * that the game has paused as well.
  144245. *
  144246. * @event Phaser.Animations.Events#PAUSE_ALL
  144247. */
  144248. module.exports = 'pauseall';
  144249. /***/ }),
  144250. /* 1262 */
  144251. /***/ (function(module, exports) {
  144252. /**
  144253. * @author Richard Davey <rich@photonstorm.com>
  144254. * @copyright 2019 Photon Storm Ltd.
  144255. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144256. */
  144257. /**
  144258. * The Animation Start Event.
  144259. *
  144260. * This event is dispatched by an Animation instance when it starts playing.
  144261. *
  144262. * Be careful with the volume of events this could generate. If a group of Sprites all play the same
  144263. * animation at the same time, this event will invoke its handler for each one of them.
  144264. *
  144265. * @event Phaser.Animations.Events#ANIMATION_START
  144266. *
  144267. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that started playing.
  144268. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation started with.
  144269. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation started playing.
  144270. */
  144271. module.exports = 'start';
  144272. /***/ }),
  144273. /* 1263 */
  144274. /***/ (function(module, exports) {
  144275. /**
  144276. * @author Richard Davey <rich@photonstorm.com>
  144277. * @copyright 2019 Photon Storm Ltd.
  144278. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144279. */
  144280. /**
  144281. * The Animation Restart Event.
  144282. *
  144283. * This event is dispatched by an Animation instance when it restarts.
  144284. *
  144285. * Be careful with the volume of events this could generate. If a group of Sprites all restart the same
  144286. * animation at the same time, this event will invoke its handler for each one of them.
  144287. *
  144288. * @event Phaser.Animations.Events#ANIMATION_RESTART
  144289. *
  144290. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that restarted playing.
  144291. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation restarted with.
  144292. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation restarted playing.
  144293. */
  144294. module.exports = 'restart';
  144295. /***/ }),
  144296. /* 1264 */
  144297. /***/ (function(module, exports) {
  144298. /**
  144299. * @author Richard Davey <rich@photonstorm.com>
  144300. * @copyright 2019 Photon Storm Ltd.
  144301. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144302. */
  144303. /**
  144304. * The Animation Repeat Event.
  144305. *
  144306. * This event is dispatched when a currently playing animation repeats.
  144307. *
  144308. * The event is dispatched directly from the Animation object itself. Which means that listeners
  144309. * bound to this event will be invoked every time the Animation repeats, for every Game Object that may have it.
  144310. *
  144311. * @event Phaser.Animations.Events#ANIMATION_REPEAT
  144312. *
  144313. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that repeated.
  144314. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation was on when it repeated.
  144315. */
  144316. module.exports = 'repeat';
  144317. /***/ }),
  144318. /* 1265 */
  144319. /***/ (function(module, exports) {
  144320. /**
  144321. * @author Richard Davey <rich@photonstorm.com>
  144322. * @copyright 2019 Photon Storm Ltd.
  144323. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144324. */
  144325. /**
  144326. * The Animation Complete Event.
  144327. *
  144328. * This event is dispatched by an Animation instance when it completes, i.e. finishes playing or is manually stopped.
  144329. *
  144330. * Be careful with the volume of events this could generate. If a group of Sprites all complete the same
  144331. * animation at the same time, this event will invoke its handler for each one of them.
  144332. *
  144333. * @event Phaser.Animations.Events#ANIMATION_COMPLETE
  144334. *
  144335. * @param {Phaser.Animations.Animation} animation - A reference to the Animation that completed.
  144336. * @param {Phaser.Animations.AnimationFrame} frame - The current Animation Frame that the Animation completed on.
  144337. * @param {Phaser.GameObjects.Sprite} gameObject - A reference to the Game Object on which the animation completed.
  144338. */
  144339. module.exports = 'complete';
  144340. /***/ }),
  144341. /* 1266 */
  144342. /***/ (function(module, exports) {
  144343. /**
  144344. * @author Richard Davey <rich@photonstorm.com>
  144345. * @copyright 2019 Photon Storm Ltd.
  144346. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144347. */
  144348. /**
  144349. * The Add Animation Event.
  144350. *
  144351. * This event is dispatched when a new animation is added to the global Animation Manager.
  144352. *
  144353. * This can happen either as a result of an animation instance being added to the Animation Manager,
  144354. * or the Animation Manager creating a new animation directly.
  144355. *
  144356. * @event Phaser.Animations.Events#ADD_ANIMATION
  144357. *
  144358. * @param {string} key - The key of the Animation that was added to the global Animation Manager.
  144359. * @param {Phaser.Animations.Animation} animation - An instance of the newly created Animation.
  144360. */
  144361. module.exports = 'add';
  144362. /***/ }),
  144363. /* 1267 */
  144364. /***/ (function(module, exports, __webpack_require__) {
  144365. /**
  144366. * @author Richard Davey <rich@photonstorm.com>
  144367. * @copyright 2019 Photon Storm Ltd.
  144368. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144369. */
  144370. var AlignIn = __webpack_require__(449);
  144371. var CONST = __webpack_require__(208);
  144372. var GetFastValue = __webpack_require__(2);
  144373. var NOOP = __webpack_require__(1);
  144374. var Zone = __webpack_require__(137);
  144375. var tempZone = new Zone({ sys: { queueDepthSort: NOOP, events: { once: NOOP } } }, 0, 0, 1, 1);
  144376. /**
  144377. * @typedef {object} GridAlignConfig
  144378. *
  144379. * @property {integer} [width=-1] - The width of the grid in items (not pixels). -1 means lay all items out horizontally, regardless of quantity.
  144380. * If both this value and height are set to -1 then this value overrides it and the `height` value is ignored.
  144381. * @property {integer} [height=-1] - The height of the grid in items (not pixels). -1 means lay all items out vertically, regardless of quantity.
  144382. * If both this value and `width` are set to -1 then `width` overrides it and this value is ignored.
  144383. * @property {integer} [cellWidth=1] - The width of the cell, in pixels, in which the item is positioned.
  144384. * @property {integer} [cellHeight=1] - The height of the cell, in pixels, in which the item is positioned.
  144385. * @property {integer} [position=0] - The alignment position. One of the Phaser.Display.Align consts such as `TOP_LEFT` or `RIGHT_CENTER`.
  144386. * @property {number} [x=0] - Optionally place the top-left of the final grid at this coordinate.
  144387. * @property {number} [y=0] - Optionally place the top-left of the final grid at this coordinate.
  144388. */
  144389. /**
  144390. * Takes an array of Game Objects, or any objects that have public `x` and `y` properties,
  144391. * and then aligns them based on the grid configuration given to this action.
  144392. *
  144393. * @function Phaser.Actions.GridAlign
  144394. * @since 3.0.0
  144395. *
  144396. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  144397. *
  144398. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  144399. * @param {GridAlignConfig} options - The GridAlign Configuration object.
  144400. *
  144401. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  144402. */
  144403. var GridAlign = function (items, options)
  144404. {
  144405. if (options === undefined) { options = {}; }
  144406. var width = GetFastValue(options, 'width', -1);
  144407. var height = GetFastValue(options, 'height', -1);
  144408. var cellWidth = GetFastValue(options, 'cellWidth', 1);
  144409. var cellHeight = GetFastValue(options, 'cellHeight', cellWidth);
  144410. var position = GetFastValue(options, 'position', CONST.TOP_LEFT);
  144411. var x = GetFastValue(options, 'x', 0);
  144412. var y = GetFastValue(options, 'y', 0);
  144413. var cx = 0;
  144414. var cy = 0;
  144415. var w = (width * cellWidth);
  144416. var h = (height * cellHeight);
  144417. tempZone.setPosition(x, y);
  144418. tempZone.setSize(cellWidth, cellHeight);
  144419. for (var i = 0; i < items.length; i++)
  144420. {
  144421. AlignIn(items[i], tempZone, position);
  144422. if (width === -1)
  144423. {
  144424. // We keep laying them out horizontally until we've done them all
  144425. cy += cellHeight;
  144426. tempZone.y += cellHeight;
  144427. if (cy === h)
  144428. {
  144429. cy = 0;
  144430. tempZone.x += cellWidth;
  144431. tempZone.y = y;
  144432. }
  144433. }
  144434. else if (height === -1)
  144435. {
  144436. // We keep laying them out vertically until we've done them all
  144437. cx += cellWidth;
  144438. tempZone.x += cellWidth;
  144439. if (cx === w)
  144440. {
  144441. cx = 0;
  144442. tempZone.x = x;
  144443. tempZone.y += cellHeight;
  144444. }
  144445. }
  144446. else
  144447. {
  144448. // We keep laying them out until we hit the column limit
  144449. cx += cellWidth;
  144450. tempZone.x += cellWidth;
  144451. if (cx === w)
  144452. {
  144453. cx = 0;
  144454. cy += cellHeight;
  144455. tempZone.x = x;
  144456. tempZone.y += cellHeight;
  144457. if (cy === h)
  144458. {
  144459. // We've hit the column limit, so return, even if there are items left
  144460. break;
  144461. }
  144462. }
  144463. }
  144464. }
  144465. return items;
  144466. };
  144467. module.exports = GridAlign;
  144468. /***/ }),
  144469. /* 1268 */
  144470. /***/ (function(module, exports) {
  144471. /**
  144472. * @author Richard Davey <rich@photonstorm.com>
  144473. * @copyright 2019 Photon Storm Ltd.
  144474. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144475. */
  144476. /**
  144477. * Takes an array of objects and returns the last element in the array that has properties which match
  144478. * all of those specified in the `compare` object. For example, if the compare object was: `{ scaleX: 0.5, alpha: 1 }`
  144479. * then it would return the last item which had the property `scaleX` set to 0.5 and `alpha` set to 1.
  144480. *
  144481. * To use this with a Group: `GetLast(group.getChildren(), compare, index)`
  144482. *
  144483. * @function Phaser.Actions.GetLast
  144484. * @since 3.3.0
  144485. *
  144486. * @generic {Phaser.GameObjects.GameObject[]} G - [items]
  144487. *
  144488. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be searched by this action.
  144489. * @param {object} compare - The comparison object. Each property in this object will be checked against the items of the array.
  144490. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  144491. *
  144492. * @return {?(object|Phaser.GameObjects.GameObject)} The last object in the array that matches the comparison object, or `null` if no match was found.
  144493. */
  144494. var GetLast = function (items, compare, index)
  144495. {
  144496. if (index === undefined) { index = 0; }
  144497. for (var i = index; i < items.length; i++)
  144498. {
  144499. var item = items[i];
  144500. var match = true;
  144501. for (var property in compare)
  144502. {
  144503. if (item[property] !== compare[property])
  144504. {
  144505. match = false;
  144506. }
  144507. }
  144508. if (match)
  144509. {
  144510. return item;
  144511. }
  144512. }
  144513. return null;
  144514. };
  144515. module.exports = GetLast;
  144516. /***/ }),
  144517. /* 1269 */
  144518. /***/ (function(module, exports) {
  144519. /**
  144520. * @author Richard Davey <rich@photonstorm.com>
  144521. * @copyright 2019 Photon Storm Ltd.
  144522. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144523. */
  144524. /**
  144525. * Takes an array of objects and returns the first element in the array that has properties which match
  144526. * all of those specified in the `compare` object. For example, if the compare object was: `{ scaleX: 0.5, alpha: 1 }`
  144527. * then it would return the first item which had the property `scaleX` set to 0.5 and `alpha` set to 1.
  144528. *
  144529. * To use this with a Group: `GetFirst(group.getChildren(), compare, index)`
  144530. *
  144531. * @function Phaser.Actions.GetFirst
  144532. * @since 3.0.0
  144533. *
  144534. * @generic {Phaser.GameObjects.GameObject[]} G - [items]
  144535. *
  144536. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be searched by this action.
  144537. * @param {object} compare - The comparison object. Each property in this object will be checked against the items of the array.
  144538. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  144539. *
  144540. * @return {?(object|Phaser.GameObjects.GameObject)} The first object in the array that matches the comparison object, or `null` if no match was found.
  144541. */
  144542. var GetFirst = function (items, compare, index)
  144543. {
  144544. if (index === undefined) { index = 0; }
  144545. for (var i = index; i < items.length; i++)
  144546. {
  144547. var item = items[i];
  144548. var match = true;
  144549. for (var property in compare)
  144550. {
  144551. if (item[property] !== compare[property])
  144552. {
  144553. match = false;
  144554. }
  144555. }
  144556. if (match)
  144557. {
  144558. return item;
  144559. }
  144560. }
  144561. return null;
  144562. };
  144563. module.exports = GetFirst;
  144564. /***/ }),
  144565. /* 1270 */
  144566. /***/ (function(module, exports) {
  144567. /**
  144568. * @author Richard Davey <rich@photonstorm.com>
  144569. * @copyright 2019 Photon Storm Ltd.
  144570. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144571. */
  144572. /**
  144573. * @callback CallCallback
  144574. *
  144575. * @param {Phaser.GameObjects.GameObject} item - The Game Object to run the callback on.
  144576. */
  144577. /**
  144578. * Takes an array of objects and passes each of them to the given callback.
  144579. *
  144580. * @function Phaser.Actions.Call
  144581. * @since 3.0.0
  144582. *
  144583. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  144584. *
  144585. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  144586. * @param {CallCallback} callback - The callback to be invoked. It will be passed just one argument: the item from the array.
  144587. * @param {*} context - The scope in which the callback will be invoked.
  144588. *
  144589. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that was passed to this Action.
  144590. */
  144591. var Call = function (items, callback, context)
  144592. {
  144593. for (var i = 0; i < items.length; i++)
  144594. {
  144595. var item = items[i];
  144596. callback.call(context, item);
  144597. }
  144598. return items;
  144599. };
  144600. module.exports = Call;
  144601. /***/ }),
  144602. /* 1271 */
  144603. /***/ (function(module, exports, __webpack_require__) {
  144604. /**
  144605. * @author Richard Davey <rich@photonstorm.com>
  144606. * @copyright 2019 Photon Storm Ltd.
  144607. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  144608. */
  144609. var PropertyValueInc = __webpack_require__(35);
  144610. /**
  144611. * Takes an array of Game Objects, or any objects that have a public `angle` property,
  144612. * and then adds the given value to each of their `angle` properties.
  144613. *
  144614. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  144615. *
  144616. * To use this with a Group: `Angle(group.getChildren(), value, step)`
  144617. *
  144618. * @function Phaser.Actions.Angle
  144619. * @since 3.0.0
  144620. *
  144621. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  144622. *
  144623. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  144624. * @param {number} value - The amount to be added to the `angle` property.
  144625. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  144626. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  144627. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  144628. *
  144629. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  144630. */
  144631. var Angle = function (items, value, step, index, direction)
  144632. {
  144633. return PropertyValueInc(items, 'angle', value, step, index, direction);
  144634. };
  144635. module.exports = Angle;
  144636. /***/ }),
  144637. /* 1272 */
  144638. /***/ (function(module, exports) {
  144639. /**
  144640. * Low-budget Float32Array knock-off, suitable for use with P2.js in IE9
  144641. * Source: http://www.html5gamedevs.com/topic/5988-phaser-12-ie9/
  144642. * Cameron Foale (http://www.kibibu.com)
  144643. */
  144644. if (typeof window.Uint32Array !== 'function' && typeof window.Uint32Array !== 'object')
  144645. {
  144646. var CheapArray = function (fakeType)
  144647. {
  144648. var proto = new Array(); // jshint ignore:line
  144649. window[fakeType] = function(arg) {
  144650. if (typeof(arg) === 'number')
  144651. {
  144652. Array.call(this, arg);
  144653. this.length = arg;
  144654. for (var i = 0; i < this.length; i++)
  144655. {
  144656. this[i] = 0;
  144657. }
  144658. }
  144659. else
  144660. {
  144661. Array.call(this, arg.length);
  144662. this.length = arg.length;
  144663. for (var i = 0; i < this.length; i++)
  144664. {
  144665. this[i] = arg[i];
  144666. }
  144667. }
  144668. };
  144669. window[fakeType].prototype = proto;
  144670. window[fakeType].constructor = window[fakeType];
  144671. };
  144672. CheapArray('Float32Array'); // jshint ignore:line
  144673. CheapArray('Uint32Array'); // jshint ignore:line
  144674. CheapArray('Uint16Array'); // jshint ignore:line
  144675. CheapArray('Int16Array'); // jshint ignore:line
  144676. CheapArray('ArrayBuffer'); // jshint ignore:line
  144677. }
  144678. /***/ }),
  144679. /* 1273 */
  144680. /***/ (function(module, exports, __webpack_require__) {
  144681. /* WEBPACK VAR INJECTION */(function(global) {// References:
  144682. // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
  144683. // https://gist.github.com/1579671
  144684. // http://updates.html5rocks.com/2012/05/requestAnimationFrame-API-now-with-sub-millisecond-precision
  144685. // https://gist.github.com/timhall/4078614
  144686. // https://github.com/Financial-Times/polyfill-service/tree/master/polyfills/requestAnimationFrame
  144687. // Expected to be used with Browserfiy
  144688. // Browserify automatically detects the use of `global` and passes the
  144689. // correct reference of `global`, `self`, and finally `window`
  144690. // Date.now
  144691. if (!(Date.now && Date.prototype.getTime)) {
  144692. Date.now = function now() {
  144693. return new Date().getTime();
  144694. };
  144695. }
  144696. // performance.now
  144697. if (!(global.performance && global.performance.now)) {
  144698. var startTime = Date.now();
  144699. if (!global.performance) {
  144700. global.performance = {};
  144701. }
  144702. global.performance.now = function () {
  144703. return Date.now() - startTime;
  144704. };
  144705. }
  144706. // requestAnimationFrame
  144707. var lastTime = Date.now();
  144708. var vendors = ['ms', 'moz', 'webkit', 'o'];
  144709. for(var x = 0; x < vendors.length && !global.requestAnimationFrame; ++x) {
  144710. global.requestAnimationFrame = global[vendors[x] + 'RequestAnimationFrame'];
  144711. global.cancelAnimationFrame = global[vendors[x] + 'CancelAnimationFrame'] ||
  144712. global[vendors[x] + 'CancelRequestAnimationFrame'];
  144713. }
  144714. if (!global.requestAnimationFrame) {
  144715. global.requestAnimationFrame = function (callback) {
  144716. if (typeof callback !== 'function') {
  144717. throw new TypeError(callback + 'is not a function');
  144718. }
  144719. var currentTime = Date.now(),
  144720. delay = 16 + lastTime - currentTime;
  144721. if (delay < 0) {
  144722. delay = 0;
  144723. }
  144724. lastTime = currentTime;
  144725. return setTimeout(function () {
  144726. lastTime = Date.now();
  144727. callback(performance.now());
  144728. }, delay);
  144729. };
  144730. }
  144731. if (!global.cancelAnimationFrame) {
  144732. global.cancelAnimationFrame = function(id) {
  144733. clearTimeout(id);
  144734. };
  144735. }
  144736. /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(215)))
  144737. /***/ }),
  144738. /* 1274 */
  144739. /***/ (function(module, exports) {
  144740. /**
  144741. * performance.now
  144742. */
  144743. (function () {
  144744. if ('performance' in window === false)
  144745. {
  144746. window.performance = {};
  144747. }
  144748. // Thanks IE8
  144749. Date.now = (Date.now || function () {
  144750. return new Date().getTime();
  144751. });
  144752. if ('now' in window.performance === false)
  144753. {
  144754. var nowOffset = Date.now();
  144755. if (performance.timing && performance.timing.navigationStart)
  144756. {
  144757. nowOffset = performance.timing.navigationStart;
  144758. }
  144759. window.performance.now = function now ()
  144760. {
  144761. return Date.now() - nowOffset;
  144762. }
  144763. }
  144764. })();
  144765. /***/ }),
  144766. /* 1275 */
  144767. /***/ (function(module, exports) {
  144768. // ES6 Math.trunc - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc
  144769. if (!Math.trunc) {
  144770. Math.trunc = function trunc(x) {
  144771. return x < 0 ? Math.ceil(x) : Math.floor(x);
  144772. };
  144773. }
  144774. /***/ }),
  144775. /* 1276 */
  144776. /***/ (function(module, exports) {
  144777. /**
  144778. * Also fix for the absent console in IE9
  144779. */
  144780. if (!window.console)
  144781. {
  144782. window.console = {};
  144783. window.console.log = window.console.assert = function(){};
  144784. window.console.warn = window.console.assert = function(){};
  144785. }
  144786. /***/ }),
  144787. /* 1277 */
  144788. /***/ (function(module, exports) {
  144789. /* Copyright 2013 Chris Wilson
  144790. Licensed under the Apache License, Version 2.0 (the "License");
  144791. you may not use this file except in compliance with the License.
  144792. You may obtain a copy of the License at
  144793. http://www.apache.org/licenses/LICENSE-2.0
  144794. Unless required by applicable law or agreed to in writing, software
  144795. distributed under the License is distributed on an "AS IS" BASIS,
  144796. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  144797. See the License for the specific language governing permissions and
  144798. limitations under the License.
  144799. */
  144800. /*
  144801. This monkeypatch library is intended to be included in projects that are
  144802. written to the proper AudioContext spec (instead of webkitAudioContext),
  144803. and that use the new naming and proper bits of the Web Audio API (e.g.
  144804. using BufferSourceNode.start() instead of BufferSourceNode.noteOn()), but may
  144805. have to run on systems that only support the deprecated bits.
  144806. This library should be harmless to include if the browser supports
  144807. unprefixed "AudioContext", and/or if it supports the new names.
  144808. The patches this library handles:
  144809. if window.AudioContext is unsupported, it will be aliased to webkitAudioContext().
  144810. if AudioBufferSourceNode.start() is unimplemented, it will be routed to noteOn() or
  144811. noteGrainOn(), depending on parameters.
  144812. The following aliases only take effect if the new names are not already in place:
  144813. AudioBufferSourceNode.stop() is aliased to noteOff()
  144814. AudioContext.createGain() is aliased to createGainNode()
  144815. AudioContext.createDelay() is aliased to createDelayNode()
  144816. AudioContext.createScriptProcessor() is aliased to createJavaScriptNode()
  144817. AudioContext.createPeriodicWave() is aliased to createWaveTable()
  144818. OscillatorNode.start() is aliased to noteOn()
  144819. OscillatorNode.stop() is aliased to noteOff()
  144820. OscillatorNode.setPeriodicWave() is aliased to setWaveTable()
  144821. AudioParam.setTargetAtTime() is aliased to setTargetValueAtTime()
  144822. This library does NOT patch the enumerated type changes, as it is
  144823. recommended in the specification that implementations support both integer
  144824. and string types for AudioPannerNode.panningModel, AudioPannerNode.distanceModel
  144825. BiquadFilterNode.type and OscillatorNode.type.
  144826. */
  144827. (function () {
  144828. function fixSetTarget(param) {
  144829. if (!param) // if NYI, just return
  144830. return;
  144831. if (!param.setTargetAtTime)
  144832. param.setTargetAtTime = param.setTargetValueAtTime;
  144833. }
  144834. if (window.hasOwnProperty('webkitAudioContext') &&
  144835. !window.hasOwnProperty('AudioContext')) {
  144836. window.AudioContext = webkitAudioContext;
  144837. if (!AudioContext.prototype.hasOwnProperty('createGain'))
  144838. AudioContext.prototype.createGain = AudioContext.prototype.createGainNode;
  144839. if (!AudioContext.prototype.hasOwnProperty('createDelay'))
  144840. AudioContext.prototype.createDelay = AudioContext.prototype.createDelayNode;
  144841. if (!AudioContext.prototype.hasOwnProperty('createScriptProcessor'))
  144842. AudioContext.prototype.createScriptProcessor = AudioContext.prototype.createJavaScriptNode;
  144843. if (!AudioContext.prototype.hasOwnProperty('createPeriodicWave'))
  144844. AudioContext.prototype.createPeriodicWave = AudioContext.prototype.createWaveTable;
  144845. AudioContext.prototype.internal_createGain = AudioContext.prototype.createGain;
  144846. AudioContext.prototype.createGain = function() {
  144847. var node = this.internal_createGain();
  144848. fixSetTarget(node.gain);
  144849. return node;
  144850. };
  144851. AudioContext.prototype.internal_createDelay = AudioContext.prototype.createDelay;
  144852. AudioContext.prototype.createDelay = function(maxDelayTime) {
  144853. var node = maxDelayTime ? this.internal_createDelay(maxDelayTime) : this.internal_createDelay();
  144854. fixSetTarget(node.delayTime);
  144855. return node;
  144856. };
  144857. AudioContext.prototype.internal_createBufferSource = AudioContext.prototype.createBufferSource;
  144858. AudioContext.prototype.createBufferSource = function() {
  144859. var node = this.internal_createBufferSource();
  144860. if (!node.start) {
  144861. node.start = function ( when, offset, duration ) {
  144862. if ( offset || duration )
  144863. this.noteGrainOn( when || 0, offset, duration );
  144864. else
  144865. this.noteOn( when || 0 );
  144866. };
  144867. } else {
  144868. node.internal_start = node.start;
  144869. node.start = function( when, offset, duration ) {
  144870. if( typeof duration !== 'undefined' )
  144871. node.internal_start( when || 0, offset, duration );
  144872. else
  144873. node.internal_start( when || 0, offset || 0 );
  144874. };
  144875. }
  144876. if (!node.stop) {
  144877. node.stop = function ( when ) {
  144878. this.noteOff( when || 0 );
  144879. };
  144880. } else {
  144881. node.internal_stop = node.stop;
  144882. node.stop = function( when ) {
  144883. node.internal_stop( when || 0 );
  144884. };
  144885. }
  144886. fixSetTarget(node.playbackRate);
  144887. return node;
  144888. };
  144889. AudioContext.prototype.internal_createDynamicsCompressor = AudioContext.prototype.createDynamicsCompressor;
  144890. AudioContext.prototype.createDynamicsCompressor = function() {
  144891. var node = this.internal_createDynamicsCompressor();
  144892. fixSetTarget(node.threshold);
  144893. fixSetTarget(node.knee);
  144894. fixSetTarget(node.ratio);
  144895. fixSetTarget(node.reduction);
  144896. fixSetTarget(node.attack);
  144897. fixSetTarget(node.release);
  144898. return node;
  144899. };
  144900. AudioContext.prototype.internal_createBiquadFilter = AudioContext.prototype.createBiquadFilter;
  144901. AudioContext.prototype.createBiquadFilter = function() {
  144902. var node = this.internal_createBiquadFilter();
  144903. fixSetTarget(node.frequency);
  144904. fixSetTarget(node.detune);
  144905. fixSetTarget(node.Q);
  144906. fixSetTarget(node.gain);
  144907. return node;
  144908. };
  144909. if (AudioContext.prototype.hasOwnProperty( 'createOscillator' )) {
  144910. AudioContext.prototype.internal_createOscillator = AudioContext.prototype.createOscillator;
  144911. AudioContext.prototype.createOscillator = function() {
  144912. var node = this.internal_createOscillator();
  144913. if (!node.start) {
  144914. node.start = function ( when ) {
  144915. this.noteOn( when || 0 );
  144916. };
  144917. } else {
  144918. node.internal_start = node.start;
  144919. node.start = function ( when ) {
  144920. node.internal_start( when || 0);
  144921. };
  144922. }
  144923. if (!node.stop) {
  144924. node.stop = function ( when ) {
  144925. this.noteOff( when || 0 );
  144926. };
  144927. } else {
  144928. node.internal_stop = node.stop;
  144929. node.stop = function( when ) {
  144930. node.internal_stop( when || 0 );
  144931. };
  144932. }
  144933. if (!node.setPeriodicWave)
  144934. node.setPeriodicWave = node.setWaveTable;
  144935. fixSetTarget(node.frequency);
  144936. fixSetTarget(node.detune);
  144937. return node;
  144938. };
  144939. }
  144940. }
  144941. if (window.hasOwnProperty('webkitOfflineAudioContext') &&
  144942. !window.hasOwnProperty('OfflineAudioContext')) {
  144943. window.OfflineAudioContext = webkitOfflineAudioContext;
  144944. }
  144945. })();
  144946. /***/ }),
  144947. /* 1278 */
  144948. /***/ (function(module, exports) {
  144949. /**
  144950. * A polyfill for Array.isArray
  144951. */
  144952. if (!Array.isArray)
  144953. {
  144954. Array.isArray = function (arg)
  144955. {
  144956. return Object.prototype.toString.call(arg) === '[object Array]';
  144957. };
  144958. }
  144959. /***/ }),
  144960. /* 1279 */
  144961. /***/ (function(module, exports) {
  144962. /**
  144963. * A polyfill for Array.forEach
  144964. * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
  144965. */
  144966. if (!Array.prototype.forEach)
  144967. {
  144968. Array.prototype.forEach = function (fun /*, thisArg */)
  144969. {
  144970. 'use strict';
  144971. if (this === void 0 || this === null)
  144972. {
  144973. throw new TypeError();
  144974. }
  144975. var t = Object(this);
  144976. var len = t.length >>> 0;
  144977. if (typeof fun !== 'function')
  144978. {
  144979. throw new TypeError();
  144980. }
  144981. var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
  144982. for (var i = 0; i < len; i++)
  144983. {
  144984. if (i in t)
  144985. {
  144986. fun.call(thisArg, t[i], i, t);
  144987. }
  144988. }
  144989. };
  144990. }
  144991. /***/ }),
  144992. /* 1280 */
  144993. /***/ (function(module, exports, __webpack_require__) {
  144994. __webpack_require__(1279);
  144995. __webpack_require__(1278);
  144996. __webpack_require__(1277);
  144997. __webpack_require__(1276);
  144998. __webpack_require__(1275);
  144999. __webpack_require__(1274);
  145000. __webpack_require__(1273);
  145001. __webpack_require__(1272);
  145002. /***/ }),
  145003. /* 1281 */
  145004. /***/ (function(module, exports, __webpack_require__) {
  145005. /**
  145006. * @author Richard Davey <rich@photonstorm.com>
  145007. * @copyright 2019 Photon Storm Ltd.
  145008. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  145009. */
  145010. var Bodies = __webpack_require__(138);
  145011. var Class = __webpack_require__(0);
  145012. var Common = __webpack_require__(36);
  145013. var Composite = __webpack_require__(149);
  145014. var Engine = __webpack_require__(1282);
  145015. var EventEmitter = __webpack_require__(11);
  145016. var Events = __webpack_require__(545);
  145017. var GetFastValue = __webpack_require__(2);
  145018. var GetValue = __webpack_require__(4);
  145019. var MatterBody = __webpack_require__(72);
  145020. var MatterEvents = __webpack_require__(210);
  145021. var MatterTileBody = __webpack_require__(544);
  145022. var MatterWorld = __webpack_require__(539);
  145023. var Vector = __webpack_require__(87);
  145024. /**
  145025. * @classdesc
  145026. * [description]
  145027. *
  145028. * @class World
  145029. * @extends Phaser.Events.EventEmitter
  145030. * @memberof Phaser.Physics.Matter
  145031. * @constructor
  145032. * @since 3.0.0
  145033. *
  145034. * @param {Phaser.Scene} scene - The Scene to which this Matter World instance belongs.
  145035. * @param {object} config - [description]
  145036. */
  145037. var World = new Class({
  145038. Extends: EventEmitter,
  145039. initialize:
  145040. function World (scene, config)
  145041. {
  145042. EventEmitter.call(this);
  145043. /**
  145044. * The Scene to which this Matter World instance belongs.
  145045. *
  145046. * @name Phaser.Physics.Matter.World#scene
  145047. * @type {Phaser.Scene}
  145048. * @since 3.0.0
  145049. */
  145050. this.scene = scene;
  145051. /**
  145052. * An instance of the MatterJS Engine.
  145053. *
  145054. * @name Phaser.Physics.Matter.World#engine
  145055. * @type {MatterJS.Engine}
  145056. * @since 3.0.0
  145057. */
  145058. this.engine = Engine.create(config);
  145059. /**
  145060. * A `World` composite object that will contain all simulated bodies and constraints.
  145061. *
  145062. * @name Phaser.Physics.Matter.World#localWorld
  145063. * @type {MatterJS.World}
  145064. * @since 3.0.0
  145065. */
  145066. this.localWorld = this.engine.world;
  145067. var gravity = GetValue(config, 'gravity', null);
  145068. if (gravity)
  145069. {
  145070. this.setGravity(gravity.x, gravity.y, gravity.scale);
  145071. }
  145072. /**
  145073. * An object containing the 4 wall bodies that bound the physics world.
  145074. *
  145075. * @name Phaser.Physics.Matter.World#walls
  145076. * @type {object}
  145077. * @since 3.0.0
  145078. */
  145079. this.walls = { left: null, right: null, top: null, bottom: null };
  145080. if (GetFastValue(config, 'setBounds', false))
  145081. {
  145082. var boundsConfig = config['setBounds'];
  145083. if (typeof boundsConfig === 'boolean')
  145084. {
  145085. this.setBounds();
  145086. }
  145087. else
  145088. {
  145089. var x = GetFastValue(boundsConfig, 'x', 0);
  145090. var y = GetFastValue(boundsConfig, 'y', 0);
  145091. var width = GetFastValue(boundsConfig, 'width', scene.sys.scale.width);
  145092. var height = GetFastValue(boundsConfig, 'height', scene.sys.scale.height);
  145093. var thickness = GetFastValue(boundsConfig, 'thickness', 64);
  145094. var left = GetFastValue(boundsConfig, 'left', true);
  145095. var right = GetFastValue(boundsConfig, 'right', true);
  145096. var top = GetFastValue(boundsConfig, 'top', true);
  145097. var bottom = GetFastValue(boundsConfig, 'bottom', true);
  145098. this.setBounds(x, y, width, height, thickness, left, right, top, bottom);
  145099. }
  145100. }
  145101. /**
  145102. * A flag that toggles if the world is enabled or not.
  145103. *
  145104. * @name Phaser.Physics.Matter.World#enabled
  145105. * @type {boolean}
  145106. * @default true
  145107. * @since 3.0.0
  145108. */
  145109. this.enabled = GetValue(config, 'enabled', true);
  145110. /**
  145111. * The correction argument is an optional Number that specifies the time correction factor to apply to the update.
  145112. * This can help improve the accuracy of the simulation in cases where delta is changing between updates.
  145113. * The value of correction is defined as delta / lastDelta, i.e. the percentage change of delta over the last step.
  145114. * Therefore the value is always 1 (no correction) when delta constant (or when no correction is desired, which is the default).
  145115. * See the paper on Time Corrected Verlet for more information.
  145116. *
  145117. * @name Phaser.Physics.Matter.World#correction
  145118. * @type {number}
  145119. * @default 1
  145120. * @since 3.4.0
  145121. */
  145122. this.correction = GetValue(config, 'correction', 1);
  145123. /**
  145124. * This function is called every time the core game loop steps, which is bound to the
  145125. * Request Animation Frame frequency unless otherwise modified.
  145126. *
  145127. * The function is passed two values: `time` and `delta`, both of which come from the game step values.
  145128. *
  145129. * It must return a number. This number is used as the delta value passed to Matter.Engine.update.
  145130. *
  145131. * You can override this function with your own to define your own timestep.
  145132. *
  145133. * If you need to update the Engine multiple times in a single game step then call
  145134. * `World.update` as many times as required. Each call will trigger the `getDelta` function.
  145135. * If you wish to have full control over when the Engine updates then see the property `autoUpdate`.
  145136. *
  145137. * You can also adjust the number of iterations that Engine.update performs.
  145138. * Use the Scene Matter Physics config object to set the following properties:
  145139. *
  145140. * positionIterations (defaults to 6)
  145141. * velocityIterations (defaults to 4)
  145142. * constraintIterations (defaults to 2)
  145143. *
  145144. * Adjusting these values can help performance in certain situations, depending on the physics requirements
  145145. * of your game.
  145146. *
  145147. * @name Phaser.Physics.Matter.World#getDelta
  145148. * @type {function}
  145149. * @since 3.4.0
  145150. */
  145151. this.getDelta = GetValue(config, 'getDelta', this.update60Hz);
  145152. /**
  145153. * Automatically call Engine.update every time the game steps.
  145154. * If you disable this then you are responsible for calling `World.step` directly from your game.
  145155. * If you call `set60Hz` or `set30Hz` then `autoUpdate` is reset to `true`.
  145156. *
  145157. * @name Phaser.Physics.Matter.World#autoUpdate
  145158. * @type {boolean}
  145159. * @default true
  145160. * @since 3.4.0
  145161. */
  145162. this.autoUpdate = GetValue(config, 'autoUpdate', true);
  145163. /**
  145164. * A flag that controls if the debug graphics will be drawn to or not.
  145165. *
  145166. * @name Phaser.Physics.Matter.World#drawDebug
  145167. * @type {boolean}
  145168. * @default false
  145169. * @since 3.0.0
  145170. */
  145171. this.drawDebug = GetValue(config, 'debug', false);
  145172. /**
  145173. * An instance of the Graphics object the debug bodies are drawn to, if enabled.
  145174. *
  145175. * @name Phaser.Physics.Matter.World#debugGraphic
  145176. * @type {Phaser.GameObjects.Graphics}
  145177. * @since 3.0.0
  145178. */
  145179. this.debugGraphic;
  145180. /**
  145181. * The default configuration values.
  145182. *
  145183. * @name Phaser.Physics.Matter.World#defaults
  145184. * @type {object}
  145185. * @since 3.0.0
  145186. */
  145187. this.defaults = {
  145188. debugShowBody: GetFastValue(config, 'debugShowBody', true),
  145189. debugShowStaticBody: GetFastValue(config, 'debugShowStaticBody', true),
  145190. debugShowVelocity: GetFastValue(config, 'debugShowVelocity', true),
  145191. bodyDebugColor: GetFastValue(config, 'debugBodyColor', 0xff00ff),
  145192. bodyDebugFillColor: GetFastValue(config, 'bodyDebugFillColor', 0xe3a7e3),
  145193. staticBodyDebugColor: GetFastValue(config, 'debugBodyColor', 0x0000ff),
  145194. velocityDebugColor: GetFastValue(config, 'debugVelocityColor', 0x00ff00),
  145195. debugShowJoint: GetFastValue(config, 'debugShowJoint', true),
  145196. jointDebugColor: GetFastValue(config, 'debugJointColor', 0x000000),
  145197. debugWireframes: GetFastValue(config, 'debugWireframes', true),
  145198. debugShowInternalEdges: GetFastValue(config, 'debugShowInternalEdges', false),
  145199. debugShowConvexHulls: GetFastValue(config, 'debugShowConvexHulls', false),
  145200. debugConvexHullColor: GetFastValue(config, 'debugConvexHullColor', 0xaaaaaa),
  145201. debugShowSleeping: GetFastValue(config, 'debugShowSleeping', false)
  145202. };
  145203. if (this.drawDebug)
  145204. {
  145205. this.createDebugGraphic();
  145206. }
  145207. this.setEventsProxy();
  145208. },
  145209. /**
  145210. * [description]
  145211. *
  145212. * @method Phaser.Physics.Matter.World#setEventsProxy
  145213. * @since 3.0.0
  145214. */
  145215. setEventsProxy: function ()
  145216. {
  145217. var _this = this;
  145218. var engine = this.engine;
  145219. MatterEvents.on(engine, 'beforeUpdate', function (event)
  145220. {
  145221. _this.emit(Events.BEFORE_UPDATE, event);
  145222. });
  145223. MatterEvents.on(engine, 'afterUpdate', function (event)
  145224. {
  145225. _this.emit(Events.AFTER_UPDATE, event);
  145226. });
  145227. MatterEvents.on(engine, 'collisionStart', function (event)
  145228. {
  145229. var pairs = event.pairs;
  145230. var bodyA;
  145231. var bodyB;
  145232. if (pairs.length > 0)
  145233. {
  145234. bodyA = pairs[0].bodyA;
  145235. bodyB = pairs[0].bodyB;
  145236. }
  145237. _this.emit(Events.COLLISION_START, event, bodyA, bodyB);
  145238. });
  145239. MatterEvents.on(engine, 'collisionActive', function (event)
  145240. {
  145241. var pairs = event.pairs;
  145242. var bodyA;
  145243. var bodyB;
  145244. if (pairs.length > 0)
  145245. {
  145246. bodyA = pairs[0].bodyA;
  145247. bodyB = pairs[0].bodyB;
  145248. }
  145249. _this.emit(Events.COLLISION_ACTIVE, event, bodyA, bodyB);
  145250. });
  145251. MatterEvents.on(engine, 'collisionEnd', function (event)
  145252. {
  145253. var pairs = event.pairs;
  145254. var bodyA;
  145255. var bodyB;
  145256. if (pairs.length > 0)
  145257. {
  145258. bodyA = pairs[0].bodyA;
  145259. bodyB = pairs[0].bodyB;
  145260. }
  145261. _this.emit(Events.COLLISION_END, event, bodyA, bodyB);
  145262. });
  145263. },
  145264. /**
  145265. * Sets the bounds of the Physics world to match the given world pixel dimensions.
  145266. * You can optionally set which 'walls' to create: left, right, top or bottom.
  145267. * If none of the walls are given it will default to use the walls settings it had previously.
  145268. * I.e. if you previously told it to not have the left or right walls, and you then adjust the world size
  145269. * the newly created bounds will also not have the left and right walls.
  145270. * Explicitly state them in the parameters to override this.
  145271. *
  145272. * @method Phaser.Physics.Matter.World#setBounds
  145273. * @since 3.0.0
  145274. *
  145275. * @param {number} [x=0] - The x coordinate of the top-left corner of the bounds.
  145276. * @param {number} [y=0] - The y coordinate of the top-left corner of the bounds.
  145277. * @param {number} [width] - The width of the bounds.
  145278. * @param {number} [height] - The height of the bounds.
  145279. * @param {number} [thickness=128] - The thickness of each wall, in pixels.
  145280. * @param {boolean} [left=true] - If true will create the left bounds wall.
  145281. * @param {boolean} [right=true] - If true will create the right bounds wall.
  145282. * @param {boolean} [top=true] - If true will create the top bounds wall.
  145283. * @param {boolean} [bottom=true] - If true will create the bottom bounds wall.
  145284. *
  145285. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145286. */
  145287. setBounds: function (x, y, width, height, thickness, left, right, top, bottom)
  145288. {
  145289. if (x === undefined) { x = 0; }
  145290. if (y === undefined) { y = 0; }
  145291. if (width === undefined) { width = this.scene.sys.scale.width; }
  145292. if (height === undefined) { height = this.scene.sys.scale.height; }
  145293. if (thickness === undefined) { thickness = 128; }
  145294. if (left === undefined) { left = true; }
  145295. if (right === undefined) { right = true; }
  145296. if (top === undefined) { top = true; }
  145297. if (bottom === undefined) { bottom = true; }
  145298. this.updateWall(left, 'left', x - thickness, y - thickness, thickness, height + (thickness * 2));
  145299. this.updateWall(right, 'right', x + width, y - thickness, thickness, height + (thickness * 2));
  145300. this.updateWall(top, 'top', x, y - thickness, width, thickness);
  145301. this.updateWall(bottom, 'bottom', x, y + height, width, thickness);
  145302. return this;
  145303. },
  145304. // position = 'left', 'right', 'top' or 'bottom'
  145305. /**
  145306. * [description]
  145307. *
  145308. * @method Phaser.Physics.Matter.World#updateWall
  145309. * @since 3.0.0
  145310. *
  145311. * @param {boolean} add - [description]
  145312. * @param {string} position - [description]
  145313. * @param {number} x - [description]
  145314. * @param {number} y - [description]
  145315. * @param {number} width - [description]
  145316. * @param {number} height - [description]
  145317. */
  145318. updateWall: function (add, position, x, y, width, height)
  145319. {
  145320. var wall = this.walls[position];
  145321. if (add)
  145322. {
  145323. if (wall)
  145324. {
  145325. MatterWorld.remove(this.localWorld, wall);
  145326. }
  145327. // adjust center
  145328. x += (width / 2);
  145329. y += (height / 2);
  145330. this.walls[position] = this.create(x, y, width, height, { isStatic: true, friction: 0, frictionStatic: 0 });
  145331. }
  145332. else
  145333. {
  145334. if (wall)
  145335. {
  145336. MatterWorld.remove(this.localWorld, wall);
  145337. }
  145338. this.walls[position] = null;
  145339. }
  145340. },
  145341. /**
  145342. * [description]
  145343. *
  145344. * @method Phaser.Physics.Matter.World#createDebugGraphic
  145345. * @since 3.0.0
  145346. *
  145347. * @return {Phaser.GameObjects.Graphics} [description]
  145348. */
  145349. createDebugGraphic: function ()
  145350. {
  145351. var graphic = this.scene.sys.add.graphics({ x: 0, y: 0 });
  145352. graphic.setDepth(Number.MAX_VALUE);
  145353. this.debugGraphic = graphic;
  145354. this.drawDebug = true;
  145355. return graphic;
  145356. },
  145357. /**
  145358. * Sets the world's gravity and gravity scale to 0.
  145359. *
  145360. * @method Phaser.Physics.Matter.World#disableGravity
  145361. * @since 3.0.0
  145362. *
  145363. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145364. */
  145365. disableGravity: function ()
  145366. {
  145367. this.localWorld.gravity.x = 0;
  145368. this.localWorld.gravity.y = 0;
  145369. this.localWorld.gravity.scale = 0;
  145370. return this;
  145371. },
  145372. /**
  145373. * Sets the world's gravity
  145374. *
  145375. * @method Phaser.Physics.Matter.World#setGravity
  145376. * @since 3.0.0
  145377. *
  145378. * @param {number} [x=0] - The world gravity x component.
  145379. * @param {number} [y=1] - The world gravity y component.
  145380. * @param {number} [scale] - [description]
  145381. *
  145382. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145383. */
  145384. setGravity: function (x, y, scale)
  145385. {
  145386. if (x === undefined) { x = 0; }
  145387. if (y === undefined) { y = 1; }
  145388. this.localWorld.gravity.x = x;
  145389. this.localWorld.gravity.y = y;
  145390. if (scale !== undefined)
  145391. {
  145392. this.localWorld.gravity.scale = scale;
  145393. }
  145394. return this;
  145395. },
  145396. /**
  145397. * Creates a rectangle Matter body and adds it to the world.
  145398. *
  145399. * @method Phaser.Physics.Matter.World#create
  145400. * @since 3.0.0
  145401. *
  145402. * @param {number} x - The horizontal position of the body in the world.
  145403. * @param {number} y - The vertical position of the body in the world.
  145404. * @param {number} width - The width of the body.
  145405. * @param {number} height - The height of the body.
  145406. * @param {object} options - Optional Matter configuration object.
  145407. *
  145408. * @return {MatterJS.Body} The Matter.js body that was created.
  145409. */
  145410. create: function (x, y, width, height, options)
  145411. {
  145412. var body = Bodies.rectangle(x, y, width, height, options);
  145413. MatterWorld.add(this.localWorld, body);
  145414. return body;
  145415. },
  145416. /**
  145417. * Adds an object to the world.
  145418. *
  145419. * @method Phaser.Physics.Matter.World#add
  145420. * @since 3.0.0
  145421. *
  145422. * @param {(object|object[])} object - Can be single or an array, and can be a body, composite or constraint
  145423. *
  145424. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145425. */
  145426. add: function (object)
  145427. {
  145428. MatterWorld.add(this.localWorld, object);
  145429. return this;
  145430. },
  145431. /**
  145432. * [description]
  145433. *
  145434. * @method Phaser.Physics.Matter.World#remove
  145435. * @since 3.0.0
  145436. *
  145437. * @param {object} object - The object to be removed from the world.
  145438. * @param {boolean} deep - [description]
  145439. *
  145440. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145441. */
  145442. remove: function (object, deep)
  145443. {
  145444. var body = (object.body) ? object.body : object;
  145445. Composite.remove(this.localWorld, body, deep);
  145446. return this;
  145447. },
  145448. /**
  145449. * [description]
  145450. *
  145451. * @method Phaser.Physics.Matter.World#removeConstraint
  145452. * @since 3.0.0
  145453. *
  145454. * @param {MatterJS.Constraint} constraint - [description]
  145455. * @param {boolean} deep - [description]
  145456. *
  145457. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145458. */
  145459. removeConstraint: function (constraint, deep)
  145460. {
  145461. Composite.remove(this.localWorld, constraint, deep);
  145462. return this;
  145463. },
  145464. /**
  145465. * Adds MatterTileBody instances for all the colliding tiles within the given tilemap layer. Set
  145466. * the appropriate tiles in your layer to collide before calling this method!
  145467. *
  145468. * @method Phaser.Physics.Matter.World#convertTilemapLayer
  145469. * @since 3.0.0
  145470. *
  145471. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer -
  145472. * An array of tiles.
  145473. * @param {object} [options] - Options to be passed to the MatterTileBody constructor. {@ee Phaser.Physics.Matter.TileBody}
  145474. *
  145475. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145476. */
  145477. convertTilemapLayer: function (tilemapLayer, options)
  145478. {
  145479. var layerData = tilemapLayer.layer;
  145480. var tiles = tilemapLayer.getTilesWithin(0, 0, layerData.width, layerData.height, { isColliding: true });
  145481. this.convertTiles(tiles, options);
  145482. return this;
  145483. },
  145484. /**
  145485. * Adds MatterTileBody instances for the given tiles. This adds bodies regardless of whether the
  145486. * tiles are set to collide or not.
  145487. *
  145488. * @method Phaser.Physics.Matter.World#convertTiles
  145489. * @since 3.0.0
  145490. *
  145491. * @param {Phaser.Tilemaps.Tile[]} tiles - An array of tiles.
  145492. * @param {object} [options] - Options to be passed to the MatterTileBody constructor. {@see Phaser.Physics.Matter.TileBody}
  145493. *
  145494. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145495. */
  145496. convertTiles: function (tiles, options)
  145497. {
  145498. if (tiles.length === 0)
  145499. {
  145500. return this;
  145501. }
  145502. for (var i = 0; i < tiles.length; i++)
  145503. {
  145504. new MatterTileBody(this, tiles[i], options);
  145505. }
  145506. return this;
  145507. },
  145508. /**
  145509. * [description]
  145510. *
  145511. * @method Phaser.Physics.Matter.World#nextGroup
  145512. * @since 3.0.0
  145513. *
  145514. * @param {boolean} isNonColliding - [description]
  145515. *
  145516. * @return {number} [description]
  145517. */
  145518. nextGroup: function (isNonColliding)
  145519. {
  145520. return MatterBody.nextGroup(isNonColliding);
  145521. },
  145522. /**
  145523. * [description]
  145524. *
  145525. * @method Phaser.Physics.Matter.World#nextCategory
  145526. * @since 3.0.0
  145527. *
  145528. * @return {number} Returns the next unique category bitfield.
  145529. */
  145530. nextCategory: function ()
  145531. {
  145532. return MatterBody.nextCategory();
  145533. },
  145534. /**
  145535. * [description]
  145536. *
  145537. * @method Phaser.Physics.Matter.World#pause
  145538. * @fires Phaser.Physics.Matter.Events#PAUSE
  145539. * @since 3.0.0
  145540. *
  145541. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145542. */
  145543. pause: function ()
  145544. {
  145545. this.enabled = false;
  145546. this.emit(Events.PAUSE);
  145547. return this;
  145548. },
  145549. /**
  145550. * [description]
  145551. *
  145552. * @method Phaser.Physics.Matter.World#resume
  145553. * @fires Phaser.Physics.Matter.Events#RESUME
  145554. * @since 3.0.0
  145555. *
  145556. * @return {Phaser.Physics.Matter.World} This Matter World object.
  145557. */
  145558. resume: function ()
  145559. {
  145560. this.enabled = true;
  145561. this.emit(Events.RESUME);
  145562. return this;
  145563. },
  145564. /**
  145565. * [description]
  145566. *
  145567. * @method Phaser.Physics.Matter.World#update
  145568. * @since 3.0.0
  145569. *
  145570. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  145571. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  145572. */
  145573. update: function (time, delta)
  145574. {
  145575. if (this.enabled && this.autoUpdate)
  145576. {
  145577. Engine.update(this.engine, this.getDelta(time, delta), this.correction);
  145578. }
  145579. },
  145580. /**
  145581. * Manually advances the physics simulation by one iteration.
  145582. *
  145583. * You can optionally pass in the `delta` and `correction` values to be used by Engine.update.
  145584. * If undefined they use the Matter defaults of 60Hz and no correction.
  145585. *
  145586. * Calling `step` directly bypasses any checks of `enabled` or `autoUpdate`.
  145587. *
  145588. * It also ignores any custom `getDelta` functions, as you should be passing the delta
  145589. * value in to this call.
  145590. *
  145591. * You can adjust the number of iterations that Engine.update performs internally.
  145592. * Use the Scene Matter Physics config object to set the following properties:
  145593. *
  145594. * positionIterations (defaults to 6)
  145595. * velocityIterations (defaults to 4)
  145596. * constraintIterations (defaults to 2)
  145597. *
  145598. * Adjusting these values can help performance in certain situations, depending on the physics requirements
  145599. * of your game.
  145600. *
  145601. * @method Phaser.Physics.Matter.World#step
  145602. * @since 3.4.0
  145603. *
  145604. * @param {number} [delta=16.666] - [description]
  145605. * @param {number} [correction=1] - [description]
  145606. */
  145607. step: function (delta, correction)
  145608. {
  145609. Engine.update(this.engine, delta, correction);
  145610. },
  145611. /**
  145612. * Runs the Matter Engine.update at a fixed timestep of 60Hz.
  145613. *
  145614. * @method Phaser.Physics.Matter.World#update60Hz
  145615. * @since 3.4.0
  145616. *
  145617. * @return {number} The delta value to be passed to Engine.update.
  145618. */
  145619. update60Hz: function ()
  145620. {
  145621. return 1000 / 60;
  145622. },
  145623. /**
  145624. * Runs the Matter Engine.update at a fixed timestep of 30Hz.
  145625. *
  145626. * @method Phaser.Physics.Matter.World#update30Hz
  145627. * @since 3.4.0
  145628. *
  145629. * @return {number} The delta value to be passed to Engine.update.
  145630. */
  145631. update30Hz: function ()
  145632. {
  145633. return 1000 / 30;
  145634. },
  145635. /**
  145636. * Handles the rendering of bodies and debug information to the debug Graphics object, if enabled.
  145637. *
  145638. * @method Phaser.Physics.Matter.World#postUpdate
  145639. * @private
  145640. * @since 3.0.0
  145641. */
  145642. postUpdate: function ()
  145643. {
  145644. if (!this.drawDebug)
  145645. {
  145646. return;
  145647. }
  145648. this.debugGraphic.clear();
  145649. var bodies = Composite.allBodies(this.localWorld);
  145650. if (this.defaults.debugWireframes)
  145651. {
  145652. if (this.defaults.debugShowConvexHulls)
  145653. {
  145654. this.renderConvexHulls(bodies);
  145655. }
  145656. this.renderWireframes(bodies);
  145657. }
  145658. else
  145659. {
  145660. this.renderBodies(bodies);
  145661. }
  145662. if (this.defaults.debugShowJoint)
  145663. {
  145664. this.renderJoints();
  145665. }
  145666. },
  145667. /**
  145668. * Renders the debug convex hulls from the given array of bodies.
  145669. *
  145670. * @method Phaser.Physics.Matter.World#renderConvexHulls
  145671. * @private
  145672. * @since 3.14.0
  145673. *
  145674. * @param {array} bodies - An array of bodies from the localWorld.
  145675. */
  145676. renderConvexHulls: function (bodies)
  145677. {
  145678. var graphics = this.debugGraphic;
  145679. graphics.lineStyle(1, this.defaults.debugConvexHullColor);
  145680. graphics.beginPath();
  145681. for (var i = 0; i < bodies.length; i++)
  145682. {
  145683. var body = bodies[i];
  145684. if (!body.render.visible || body.parts.length === 1)
  145685. {
  145686. continue;
  145687. }
  145688. graphics.moveTo(body.vertices[0].x, body.vertices[0].y);
  145689. for (var j = 1; j < body.vertices.length; j++)
  145690. {
  145691. graphics.lineTo(body.vertices[j].x, body.vertices[j].y);
  145692. }
  145693. graphics.lineTo(body.vertices[0].x, body.vertices[0].y);
  145694. }
  145695. graphics.strokePath();
  145696. },
  145697. /**
  145698. * Renders the wireframes of the given array of bodies.
  145699. *
  145700. * @method Phaser.Physics.Matter.World#renderWireframes
  145701. * @private
  145702. * @since 3.14.0
  145703. *
  145704. * @param {array} bodies - An array of bodies from the localWorld.
  145705. */
  145706. renderWireframes: function (bodies)
  145707. {
  145708. var graphics = this.debugGraphic;
  145709. var showInternalEdges = this.defaults.debugShowInternalEdges;
  145710. graphics.lineStyle(1, this.defaults.bodyDebugColor);
  145711. graphics.beginPath();
  145712. for (var i = 0; i < bodies.length; i++)
  145713. {
  145714. var body = bodies[i];
  145715. if (!body.render.visible)
  145716. {
  145717. continue;
  145718. }
  145719. for (var k = (body.parts.length > 1) ? 1 : 0; k < body.parts.length; k++)
  145720. {
  145721. var part = body.parts[k];
  145722. var vertLength = part.vertices.length;
  145723. graphics.moveTo(part.vertices[0].x, part.vertices[0].y);
  145724. for (var j = 1; j < vertLength; j++)
  145725. {
  145726. if (!part.vertices[j - 1].isInternal || showInternalEdges)
  145727. {
  145728. graphics.lineTo(part.vertices[j].x, part.vertices[j].y);
  145729. }
  145730. else
  145731. {
  145732. graphics.moveTo(part.vertices[j].x, part.vertices[j].y);
  145733. }
  145734. if (part.vertices[j].isInternal && !showInternalEdges)
  145735. {
  145736. graphics.moveTo(part.vertices[(j + 1) % vertLength].x, part.vertices[(j + 1) % vertLength].y);
  145737. }
  145738. }
  145739. graphics.lineTo(part.vertices[0].x, part.vertices[0].y);
  145740. }
  145741. }
  145742. graphics.strokePath();
  145743. },
  145744. /**
  145745. * Renders the array of bodies.
  145746. *
  145747. * @method Phaser.Physics.Matter.World#renderBodies
  145748. * @private
  145749. * @since 3.14.0
  145750. *
  145751. * @param {array} bodies - An array of bodies from the localWorld.
  145752. */
  145753. renderBodies: function (bodies)
  145754. {
  145755. var graphics = this.debugGraphic;
  145756. var showInternalEdges = this.defaults.debugShowInternalEdges || !this.defaults.debugWireframes;
  145757. var showSleeping = this.defaults.debugShowSleeping;
  145758. var wireframes = this.defaults.debugWireframes;
  145759. var body;
  145760. var part;
  145761. var i;
  145762. var k;
  145763. for (i = 0; i < bodies.length; i++)
  145764. {
  145765. body = bodies[i];
  145766. if (!body.render.visible)
  145767. {
  145768. continue;
  145769. }
  145770. // Handle compound parts
  145771. for (k = body.parts.length > 1 ? 1 : 0; k < body.parts.length; k++)
  145772. {
  145773. part = body.parts[k];
  145774. if (!part.render.visible)
  145775. {
  145776. continue;
  145777. }
  145778. if (showSleeping && body.isSleeping)
  145779. {
  145780. graphics.lineStyle(1, this.defaults.bodyDebugColor, 0.5 * part.render.opacity);
  145781. graphics.fillStyle(this.defaults.bodyDebugColor, 0.5 * part.render.opacity);
  145782. }
  145783. else
  145784. {
  145785. graphics.lineStyle(1, this.defaults.bodyDebugColor, part.render.opacity);
  145786. graphics.fillStyle(this.defaults.bodyDebugColor, part.render.opacity);
  145787. }
  145788. // Part polygon
  145789. if (part.circleRadius)
  145790. {
  145791. graphics.beginPath();
  145792. graphics.arc(part.position.x, part.position.y, part.circleRadius, 0, 2 * Math.PI);
  145793. }
  145794. else
  145795. {
  145796. graphics.beginPath();
  145797. graphics.moveTo(part.vertices[0].x, part.vertices[0].y);
  145798. var vertLength = part.vertices.length;
  145799. for (var j = 1; j < vertLength; j++)
  145800. {
  145801. if (!part.vertices[j - 1].isInternal || showInternalEdges)
  145802. {
  145803. graphics.lineTo(part.vertices[j].x, part.vertices[j].y);
  145804. }
  145805. else
  145806. {
  145807. graphics.moveTo(part.vertices[j].x, part.vertices[j].y);
  145808. }
  145809. if (part.vertices[j].isInternal && !showInternalEdges)
  145810. {
  145811. graphics.moveTo(part.vertices[(j + 1) % part.vertices.length].x, part.vertices[(j + 1) % part.vertices.length].y);
  145812. }
  145813. }
  145814. graphics.lineTo(part.vertices[0].x, part.vertices[0].y);
  145815. graphics.closePath();
  145816. }
  145817. if (!wireframes)
  145818. {
  145819. graphics.fillPath();
  145820. }
  145821. else
  145822. {
  145823. graphics.strokePath();
  145824. }
  145825. }
  145826. }
  145827. },
  145828. /**
  145829. * Renders world constraints.
  145830. *
  145831. * @method Phaser.Physics.Matter.World#renderJoints
  145832. * @private
  145833. * @since 3.14.0
  145834. */
  145835. renderJoints: function ()
  145836. {
  145837. var graphics = this.debugGraphic;
  145838. graphics.lineStyle(2, this.defaults.jointDebugColor);
  145839. // Render constraints
  145840. var constraints = Composite.allConstraints(this.localWorld);
  145841. for (var i = 0; i < constraints.length; i++)
  145842. {
  145843. var constraint = constraints[i];
  145844. if (!constraint.render.visible || !constraint.pointA || !constraint.pointB)
  145845. {
  145846. continue;
  145847. }
  145848. if (constraint.render.lineWidth)
  145849. {
  145850. graphics.lineStyle(constraint.render.lineWidth, Common.colorToNumber(constraint.render.strokeStyle));
  145851. }
  145852. var bodyA = constraint.bodyA;
  145853. var bodyB = constraint.bodyB;
  145854. var start;
  145855. var end;
  145856. if (bodyA)
  145857. {
  145858. start = Vector.add(bodyA.position, constraint.pointA);
  145859. }
  145860. else
  145861. {
  145862. start = constraint.pointA;
  145863. }
  145864. if (constraint.render.type === 'pin')
  145865. {
  145866. graphics.beginPath();
  145867. graphics.arc(start.x, start.y, 3, 0, 2 * Math.PI);
  145868. graphics.closePath();
  145869. }
  145870. else
  145871. {
  145872. if (bodyB)
  145873. {
  145874. end = Vector.add(bodyB.position, constraint.pointB);
  145875. }
  145876. else
  145877. {
  145878. end = constraint.pointB;
  145879. }
  145880. graphics.beginPath();
  145881. graphics.moveTo(start.x, start.y);
  145882. if (constraint.render.type === 'spring')
  145883. {
  145884. var delta = Vector.sub(end, start);
  145885. var normal = Vector.perp(Vector.normalise(delta));
  145886. var coils = Math.ceil(Common.clamp(constraint.length / 5, 12, 20));
  145887. var offset;
  145888. for (var j = 1; j < coils; j += 1)
  145889. {
  145890. offset = (j % 2 === 0) ? 1 : -1;
  145891. graphics.lineTo(
  145892. start.x + delta.x * (j / coils) + normal.x * offset * 4,
  145893. start.y + delta.y * (j / coils) + normal.y * offset * 4
  145894. );
  145895. }
  145896. }
  145897. graphics.lineTo(end.x, end.y);
  145898. }
  145899. if (constraint.render.lineWidth)
  145900. {
  145901. graphics.strokePath();
  145902. }
  145903. if (constraint.render.anchors)
  145904. {
  145905. graphics.fillStyle(Common.colorToNumber(constraint.render.strokeStyle));
  145906. graphics.beginPath();
  145907. graphics.arc(start.x, start.y, 6, 0, 2 * Math.PI);
  145908. graphics.arc(end.x, end.y, 6, 0, 2 * Math.PI);
  145909. graphics.closePath();
  145910. graphics.fillPath();
  145911. }
  145912. }
  145913. },
  145914. /**
  145915. * [description]
  145916. *
  145917. * @method Phaser.Physics.Matter.World#fromPath
  145918. * @since 3.0.0
  145919. *
  145920. * @param {string} path - [description]
  145921. * @param {array} points - [description]
  145922. *
  145923. * @return {array} [description]
  145924. */
  145925. fromPath: function (path, points)
  145926. {
  145927. if (points === undefined) { points = []; }
  145928. // var pathPattern = /L?\s*([-\d.e]+)[\s,]*([-\d.e]+)*/ig;
  145929. // eslint-disable-next-line no-useless-escape
  145930. var pathPattern = /L?\s*([\-\d\.e]+)[\s,]*([\-\d\.e]+)*/ig;
  145931. path.replace(pathPattern, function (match, x, y)
  145932. {
  145933. points.push({ x: parseFloat(x), y: parseFloat(y) });
  145934. });
  145935. return points;
  145936. },
  145937. /**
  145938. * Will remove all Matter physics event listeners and clear the matter physics world,
  145939. * engine and any debug graphics, if any.
  145940. *
  145941. * @method Phaser.Physics.Matter.World#shutdown
  145942. * @since 3.0.0
  145943. */
  145944. shutdown: function ()
  145945. {
  145946. MatterEvents.off(this.engine);
  145947. this.removeAllListeners();
  145948. MatterWorld.clear(this.localWorld, false);
  145949. Engine.clear(this.engine);
  145950. if (this.drawDebug)
  145951. {
  145952. this.debugGraphic.destroy();
  145953. }
  145954. },
  145955. /**
  145956. * Will remove all Matter physics event listeners and clear the matter physics world,
  145957. * engine and any debug graphics, if any.
  145958. *
  145959. * After destroying the world it cannot be re-used again.
  145960. *
  145961. * @method Phaser.Physics.Matter.World#destroy
  145962. * @since 3.0.0
  145963. */
  145964. destroy: function ()
  145965. {
  145966. this.shutdown();
  145967. }
  145968. });
  145969. module.exports = World;
  145970. /***/ }),
  145971. /* 1282 */
  145972. /***/ (function(module, exports, __webpack_require__) {
  145973. /**
  145974. * The `Matter.Engine` module contains methods for creating and manipulating engines.
  145975. * An engine is a controller that manages updating the simulation of the world.
  145976. * See `Matter.Runner` for an optional game loop utility.
  145977. *
  145978. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  145979. *
  145980. * @class Engine
  145981. */
  145982. var Engine = {};
  145983. module.exports = Engine;
  145984. var World = __webpack_require__(539);
  145985. var Sleeping = __webpack_require__(238);
  145986. var Resolver = __webpack_require__(1283);
  145987. var Pairs = __webpack_require__(1284);
  145988. var Metrics = __webpack_require__(1309);
  145989. var Grid = __webpack_require__(1285);
  145990. var Events = __webpack_require__(210);
  145991. var Composite = __webpack_require__(149);
  145992. var Constraint = __webpack_require__(209);
  145993. var Common = __webpack_require__(36);
  145994. var Body = __webpack_require__(72);
  145995. (function() {
  145996. /**
  145997. * Creates a new engine. The options parameter is an object that specifies any properties you wish to override the defaults.
  145998. * All properties have default values, and many are pre-calculated automatically based on other properties.
  145999. * See the properties section below for detailed information on what you can pass via the `options` object.
  146000. * @method create
  146001. * @param {object} [options]
  146002. * @return {engine} engine
  146003. */
  146004. Engine.create = function(element, options) {
  146005. // options may be passed as the first (and only) argument
  146006. options = Common.isElement(element) ? options : element;
  146007. element = Common.isElement(element) ? element : null;
  146008. options = options || {};
  146009. if (element || options.render) {
  146010. Common.warn('Engine.create: engine.render is deprecated (see docs)');
  146011. }
  146012. var defaults = {
  146013. positionIterations: 6,
  146014. velocityIterations: 4,
  146015. constraintIterations: 2,
  146016. enableSleeping: false,
  146017. events: [],
  146018. plugin: {},
  146019. timing: {
  146020. timestamp: 0,
  146021. timeScale: 1
  146022. },
  146023. broadphase: {
  146024. controller: Grid
  146025. }
  146026. };
  146027. var engine = Common.extend(defaults, options);
  146028. // @deprecated
  146029. if (element || engine.render) {
  146030. var renderDefaults = {
  146031. element: element,
  146032. controller: Render
  146033. };
  146034. engine.render = Common.extend(renderDefaults, engine.render);
  146035. }
  146036. // @deprecated
  146037. if (engine.render && engine.render.controller) {
  146038. engine.render = engine.render.controller.create(engine.render);
  146039. }
  146040. // @deprecated
  146041. if (engine.render) {
  146042. engine.render.engine = engine;
  146043. }
  146044. engine.world = options.world || World.create(engine.world);
  146045. engine.pairs = Pairs.create();
  146046. engine.broadphase = engine.broadphase.controller.create(engine.broadphase);
  146047. engine.metrics = engine.metrics || { extended: false };
  146048. // @if DEBUG
  146049. engine.metrics = Metrics.create(engine.metrics);
  146050. // @endif
  146051. return engine;
  146052. };
  146053. /**
  146054. * Moves the simulation forward in time by `delta` ms.
  146055. * The `correction` argument is an optional `Number` that specifies the time correction factor to apply to the update.
  146056. * This can help improve the accuracy of the simulation in cases where `delta` is changing between updates.
  146057. * The value of `correction` is defined as `delta / lastDelta`, i.e. the percentage change of `delta` over the last step.
  146058. * Therefore the value is always `1` (no correction) when `delta` constant (or when no correction is desired, which is the default).
  146059. * See the paper on <a href="http://lonesock.net/article/verlet.html">Time Corrected Verlet</a> for more information.
  146060. *
  146061. * Triggers `beforeUpdate` and `afterUpdate` events.
  146062. * Triggers `collisionStart`, `collisionActive` and `collisionEnd` events.
  146063. * @method update
  146064. * @param {engine} engine
  146065. * @param {number} [delta=16.666]
  146066. * @param {number} [correction=1]
  146067. */
  146068. Engine.update = function(engine, delta, correction) {
  146069. delta = delta || 1000 / 60;
  146070. correction = correction || 1;
  146071. var world = engine.world,
  146072. timing = engine.timing,
  146073. broadphase = engine.broadphase,
  146074. broadphasePairs = [],
  146075. i;
  146076. // increment timestamp
  146077. timing.timestamp += delta * timing.timeScale;
  146078. // create an event object
  146079. var event = {
  146080. timestamp: timing.timestamp
  146081. };
  146082. Events.trigger(engine, 'beforeUpdate', event);
  146083. // get lists of all bodies and constraints, no matter what composites they are in
  146084. var allBodies = Composite.allBodies(world),
  146085. allConstraints = Composite.allConstraints(world);
  146086. // @if DEBUG
  146087. // reset metrics logging
  146088. Metrics.reset(engine.metrics);
  146089. // @endif
  146090. // if sleeping enabled, call the sleeping controller
  146091. if (engine.enableSleeping)
  146092. Sleeping.update(allBodies, timing.timeScale);
  146093. // applies gravity to all bodies
  146094. Engine._bodiesApplyGravity(allBodies, world.gravity);
  146095. // update all body position and rotation by integration
  146096. Engine._bodiesUpdate(allBodies, delta, timing.timeScale, correction, world.bounds);
  146097. // update all constraints (first pass)
  146098. Constraint.preSolveAll(allBodies);
  146099. for (i = 0; i < engine.constraintIterations; i++) {
  146100. Constraint.solveAll(allConstraints, timing.timeScale);
  146101. }
  146102. Constraint.postSolveAll(allBodies);
  146103. // broadphase pass: find potential collision pairs
  146104. if (broadphase.controller) {
  146105. // if world is dirty, we must flush the whole grid
  146106. if (world.isModified)
  146107. broadphase.controller.clear(broadphase);
  146108. // update the grid buckets based on current bodies
  146109. broadphase.controller.update(broadphase, allBodies, engine, world.isModified);
  146110. broadphasePairs = broadphase.pairsList;
  146111. } else {
  146112. // if no broadphase set, we just pass all bodies
  146113. broadphasePairs = allBodies;
  146114. }
  146115. // clear all composite modified flags
  146116. if (world.isModified) {
  146117. Composite.setModified(world, false, false, true);
  146118. }
  146119. // narrowphase pass: find actual collisions, then create or update collision pairs
  146120. var collisions = broadphase.detector(broadphasePairs, engine);
  146121. // update collision pairs
  146122. var pairs = engine.pairs,
  146123. timestamp = timing.timestamp;
  146124. Pairs.update(pairs, collisions, timestamp);
  146125. Pairs.removeOld(pairs, timestamp);
  146126. // wake up bodies involved in collisions
  146127. if (engine.enableSleeping)
  146128. Sleeping.afterCollisions(pairs.list, timing.timeScale);
  146129. // trigger collision events
  146130. if (pairs.collisionStart.length > 0)
  146131. Events.trigger(engine, 'collisionStart', { pairs: pairs.collisionStart });
  146132. // iteratively resolve position between collisions
  146133. Resolver.preSolvePosition(pairs.list);
  146134. for (i = 0; i < engine.positionIterations; i++) {
  146135. Resolver.solvePosition(pairs.list, allBodies, timing.timeScale);
  146136. }
  146137. Resolver.postSolvePosition(allBodies);
  146138. // update all constraints (second pass)
  146139. Constraint.preSolveAll(allBodies);
  146140. for (i = 0; i < engine.constraintIterations; i++) {
  146141. Constraint.solveAll(allConstraints, timing.timeScale);
  146142. }
  146143. Constraint.postSolveAll(allBodies);
  146144. // iteratively resolve velocity between collisions
  146145. Resolver.preSolveVelocity(pairs.list);
  146146. for (i = 0; i < engine.velocityIterations; i++) {
  146147. Resolver.solveVelocity(pairs.list, timing.timeScale);
  146148. }
  146149. // trigger collision events
  146150. if (pairs.collisionActive.length > 0)
  146151. Events.trigger(engine, 'collisionActive', { pairs: pairs.collisionActive });
  146152. if (pairs.collisionEnd.length > 0)
  146153. Events.trigger(engine, 'collisionEnd', { pairs: pairs.collisionEnd });
  146154. // @if DEBUG
  146155. // update metrics log
  146156. Metrics.update(engine.metrics, engine);
  146157. // @endif
  146158. // clear force buffers
  146159. Engine._bodiesClearForces(allBodies);
  146160. Events.trigger(engine, 'afterUpdate', event);
  146161. return engine;
  146162. };
  146163. /**
  146164. * Merges two engines by keeping the configuration of `engineA` but replacing the world with the one from `engineB`.
  146165. * @method merge
  146166. * @param {engine} engineA
  146167. * @param {engine} engineB
  146168. */
  146169. Engine.merge = function(engineA, engineB) {
  146170. Common.extend(engineA, engineB);
  146171. if (engineB.world) {
  146172. engineA.world = engineB.world;
  146173. Engine.clear(engineA);
  146174. var bodies = Composite.allBodies(engineA.world);
  146175. for (var i = 0; i < bodies.length; i++) {
  146176. var body = bodies[i];
  146177. Sleeping.set(body, false);
  146178. body.id = Common.nextId();
  146179. }
  146180. }
  146181. };
  146182. /**
  146183. * Clears the engine including the world, pairs and broadphase.
  146184. * @method clear
  146185. * @param {engine} engine
  146186. */
  146187. Engine.clear = function(engine) {
  146188. var world = engine.world;
  146189. Pairs.clear(engine.pairs);
  146190. var broadphase = engine.broadphase;
  146191. if (broadphase.controller) {
  146192. var bodies = Composite.allBodies(world);
  146193. broadphase.controller.clear(broadphase);
  146194. broadphase.controller.update(broadphase, bodies, engine, true);
  146195. }
  146196. };
  146197. /**
  146198. * Zeroes the `body.force` and `body.torque` force buffers.
  146199. * @method _bodiesClearForces
  146200. * @private
  146201. * @param {body[]} bodies
  146202. */
  146203. Engine._bodiesClearForces = function(bodies) {
  146204. for (var i = 0; i < bodies.length; i++) {
  146205. var body = bodies[i];
  146206. // reset force buffers
  146207. body.force.x = 0;
  146208. body.force.y = 0;
  146209. body.torque = 0;
  146210. }
  146211. };
  146212. /**
  146213. * Applys a mass dependant force to all given bodies.
  146214. * @method _bodiesApplyGravity
  146215. * @private
  146216. * @param {body[]} bodies
  146217. * @param {vector} gravity
  146218. */
  146219. Engine._bodiesApplyGravity = function(bodies, gravity) {
  146220. var gravityScale = typeof gravity.scale !== 'undefined' ? gravity.scale : 0.001;
  146221. if ((gravity.x === 0 && gravity.y === 0) || gravityScale === 0) {
  146222. return;
  146223. }
  146224. for (var i = 0; i < bodies.length; i++) {
  146225. var body = bodies[i];
  146226. if (body.ignoreGravity || body.isStatic || body.isSleeping)
  146227. continue;
  146228. // apply gravity
  146229. body.force.y += body.mass * gravity.y * gravityScale;
  146230. body.force.x += body.mass * gravity.x * gravityScale;
  146231. }
  146232. };
  146233. /**
  146234. * Applys `Body.update` to all given `bodies`.
  146235. * @method _bodiesUpdate
  146236. * @private
  146237. * @param {body[]} bodies
  146238. * @param {number} deltaTime
  146239. * The amount of time elapsed between updates
  146240. * @param {number} timeScale
  146241. * @param {number} correction
  146242. * The Verlet correction factor (deltaTime / lastDeltaTime)
  146243. * @param {bounds} worldBounds
  146244. */
  146245. Engine._bodiesUpdate = function(bodies, deltaTime, timeScale, correction, worldBounds) {
  146246. for (var i = 0; i < bodies.length; i++) {
  146247. var body = bodies[i];
  146248. if (body.isStatic || body.isSleeping)
  146249. continue;
  146250. Body.update(body, deltaTime, timeScale, correction);
  146251. }
  146252. };
  146253. /**
  146254. * An alias for `Runner.run`, see `Matter.Runner` for more information.
  146255. * @method run
  146256. * @param {engine} engine
  146257. */
  146258. /**
  146259. * Fired just before an update
  146260. *
  146261. * @event beforeUpdate
  146262. * @param {} event An event object
  146263. * @param {number} event.timestamp The engine.timing.timestamp of the event
  146264. * @param {} event.source The source object of the event
  146265. * @param {} event.name The name of the event
  146266. */
  146267. /**
  146268. * Fired after engine update and all collision events
  146269. *
  146270. * @event afterUpdate
  146271. * @param {} event An event object
  146272. * @param {number} event.timestamp The engine.timing.timestamp of the event
  146273. * @param {} event.source The source object of the event
  146274. * @param {} event.name The name of the event
  146275. */
  146276. /**
  146277. * Fired after engine update, provides a list of all pairs that have started to collide in the current tick (if any)
  146278. *
  146279. * @event collisionStart
  146280. * @param {} event An event object
  146281. * @param {} event.pairs List of affected pairs
  146282. * @param {number} event.timestamp The engine.timing.timestamp of the event
  146283. * @param {} event.source The source object of the event
  146284. * @param {} event.name The name of the event
  146285. */
  146286. /**
  146287. * Fired after engine update, provides a list of all pairs that are colliding in the current tick (if any)
  146288. *
  146289. * @event collisionActive
  146290. * @param {} event An event object
  146291. * @param {} event.pairs List of affected pairs
  146292. * @param {number} event.timestamp The engine.timing.timestamp of the event
  146293. * @param {} event.source The source object of the event
  146294. * @param {} event.name The name of the event
  146295. */
  146296. /**
  146297. * Fired after engine update, provides a list of all pairs that have ended collision in the current tick (if any)
  146298. *
  146299. * @event collisionEnd
  146300. * @param {} event An event object
  146301. * @param {} event.pairs List of affected pairs
  146302. * @param {number} event.timestamp The engine.timing.timestamp of the event
  146303. * @param {} event.source The source object of the event
  146304. * @param {} event.name The name of the event
  146305. */
  146306. /*
  146307. *
  146308. * Properties Documentation
  146309. *
  146310. */
  146311. /**
  146312. * An integer `Number` that specifies the number of position iterations to perform each update.
  146313. * The higher the value, the higher quality the simulation will be at the expense of performance.
  146314. *
  146315. * @property positionIterations
  146316. * @type number
  146317. * @default 6
  146318. */
  146319. /**
  146320. * An integer `Number` that specifies the number of velocity iterations to perform each update.
  146321. * The higher the value, the higher quality the simulation will be at the expense of performance.
  146322. *
  146323. * @property velocityIterations
  146324. * @type number
  146325. * @default 4
  146326. */
  146327. /**
  146328. * An integer `Number` that specifies the number of constraint iterations to perform each update.
  146329. * The higher the value, the higher quality the simulation will be at the expense of performance.
  146330. * The default value of `2` is usually very adequate.
  146331. *
  146332. * @property constraintIterations
  146333. * @type number
  146334. * @default 2
  146335. */
  146336. /**
  146337. * A flag that specifies whether the engine should allow sleeping via the `Matter.Sleeping` module.
  146338. * Sleeping can improve stability and performance, but often at the expense of accuracy.
  146339. *
  146340. * @property enableSleeping
  146341. * @type boolean
  146342. * @default false
  146343. */
  146344. /**
  146345. * An `Object` containing properties regarding the timing systems of the engine.
  146346. *
  146347. * @property timing
  146348. * @type object
  146349. */
  146350. /**
  146351. * A `Number` that specifies the global scaling factor of time for all bodies.
  146352. * A value of `0` freezes the simulation.
  146353. * A value of `0.1` gives a slow-motion effect.
  146354. * A value of `1.2` gives a speed-up effect.
  146355. *
  146356. * @property timing.timeScale
  146357. * @type number
  146358. * @default 1
  146359. */
  146360. /**
  146361. * A `Number` that specifies the current simulation-time in milliseconds starting from `0`.
  146362. * It is incremented on every `Engine.update` by the given `delta` argument.
  146363. *
  146364. * @property timing.timestamp
  146365. * @type number
  146366. * @default 0
  146367. */
  146368. /**
  146369. * An instance of a `Render` controller. The default value is a `Matter.Render` instance created by `Engine.create`.
  146370. * One may also develop a custom renderer module based on `Matter.Render` and pass an instance of it to `Engine.create` via `options.render`.
  146371. *
  146372. * A minimal custom renderer object must define at least three functions: `create`, `clear` and `world` (see `Matter.Render`).
  146373. * It is also possible to instead pass the _module_ reference via `options.render.controller` and `Engine.create` will instantiate one for you.
  146374. *
  146375. * @property render
  146376. * @type render
  146377. * @deprecated see Demo.js for an example of creating a renderer
  146378. * @default a Matter.Render instance
  146379. */
  146380. /**
  146381. * An instance of a broadphase controller. The default value is a `Matter.Grid` instance created by `Engine.create`.
  146382. *
  146383. * @property broadphase
  146384. * @type grid
  146385. * @default a Matter.Grid instance
  146386. */
  146387. /**
  146388. * A `World` composite object that will contain all simulated bodies and constraints.
  146389. *
  146390. * @property world
  146391. * @type world
  146392. * @default a Matter.World instance
  146393. */
  146394. /**
  146395. * An object reserved for storing plugin-specific properties.
  146396. *
  146397. * @property plugin
  146398. * @type {}
  146399. */
  146400. })();
  146401. /***/ }),
  146402. /* 1283 */
  146403. /***/ (function(module, exports, __webpack_require__) {
  146404. /**
  146405. * The `Matter.Resolver` module contains methods for resolving collision pairs.
  146406. *
  146407. * @class Resolver
  146408. */
  146409. var Resolver = {};
  146410. module.exports = Resolver;
  146411. var Vertices = __webpack_require__(82);
  146412. var Vector = __webpack_require__(87);
  146413. var Common = __webpack_require__(36);
  146414. var Bounds = __webpack_require__(86);
  146415. (function() {
  146416. Resolver._restingThresh = 4;
  146417. Resolver._restingThreshTangent = 6;
  146418. Resolver._positionDampen = 0.9;
  146419. Resolver._positionWarming = 0.8;
  146420. Resolver._frictionNormalMultiplier = 5;
  146421. /**
  146422. * Prepare pairs for position solving.
  146423. * @method preSolvePosition
  146424. * @param {pair[]} pairs
  146425. */
  146426. Resolver.preSolvePosition = function(pairs) {
  146427. var i,
  146428. pair,
  146429. activeCount;
  146430. // find total contacts on each body
  146431. for (i = 0; i < pairs.length; i++) {
  146432. pair = pairs[i];
  146433. if (!pair.isActive)
  146434. continue;
  146435. activeCount = pair.activeContacts.length;
  146436. pair.collision.parentA.totalContacts += activeCount;
  146437. pair.collision.parentB.totalContacts += activeCount;
  146438. }
  146439. };
  146440. /**
  146441. * Find a solution for pair positions.
  146442. * @method solvePosition
  146443. * @param {pair[]} pairs
  146444. * @param {body[]} bodies
  146445. * @param {number} timeScale
  146446. */
  146447. Resolver.solvePosition = function(pairs, bodies, timeScale) {
  146448. var i,
  146449. normalX,
  146450. normalY,
  146451. pair,
  146452. collision,
  146453. bodyA,
  146454. bodyB,
  146455. normal,
  146456. separation,
  146457. penetration,
  146458. positionImpulseA,
  146459. positionImpulseB,
  146460. contactShare,
  146461. bodyBtoAX,
  146462. bodyBtoAY,
  146463. positionImpulse,
  146464. impulseCoefficient = timeScale * Resolver._positionDampen;
  146465. for (i = 0; i < bodies.length; i++) {
  146466. var body = bodies[i];
  146467. body.previousPositionImpulse.x = body.positionImpulse.x;
  146468. body.previousPositionImpulse.y = body.positionImpulse.y;
  146469. }
  146470. // find impulses required to resolve penetration
  146471. for (i = 0; i < pairs.length; i++) {
  146472. pair = pairs[i];
  146473. if (!pair.isActive || pair.isSensor)
  146474. continue;
  146475. collision = pair.collision;
  146476. bodyA = collision.parentA;
  146477. bodyB = collision.parentB;
  146478. normal = collision.normal;
  146479. positionImpulseA = bodyA.previousPositionImpulse;
  146480. positionImpulseB = bodyB.previousPositionImpulse;
  146481. penetration = collision.penetration;
  146482. bodyBtoAX = positionImpulseB.x - positionImpulseA.x + penetration.x;
  146483. bodyBtoAY = positionImpulseB.y - positionImpulseA.y + penetration.y;
  146484. normalX = normal.x;
  146485. normalY = normal.y;
  146486. separation = normalX * bodyBtoAX + normalY * bodyBtoAY;
  146487. pair.separation = separation;
  146488. positionImpulse = (separation - pair.slop) * impulseCoefficient;
  146489. if (bodyA.isStatic || bodyB.isStatic)
  146490. positionImpulse *= 2;
  146491. if (!(bodyA.isStatic || bodyA.isSleeping)) {
  146492. contactShare = positionImpulse / bodyA.totalContacts;
  146493. bodyA.positionImpulse.x += normalX * contactShare;
  146494. bodyA.positionImpulse.y += normalY * contactShare;
  146495. }
  146496. if (!(bodyB.isStatic || bodyB.isSleeping)) {
  146497. contactShare = positionImpulse / bodyB.totalContacts;
  146498. bodyB.positionImpulse.x -= normalX * contactShare;
  146499. bodyB.positionImpulse.y -= normalY * contactShare;
  146500. }
  146501. }
  146502. };
  146503. /**
  146504. * Apply position resolution.
  146505. * @method postSolvePosition
  146506. * @param {body[]} bodies
  146507. */
  146508. Resolver.postSolvePosition = function(bodies) {
  146509. for (var i = 0; i < bodies.length; i++) {
  146510. var body = bodies[i];
  146511. // reset contact count
  146512. body.totalContacts = 0;
  146513. if (body.positionImpulse.x !== 0 || body.positionImpulse.y !== 0) {
  146514. // update body geometry
  146515. for (var j = 0; j < body.parts.length; j++) {
  146516. var part = body.parts[j];
  146517. Vertices.translate(part.vertices, body.positionImpulse);
  146518. Bounds.update(part.bounds, part.vertices, body.velocity);
  146519. part.position.x += body.positionImpulse.x;
  146520. part.position.y += body.positionImpulse.y;
  146521. }
  146522. // move the body without changing velocity
  146523. body.positionPrev.x += body.positionImpulse.x;
  146524. body.positionPrev.y += body.positionImpulse.y;
  146525. if (Vector.dot(body.positionImpulse, body.velocity) < 0) {
  146526. // reset cached impulse if the body has velocity along it
  146527. body.positionImpulse.x = 0;
  146528. body.positionImpulse.y = 0;
  146529. } else {
  146530. // warm the next iteration
  146531. body.positionImpulse.x *= Resolver._positionWarming;
  146532. body.positionImpulse.y *= Resolver._positionWarming;
  146533. }
  146534. }
  146535. }
  146536. };
  146537. /**
  146538. * Prepare pairs for velocity solving.
  146539. * @method preSolveVelocity
  146540. * @param {pair[]} pairs
  146541. */
  146542. Resolver.preSolveVelocity = function(pairs) {
  146543. var i,
  146544. j,
  146545. pair,
  146546. contacts,
  146547. collision,
  146548. bodyA,
  146549. bodyB,
  146550. normal,
  146551. tangent,
  146552. contact,
  146553. contactVertex,
  146554. normalImpulse,
  146555. tangentImpulse,
  146556. offset,
  146557. impulse = Vector._temp[0],
  146558. tempA = Vector._temp[1];
  146559. for (i = 0; i < pairs.length; i++) {
  146560. pair = pairs[i];
  146561. if (!pair.isActive || pair.isSensor)
  146562. continue;
  146563. contacts = pair.activeContacts;
  146564. collision = pair.collision;
  146565. bodyA = collision.parentA;
  146566. bodyB = collision.parentB;
  146567. normal = collision.normal;
  146568. tangent = collision.tangent;
  146569. // resolve each contact
  146570. for (j = 0; j < contacts.length; j++) {
  146571. contact = contacts[j];
  146572. contactVertex = contact.vertex;
  146573. normalImpulse = contact.normalImpulse;
  146574. tangentImpulse = contact.tangentImpulse;
  146575. if (normalImpulse !== 0 || tangentImpulse !== 0) {
  146576. // total impulse from contact
  146577. impulse.x = (normal.x * normalImpulse) + (tangent.x * tangentImpulse);
  146578. impulse.y = (normal.y * normalImpulse) + (tangent.y * tangentImpulse);
  146579. // apply impulse from contact
  146580. if (!(bodyA.isStatic || bodyA.isSleeping)) {
  146581. offset = Vector.sub(contactVertex, bodyA.position, tempA);
  146582. bodyA.positionPrev.x += impulse.x * bodyA.inverseMass;
  146583. bodyA.positionPrev.y += impulse.y * bodyA.inverseMass;
  146584. bodyA.anglePrev += Vector.cross(offset, impulse) * bodyA.inverseInertia;
  146585. }
  146586. if (!(bodyB.isStatic || bodyB.isSleeping)) {
  146587. offset = Vector.sub(contactVertex, bodyB.position, tempA);
  146588. bodyB.positionPrev.x -= impulse.x * bodyB.inverseMass;
  146589. bodyB.positionPrev.y -= impulse.y * bodyB.inverseMass;
  146590. bodyB.anglePrev -= Vector.cross(offset, impulse) * bodyB.inverseInertia;
  146591. }
  146592. }
  146593. }
  146594. }
  146595. };
  146596. /**
  146597. * Find a solution for pair velocities.
  146598. * @method solveVelocity
  146599. * @param {pair[]} pairs
  146600. * @param {number} timeScale
  146601. */
  146602. Resolver.solveVelocity = function(pairs, timeScale) {
  146603. var timeScaleSquared = timeScale * timeScale,
  146604. impulse = Vector._temp[0],
  146605. tempA = Vector._temp[1],
  146606. tempB = Vector._temp[2],
  146607. tempC = Vector._temp[3],
  146608. tempD = Vector._temp[4],
  146609. tempE = Vector._temp[5];
  146610. for (var i = 0; i < pairs.length; i++) {
  146611. var pair = pairs[i];
  146612. if (!pair.isActive || pair.isSensor)
  146613. continue;
  146614. var collision = pair.collision,
  146615. bodyA = collision.parentA,
  146616. bodyB = collision.parentB,
  146617. normal = collision.normal,
  146618. tangent = collision.tangent,
  146619. contacts = pair.activeContacts,
  146620. contactShare = 1 / contacts.length;
  146621. // update body velocities
  146622. bodyA.velocity.x = bodyA.position.x - bodyA.positionPrev.x;
  146623. bodyA.velocity.y = bodyA.position.y - bodyA.positionPrev.y;
  146624. bodyB.velocity.x = bodyB.position.x - bodyB.positionPrev.x;
  146625. bodyB.velocity.y = bodyB.position.y - bodyB.positionPrev.y;
  146626. bodyA.angularVelocity = bodyA.angle - bodyA.anglePrev;
  146627. bodyB.angularVelocity = bodyB.angle - bodyB.anglePrev;
  146628. // resolve each contact
  146629. for (var j = 0; j < contacts.length; j++) {
  146630. var contact = contacts[j],
  146631. contactVertex = contact.vertex,
  146632. offsetA = Vector.sub(contactVertex, bodyA.position, tempA),
  146633. offsetB = Vector.sub(contactVertex, bodyB.position, tempB),
  146634. velocityPointA = Vector.add(bodyA.velocity, Vector.mult(Vector.perp(offsetA), bodyA.angularVelocity), tempC),
  146635. velocityPointB = Vector.add(bodyB.velocity, Vector.mult(Vector.perp(offsetB), bodyB.angularVelocity), tempD),
  146636. relativeVelocity = Vector.sub(velocityPointA, velocityPointB, tempE),
  146637. normalVelocity = Vector.dot(normal, relativeVelocity);
  146638. var tangentVelocity = Vector.dot(tangent, relativeVelocity),
  146639. tangentSpeed = Math.abs(tangentVelocity),
  146640. tangentVelocityDirection = Common.sign(tangentVelocity);
  146641. // raw impulses
  146642. var normalImpulse = (1 + pair.restitution) * normalVelocity,
  146643. normalForce = Common.clamp(pair.separation + normalVelocity, 0, 1) * Resolver._frictionNormalMultiplier;
  146644. // coulomb friction
  146645. var tangentImpulse = tangentVelocity,
  146646. maxFriction = Infinity;
  146647. if (tangentSpeed > pair.friction * pair.frictionStatic * normalForce * timeScaleSquared) {
  146648. maxFriction = tangentSpeed;
  146649. tangentImpulse = Common.clamp(
  146650. pair.friction * tangentVelocityDirection * timeScaleSquared,
  146651. -maxFriction, maxFriction
  146652. );
  146653. }
  146654. // modify impulses accounting for mass, inertia and offset
  146655. var oAcN = Vector.cross(offsetA, normal),
  146656. oBcN = Vector.cross(offsetB, normal),
  146657. share = contactShare / (bodyA.inverseMass + bodyB.inverseMass + bodyA.inverseInertia * oAcN * oAcN + bodyB.inverseInertia * oBcN * oBcN);
  146658. normalImpulse *= share;
  146659. tangentImpulse *= share;
  146660. // handle high velocity and resting collisions separately
  146661. if (normalVelocity < 0 && normalVelocity * normalVelocity > Resolver._restingThresh * timeScaleSquared) {
  146662. // high normal velocity so clear cached contact normal impulse
  146663. contact.normalImpulse = 0;
  146664. } else {
  146665. // solve resting collision constraints using Erin Catto's method (GDC08)
  146666. // impulse constraint tends to 0
  146667. var contactNormalImpulse = contact.normalImpulse;
  146668. contact.normalImpulse = Math.min(contact.normalImpulse + normalImpulse, 0);
  146669. normalImpulse = contact.normalImpulse - contactNormalImpulse;
  146670. }
  146671. // handle high velocity and resting collisions separately
  146672. if (tangentVelocity * tangentVelocity > Resolver._restingThreshTangent * timeScaleSquared) {
  146673. // high tangent velocity so clear cached contact tangent impulse
  146674. contact.tangentImpulse = 0;
  146675. } else {
  146676. // solve resting collision constraints using Erin Catto's method (GDC08)
  146677. // tangent impulse tends to -tangentSpeed or +tangentSpeed
  146678. var contactTangentImpulse = contact.tangentImpulse;
  146679. contact.tangentImpulse = Common.clamp(contact.tangentImpulse + tangentImpulse, -maxFriction, maxFriction);
  146680. tangentImpulse = contact.tangentImpulse - contactTangentImpulse;
  146681. }
  146682. // total impulse from contact
  146683. impulse.x = (normal.x * normalImpulse) + (tangent.x * tangentImpulse);
  146684. impulse.y = (normal.y * normalImpulse) + (tangent.y * tangentImpulse);
  146685. // apply impulse from contact
  146686. if (!(bodyA.isStatic || bodyA.isSleeping)) {
  146687. bodyA.positionPrev.x += impulse.x * bodyA.inverseMass;
  146688. bodyA.positionPrev.y += impulse.y * bodyA.inverseMass;
  146689. bodyA.anglePrev += Vector.cross(offsetA, impulse) * bodyA.inverseInertia;
  146690. }
  146691. if (!(bodyB.isStatic || bodyB.isSleeping)) {
  146692. bodyB.positionPrev.x -= impulse.x * bodyB.inverseMass;
  146693. bodyB.positionPrev.y -= impulse.y * bodyB.inverseMass;
  146694. bodyB.anglePrev -= Vector.cross(offsetB, impulse) * bodyB.inverseInertia;
  146695. }
  146696. }
  146697. }
  146698. };
  146699. })();
  146700. /***/ }),
  146701. /* 1284 */
  146702. /***/ (function(module, exports, __webpack_require__) {
  146703. /**
  146704. * The `Matter.Pairs` module contains methods for creating and manipulating collision pair sets.
  146705. *
  146706. * @class Pairs
  146707. */
  146708. var Pairs = {};
  146709. module.exports = Pairs;
  146710. var Pair = __webpack_require__(451);
  146711. var Common = __webpack_require__(36);
  146712. (function() {
  146713. Pairs._pairMaxIdleLife = 1000;
  146714. /**
  146715. * Creates a new pairs structure.
  146716. * @method create
  146717. * @param {object} options
  146718. * @return {pairs} A new pairs structure
  146719. */
  146720. Pairs.create = function(options) {
  146721. return Common.extend({
  146722. table: {},
  146723. list: [],
  146724. collisionStart: [],
  146725. collisionActive: [],
  146726. collisionEnd: []
  146727. }, options);
  146728. };
  146729. /**
  146730. * Updates pairs given a list of collisions.
  146731. * @method update
  146732. * @param {object} pairs
  146733. * @param {collision[]} collisions
  146734. * @param {number} timestamp
  146735. */
  146736. Pairs.update = function(pairs, collisions, timestamp) {
  146737. var pairsList = pairs.list,
  146738. pairsTable = pairs.table,
  146739. collisionStart = pairs.collisionStart,
  146740. collisionEnd = pairs.collisionEnd,
  146741. collisionActive = pairs.collisionActive,
  146742. collision,
  146743. pairId,
  146744. pair,
  146745. i;
  146746. // clear collision state arrays, but maintain old reference
  146747. collisionStart.length = 0;
  146748. collisionEnd.length = 0;
  146749. collisionActive.length = 0;
  146750. for (i = 0; i < pairsList.length; i++) {
  146751. pairsList[i].confirmedActive = false;
  146752. }
  146753. for (i = 0; i < collisions.length; i++) {
  146754. collision = collisions[i];
  146755. if (collision.collided) {
  146756. pairId = Pair.id(collision.bodyA, collision.bodyB);
  146757. pair = pairsTable[pairId];
  146758. if (pair) {
  146759. // pair already exists (but may or may not be active)
  146760. if (pair.isActive) {
  146761. // pair exists and is active
  146762. collisionActive.push(pair);
  146763. } else {
  146764. // pair exists but was inactive, so a collision has just started again
  146765. collisionStart.push(pair);
  146766. }
  146767. // update the pair
  146768. Pair.update(pair, collision, timestamp);
  146769. pair.confirmedActive = true;
  146770. } else {
  146771. // pair did not exist, create a new pair
  146772. pair = Pair.create(collision, timestamp);
  146773. pairsTable[pairId] = pair;
  146774. // push the new pair
  146775. collisionStart.push(pair);
  146776. pairsList.push(pair);
  146777. }
  146778. }
  146779. }
  146780. // deactivate previously active pairs that are now inactive
  146781. for (i = 0; i < pairsList.length; i++) {
  146782. pair = pairsList[i];
  146783. if (pair.isActive && !pair.confirmedActive) {
  146784. Pair.setActive(pair, false, timestamp);
  146785. collisionEnd.push(pair);
  146786. }
  146787. }
  146788. };
  146789. /**
  146790. * Finds and removes pairs that have been inactive for a set amount of time.
  146791. * @method removeOld
  146792. * @param {object} pairs
  146793. * @param {number} timestamp
  146794. */
  146795. Pairs.removeOld = function(pairs, timestamp) {
  146796. var pairsList = pairs.list,
  146797. pairsTable = pairs.table,
  146798. indexesToRemove = [],
  146799. pair,
  146800. collision,
  146801. pairIndex,
  146802. i;
  146803. for (i = 0; i < pairsList.length; i++) {
  146804. pair = pairsList[i];
  146805. collision = pair.collision;
  146806. // never remove sleeping pairs
  146807. if (collision.bodyA.isSleeping || collision.bodyB.isSleeping) {
  146808. pair.timeUpdated = timestamp;
  146809. continue;
  146810. }
  146811. // if pair is inactive for too long, mark it to be removed
  146812. if (timestamp - pair.timeUpdated > Pairs._pairMaxIdleLife) {
  146813. indexesToRemove.push(i);
  146814. }
  146815. }
  146816. // remove marked pairs
  146817. for (i = 0; i < indexesToRemove.length; i++) {
  146818. pairIndex = indexesToRemove[i] - i;
  146819. pair = pairsList[pairIndex];
  146820. delete pairsTable[pair.id];
  146821. pairsList.splice(pairIndex, 1);
  146822. }
  146823. };
  146824. /**
  146825. * Clears the given pairs structure.
  146826. * @method clear
  146827. * @param {pairs} pairs
  146828. * @return {pairs} pairs
  146829. */
  146830. Pairs.clear = function(pairs) {
  146831. pairs.table = {};
  146832. pairs.list.length = 0;
  146833. pairs.collisionStart.length = 0;
  146834. pairs.collisionActive.length = 0;
  146835. pairs.collisionEnd.length = 0;
  146836. return pairs;
  146837. };
  146838. })();
  146839. /***/ }),
  146840. /* 1285 */
  146841. /***/ (function(module, exports, __webpack_require__) {
  146842. /**
  146843. * The `Matter.Grid` module contains methods for creating and manipulating collision broadphase grid structures.
  146844. *
  146845. * @class Grid
  146846. */
  146847. var Grid = {};
  146848. module.exports = Grid;
  146849. var Pair = __webpack_require__(451);
  146850. var Detector = __webpack_require__(543);
  146851. var Common = __webpack_require__(36);
  146852. (function() {
  146853. /**
  146854. * Creates a new grid.
  146855. * @method create
  146856. * @param {} options
  146857. * @return {grid} A new grid
  146858. */
  146859. Grid.create = function(options) {
  146860. var defaults = {
  146861. controller: Grid,
  146862. detector: Detector.collisions,
  146863. buckets: {},
  146864. pairs: {},
  146865. pairsList: [],
  146866. bucketWidth: 48,
  146867. bucketHeight: 48
  146868. };
  146869. return Common.extend(defaults, options);
  146870. };
  146871. /**
  146872. * The width of a single grid bucket.
  146873. *
  146874. * @property bucketWidth
  146875. * @type number
  146876. * @default 48
  146877. */
  146878. /**
  146879. * The height of a single grid bucket.
  146880. *
  146881. * @property bucketHeight
  146882. * @type number
  146883. * @default 48
  146884. */
  146885. /**
  146886. * Updates the grid.
  146887. * @method update
  146888. * @param {grid} grid
  146889. * @param {body[]} bodies
  146890. * @param {engine} engine
  146891. * @param {boolean} forceUpdate
  146892. */
  146893. Grid.update = function(grid, bodies, engine, forceUpdate) {
  146894. var i, col, row,
  146895. world = engine.world,
  146896. buckets = grid.buckets,
  146897. bucket,
  146898. bucketId,
  146899. gridChanged = false;
  146900. // @if DEBUG
  146901. var metrics = engine.metrics;
  146902. metrics.broadphaseTests = 0;
  146903. // @endif
  146904. for (i = 0; i < bodies.length; i++) {
  146905. var body = bodies[i];
  146906. if (body.isSleeping && !forceUpdate)
  146907. continue;
  146908. // don't update out of world bodies
  146909. if (body.bounds.max.x < world.bounds.min.x || body.bounds.min.x > world.bounds.max.x
  146910. || body.bounds.max.y < world.bounds.min.y || body.bounds.min.y > world.bounds.max.y)
  146911. continue;
  146912. var newRegion = Grid._getRegion(grid, body);
  146913. // if the body has changed grid region
  146914. if (!body.region || newRegion.id !== body.region.id || forceUpdate) {
  146915. // @if DEBUG
  146916. metrics.broadphaseTests += 1;
  146917. // @endif
  146918. if (!body.region || forceUpdate)
  146919. body.region = newRegion;
  146920. var union = Grid._regionUnion(newRegion, body.region);
  146921. // update grid buckets affected by region change
  146922. // iterate over the union of both regions
  146923. for (col = union.startCol; col <= union.endCol; col++) {
  146924. for (row = union.startRow; row <= union.endRow; row++) {
  146925. bucketId = Grid._getBucketId(col, row);
  146926. bucket = buckets[bucketId];
  146927. var isInsideNewRegion = (col >= newRegion.startCol && col <= newRegion.endCol
  146928. && row >= newRegion.startRow && row <= newRegion.endRow);
  146929. var isInsideOldRegion = (col >= body.region.startCol && col <= body.region.endCol
  146930. && row >= body.region.startRow && row <= body.region.endRow);
  146931. // remove from old region buckets
  146932. if (!isInsideNewRegion && isInsideOldRegion) {
  146933. if (isInsideOldRegion) {
  146934. if (bucket)
  146935. Grid._bucketRemoveBody(grid, bucket, body);
  146936. }
  146937. }
  146938. // add to new region buckets
  146939. if (body.region === newRegion || (isInsideNewRegion && !isInsideOldRegion) || forceUpdate) {
  146940. if (!bucket)
  146941. bucket = Grid._createBucket(buckets, bucketId);
  146942. Grid._bucketAddBody(grid, bucket, body);
  146943. }
  146944. }
  146945. }
  146946. // set the new region
  146947. body.region = newRegion;
  146948. // flag changes so we can update pairs
  146949. gridChanged = true;
  146950. }
  146951. }
  146952. // update pairs list only if pairs changed (i.e. a body changed region)
  146953. if (gridChanged)
  146954. grid.pairsList = Grid._createActivePairsList(grid);
  146955. };
  146956. /**
  146957. * Clears the grid.
  146958. * @method clear
  146959. * @param {grid} grid
  146960. */
  146961. Grid.clear = function(grid) {
  146962. grid.buckets = {};
  146963. grid.pairs = {};
  146964. grid.pairsList = [];
  146965. };
  146966. /**
  146967. * Finds the union of two regions.
  146968. * @method _regionUnion
  146969. * @private
  146970. * @param {} regionA
  146971. * @param {} regionB
  146972. * @return {} region
  146973. */
  146974. Grid._regionUnion = function(regionA, regionB) {
  146975. var startCol = Math.min(regionA.startCol, regionB.startCol),
  146976. endCol = Math.max(regionA.endCol, regionB.endCol),
  146977. startRow = Math.min(regionA.startRow, regionB.startRow),
  146978. endRow = Math.max(regionA.endRow, regionB.endRow);
  146979. return Grid._createRegion(startCol, endCol, startRow, endRow);
  146980. };
  146981. /**
  146982. * Gets the region a given body falls in for a given grid.
  146983. * @method _getRegion
  146984. * @private
  146985. * @param {} grid
  146986. * @param {} body
  146987. * @return {} region
  146988. */
  146989. Grid._getRegion = function(grid, body) {
  146990. var bounds = body.bounds,
  146991. startCol = Math.floor(bounds.min.x / grid.bucketWidth),
  146992. endCol = Math.floor(bounds.max.x / grid.bucketWidth),
  146993. startRow = Math.floor(bounds.min.y / grid.bucketHeight),
  146994. endRow = Math.floor(bounds.max.y / grid.bucketHeight);
  146995. return Grid._createRegion(startCol, endCol, startRow, endRow);
  146996. };
  146997. /**
  146998. * Creates a region.
  146999. * @method _createRegion
  147000. * @private
  147001. * @param {} startCol
  147002. * @param {} endCol
  147003. * @param {} startRow
  147004. * @param {} endRow
  147005. * @return {} region
  147006. */
  147007. Grid._createRegion = function(startCol, endCol, startRow, endRow) {
  147008. return {
  147009. id: startCol + ',' + endCol + ',' + startRow + ',' + endRow,
  147010. startCol: startCol,
  147011. endCol: endCol,
  147012. startRow: startRow,
  147013. endRow: endRow
  147014. };
  147015. };
  147016. /**
  147017. * Gets the bucket id at the given position.
  147018. * @method _getBucketId
  147019. * @private
  147020. * @param {} column
  147021. * @param {} row
  147022. * @return {string} bucket id
  147023. */
  147024. Grid._getBucketId = function(column, row) {
  147025. return 'C' + column + 'R' + row;
  147026. };
  147027. /**
  147028. * Creates a bucket.
  147029. * @method _createBucket
  147030. * @private
  147031. * @param {} buckets
  147032. * @param {} bucketId
  147033. * @return {} bucket
  147034. */
  147035. Grid._createBucket = function(buckets, bucketId) {
  147036. var bucket = buckets[bucketId] = [];
  147037. return bucket;
  147038. };
  147039. /**
  147040. * Adds a body to a bucket.
  147041. * @method _bucketAddBody
  147042. * @private
  147043. * @param {} grid
  147044. * @param {} bucket
  147045. * @param {} body
  147046. */
  147047. Grid._bucketAddBody = function(grid, bucket, body) {
  147048. // add new pairs
  147049. for (var i = 0; i < bucket.length; i++) {
  147050. var bodyB = bucket[i];
  147051. if (body.id === bodyB.id || (body.isStatic && bodyB.isStatic))
  147052. continue;
  147053. // keep track of the number of buckets the pair exists in
  147054. // important for Grid.update to work
  147055. var pairId = Pair.id(body, bodyB),
  147056. pair = grid.pairs[pairId];
  147057. if (pair) {
  147058. pair[2] += 1;
  147059. } else {
  147060. grid.pairs[pairId] = [body, bodyB, 1];
  147061. }
  147062. }
  147063. // add to bodies (after pairs, otherwise pairs with self)
  147064. bucket.push(body);
  147065. };
  147066. /**
  147067. * Removes a body from a bucket.
  147068. * @method _bucketRemoveBody
  147069. * @private
  147070. * @param {} grid
  147071. * @param {} bucket
  147072. * @param {} body
  147073. */
  147074. Grid._bucketRemoveBody = function(grid, bucket, body) {
  147075. // remove from bucket
  147076. bucket.splice(Common.indexOf(bucket, body), 1);
  147077. // update pair counts
  147078. for (var i = 0; i < bucket.length; i++) {
  147079. // keep track of the number of buckets the pair exists in
  147080. // important for _createActivePairsList to work
  147081. var bodyB = bucket[i],
  147082. pairId = Pair.id(body, bodyB),
  147083. pair = grid.pairs[pairId];
  147084. if (pair)
  147085. pair[2] -= 1;
  147086. }
  147087. };
  147088. /**
  147089. * Generates a list of the active pairs in the grid.
  147090. * @method _createActivePairsList
  147091. * @private
  147092. * @param {} grid
  147093. * @return [] pairs
  147094. */
  147095. Grid._createActivePairsList = function(grid) {
  147096. var pairKeys,
  147097. pair,
  147098. pairs = [];
  147099. // grid.pairs is used as a hashmap
  147100. pairKeys = Common.keys(grid.pairs);
  147101. // iterate over grid.pairs
  147102. for (var k = 0; k < pairKeys.length; k++) {
  147103. pair = grid.pairs[pairKeys[k]];
  147104. // if pair exists in at least one bucket
  147105. // it is a pair that needs further collision testing so push it
  147106. if (pair[2] > 0) {
  147107. pairs.push(pair);
  147108. } else {
  147109. delete grid.pairs[pairKeys[k]];
  147110. }
  147111. }
  147112. return pairs;
  147113. };
  147114. })();
  147115. /***/ }),
  147116. /* 1286 */
  147117. /***/ (function(module, exports, __webpack_require__) {
  147118. /**
  147119. * The `Matter` module is the top level namespace. It also includes a function for installing plugins on top of the library.
  147120. *
  147121. * @class Matter
  147122. */
  147123. var Matter = {};
  147124. module.exports = Matter;
  147125. var Plugin = __webpack_require__(540);
  147126. var Common = __webpack_require__(36);
  147127. (function() {
  147128. /**
  147129. * The library name.
  147130. * @property name
  147131. * @readOnly
  147132. * @type {String}
  147133. */
  147134. Matter.name = 'matter-js';
  147135. /**
  147136. * The library version.
  147137. * @property version
  147138. * @readOnly
  147139. * @type {String}
  147140. */
  147141. Matter.version = '0.14.2';
  147142. /**
  147143. * A list of plugin dependencies to be installed. These are normally set and installed through `Matter.use`.
  147144. * Alternatively you may set `Matter.uses` manually and install them by calling `Plugin.use(Matter)`.
  147145. * @property uses
  147146. * @type {Array}
  147147. */
  147148. Matter.uses = [];
  147149. /**
  147150. * The plugins that have been installed through `Matter.Plugin.install`. Read only.
  147151. * @property used
  147152. * @readOnly
  147153. * @type {Array}
  147154. */
  147155. Matter.used = [];
  147156. /**
  147157. * Installs the given plugins on the `Matter` namespace.
  147158. * This is a short-hand for `Plugin.use`, see it for more information.
  147159. * Call this function once at the start of your code, with all of the plugins you wish to install as arguments.
  147160. * Avoid calling this function multiple times unless you intend to manually control installation order.
  147161. * @method use
  147162. * @param ...plugin {Function} The plugin(s) to install on `base` (multi-argument).
  147163. */
  147164. Matter.use = function() {
  147165. Plugin.use(Matter, Array.prototype.slice.call(arguments));
  147166. };
  147167. /**
  147168. * Chains a function to excute before the original function on the given `path` relative to `Matter`.
  147169. * See also docs for `Common.chain`.
  147170. * @method before
  147171. * @param {string} path The path relative to `Matter`
  147172. * @param {function} func The function to chain before the original
  147173. * @return {function} The chained function that replaced the original
  147174. */
  147175. Matter.before = function(path, func) {
  147176. path = path.replace(/^Matter./, '');
  147177. return Common.chainPathBefore(Matter, path, func);
  147178. };
  147179. /**
  147180. * Chains a function to excute after the original function on the given `path` relative to `Matter`.
  147181. * See also docs for `Common.chain`.
  147182. * @method after
  147183. * @param {string} path The path relative to `Matter`
  147184. * @param {function} func The function to chain after the original
  147185. * @return {function} The chained function that replaced the original
  147186. */
  147187. Matter.after = function(path, func) {
  147188. path = path.replace(/^Matter./, '');
  147189. return Common.chainPathAfter(Matter, path, func);
  147190. };
  147191. })();
  147192. /***/ }),
  147193. /* 1287 */
  147194. /***/ (function(module, exports, __webpack_require__) {
  147195. /**
  147196. * @author Richard Davey <rich@photonstorm.com>
  147197. * @copyright 2019 Photon Storm Ltd.
  147198. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  147199. */
  147200. var AnimationComponent = __webpack_require__(460);
  147201. var Class = __webpack_require__(0);
  147202. var Components = __webpack_require__(452);
  147203. var GameObject = __webpack_require__(18);
  147204. var GetFastValue = __webpack_require__(2);
  147205. var Pipeline = __webpack_require__(200);
  147206. var Sprite = __webpack_require__(67);
  147207. var Vector2 = __webpack_require__(3);
  147208. /**
  147209. * @classdesc
  147210. * A Matter Physics Sprite Game Object.
  147211. *
  147212. * A Sprite Game Object is used for the display of both static and animated images in your game.
  147213. * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled
  147214. * and animated.
  147215. *
  147216. * The main difference between a Sprite and an Image Game Object is that you cannot animate Images.
  147217. * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation
  147218. * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases.
  147219. *
  147220. * @class Sprite
  147221. * @extends Phaser.GameObjects.Sprite
  147222. * @memberof Phaser.Physics.Matter
  147223. * @constructor
  147224. * @since 3.0.0
  147225. *
  147226. * @extends Phaser.Physics.Matter.Components.Bounce
  147227. * @extends Phaser.Physics.Matter.Components.Collision
  147228. * @extends Phaser.Physics.Matter.Components.Force
  147229. * @extends Phaser.Physics.Matter.Components.Friction
  147230. * @extends Phaser.Physics.Matter.Components.Gravity
  147231. * @extends Phaser.Physics.Matter.Components.Mass
  147232. * @extends Phaser.Physics.Matter.Components.Sensor
  147233. * @extends Phaser.Physics.Matter.Components.SetBody
  147234. * @extends Phaser.Physics.Matter.Components.Sleep
  147235. * @extends Phaser.Physics.Matter.Components.Static
  147236. * @extends Phaser.Physics.Matter.Components.Transform
  147237. * @extends Phaser.Physics.Matter.Components.Velocity
  147238. * @extends Phaser.GameObjects.Components.Alpha
  147239. * @extends Phaser.GameObjects.Components.BlendMode
  147240. * @extends Phaser.GameObjects.Components.Depth
  147241. * @extends Phaser.GameObjects.Components.Flip
  147242. * @extends Phaser.GameObjects.Components.GetBounds
  147243. * @extends Phaser.GameObjects.Components.Origin
  147244. * @extends Phaser.GameObjects.Components.Pipeline
  147245. * @extends Phaser.GameObjects.Components.ScaleMode
  147246. * @extends Phaser.GameObjects.Components.ScrollFactor
  147247. * @extends Phaser.GameObjects.Components.Size
  147248. * @extends Phaser.GameObjects.Components.Texture
  147249. * @extends Phaser.GameObjects.Components.Tint
  147250. * @extends Phaser.GameObjects.Components.Transform
  147251. * @extends Phaser.GameObjects.Components.Visible
  147252. *
  147253. * @param {Phaser.Physics.Matter.World} world - [description]
  147254. * @param {number} x - The horizontal position of this Game Object in the world.
  147255. * @param {number} y - The vertical position of this Game Object in the world.
  147256. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  147257. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  147258. * @param {object} [options={}] - Matter.js configuration object.
  147259. */
  147260. var MatterSprite = new Class({
  147261. Extends: Sprite,
  147262. Mixins: [
  147263. Components.Bounce,
  147264. Components.Collision,
  147265. Components.Force,
  147266. Components.Friction,
  147267. Components.Gravity,
  147268. Components.Mass,
  147269. Components.Sensor,
  147270. Components.SetBody,
  147271. Components.Sleep,
  147272. Components.Static,
  147273. Components.Transform,
  147274. Components.Velocity,
  147275. Pipeline
  147276. ],
  147277. initialize:
  147278. function MatterSprite (world, x, y, texture, frame, options)
  147279. {
  147280. GameObject.call(this, world.scene, 'Sprite');
  147281. this.anims = new AnimationComponent(this);
  147282. this.setTexture(texture, frame);
  147283. this.setSizeToFrame();
  147284. this.setOrigin();
  147285. /**
  147286. * [description]
  147287. *
  147288. * @name Phaser.Physics.Matter.Sprite#world
  147289. * @type {Phaser.Physics.Matter.World}
  147290. * @since 3.0.0
  147291. */
  147292. this.world = world;
  147293. /**
  147294. * [description]
  147295. *
  147296. * @name Phaser.Physics.Matter.Sprite#_tempVec2
  147297. * @type {Phaser.Math.Vector2}
  147298. * @private
  147299. * @since 3.0.0
  147300. */
  147301. this._tempVec2 = new Vector2(x, y);
  147302. var shape = GetFastValue(options, 'shape', null);
  147303. if (shape)
  147304. {
  147305. this.setBody(shape, options);
  147306. }
  147307. else
  147308. {
  147309. this.setRectangle(this.width, this.height, options);
  147310. }
  147311. this.setPosition(x, y);
  147312. this.initPipeline('TextureTintPipeline');
  147313. }
  147314. });
  147315. module.exports = MatterSprite;
  147316. /***/ }),
  147317. /* 1288 */
  147318. /***/ (function(module, exports, __webpack_require__) {
  147319. /**
  147320. * @author Richard Davey <rich@photonstorm.com>
  147321. * @copyright 2019 Photon Storm Ltd.
  147322. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  147323. */
  147324. var Class = __webpack_require__(0);
  147325. var Components = __webpack_require__(452);
  147326. var GameObject = __webpack_require__(18);
  147327. var GetFastValue = __webpack_require__(2);
  147328. var Image = __webpack_require__(93);
  147329. var Pipeline = __webpack_require__(200);
  147330. var Vector2 = __webpack_require__(3);
  147331. /**
  147332. * @classdesc
  147333. * A Matter Physics Image Game Object.
  147334. *
  147335. * An Image is a light-weight Game Object useful for the display of static images in your game,
  147336. * such as logos, backgrounds, scenery or other non-animated elements. Images can have input
  147337. * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an
  147338. * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component.
  147339. *
  147340. * @class Image
  147341. * @extends Phaser.GameObjects.Image
  147342. * @memberof Phaser.Physics.Matter
  147343. * @constructor
  147344. * @since 3.0.0
  147345. *
  147346. * @extends Phaser.Physics.Matter.Components.Bounce
  147347. * @extends Phaser.Physics.Matter.Components.Collision
  147348. * @extends Phaser.Physics.Matter.Components.Force
  147349. * @extends Phaser.Physics.Matter.Components.Friction
  147350. * @extends Phaser.Physics.Matter.Components.Gravity
  147351. * @extends Phaser.Physics.Matter.Components.Mass
  147352. * @extends Phaser.Physics.Matter.Components.Sensor
  147353. * @extends Phaser.Physics.Matter.Components.SetBody
  147354. * @extends Phaser.Physics.Matter.Components.Sleep
  147355. * @extends Phaser.Physics.Matter.Components.Static
  147356. * @extends Phaser.Physics.Matter.Components.Transform
  147357. * @extends Phaser.Physics.Matter.Components.Velocity
  147358. * @extends Phaser.GameObjects.Components.Alpha
  147359. * @extends Phaser.GameObjects.Components.BlendMode
  147360. * @extends Phaser.GameObjects.Components.Depth
  147361. * @extends Phaser.GameObjects.Components.Flip
  147362. * @extends Phaser.GameObjects.Components.GetBounds
  147363. * @extends Phaser.GameObjects.Components.Origin
  147364. * @extends Phaser.GameObjects.Components.Pipeline
  147365. * @extends Phaser.GameObjects.Components.ScaleMode
  147366. * @extends Phaser.GameObjects.Components.ScrollFactor
  147367. * @extends Phaser.GameObjects.Components.Size
  147368. * @extends Phaser.GameObjects.Components.Texture
  147369. * @extends Phaser.GameObjects.Components.Tint
  147370. * @extends Phaser.GameObjects.Components.Transform
  147371. * @extends Phaser.GameObjects.Components.Visible
  147372. *
  147373. * @param {Phaser.Physics.Matter.World} world - [description]
  147374. * @param {number} x - The horizontal position of this Game Object in the world.
  147375. * @param {number} y - The vertical position of this Game Object in the world.
  147376. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  147377. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  147378. * @param {object} [options={}] - Matter.js configuration object.
  147379. */
  147380. var MatterImage = new Class({
  147381. Extends: Image,
  147382. Mixins: [
  147383. Components.Bounce,
  147384. Components.Collision,
  147385. Components.Force,
  147386. Components.Friction,
  147387. Components.Gravity,
  147388. Components.Mass,
  147389. Components.Sensor,
  147390. Components.SetBody,
  147391. Components.Sleep,
  147392. Components.Static,
  147393. Components.Transform,
  147394. Components.Velocity,
  147395. Pipeline
  147396. ],
  147397. initialize:
  147398. function MatterImage (world, x, y, texture, frame, options)
  147399. {
  147400. GameObject.call(this, world.scene, 'Image');
  147401. this.setTexture(texture, frame);
  147402. this.setSizeToFrame();
  147403. this.setOrigin();
  147404. /**
  147405. * [description]
  147406. *
  147407. * @name Phaser.Physics.Matter.Image#world
  147408. * @type {Phaser.Physics.Matter.World}
  147409. * @since 3.0.0
  147410. */
  147411. this.world = world;
  147412. /**
  147413. * [description]
  147414. *
  147415. * @name Phaser.Physics.Matter.Image#_tempVec2
  147416. * @type {Phaser.Math.Vector2}
  147417. * @private
  147418. * @since 3.0.0
  147419. */
  147420. this._tempVec2 = new Vector2(x, y);
  147421. var shape = GetFastValue(options, 'shape', null);
  147422. if (shape)
  147423. {
  147424. this.setBody(shape, options);
  147425. }
  147426. else
  147427. {
  147428. this.setRectangle(this.width, this.height, options);
  147429. }
  147430. this.setPosition(x, y);
  147431. this.initPipeline('TextureTintPipeline');
  147432. }
  147433. });
  147434. module.exports = MatterImage;
  147435. /***/ }),
  147436. /* 1289 */
  147437. /***/ (function(module, exports, __webpack_require__) {
  147438. /**
  147439. * The `Matter.Composites` module contains factory methods for creating composite bodies
  147440. * with commonly used configurations (such as stacks and chains).
  147441. *
  147442. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  147443. *
  147444. * @class Composites
  147445. */
  147446. var Composites = {};
  147447. module.exports = Composites;
  147448. var Composite = __webpack_require__(149);
  147449. var Constraint = __webpack_require__(209);
  147450. var Common = __webpack_require__(36);
  147451. var Body = __webpack_require__(72);
  147452. var Bodies = __webpack_require__(138);
  147453. (function() {
  147454. /**
  147455. * Create a new composite containing bodies created in the callback in a grid arrangement.
  147456. * This function uses the body's bounds to prevent overlaps.
  147457. * @method stack
  147458. * @param {number} xx
  147459. * @param {number} yy
  147460. * @param {number} columns
  147461. * @param {number} rows
  147462. * @param {number} columnGap
  147463. * @param {number} rowGap
  147464. * @param {function} callback
  147465. * @return {composite} A new composite containing objects created in the callback
  147466. */
  147467. Composites.stack = function(xx, yy, columns, rows, columnGap, rowGap, callback) {
  147468. var stack = Composite.create({ label: 'Stack' }),
  147469. x = xx,
  147470. y = yy,
  147471. lastBody,
  147472. i = 0;
  147473. for (var row = 0; row < rows; row++) {
  147474. var maxHeight = 0;
  147475. for (var column = 0; column < columns; column++) {
  147476. var body = callback(x, y, column, row, lastBody, i);
  147477. if (body) {
  147478. var bodyHeight = body.bounds.max.y - body.bounds.min.y,
  147479. bodyWidth = body.bounds.max.x - body.bounds.min.x;
  147480. if (bodyHeight > maxHeight)
  147481. maxHeight = bodyHeight;
  147482. Body.translate(body, { x: bodyWidth * 0.5, y: bodyHeight * 0.5 });
  147483. x = body.bounds.max.x + columnGap;
  147484. Composite.addBody(stack, body);
  147485. lastBody = body;
  147486. i += 1;
  147487. } else {
  147488. x += columnGap;
  147489. }
  147490. }
  147491. y += maxHeight + rowGap;
  147492. x = xx;
  147493. }
  147494. return stack;
  147495. };
  147496. /**
  147497. * Chains all bodies in the given composite together using constraints.
  147498. * @method chain
  147499. * @param {composite} composite
  147500. * @param {number} xOffsetA
  147501. * @param {number} yOffsetA
  147502. * @param {number} xOffsetB
  147503. * @param {number} yOffsetB
  147504. * @param {object} options
  147505. * @return {composite} A new composite containing objects chained together with constraints
  147506. */
  147507. Composites.chain = function(composite, xOffsetA, yOffsetA, xOffsetB, yOffsetB, options) {
  147508. var bodies = composite.bodies;
  147509. for (var i = 1; i < bodies.length; i++) {
  147510. var bodyA = bodies[i - 1],
  147511. bodyB = bodies[i],
  147512. bodyAHeight = bodyA.bounds.max.y - bodyA.bounds.min.y,
  147513. bodyAWidth = bodyA.bounds.max.x - bodyA.bounds.min.x,
  147514. bodyBHeight = bodyB.bounds.max.y - bodyB.bounds.min.y,
  147515. bodyBWidth = bodyB.bounds.max.x - bodyB.bounds.min.x;
  147516. var defaults = {
  147517. bodyA: bodyA,
  147518. pointA: { x: bodyAWidth * xOffsetA, y: bodyAHeight * yOffsetA },
  147519. bodyB: bodyB,
  147520. pointB: { x: bodyBWidth * xOffsetB, y: bodyBHeight * yOffsetB }
  147521. };
  147522. var constraint = Common.extend(defaults, options);
  147523. Composite.addConstraint(composite, Constraint.create(constraint));
  147524. }
  147525. composite.label += ' Chain';
  147526. return composite;
  147527. };
  147528. /**
  147529. * Connects bodies in the composite with constraints in a grid pattern, with optional cross braces.
  147530. * @method mesh
  147531. * @param {composite} composite
  147532. * @param {number} columns
  147533. * @param {number} rows
  147534. * @param {boolean} crossBrace
  147535. * @param {object} options
  147536. * @return {composite} The composite containing objects meshed together with constraints
  147537. */
  147538. Composites.mesh = function(composite, columns, rows, crossBrace, options) {
  147539. var bodies = composite.bodies,
  147540. row,
  147541. col,
  147542. bodyA,
  147543. bodyB,
  147544. bodyC;
  147545. for (row = 0; row < rows; row++) {
  147546. for (col = 1; col < columns; col++) {
  147547. bodyA = bodies[(col - 1) + (row * columns)];
  147548. bodyB = bodies[col + (row * columns)];
  147549. Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyA, bodyB: bodyB }, options)));
  147550. }
  147551. if (row > 0) {
  147552. for (col = 0; col < columns; col++) {
  147553. bodyA = bodies[col + ((row - 1) * columns)];
  147554. bodyB = bodies[col + (row * columns)];
  147555. Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyA, bodyB: bodyB }, options)));
  147556. if (crossBrace && col > 0) {
  147557. bodyC = bodies[(col - 1) + ((row - 1) * columns)];
  147558. Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyC, bodyB: bodyB }, options)));
  147559. }
  147560. if (crossBrace && col < columns - 1) {
  147561. bodyC = bodies[(col + 1) + ((row - 1) * columns)];
  147562. Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyC, bodyB: bodyB }, options)));
  147563. }
  147564. }
  147565. }
  147566. }
  147567. composite.label += ' Mesh';
  147568. return composite;
  147569. };
  147570. /**
  147571. * Create a new composite containing bodies created in the callback in a pyramid arrangement.
  147572. * This function uses the body's bounds to prevent overlaps.
  147573. * @method pyramid
  147574. * @param {number} xx
  147575. * @param {number} yy
  147576. * @param {number} columns
  147577. * @param {number} rows
  147578. * @param {number} columnGap
  147579. * @param {number} rowGap
  147580. * @param {function} callback
  147581. * @return {composite} A new composite containing objects created in the callback
  147582. */
  147583. Composites.pyramid = function(xx, yy, columns, rows, columnGap, rowGap, callback) {
  147584. return Composites.stack(xx, yy, columns, rows, columnGap, rowGap, function(x, y, column, row, lastBody, i) {
  147585. var actualRows = Math.min(rows, Math.ceil(columns / 2)),
  147586. lastBodyWidth = lastBody ? lastBody.bounds.max.x - lastBody.bounds.min.x : 0;
  147587. if (row > actualRows)
  147588. return;
  147589. // reverse row order
  147590. row = actualRows - row;
  147591. var start = row,
  147592. end = columns - 1 - row;
  147593. if (column < start || column > end)
  147594. return;
  147595. // retroactively fix the first body's position, since width was unknown
  147596. if (i === 1) {
  147597. Body.translate(lastBody, { x: (column + (columns % 2 === 1 ? 1 : -1)) * lastBodyWidth, y: 0 });
  147598. }
  147599. var xOffset = lastBody ? column * lastBodyWidth : 0;
  147600. return callback(xx + xOffset + column * columnGap, y, column, row, lastBody, i);
  147601. });
  147602. };
  147603. /**
  147604. * Creates a composite with a Newton's Cradle setup of bodies and constraints.
  147605. * @method newtonsCradle
  147606. * @param {number} xx
  147607. * @param {number} yy
  147608. * @param {number} number
  147609. * @param {number} size
  147610. * @param {number} length
  147611. * @return {composite} A new composite newtonsCradle body
  147612. */
  147613. Composites.newtonsCradle = function(xx, yy, number, size, length) {
  147614. var newtonsCradle = Composite.create({ label: 'Newtons Cradle' });
  147615. for (var i = 0; i < number; i++) {
  147616. var separation = 1.9,
  147617. circle = Bodies.circle(xx + i * (size * separation), yy + length, size,
  147618. { inertia: Infinity, restitution: 1, friction: 0, frictionAir: 0.0001, slop: 1 }),
  147619. constraint = Constraint.create({ pointA: { x: xx + i * (size * separation), y: yy }, bodyB: circle });
  147620. Composite.addBody(newtonsCradle, circle);
  147621. Composite.addConstraint(newtonsCradle, constraint);
  147622. }
  147623. return newtonsCradle;
  147624. };
  147625. /**
  147626. * Creates a composite with simple car setup of bodies and constraints.
  147627. * @method car
  147628. * @param {number} xx
  147629. * @param {number} yy
  147630. * @param {number} width
  147631. * @param {number} height
  147632. * @param {number} wheelSize
  147633. * @return {composite} A new composite car body
  147634. */
  147635. Composites.car = function(xx, yy, width, height, wheelSize) {
  147636. var group = Body.nextGroup(true),
  147637. wheelBase = 20,
  147638. wheelAOffset = -width * 0.5 + wheelBase,
  147639. wheelBOffset = width * 0.5 - wheelBase,
  147640. wheelYOffset = 0;
  147641. var car = Composite.create({ label: 'Car' }),
  147642. body = Bodies.rectangle(xx, yy, width, height, {
  147643. collisionFilter: {
  147644. group: group
  147645. },
  147646. chamfer: {
  147647. radius: height * 0.5
  147648. },
  147649. density: 0.0002
  147650. });
  147651. var wheelA = Bodies.circle(xx + wheelAOffset, yy + wheelYOffset, wheelSize, {
  147652. collisionFilter: {
  147653. group: group
  147654. },
  147655. friction: 0.8
  147656. });
  147657. var wheelB = Bodies.circle(xx + wheelBOffset, yy + wheelYOffset, wheelSize, {
  147658. collisionFilter: {
  147659. group: group
  147660. },
  147661. friction: 0.8
  147662. });
  147663. var axelA = Constraint.create({
  147664. bodyB: body,
  147665. pointB: { x: wheelAOffset, y: wheelYOffset },
  147666. bodyA: wheelA,
  147667. stiffness: 1,
  147668. length: 0
  147669. });
  147670. var axelB = Constraint.create({
  147671. bodyB: body,
  147672. pointB: { x: wheelBOffset, y: wheelYOffset },
  147673. bodyA: wheelB,
  147674. stiffness: 1,
  147675. length: 0
  147676. });
  147677. Composite.addBody(car, body);
  147678. Composite.addBody(car, wheelA);
  147679. Composite.addBody(car, wheelB);
  147680. Composite.addConstraint(car, axelA);
  147681. Composite.addConstraint(car, axelB);
  147682. return car;
  147683. };
  147684. /**
  147685. * Creates a simple soft body like object.
  147686. * @method softBody
  147687. * @param {number} xx
  147688. * @param {number} yy
  147689. * @param {number} columns
  147690. * @param {number} rows
  147691. * @param {number} columnGap
  147692. * @param {number} rowGap
  147693. * @param {boolean} crossBrace
  147694. * @param {number} particleRadius
  147695. * @param {} particleOptions
  147696. * @param {} constraintOptions
  147697. * @return {composite} A new composite softBody
  147698. */
  147699. Composites.softBody = function(xx, yy, columns, rows, columnGap, rowGap, crossBrace, particleRadius, particleOptions, constraintOptions) {
  147700. particleOptions = Common.extend({ inertia: Infinity }, particleOptions);
  147701. constraintOptions = Common.extend({ stiffness: 0.2, render: { type: 'line', anchors: false } }, constraintOptions);
  147702. var softBody = Composites.stack(xx, yy, columns, rows, columnGap, rowGap, function(x, y) {
  147703. return Bodies.circle(x, y, particleRadius, particleOptions);
  147704. });
  147705. Composites.mesh(softBody, columns, rows, crossBrace, constraintOptions);
  147706. softBody.label = 'Soft Body';
  147707. return softBody;
  147708. };
  147709. })();
  147710. /***/ }),
  147711. /* 1290 */
  147712. /***/ (function(module, exports) {
  147713. /**
  147714. * @author Stefan Hedman <schteppe@gmail.com> (http://steffe.se)
  147715. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  147716. */
  147717. // v0.3.0
  147718. module.exports = {
  147719. decomp: polygonDecomp,
  147720. quickDecomp: polygonQuickDecomp,
  147721. isSimple: polygonIsSimple,
  147722. removeCollinearPoints: polygonRemoveCollinearPoints,
  147723. removeDuplicatePoints: polygonRemoveDuplicatePoints,
  147724. makeCCW: polygonMakeCCW
  147725. };
  147726. /**
  147727. * Compute the intersection between two lines.
  147728. * @static
  147729. * @method lineInt
  147730. * @param {Array} l1 Line vector 1
  147731. * @param {Array} l2 Line vector 2
  147732. * @param {Number} precision Precision to use when checking if the lines are parallel
  147733. * @return {Array} The intersection point.
  147734. */
  147735. function lineInt(l1,l2,precision){
  147736. precision = precision || 0;
  147737. var i = [0,0]; // point
  147738. var a1, b1, c1, a2, b2, c2, det; // scalars
  147739. a1 = l1[1][1] - l1[0][1];
  147740. b1 = l1[0][0] - l1[1][0];
  147741. c1 = a1 * l1[0][0] + b1 * l1[0][1];
  147742. a2 = l2[1][1] - l2[0][1];
  147743. b2 = l2[0][0] - l2[1][0];
  147744. c2 = a2 * l2[0][0] + b2 * l2[0][1];
  147745. det = a1 * b2 - a2*b1;
  147746. if (!scalar_eq(det, 0, precision)) { // lines are not parallel
  147747. i[0] = (b2 * c1 - b1 * c2) / det;
  147748. i[1] = (a1 * c2 - a2 * c1) / det;
  147749. }
  147750. return i;
  147751. }
  147752. /**
  147753. * Checks if two line segments intersects.
  147754. * @method segmentsIntersect
  147755. * @param {Array} p1 The start vertex of the first line segment.
  147756. * @param {Array} p2 The end vertex of the first line segment.
  147757. * @param {Array} q1 The start vertex of the second line segment.
  147758. * @param {Array} q2 The end vertex of the second line segment.
  147759. * @return {Boolean} True if the two line segments intersect
  147760. */
  147761. function lineSegmentsIntersect(p1, p2, q1, q2){
  147762. var dx = p2[0] - p1[0];
  147763. var dy = p2[1] - p1[1];
  147764. var da = q2[0] - q1[0];
  147765. var db = q2[1] - q1[1];
  147766. // segments are parallel
  147767. if((da*dy - db*dx) === 0){
  147768. return false;
  147769. }
  147770. var s = (dx * (q1[1] - p1[1]) + dy * (p1[0] - q1[0])) / (da * dy - db * dx);
  147771. var t = (da * (p1[1] - q1[1]) + db * (q1[0] - p1[0])) / (db * dx - da * dy);
  147772. return (s>=0 && s<=1 && t>=0 && t<=1);
  147773. }
  147774. /**
  147775. * Get the area of a triangle spanned by the three given points. Note that the area will be negative if the points are not given in counter-clockwise order.
  147776. * @static
  147777. * @method area
  147778. * @param {Array} a
  147779. * @param {Array} b
  147780. * @param {Array} c
  147781. * @return {Number}
  147782. */
  147783. function triangleArea(a,b,c){
  147784. return (((b[0] - a[0])*(c[1] - a[1]))-((c[0] - a[0])*(b[1] - a[1])));
  147785. }
  147786. function isLeft(a,b,c){
  147787. return triangleArea(a,b,c) > 0;
  147788. }
  147789. function isLeftOn(a,b,c) {
  147790. return triangleArea(a, b, c) >= 0;
  147791. }
  147792. function isRight(a,b,c) {
  147793. return triangleArea(a, b, c) < 0;
  147794. }
  147795. function isRightOn(a,b,c) {
  147796. return triangleArea(a, b, c) <= 0;
  147797. }
  147798. var tmpPoint1 = [],
  147799. tmpPoint2 = [];
  147800. /**
  147801. * Check if three points are collinear
  147802. * @method collinear
  147803. * @param {Array} a
  147804. * @param {Array} b
  147805. * @param {Array} c
  147806. * @param {Number} [thresholdAngle=0] Threshold angle to use when comparing the vectors. The function will return true if the angle between the resulting vectors is less than this value. Use zero for max precision.
  147807. * @return {Boolean}
  147808. */
  147809. function collinear(a,b,c,thresholdAngle) {
  147810. if(!thresholdAngle){
  147811. return triangleArea(a, b, c) === 0;
  147812. } else {
  147813. var ab = tmpPoint1,
  147814. bc = tmpPoint2;
  147815. ab[0] = b[0]-a[0];
  147816. ab[1] = b[1]-a[1];
  147817. bc[0] = c[0]-b[0];
  147818. bc[1] = c[1]-b[1];
  147819. var dot = ab[0]*bc[0] + ab[1]*bc[1],
  147820. magA = Math.sqrt(ab[0]*ab[0] + ab[1]*ab[1]),
  147821. magB = Math.sqrt(bc[0]*bc[0] + bc[1]*bc[1]),
  147822. angle = Math.acos(dot/(magA*magB));
  147823. return angle < thresholdAngle;
  147824. }
  147825. }
  147826. function sqdist(a,b){
  147827. var dx = b[0] - a[0];
  147828. var dy = b[1] - a[1];
  147829. return dx * dx + dy * dy;
  147830. }
  147831. /**
  147832. * Get a vertex at position i. It does not matter if i is out of bounds, this function will just cycle.
  147833. * @method at
  147834. * @param {Number} i
  147835. * @return {Array}
  147836. */
  147837. function polygonAt(polygon, i){
  147838. var s = polygon.length;
  147839. return polygon[i < 0 ? i % s + s : i % s];
  147840. }
  147841. /**
  147842. * Clear the polygon data
  147843. * @method clear
  147844. * @return {Array}
  147845. */
  147846. function polygonClear(polygon){
  147847. polygon.length = 0;
  147848. }
  147849. /**
  147850. * Append points "from" to "to"-1 from an other polygon "poly" onto this one.
  147851. * @method append
  147852. * @param {Polygon} poly The polygon to get points from.
  147853. * @param {Number} from The vertex index in "poly".
  147854. * @param {Number} to The end vertex index in "poly". Note that this vertex is NOT included when appending.
  147855. * @return {Array}
  147856. */
  147857. function polygonAppend(polygon, poly, from, to){
  147858. for(var i=from; i<to; i++){
  147859. polygon.push(poly[i]);
  147860. }
  147861. }
  147862. /**
  147863. * Make sure that the polygon vertices are ordered counter-clockwise.
  147864. * @method makeCCW
  147865. */
  147866. function polygonMakeCCW(polygon){
  147867. var br = 0,
  147868. v = polygon;
  147869. // find bottom right point
  147870. for (var i = 1; i < polygon.length; ++i) {
  147871. if (v[i][1] < v[br][1] || (v[i][1] === v[br][1] && v[i][0] > v[br][0])) {
  147872. br = i;
  147873. }
  147874. }
  147875. // reverse poly if clockwise
  147876. if (!isLeft(polygonAt(polygon, br - 1), polygonAt(polygon, br), polygonAt(polygon, br + 1))) {
  147877. polygonReverse(polygon);
  147878. return true;
  147879. } else {
  147880. return false;
  147881. }
  147882. }
  147883. /**
  147884. * Reverse the vertices in the polygon
  147885. * @method reverse
  147886. */
  147887. function polygonReverse(polygon){
  147888. var tmp = [];
  147889. var N = polygon.length;
  147890. for(var i=0; i!==N; i++){
  147891. tmp.push(polygon.pop());
  147892. }
  147893. for(var i=0; i!==N; i++){
  147894. polygon[i] = tmp[i];
  147895. }
  147896. }
  147897. /**
  147898. * Check if a point in the polygon is a reflex point
  147899. * @method isReflex
  147900. * @param {Number} i
  147901. * @return {Boolean}
  147902. */
  147903. function polygonIsReflex(polygon, i){
  147904. return isRight(polygonAt(polygon, i - 1), polygonAt(polygon, i), polygonAt(polygon, i + 1));
  147905. }
  147906. var tmpLine1=[],
  147907. tmpLine2=[];
  147908. /**
  147909. * Check if two vertices in the polygon can see each other
  147910. * @method canSee
  147911. * @param {Number} a Vertex index 1
  147912. * @param {Number} b Vertex index 2
  147913. * @return {Boolean}
  147914. */
  147915. function polygonCanSee(polygon, a,b) {
  147916. var p, dist, l1=tmpLine1, l2=tmpLine2;
  147917. if (isLeftOn(polygonAt(polygon, a + 1), polygonAt(polygon, a), polygonAt(polygon, b)) && isRightOn(polygonAt(polygon, a - 1), polygonAt(polygon, a), polygonAt(polygon, b))) {
  147918. return false;
  147919. }
  147920. dist = sqdist(polygonAt(polygon, a), polygonAt(polygon, b));
  147921. for (var i = 0; i !== polygon.length; ++i) { // for each edge
  147922. if ((i + 1) % polygon.length === a || i === a){ // ignore incident edges
  147923. continue;
  147924. }
  147925. if (isLeftOn(polygonAt(polygon, a), polygonAt(polygon, b), polygonAt(polygon, i + 1)) && isRightOn(polygonAt(polygon, a), polygonAt(polygon, b), polygonAt(polygon, i))) { // if diag intersects an edge
  147926. l1[0] = polygonAt(polygon, a);
  147927. l1[1] = polygonAt(polygon, b);
  147928. l2[0] = polygonAt(polygon, i);
  147929. l2[1] = polygonAt(polygon, i + 1);
  147930. p = lineInt(l1,l2);
  147931. if (sqdist(polygonAt(polygon, a), p) < dist) { // if edge is blocking visibility to b
  147932. return false;
  147933. }
  147934. }
  147935. }
  147936. return true;
  147937. }
  147938. /**
  147939. * Check if two vertices in the polygon can see each other
  147940. * @method canSee2
  147941. * @param {Number} a Vertex index 1
  147942. * @param {Number} b Vertex index 2
  147943. * @return {Boolean}
  147944. */
  147945. function polygonCanSee2(polygon, a,b) {
  147946. // for each edge
  147947. for (var i = 0; i !== polygon.length; ++i) {
  147948. // ignore incident edges
  147949. if (i === a || i === b || (i + 1) % polygon.length === a || (i + 1) % polygon.length === b){
  147950. continue;
  147951. }
  147952. if( lineSegmentsIntersect(polygonAt(polygon, a), polygonAt(polygon, b), polygonAt(polygon, i), polygonAt(polygon, i+1)) ){
  147953. return false;
  147954. }
  147955. }
  147956. return true;
  147957. }
  147958. /**
  147959. * Copy the polygon from vertex i to vertex j.
  147960. * @method copy
  147961. * @param {Number} i
  147962. * @param {Number} j
  147963. * @param {Polygon} [targetPoly] Optional target polygon to save in.
  147964. * @return {Polygon} The resulting copy.
  147965. */
  147966. function polygonCopy(polygon, i,j,targetPoly){
  147967. var p = targetPoly || [];
  147968. polygonClear(p);
  147969. if (i < j) {
  147970. // Insert all vertices from i to j
  147971. for(var k=i; k<=j; k++){
  147972. p.push(polygon[k]);
  147973. }
  147974. } else {
  147975. // Insert vertices 0 to j
  147976. for(var k=0; k<=j; k++){
  147977. p.push(polygon[k]);
  147978. }
  147979. // Insert vertices i to end
  147980. for(var k=i; k<polygon.length; k++){
  147981. p.push(polygon[k]);
  147982. }
  147983. }
  147984. return p;
  147985. }
  147986. /**
  147987. * Decomposes the polygon into convex pieces. Returns a list of edges [[p1,p2],[p2,p3],...] that cuts the polygon.
  147988. * Note that this algorithm has complexity O(N^4) and will be very slow for polygons with many vertices.
  147989. * @method getCutEdges
  147990. * @return {Array}
  147991. */
  147992. function polygonGetCutEdges(polygon) {
  147993. var min=[], tmp1=[], tmp2=[], tmpPoly = [];
  147994. var nDiags = Number.MAX_VALUE;
  147995. for (var i = 0; i < polygon.length; ++i) {
  147996. if (polygonIsReflex(polygon, i)) {
  147997. for (var j = 0; j < polygon.length; ++j) {
  147998. if (polygonCanSee(polygon, i, j)) {
  147999. tmp1 = polygonGetCutEdges(polygonCopy(polygon, i, j, tmpPoly));
  148000. tmp2 = polygonGetCutEdges(polygonCopy(polygon, j, i, tmpPoly));
  148001. for(var k=0; k<tmp2.length; k++){
  148002. tmp1.push(tmp2[k]);
  148003. }
  148004. if (tmp1.length < nDiags) {
  148005. min = tmp1;
  148006. nDiags = tmp1.length;
  148007. min.push([polygonAt(polygon, i), polygonAt(polygon, j)]);
  148008. }
  148009. }
  148010. }
  148011. }
  148012. }
  148013. return min;
  148014. }
  148015. /**
  148016. * Decomposes the polygon into one or more convex sub-Polygons.
  148017. * @method decomp
  148018. * @return {Array} An array or Polygon objects.
  148019. */
  148020. function polygonDecomp(polygon){
  148021. var edges = polygonGetCutEdges(polygon);
  148022. if(edges.length > 0){
  148023. return polygonSlice(polygon, edges);
  148024. } else {
  148025. return [polygon];
  148026. }
  148027. }
  148028. /**
  148029. * Slices the polygon given one or more cut edges. If given one, this function will return two polygons (false on failure). If many, an array of polygons.
  148030. * @method slice
  148031. * @param {Array} cutEdges A list of edges, as returned by .getCutEdges()
  148032. * @return {Array}
  148033. */
  148034. function polygonSlice(polygon, cutEdges){
  148035. if(cutEdges.length === 0){
  148036. return [polygon];
  148037. }
  148038. if(cutEdges instanceof Array && cutEdges.length && cutEdges[0] instanceof Array && cutEdges[0].length===2 && cutEdges[0][0] instanceof Array){
  148039. var polys = [polygon];
  148040. for(var i=0; i<cutEdges.length; i++){
  148041. var cutEdge = cutEdges[i];
  148042. // Cut all polys
  148043. for(var j=0; j<polys.length; j++){
  148044. var poly = polys[j];
  148045. var result = polygonSlice(poly, cutEdge);
  148046. if(result){
  148047. // Found poly! Cut and quit
  148048. polys.splice(j,1);
  148049. polys.push(result[0],result[1]);
  148050. break;
  148051. }
  148052. }
  148053. }
  148054. return polys;
  148055. } else {
  148056. // Was given one edge
  148057. var cutEdge = cutEdges;
  148058. var i = polygon.indexOf(cutEdge[0]);
  148059. var j = polygon.indexOf(cutEdge[1]);
  148060. if(i !== -1 && j !== -1){
  148061. return [polygonCopy(polygon, i,j),
  148062. polygonCopy(polygon, j,i)];
  148063. } else {
  148064. return false;
  148065. }
  148066. }
  148067. }
  148068. /**
  148069. * Checks that the line segments of this polygon do not intersect each other.
  148070. * @method isSimple
  148071. * @param {Array} path An array of vertices e.g. [[0,0],[0,1],...]
  148072. * @return {Boolean}
  148073. * @todo Should it check all segments with all others?
  148074. */
  148075. function polygonIsSimple(polygon){
  148076. var path = polygon, i;
  148077. // Check
  148078. for(i=0; i<path.length-1; i++){
  148079. for(var j=0; j<i-1; j++){
  148080. if(lineSegmentsIntersect(path[i], path[i+1], path[j], path[j+1] )){
  148081. return false;
  148082. }
  148083. }
  148084. }
  148085. // Check the segment between the last and the first point to all others
  148086. for(i=1; i<path.length-2; i++){
  148087. if(lineSegmentsIntersect(path[0], path[path.length-1], path[i], path[i+1] )){
  148088. return false;
  148089. }
  148090. }
  148091. return true;
  148092. }
  148093. function getIntersectionPoint(p1, p2, q1, q2, delta){
  148094. delta = delta || 0;
  148095. var a1 = p2[1] - p1[1];
  148096. var b1 = p1[0] - p2[0];
  148097. var c1 = (a1 * p1[0]) + (b1 * p1[1]);
  148098. var a2 = q2[1] - q1[1];
  148099. var b2 = q1[0] - q2[0];
  148100. var c2 = (a2 * q1[0]) + (b2 * q1[1]);
  148101. var det = (a1 * b2) - (a2 * b1);
  148102. if(!scalar_eq(det,0,delta)){
  148103. return [((b2 * c1) - (b1 * c2)) / det, ((a1 * c2) - (a2 * c1)) / det];
  148104. } else {
  148105. return [0,0];
  148106. }
  148107. }
  148108. /**
  148109. * Quickly decompose the Polygon into convex sub-polygons.
  148110. * @method quickDecomp
  148111. * @param {Array} result
  148112. * @param {Array} [reflexVertices]
  148113. * @param {Array} [steinerPoints]
  148114. * @param {Number} [delta]
  148115. * @param {Number} [maxlevel]
  148116. * @param {Number} [level]
  148117. * @return {Array}
  148118. */
  148119. function polygonQuickDecomp(polygon, result,reflexVertices,steinerPoints,delta,maxlevel,level){
  148120. maxlevel = maxlevel || 100;
  148121. level = level || 0;
  148122. delta = delta || 25;
  148123. result = typeof(result)!=="undefined" ? result : [];
  148124. reflexVertices = reflexVertices || [];
  148125. steinerPoints = steinerPoints || [];
  148126. var upperInt=[0,0], lowerInt=[0,0], p=[0,0]; // Points
  148127. var upperDist=0, lowerDist=0, d=0, closestDist=0; // scalars
  148128. var upperIndex=0, lowerIndex=0, closestIndex=0; // Integers
  148129. var lowerPoly=[], upperPoly=[]; // polygons
  148130. var poly = polygon,
  148131. v = polygon;
  148132. if(v.length < 3){
  148133. return result;
  148134. }
  148135. level++;
  148136. if(level > maxlevel){
  148137. console.warn("quickDecomp: max level ("+maxlevel+") reached.");
  148138. return result;
  148139. }
  148140. for (var i = 0; i < polygon.length; ++i) {
  148141. if (polygonIsReflex(poly, i)) {
  148142. reflexVertices.push(poly[i]);
  148143. upperDist = lowerDist = Number.MAX_VALUE;
  148144. for (var j = 0; j < polygon.length; ++j) {
  148145. if (isLeft(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j)) && isRightOn(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j - 1))) { // if line intersects with an edge
  148146. p = getIntersectionPoint(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j), polygonAt(poly, j - 1)); // find the point of intersection
  148147. if (isRight(polygonAt(poly, i + 1), polygonAt(poly, i), p)) { // make sure it's inside the poly
  148148. d = sqdist(poly[i], p);
  148149. if (d < lowerDist) { // keep only the closest intersection
  148150. lowerDist = d;
  148151. lowerInt = p;
  148152. lowerIndex = j;
  148153. }
  148154. }
  148155. }
  148156. if (isLeft(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j + 1)) && isRightOn(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j))) {
  148157. p = getIntersectionPoint(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j), polygonAt(poly, j + 1));
  148158. if (isLeft(polygonAt(poly, i - 1), polygonAt(poly, i), p)) {
  148159. d = sqdist(poly[i], p);
  148160. if (d < upperDist) {
  148161. upperDist = d;
  148162. upperInt = p;
  148163. upperIndex = j;
  148164. }
  148165. }
  148166. }
  148167. }
  148168. // if there are no vertices to connect to, choose a point in the middle
  148169. if (lowerIndex === (upperIndex + 1) % polygon.length) {
  148170. //console.log("Case 1: Vertex("+i+"), lowerIndex("+lowerIndex+"), upperIndex("+upperIndex+"), poly.size("+polygon.length+")");
  148171. p[0] = (lowerInt[0] + upperInt[0]) / 2;
  148172. p[1] = (lowerInt[1] + upperInt[1]) / 2;
  148173. steinerPoints.push(p);
  148174. if (i < upperIndex) {
  148175. //lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.begin() + upperIndex + 1);
  148176. polygonAppend(lowerPoly, poly, i, upperIndex+1);
  148177. lowerPoly.push(p);
  148178. upperPoly.push(p);
  148179. if (lowerIndex !== 0){
  148180. //upperPoly.insert(upperPoly.end(), poly.begin() + lowerIndex, poly.end());
  148181. polygonAppend(upperPoly, poly,lowerIndex,poly.length);
  148182. }
  148183. //upperPoly.insert(upperPoly.end(), poly.begin(), poly.begin() + i + 1);
  148184. polygonAppend(upperPoly, poly,0,i+1);
  148185. } else {
  148186. if (i !== 0){
  148187. //lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.end());
  148188. polygonAppend(lowerPoly, poly,i,poly.length);
  148189. }
  148190. //lowerPoly.insert(lowerPoly.end(), poly.begin(), poly.begin() + upperIndex + 1);
  148191. polygonAppend(lowerPoly, poly,0,upperIndex+1);
  148192. lowerPoly.push(p);
  148193. upperPoly.push(p);
  148194. //upperPoly.insert(upperPoly.end(), poly.begin() + lowerIndex, poly.begin() + i + 1);
  148195. polygonAppend(upperPoly, poly,lowerIndex,i+1);
  148196. }
  148197. } else {
  148198. // connect to the closest point within the triangle
  148199. //console.log("Case 2: Vertex("+i+"), closestIndex("+closestIndex+"), poly.size("+polygon.length+")\n");
  148200. if (lowerIndex > upperIndex) {
  148201. upperIndex += polygon.length;
  148202. }
  148203. closestDist = Number.MAX_VALUE;
  148204. if(upperIndex < lowerIndex){
  148205. return result;
  148206. }
  148207. for (var j = lowerIndex; j <= upperIndex; ++j) {
  148208. if (
  148209. isLeftOn(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j)) &&
  148210. isRightOn(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j))
  148211. ) {
  148212. d = sqdist(polygonAt(poly, i), polygonAt(poly, j));
  148213. if (d < closestDist && polygonCanSee2(poly, i, j)) {
  148214. closestDist = d;
  148215. closestIndex = j % polygon.length;
  148216. }
  148217. }
  148218. }
  148219. if (i < closestIndex) {
  148220. polygonAppend(lowerPoly, poly,i,closestIndex+1);
  148221. if (closestIndex !== 0){
  148222. polygonAppend(upperPoly, poly,closestIndex,v.length);
  148223. }
  148224. polygonAppend(upperPoly, poly,0,i+1);
  148225. } else {
  148226. if (i !== 0){
  148227. polygonAppend(lowerPoly, poly,i,v.length);
  148228. }
  148229. polygonAppend(lowerPoly, poly,0,closestIndex+1);
  148230. polygonAppend(upperPoly, poly,closestIndex,i+1);
  148231. }
  148232. }
  148233. // solve smallest poly first
  148234. if (lowerPoly.length < upperPoly.length) {
  148235. polygonQuickDecomp(lowerPoly,result,reflexVertices,steinerPoints,delta,maxlevel,level);
  148236. polygonQuickDecomp(upperPoly,result,reflexVertices,steinerPoints,delta,maxlevel,level);
  148237. } else {
  148238. polygonQuickDecomp(upperPoly,result,reflexVertices,steinerPoints,delta,maxlevel,level);
  148239. polygonQuickDecomp(lowerPoly,result,reflexVertices,steinerPoints,delta,maxlevel,level);
  148240. }
  148241. return result;
  148242. }
  148243. }
  148244. result.push(polygon);
  148245. return result;
  148246. }
  148247. /**
  148248. * Remove collinear points in the polygon.
  148249. * @method removeCollinearPoints
  148250. * @param {Number} [precision] The threshold angle to use when determining whether two edges are collinear. Use zero for finest precision.
  148251. * @return {Number} The number of points removed
  148252. */
  148253. function polygonRemoveCollinearPoints(polygon, precision){
  148254. var num = 0;
  148255. for(var i=polygon.length-1; polygon.length>3 && i>=0; --i){
  148256. if(collinear(polygonAt(polygon, i-1),polygonAt(polygon, i),polygonAt(polygon, i+1),precision)){
  148257. // Remove the middle point
  148258. polygon.splice(i%polygon.length,1);
  148259. num++;
  148260. }
  148261. }
  148262. return num;
  148263. }
  148264. /**
  148265. * Remove duplicate points in the polygon.
  148266. * @method removeDuplicatePoints
  148267. * @param {Number} [precision] The threshold to use when determining whether two points are the same. Use zero for best precision.
  148268. */
  148269. function polygonRemoveDuplicatePoints(polygon, precision){
  148270. for(var i=polygon.length-1; i>=1; --i){
  148271. var pi = polygon[i];
  148272. for(var j=i-1; j>=0; --j){
  148273. if(points_eq(pi, polygon[j], precision)){
  148274. polygon.splice(i,1);
  148275. continue;
  148276. }
  148277. }
  148278. }
  148279. }
  148280. /**
  148281. * Check if two scalars are equal
  148282. * @static
  148283. * @method eq
  148284. * @param {Number} a
  148285. * @param {Number} b
  148286. * @param {Number} [precision]
  148287. * @return {Boolean}
  148288. */
  148289. function scalar_eq(a,b,precision){
  148290. precision = precision || 0;
  148291. return Math.abs(a-b) <= precision;
  148292. }
  148293. /**
  148294. * Check if two points are equal
  148295. * @static
  148296. * @method points_eq
  148297. * @param {Array} a
  148298. * @param {Array} b
  148299. * @param {Number} [precision]
  148300. * @return {Boolean}
  148301. */
  148302. function points_eq(a,b,precision){
  148303. return scalar_eq(a[0],b[0],precision) && scalar_eq(a[1],b[1],precision);
  148304. }
  148305. /***/ }),
  148306. /* 1291 */
  148307. /***/ (function(module, exports, __webpack_require__) {
  148308. /**
  148309. * @author Richard Davey <rich@photonstorm.com>
  148310. * @copyright 2019 Photon Storm Ltd.
  148311. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  148312. */
  148313. var Bodies = __webpack_require__(138);
  148314. var Class = __webpack_require__(0);
  148315. var Composites = __webpack_require__(1289);
  148316. var Constraint = __webpack_require__(209);
  148317. var MatterGameObject = __webpack_require__(1337);
  148318. var MatterImage = __webpack_require__(1288);
  148319. var MatterSprite = __webpack_require__(1287);
  148320. var MatterTileBody = __webpack_require__(544);
  148321. var PointerConstraint = __webpack_require__(1311);
  148322. /**
  148323. * @classdesc
  148324. * The Matter Factory can create different types of bodies and them to a physics world.
  148325. *
  148326. * @class Factory
  148327. * @memberof Phaser.Physics.Matter
  148328. * @constructor
  148329. * @since 3.0.0
  148330. *
  148331. * @param {Phaser.Physics.Matter.World} world - The Matter World which this Factory adds to.
  148332. */
  148333. var Factory = new Class({
  148334. initialize:
  148335. function Factory (world)
  148336. {
  148337. /**
  148338. * The Matter World which this Factory adds to.
  148339. *
  148340. * @name Phaser.Physics.Matter.Factory#world
  148341. * @type {Phaser.Physics.Matter.World}
  148342. * @since 3.0.0
  148343. */
  148344. this.world = world;
  148345. /**
  148346. * The Scene which this Factory's Matter World belongs to.
  148347. *
  148348. * @name Phaser.Physics.Matter.Factory#scene
  148349. * @type {Phaser.Scene}
  148350. * @since 3.0.0
  148351. */
  148352. this.scene = world.scene;
  148353. /**
  148354. * A reference to the Scene.Systems this Matter Physics instance belongs to.
  148355. *
  148356. * @name Phaser.Physics.Matter.Factory#sys
  148357. * @type {Phaser.Scenes.Systems}
  148358. * @since 3.0.0
  148359. */
  148360. this.sys = world.scene.sys;
  148361. },
  148362. /**
  148363. * Creates a new rigid rectangular Body and adds it to the World.
  148364. *
  148365. * @method Phaser.Physics.Matter.Factory#rectangle
  148366. * @since 3.0.0
  148367. *
  148368. * @param {number} x - The X coordinate of the center of the Body.
  148369. * @param {number} y - The Y coordinate of the center of the Body.
  148370. * @param {number} width - The width of the Body.
  148371. * @param {number} height - The height of the Body.
  148372. * @param {object} options - An object of properties to set on the Body. You can also specify a `chamfer` property to automatically adjust the body.
  148373. *
  148374. * @return {MatterJS.Body} A Matter JS Body.
  148375. */
  148376. rectangle: function (x, y, width, height, options)
  148377. {
  148378. var body = Bodies.rectangle(x, y, width, height, options);
  148379. this.world.add(body);
  148380. return body;
  148381. },
  148382. /**
  148383. * Creates a new rigid trapezoidal Body and adds it to the World.
  148384. *
  148385. * @method Phaser.Physics.Matter.Factory#trapezoid
  148386. * @since 3.0.0
  148387. *
  148388. * @param {number} x - The X coordinate of the center of the Body.
  148389. * @param {number} y - The Y coordinate of the center of the Body.
  148390. * @param {number} width - The width of the trapezoid of the Body.
  148391. * @param {number} height - The height of the trapezoid of the Body.
  148392. * @param {number} slope - The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter.
  148393. * @param {object} options - An object of properties to set on the Body. You can also specify a `chamfer` property to automatically adjust the body.
  148394. *
  148395. * @return {MatterJS.Body} A Matter JS Body.
  148396. */
  148397. trapezoid: function (x, y, width, height, slope, options)
  148398. {
  148399. var body = Bodies.trapezoid(x, y, width, height, slope, options);
  148400. this.world.add(body);
  148401. return body;
  148402. },
  148403. /**
  148404. * Creates a new rigid circular Body and adds it to the World.
  148405. *
  148406. * @method Phaser.Physics.Matter.Factory#circle
  148407. * @since 3.0.0
  148408. *
  148409. * @param {number} x - The X coordinate of the center of the Body.
  148410. * @param {number} y - The Y coordinate of the center of the Body.
  148411. * @param {number} radius - The radius of the circle.
  148412. * @param {object} options - An object of properties to set on the Body. You can also specify a `chamfer` property to automatically adjust the body.
  148413. * @param {number} maxSides - The maximum amount of sides to use for the polygon which will approximate this circle.
  148414. *
  148415. * @return {MatterJS.Body} A Matter JS Body.
  148416. */
  148417. circle: function (x, y, radius, options, maxSides)
  148418. {
  148419. var body = Bodies.circle(x, y, radius, options, maxSides);
  148420. this.world.add(body);
  148421. return body;
  148422. },
  148423. /**
  148424. * Creates a new rigid polygonal Body and adds it to the World.
  148425. *
  148426. * @method Phaser.Physics.Matter.Factory#polygon
  148427. * @since 3.0.0
  148428. *
  148429. * @param {number} x - The X coordinate of the center of the Body.
  148430. * @param {number} y - The Y coordinate of the center of the Body.
  148431. * @param {number} sides - The number of sides the polygon will have.
  148432. * @param {number} radius - The "radius" of the polygon, i.e. the distance from its center to any vertex. This is also the radius of its circumcircle.
  148433. * @param {object} options - An object of properties to set on the Body. You can also specify a `chamfer` property to automatically adjust the body.
  148434. *
  148435. * @return {MatterJS.Body} A Matter JS Body.
  148436. */
  148437. polygon: function (x, y, sides, radius, options)
  148438. {
  148439. var body = Bodies.polygon(x, y, sides, radius, options);
  148440. this.world.add(body);
  148441. return body;
  148442. },
  148443. /**
  148444. * Creates a body using the supplied vertices (or an array containing multiple sets of vertices) and adds it to the World.
  148445. * If the vertices are convex, they will pass through as supplied. Otherwise, if the vertices are concave, they will be decomposed. Note that this process is not guaranteed to support complex sets of vertices, e.g. ones with holes.
  148446. *
  148447. * @method Phaser.Physics.Matter.Factory#fromVertices
  148448. * @since 3.0.0
  148449. *
  148450. * @param {number} x - The X coordinate of the center of the Body.
  148451. * @param {number} y - The Y coordinate of the center of the Body.
  148452. * @param {array} vertexSets - [description]
  148453. * @param {object} options - [description]
  148454. * @param {boolean} flagInternal - Flag internal edges (coincident part edges)
  148455. * @param {boolean} removeCollinear - Whether Matter.js will discard collinear edges (to improve performance).
  148456. * @param {number} minimumArea - During decomposition discard parts that have an area less than this
  148457. *
  148458. * @return {MatterJS.Body} A Matter JS Body.
  148459. */
  148460. fromVertices: function (x, y, vertexSets, options, flagInternal, removeCollinear, minimumArea)
  148461. {
  148462. var body = Bodies.fromVertices(x, y, vertexSets, options, flagInternal, removeCollinear, minimumArea);
  148463. this.world.add(body);
  148464. return body;
  148465. },
  148466. /**
  148467. * Create a new composite containing Matter Image objects created in a grid arrangement.
  148468. * This function uses the body bounds to prevent overlaps.
  148469. *
  148470. * @method Phaser.Physics.Matter.Factory#imageStack
  148471. * @since 3.0.0
  148472. *
  148473. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  148474. * @param {(string|integer)} frame - An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value.
  148475. * @param {number} x - The horizontal position of this composite in the world.
  148476. * @param {number} y - The vertical position of this composite in the world.
  148477. * @param {number} columns - The number of columns in the grid.
  148478. * @param {number} rows - The number of rows in the grid.
  148479. * @param {number} [columnGap=0] - The distance between each column.
  148480. * @param {number} [rowGap=0] - The distance between each row.
  148481. * @param {object} [options] - [description]
  148482. *
  148483. * @return {MatterJS.Composite} A Matter JS Composite Stack.
  148484. */
  148485. imageStack: function (key, frame, x, y, columns, rows, columnGap, rowGap, options)
  148486. {
  148487. if (columnGap === undefined) { columnGap = 0; }
  148488. if (rowGap === undefined) { rowGap = 0; }
  148489. if (options === undefined) { options = {}; }
  148490. var world = this.world;
  148491. var displayList = this.sys.displayList;
  148492. options.addToWorld = false;
  148493. var stack = Composites.stack(x, y, columns, rows, columnGap, rowGap, function (x, y)
  148494. {
  148495. var image = new MatterImage(world, x, y, key, frame, options);
  148496. displayList.add(image);
  148497. return image.body;
  148498. });
  148499. world.add(stack);
  148500. return stack;
  148501. },
  148502. /**
  148503. * Create a new composite containing bodies created in the callback in a grid arrangement.
  148504. * This function uses the body bounds to prevent overlaps.
  148505. *
  148506. * @method Phaser.Physics.Matter.Factory#stack
  148507. * @since 3.0.0
  148508. *
  148509. * @param {number} x - The horizontal position of this composite in the world.
  148510. * @param {number} y - The vertical position of this composite in the world.
  148511. * @param {number} columns - The number of columns in the grid.
  148512. * @param {number} rows - The number of rows in the grid.
  148513. * @param {number} columnGap - The distance between each column.
  148514. * @param {number} rowGap - The distance between each row.
  148515. * @param {function} callback - The callback that creates the stack.
  148516. *
  148517. * @return {MatterJS.Composite} A new composite containing objects created in the callback.
  148518. */
  148519. stack: function (x, y, columns, rows, columnGap, rowGap, callback)
  148520. {
  148521. var stack = Composites.stack(x, y, columns, rows, columnGap, rowGap, callback);
  148522. this.world.add(stack);
  148523. return stack;
  148524. },
  148525. /**
  148526. * Create a new composite containing bodies created in the callback in a pyramid arrangement.
  148527. * This function uses the body bounds to prevent overlaps.
  148528. *
  148529. * @method Phaser.Physics.Matter.Factory#pyramid
  148530. * @since 3.0.0
  148531. *
  148532. * @param {number} x - The horizontal position of this composite in the world.
  148533. * @param {number} y - The vertical position of this composite in the world.
  148534. * @param {number} columns - The number of columns in the pyramid.
  148535. * @param {number} rows - The number of rows in the pyramid.
  148536. * @param {number} columnGap - The distance between each column.
  148537. * @param {number} rowGap - The distance between each row.
  148538. * @param {function} callback - The callback function to be invoked.
  148539. *
  148540. * @return {MatterJS.Composite} A Matter JS Composite pyramid.
  148541. */
  148542. pyramid: function (x, y, columns, rows, columnGap, rowGap, callback)
  148543. {
  148544. var stack = Composites.pyramid(x, y, columns, rows, columnGap, rowGap, callback);
  148545. this.world.add(stack);
  148546. return stack;
  148547. },
  148548. /**
  148549. * Chains all bodies in the given composite together using constraints.
  148550. *
  148551. * @method Phaser.Physics.Matter.Factory#chain
  148552. * @since 3.0.0
  148553. *
  148554. * @param {MatterJS.Composite} composite - [description]
  148555. * @param {number} xOffsetA - [description]
  148556. * @param {number} yOffsetA - [description]
  148557. * @param {number} xOffsetB - [description]
  148558. * @param {number} yOffsetB - [description]
  148559. * @param {object} options - [description]
  148560. *
  148561. * @return {MatterJS.Composite} A new composite containing objects chained together with constraints.
  148562. */
  148563. chain: function (composite, xOffsetA, yOffsetA, xOffsetB, yOffsetB, options)
  148564. {
  148565. return Composites.chain(composite, xOffsetA, yOffsetA, xOffsetB, yOffsetB, options);
  148566. },
  148567. /**
  148568. * Connects bodies in the composite with constraints in a grid pattern, with optional cross braces.
  148569. *
  148570. * @method Phaser.Physics.Matter.Factory#mesh
  148571. * @since 3.0.0
  148572. *
  148573. * @param {MatterJS.Composite} composite - [description]
  148574. * @param {number} columns - [description]
  148575. * @param {number} rows - [description]
  148576. * @param {boolean} crossBrace - [description]
  148577. * @param {object} options - [description]
  148578. *
  148579. * @return {MatterJS.Composite} The composite containing objects meshed together with constraints.
  148580. */
  148581. mesh: function (composite, columns, rows, crossBrace, options)
  148582. {
  148583. return Composites.mesh(composite, columns, rows, crossBrace, options);
  148584. },
  148585. /**
  148586. * Creates a composite with a Newton's Cradle setup of bodies and constraints.
  148587. *
  148588. * @method Phaser.Physics.Matter.Factory#newtonsCradle
  148589. * @since 3.0.0
  148590. *
  148591. * @param {number} x - [description]
  148592. * @param {number} y - [description]
  148593. * @param {number} number - [description]
  148594. * @param {number} size - [description]
  148595. * @param {number} length - [description]
  148596. *
  148597. * @return {MatterJS.Composite} A new composite newtonsCradle body.
  148598. */
  148599. newtonsCradle: function (x, y, number, size, length)
  148600. {
  148601. var composite = Composites.newtonsCradle(x, y, number, size, length);
  148602. this.world.add(composite);
  148603. return composite;
  148604. },
  148605. /**
  148606. * Creates a composite with simple car setup of bodies and constraints.
  148607. *
  148608. * @method Phaser.Physics.Matter.Factory#car
  148609. * @since 3.0.0
  148610. *
  148611. * @param {number} x - [description]
  148612. * @param {number} y - [description]
  148613. * @param {number} width - [description]
  148614. * @param {number} height - [description]
  148615. * @param {number} wheelSize - [description]
  148616. *
  148617. * @return {MatterJS.Composite} A new composite car body.
  148618. */
  148619. car: function (x, y, width, height, wheelSize)
  148620. {
  148621. var composite = Composites.car(x, y, width, height, wheelSize);
  148622. this.world.add(composite);
  148623. return composite;
  148624. },
  148625. /**
  148626. * Creates a simple soft body like object.
  148627. *
  148628. * @method Phaser.Physics.Matter.Factory#softBody
  148629. * @since 3.0.0
  148630. *
  148631. * @param {number} x - The horizontal position of this composite in the world.
  148632. * @param {number} y - The vertical position of this composite in the world.
  148633. * @param {number} columns - The number of columns in the Composite.
  148634. * @param {number} rows - The number of rows in the Composite.
  148635. * @param {number} columnGap - The distance between each column.
  148636. * @param {number} rowGap - The distance between each row.
  148637. * @param {boolean} crossBrace - [description]
  148638. * @param {number} particleRadius - The radius of this circlular composite.
  148639. * @param {object} particleOptions - [description]
  148640. * @param {object} constraintOptions - [description]
  148641. *
  148642. * @return {MatterJS.Composite} A new composite simple soft body.
  148643. */
  148644. softBody: function (x, y, columns, rows, columnGap, rowGap, crossBrace, particleRadius, particleOptions, constraintOptions)
  148645. {
  148646. var composite = Composites.softBody(x, y, columns, rows, columnGap, rowGap, crossBrace, particleRadius, particleOptions, constraintOptions);
  148647. this.world.add(composite);
  148648. return composite;
  148649. },
  148650. /**
  148651. * [description]
  148652. *
  148653. * @method Phaser.Physics.Matter.Factory#joint
  148654. * @since 3.0.0
  148655. *
  148656. * @param {MatterJS.Body} bodyA - [description]
  148657. * @param {MatterJS.Body} bodyB - [description]
  148658. * @param {number} length - [description]
  148659. * @param {number} [stiffness=1] - [description]
  148660. * @param {object} [options={}] - [description]
  148661. *
  148662. * @return {MatterJS.Constraint} A Matter JS Constraint.
  148663. */
  148664. joint: function (bodyA, bodyB, length, stiffness, options)
  148665. {
  148666. return this.constraint(bodyA, bodyB, length, stiffness, options);
  148667. },
  148668. /**
  148669. * [description]
  148670. *
  148671. * @method Phaser.Physics.Matter.Factory#spring
  148672. * @since 3.0.0
  148673. *
  148674. * @param {MatterJS.Body} bodyA - The first possible `Body` that this constraint is attached to.
  148675. * @param {MatterJS.Body} bodyB - The second possible `Body` that this constraint is attached to.
  148676. * @param {number} length - A Number that specifies the target resting length of the constraint. It is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`
  148677. * @param {number} [stiffness=1] - A Number that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts as a soft spring.
  148678. * @param {object} [options={}] - [description]
  148679. *
  148680. * @return {MatterJS.Constraint} A Matter JS Constraint.
  148681. */
  148682. spring: function (bodyA, bodyB, length, stiffness, options)
  148683. {
  148684. return this.constraint(bodyA, bodyB, length, stiffness, options);
  148685. },
  148686. /**
  148687. * [description]
  148688. *
  148689. * @method Phaser.Physics.Matter.Factory#constraint
  148690. * @since 3.0.0
  148691. *
  148692. * @param {MatterJS.Body} bodyA - [description]
  148693. * @param {MatterJS.Body} bodyB - [description]
  148694. * @param {number} length - [description]
  148695. * @param {number} [stiffness=1] - [description]
  148696. * @param {object} [options={}] - [description]
  148697. *
  148698. * @return {MatterJS.Constraint} A Matter JS Constraint.
  148699. */
  148700. constraint: function (bodyA, bodyB, length, stiffness, options)
  148701. {
  148702. if (stiffness === undefined) { stiffness = 1; }
  148703. if (options === undefined) { options = {}; }
  148704. options.bodyA = (bodyA.type === 'body') ? bodyA : bodyA.body;
  148705. options.bodyB = (bodyB.type === 'body') ? bodyB : bodyB.body;
  148706. options.length = length;
  148707. options.stiffness = stiffness;
  148708. var constraint = Constraint.create(options);
  148709. this.world.add(constraint);
  148710. return constraint;
  148711. },
  148712. /**
  148713. * [description]
  148714. *
  148715. * @method Phaser.Physics.Matter.Factory#worldConstraint
  148716. * @since 3.0.0
  148717. *
  148718. * @param {MatterJS.Body} bodyB - [description]
  148719. * @param {number} length - [description]
  148720. * @param {number} [stiffness=1] - [description]
  148721. * @param {object} [options={}] - [description]
  148722. *
  148723. * @return {MatterJS.Constraint} A Matter JS Constraint.
  148724. */
  148725. worldConstraint: function (bodyB, length, stiffness, options)
  148726. {
  148727. if (stiffness === undefined) { stiffness = 1; }
  148728. if (options === undefined) { options = {}; }
  148729. options.bodyB = (bodyB.type === 'body') ? bodyB : bodyB.body;
  148730. options.length = length;
  148731. options.stiffness = stiffness;
  148732. var constraint = Constraint.create(options);
  148733. this.world.add(constraint);
  148734. return constraint;
  148735. },
  148736. /**
  148737. * [description]
  148738. *
  148739. * @method Phaser.Physics.Matter.Factory#mouseSpring
  148740. * @since 3.0.0
  148741. *
  148742. * @param {object} options - [description]
  148743. *
  148744. * @return {MatterJS.Constraint} A Matter JS Constraint.
  148745. */
  148746. mouseSpring: function (options)
  148747. {
  148748. return this.pointerConstraint(options);
  148749. },
  148750. /**
  148751. * [description]
  148752. *
  148753. * @method Phaser.Physics.Matter.Factory#pointerConstraint
  148754. * @since 3.0.0
  148755. *
  148756. * @param {object} options - [description]
  148757. *
  148758. * @return {MatterJS.Constraint} A Matter JS Constraint.
  148759. */
  148760. pointerConstraint: function (options)
  148761. {
  148762. if (options === undefined) { options = {}; }
  148763. if (!options.hasOwnProperty('render'))
  148764. {
  148765. options.render = { visible: false };
  148766. }
  148767. var pointerConstraint = new PointerConstraint(this.scene, this.world, options);
  148768. this.world.add(pointerConstraint.constraint);
  148769. return pointerConstraint;
  148770. },
  148771. /**
  148772. * [description]
  148773. *
  148774. * @method Phaser.Physics.Matter.Factory#image
  148775. * @since 3.0.0
  148776. *
  148777. * @param {number} x - The horizontal position of this Game Object in the world.
  148778. * @param {number} y - The vertical position of this Game Object in the world.
  148779. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  148780. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value.
  148781. * @param {object} [options={}] - [description]
  148782. *
  148783. * @return {Phaser.Physics.Matter.Image} [description]
  148784. */
  148785. image: function (x, y, key, frame, options)
  148786. {
  148787. var image = new MatterImage(this.world, x, y, key, frame, options);
  148788. this.sys.displayList.add(image);
  148789. return image;
  148790. },
  148791. /**
  148792. * [description]
  148793. *
  148794. * @method Phaser.Physics.Matter.Factory#tileBody
  148795. * @since 3.0.0
  148796. *
  148797. * @param {Phaser.Tilemaps.Tile} tile - [description]
  148798. * @param {object} options - [description]
  148799. *
  148800. * @return {Phaser.Physics.Matter.TileBody} [description]
  148801. */
  148802. tileBody: function (tile, options)
  148803. {
  148804. var tileBody = new MatterTileBody(this.world, tile, options);
  148805. return tileBody;
  148806. },
  148807. /**
  148808. * [description]
  148809. *
  148810. * @method Phaser.Physics.Matter.Factory#sprite
  148811. * @since 3.0.0
  148812. *
  148813. * @param {number} x - The horizontal position of this Game Object in the world.
  148814. * @param {number} y - The vertical position of this Game Object in the world.
  148815. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  148816. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value.
  148817. * @param {object} [options={}] - [description]
  148818. *
  148819. * @return {Phaser.Physics.Matter.Sprite} [description]
  148820. */
  148821. sprite: function (x, y, key, frame, options)
  148822. {
  148823. var sprite = new MatterSprite(this.world, x, y, key, frame, options);
  148824. this.sys.displayList.add(sprite);
  148825. this.sys.updateList.add(sprite);
  148826. return sprite;
  148827. },
  148828. /**
  148829. * [description]
  148830. *
  148831. * @method Phaser.Physics.Matter.Factory#gameObject
  148832. * @since 3.3.0
  148833. *
  148834. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to inject the Matter Body in to.
  148835. * @param {object} options - [description]
  148836. *
  148837. * @return {Phaser.GameObjects.GameObject} The Game Object that had the Matter Body injected into it.
  148838. */
  148839. gameObject: function (gameObject, options)
  148840. {
  148841. return MatterGameObject(this.world, gameObject, options);
  148842. },
  148843. /**
  148844. * Destroys this Factory.
  148845. *
  148846. * @method Phaser.Physics.Matter.Factory#destroy
  148847. * @since 3.5.0
  148848. */
  148849. destroy: function ()
  148850. {
  148851. this.world = null;
  148852. this.scene = null;
  148853. this.sys = null;
  148854. }
  148855. });
  148856. module.exports = Factory;
  148857. /***/ }),
  148858. /* 1292 */
  148859. /***/ (function(module, exports, __webpack_require__) {
  148860. /**
  148861. * @author Richard Davey <rich@photonstorm.com>
  148862. * @copyright 2019 Photon Storm Ltd.
  148863. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  148864. */
  148865. var Body = __webpack_require__(1298);
  148866. var Class = __webpack_require__(0);
  148867. var COLLIDES = __webpack_require__(240);
  148868. var CollisionMap = __webpack_require__(1297);
  148869. var EventEmitter = __webpack_require__(11);
  148870. var Events = __webpack_require__(548);
  148871. var GetFastValue = __webpack_require__(2);
  148872. var HasValue = __webpack_require__(91);
  148873. var Set = __webpack_require__(102);
  148874. var Solver = __webpack_require__(1341);
  148875. var TILEMAP_FORMATS = __webpack_require__(31);
  148876. var TYPE = __webpack_require__(239);
  148877. /**
  148878. * @typedef {object} Phaser.Physics.Impact.WorldConfig
  148879. *
  148880. * @property {number} [gravity=0] - Sets {@link Phaser.Physics.Impact.World#gravity}
  148881. * @property {number} [cellSize=64] - The size of the cells used for the broadphase pass. Increase this value if you have lots of large objects in the world.
  148882. * @property {number} [timeScale=1] - A `Number` that allows per-body time scaling, e.g. a force-field where bodies inside are in slow-motion, while others are at full speed.
  148883. * @property {number} [maxStep=0.05] - [description]
  148884. * @property {boolean} [debug=false] - Sets {@link Phaser.Physics.Impact.World#debug}.
  148885. * @property {number} [maxVelocity=100] - The maximum velocity a body can move.
  148886. * @property {boolean} [debugShowBody=true] - Whether the Body's boundary is drawn to the debug display.
  148887. * @property {boolean} [debugShowVelocity=true] - Whether the Body's velocity is drawn to the debug display.
  148888. * @property {number} [debugBodyColor=0xff00ff] - The color of this Body on the debug display.
  148889. * @property {number} [debugVelocityColor=0x00ff00] - The color of the Body's velocity on the debug display.
  148890. * @property {number} [maxVelocityX=maxVelocity] - Maximum X velocity objects can move.
  148891. * @property {number} [maxVelocityY=maxVelocity] - Maximum Y velocity objects can move.
  148892. * @property {number} [minBounceVelocity=40] - The minimum velocity an object can be moving at to be considered for bounce.
  148893. * @property {number} [gravityFactor=1] - Gravity multiplier. Set to 0 for no gravity.
  148894. * @property {number} [bounciness=0] - The default bounce, or restitution, of bodies in the world.
  148895. * @property {(object|boolean)} [setBounds] - Should the world have bounds enabled by default?
  148896. * @property {number} [setBounds.x=0] - The x coordinate of the world bounds.
  148897. * @property {number} [setBounds.y=0] - The y coordinate of the world bounds.
  148898. * @property {number} [setBounds.width] - The width of the world bounds.
  148899. * @property {number} [setBounds.height] - The height of the world bounds.
  148900. * @property {number} [setBounds.thickness=64] - The thickness of the walls of the world bounds.
  148901. * @property {boolean} [setBounds.left=true] - Should the left-side world bounds wall be created?
  148902. * @property {boolean} [setBounds.right=true] - Should the right-side world bounds wall be created?
  148903. * @property {boolean} [setBounds.top=true] - Should the top world bounds wall be created?
  148904. * @property {boolean} [setBounds.bottom=true] - Should the bottom world bounds wall be created?
  148905. */
  148906. /**
  148907. * An object containing the 4 wall bodies that bound the physics world.
  148908. *
  148909. * @typedef {object} Phaser.Physics.Impact.WorldDefaults
  148910. *
  148911. * @property {boolean} debugShowBody - Whether the Body's boundary is drawn to the debug display.
  148912. * @property {boolean} debugShowVelocity - Whether the Body's velocity is drawn to the debug display.
  148913. * @property {number} bodyDebugColor - The color of this Body on the debug display.
  148914. * @property {number} velocityDebugColor - The color of the Body's velocity on the debug display.
  148915. * @property {number} maxVelocityX - Maximum X velocity objects can move.
  148916. * @property {number} maxVelocityY - Maximum Y velocity objects can move.
  148917. * @property {number} minBounceVelocity - The minimum velocity an object can be moving at to be considered for bounce.
  148918. * @property {number} gravityFactor - Gravity multiplier. Set to 0 for no gravity.
  148919. * @property {number} bounciness - The default bounce, or restitution, of bodies in the world.
  148920. */
  148921. /**
  148922. * @typedef {object} Phaser.Physics.Impact.WorldWalls
  148923. *
  148924. * @property {?Phaser.Physics.Impact.Body} left - The left-side wall of the world bounds.
  148925. * @property {?Phaser.Physics.Impact.Body} right - The right-side wall of the world bounds.
  148926. * @property {?Phaser.Physics.Impact.Body} top - The top wall of the world bounds.
  148927. * @property {?Phaser.Physics.Impact.Body} bottom - The bottom wall of the world bounds.
  148928. */
  148929. /**
  148930. * @classdesc
  148931. * [description]
  148932. *
  148933. * @class World
  148934. * @extends Phaser.Events.EventEmitter
  148935. * @memberof Phaser.Physics.Impact
  148936. * @constructor
  148937. * @since 3.0.0
  148938. *
  148939. * @param {Phaser.Scene} scene - The Scene to which this Impact World instance belongs.
  148940. * @param {Phaser.Physics.Impact.WorldConfig} config - [description]
  148941. */
  148942. var World = new Class({
  148943. Extends: EventEmitter,
  148944. initialize:
  148945. function World (scene, config)
  148946. {
  148947. EventEmitter.call(this);
  148948. /**
  148949. * [description]
  148950. *
  148951. * @name Phaser.Physics.Impact.World#scene
  148952. * @type {Phaser.Scene}
  148953. * @since 3.0.0
  148954. */
  148955. this.scene = scene;
  148956. /**
  148957. * [description]
  148958. *
  148959. * @name Phaser.Physics.Impact.World#bodies
  148960. * @type {Phaser.Structs.Set.<Phaser.Physics.Impact.Body>}
  148961. * @since 3.0.0
  148962. */
  148963. this.bodies = new Set();
  148964. /**
  148965. * [description]
  148966. *
  148967. * @name Phaser.Physics.Impact.World#gravity
  148968. * @type {number}
  148969. * @default 0
  148970. * @since 3.0.0
  148971. */
  148972. this.gravity = GetFastValue(config, 'gravity', 0);
  148973. /**
  148974. * Spatial hash cell dimensions
  148975. *
  148976. * @name Phaser.Physics.Impact.World#cellSize
  148977. * @type {integer}
  148978. * @default 64
  148979. * @since 3.0.0
  148980. */
  148981. this.cellSize = GetFastValue(config, 'cellSize', 64);
  148982. /**
  148983. * [description]
  148984. *
  148985. * @name Phaser.Physics.Impact.World#collisionMap
  148986. * @type {Phaser.Physics.Impact.CollisionMap}
  148987. * @since 3.0.0
  148988. */
  148989. this.collisionMap = new CollisionMap();
  148990. /**
  148991. * [description]
  148992. *
  148993. * @name Phaser.Physics.Impact.World#timeScale
  148994. * @type {number}
  148995. * @default 1
  148996. * @since 3.0.0
  148997. */
  148998. this.timeScale = GetFastValue(config, 'timeScale', 1);
  148999. /**
  149000. * Impacts maximum time step is 20 fps.
  149001. *
  149002. * @name Phaser.Physics.Impact.World#maxStep
  149003. * @type {number}
  149004. * @default 0.05
  149005. * @since 3.0.0
  149006. */
  149007. this.maxStep = GetFastValue(config, 'maxStep', 0.05);
  149008. /**
  149009. * [description]
  149010. *
  149011. * @name Phaser.Physics.Impact.World#enabled
  149012. * @type {boolean}
  149013. * @default true
  149014. * @since 3.0.0
  149015. */
  149016. this.enabled = true;
  149017. /**
  149018. * [description]
  149019. *
  149020. * @name Phaser.Physics.Impact.World#drawDebug
  149021. * @type {boolean}
  149022. * @since 3.0.0
  149023. */
  149024. this.drawDebug = GetFastValue(config, 'debug', false);
  149025. /**
  149026. * [description]
  149027. *
  149028. * @name Phaser.Physics.Impact.World#debugGraphic
  149029. * @type {Phaser.GameObjects.Graphics}
  149030. * @since 3.0.0
  149031. */
  149032. this.debugGraphic;
  149033. var _maxVelocity = GetFastValue(config, 'maxVelocity', 100);
  149034. /**
  149035. * [description]
  149036. *
  149037. * @name Phaser.Physics.Impact.World#defaults
  149038. * @type {Phaser.Physics.Impact.WorldDefaults}
  149039. * @since 3.0.0
  149040. */
  149041. this.defaults = {
  149042. debugShowBody: GetFastValue(config, 'debugShowBody', true),
  149043. debugShowVelocity: GetFastValue(config, 'debugShowVelocity', true),
  149044. bodyDebugColor: GetFastValue(config, 'debugBodyColor', 0xff00ff),
  149045. velocityDebugColor: GetFastValue(config, 'debugVelocityColor', 0x00ff00),
  149046. maxVelocityX: GetFastValue(config, 'maxVelocityX', _maxVelocity),
  149047. maxVelocityY: GetFastValue(config, 'maxVelocityY', _maxVelocity),
  149048. minBounceVelocity: GetFastValue(config, 'minBounceVelocity', 40),
  149049. gravityFactor: GetFastValue(config, 'gravityFactor', 1),
  149050. bounciness: GetFastValue(config, 'bounciness', 0)
  149051. };
  149052. /**
  149053. * An object containing the 4 wall bodies that bound the physics world.
  149054. *
  149055. * @name Phaser.Physics.Impact.World#walls
  149056. * @type {Phaser.Physics.Impact.WorldWalls}
  149057. * @since 3.0.0
  149058. */
  149059. this.walls = { left: null, right: null, top: null, bottom: null };
  149060. /**
  149061. * [description]
  149062. *
  149063. * @name Phaser.Physics.Impact.World#delta
  149064. * @type {number}
  149065. * @default 0
  149066. * @since 3.0.0
  149067. */
  149068. this.delta = 0;
  149069. /**
  149070. * [description]
  149071. *
  149072. * @name Phaser.Physics.Impact.World#_lastId
  149073. * @type {number}
  149074. * @private
  149075. * @default 0
  149076. * @since 3.0.0
  149077. */
  149078. this._lastId = 0;
  149079. if (GetFastValue(config, 'setBounds', false))
  149080. {
  149081. var boundsConfig = config['setBounds'];
  149082. if (typeof boundsConfig === 'boolean')
  149083. {
  149084. this.setBounds();
  149085. }
  149086. else
  149087. {
  149088. var x = GetFastValue(boundsConfig, 'x', 0);
  149089. var y = GetFastValue(boundsConfig, 'y', 0);
  149090. var width = GetFastValue(boundsConfig, 'width', scene.sys.scale.width);
  149091. var height = GetFastValue(boundsConfig, 'height', scene.sys.scale.height);
  149092. var thickness = GetFastValue(boundsConfig, 'thickness', 64);
  149093. var left = GetFastValue(boundsConfig, 'left', true);
  149094. var right = GetFastValue(boundsConfig, 'right', true);
  149095. var top = GetFastValue(boundsConfig, 'top', true);
  149096. var bottom = GetFastValue(boundsConfig, 'bottom', true);
  149097. this.setBounds(x, y, width, height, thickness, left, right, top, bottom);
  149098. }
  149099. }
  149100. if (this.drawDebug)
  149101. {
  149102. this.createDebugGraphic();
  149103. }
  149104. },
  149105. /**
  149106. * Sets the collision map for the world either from a Weltmeister JSON level in the cache or from
  149107. * a 2D array. If loading from a Weltmeister level, the map must have a layer called "collision".
  149108. *
  149109. * @method Phaser.Physics.Impact.World#setCollisionMap
  149110. * @since 3.0.0
  149111. *
  149112. * @param {(string|integer[][])} key - Either a string key that corresponds to a Weltmeister level
  149113. * in the cache, or a 2D array of collision IDs.
  149114. * @param {integer} tileSize - The size of a tile. This is optional if loading from a Weltmeister
  149115. * level in the cache.
  149116. *
  149117. * @return {?Phaser.Physics.Impact.CollisionMap} The newly created CollisionMap, or null if the method failed to
  149118. * create the CollisionMap.
  149119. */
  149120. setCollisionMap: function (key, tileSize)
  149121. {
  149122. if (typeof key === 'string')
  149123. {
  149124. var tilemapData = this.scene.cache.tilemap.get(key);
  149125. if (!tilemapData || tilemapData.format !== TILEMAP_FORMATS.WELTMEISTER)
  149126. {
  149127. console.warn('The specified key does not correspond to a Weltmeister tilemap: ' + key);
  149128. return null;
  149129. }
  149130. var layers = tilemapData.data.layer;
  149131. var collisionLayer;
  149132. for (var i = 0; i < layers.length; i++)
  149133. {
  149134. if (layers[i].name === 'collision')
  149135. {
  149136. collisionLayer = layers[i];
  149137. break;
  149138. }
  149139. }
  149140. if (tileSize === undefined) { tileSize = collisionLayer.tilesize; }
  149141. this.collisionMap = new CollisionMap(tileSize, collisionLayer.data);
  149142. }
  149143. else if (Array.isArray(key))
  149144. {
  149145. this.collisionMap = new CollisionMap(tileSize, key);
  149146. }
  149147. else
  149148. {
  149149. console.warn('Invalid Weltmeister collision map data: ' + key);
  149150. }
  149151. return this.collisionMap;
  149152. },
  149153. /**
  149154. * @typedef {object} CollisionOptions
  149155. *
  149156. * @property {string} [slopeTileProperty=null] - Slope IDs can be stored on tiles directly
  149157. * using Impacts tileset editor. If a tile has a property with the given slopeTileProperty string
  149158. * name, the value of that property for the tile will be used for its slope mapping. E.g. a 45
  149159. * degree slope upward could be given a "slope" property with a value of 2.
  149160. * @property {object} [slopeMap=null] - A tile index to slope definition map.
  149161. * @property {integer} [defaultCollidingSlope=null] - If specified, the default slope ID to
  149162. * assign to a colliding tile. If not specified, the tile's index is used.
  149163. * @property {integer} [defaultNonCollidingSlope=0] - The default slope ID to assign to a
  149164. * non-colliding tile.
  149165. */
  149166. /**
  149167. * Sets the collision map for the world from a tilemap layer. Only tiles that are marked as
  149168. * colliding will be used. You can specify the mapping from tiles to slope IDs in a couple of
  149169. * ways. The easiest is to use Tiled and the slopeTileProperty option. Alternatively, you can
  149170. * manually create a slopeMap that stores the mapping between tile indices and slope IDs.
  149171. *
  149172. * @method Phaser.Physics.Impact.World#setCollisionMapFromTilemapLayer
  149173. * @since 3.0.0
  149174. *
  149175. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer - The tilemap layer to use.
  149176. * @param {CollisionOptions} [options] - Options for controlling the mapping from tiles to slope IDs.
  149177. *
  149178. * @return {Phaser.Physics.Impact.CollisionMap} The newly created CollisionMap.
  149179. */
  149180. setCollisionMapFromTilemapLayer: function (tilemapLayer, options)
  149181. {
  149182. if (options === undefined) { options = {}; }
  149183. var slopeProperty = GetFastValue(options, 'slopeProperty', null);
  149184. var slopeMap = GetFastValue(options, 'slopeMap', null);
  149185. var collidingSlope = GetFastValue(options, 'defaultCollidingSlope', null);
  149186. var nonCollidingSlope = GetFastValue(options, 'defaultNonCollidingSlope', 0);
  149187. var layerData = tilemapLayer.layer;
  149188. var tileSize = layerData.baseTileWidth;
  149189. var collisionData = [];
  149190. for (var ty = 0; ty < layerData.height; ty++)
  149191. {
  149192. collisionData[ty] = [];
  149193. for (var tx = 0; tx < layerData.width; tx++)
  149194. {
  149195. var tile = layerData.data[ty][tx];
  149196. if (tile && tile.collides)
  149197. {
  149198. if (slopeProperty !== null && HasValue(tile.properties, slopeProperty))
  149199. {
  149200. collisionData[ty][tx] = parseInt(tile.properties[slopeProperty], 10);
  149201. }
  149202. else if (slopeMap !== null && HasValue(slopeMap, tile.index))
  149203. {
  149204. collisionData[ty][tx] = slopeMap[tile.index];
  149205. }
  149206. else if (collidingSlope !== null)
  149207. {
  149208. collisionData[ty][tx] = collidingSlope;
  149209. }
  149210. else
  149211. {
  149212. collisionData[ty][tx] = tile.index;
  149213. }
  149214. }
  149215. else
  149216. {
  149217. collisionData[ty][tx] = nonCollidingSlope;
  149218. }
  149219. }
  149220. }
  149221. this.collisionMap = new CollisionMap(tileSize, collisionData);
  149222. return this.collisionMap;
  149223. },
  149224. /**
  149225. * Sets the bounds of the Physics world to match the given world pixel dimensions.
  149226. * You can optionally set which 'walls' to create: left, right, top or bottom.
  149227. * If none of the walls are given it will default to use the walls settings it had previously.
  149228. * I.e. if you previously told it to not have the left or right walls, and you then adjust the world size
  149229. * the newly created bounds will also not have the left and right walls.
  149230. * Explicitly state them in the parameters to override this.
  149231. *
  149232. * @method Phaser.Physics.Impact.World#setBounds
  149233. * @since 3.0.0
  149234. *
  149235. * @param {number} [x] - The x coordinate of the top-left corner of the bounds.
  149236. * @param {number} [y] - The y coordinate of the top-left corner of the bounds.
  149237. * @param {number} [width] - The width of the bounds.
  149238. * @param {number} [height] - The height of the bounds.
  149239. * @param {number} [thickness=64] - [description]
  149240. * @param {boolean} [left=true] - If true will create the left bounds wall.
  149241. * @param {boolean} [right=true] - If true will create the right bounds wall.
  149242. * @param {boolean} [top=true] - If true will create the top bounds wall.
  149243. * @param {boolean} [bottom=true] - If true will create the bottom bounds wall.
  149244. *
  149245. * @return {Phaser.Physics.Impact.World} This World object.
  149246. */
  149247. setBounds: function (x, y, width, height, thickness, left, right, top, bottom)
  149248. {
  149249. if (x === undefined) { x = 0; }
  149250. if (y === undefined) { y = 0; }
  149251. if (width === undefined) { width = this.scene.sys.scale.width; }
  149252. if (height === undefined) { height = this.scene.sys.scale.height; }
  149253. if (thickness === undefined) { thickness = 64; }
  149254. if (left === undefined) { left = true; }
  149255. if (right === undefined) { right = true; }
  149256. if (top === undefined) { top = true; }
  149257. if (bottom === undefined) { bottom = true; }
  149258. this.updateWall(left, 'left', x - thickness, y, thickness, height);
  149259. this.updateWall(right, 'right', x + width, y, thickness, height);
  149260. this.updateWall(top, 'top', x, y - thickness, width, thickness);
  149261. this.updateWall(bottom, 'bottom', x, y + height, width, thickness);
  149262. return this;
  149263. },
  149264. /**
  149265. * position = 'left', 'right', 'top' or 'bottom'
  149266. *
  149267. * @method Phaser.Physics.Impact.World#updateWall
  149268. * @since 3.0.0
  149269. *
  149270. * @param {boolean} add - [description]
  149271. * @param {string} position - [description]
  149272. * @param {number} x - [description]
  149273. * @param {number} y - [description]
  149274. * @param {number} width - [description]
  149275. * @param {number} height - [description]
  149276. */
  149277. updateWall: function (add, position, x, y, width, height)
  149278. {
  149279. var wall = this.walls[position];
  149280. if (add)
  149281. {
  149282. if (wall)
  149283. {
  149284. wall.resetSize(x, y, width, height);
  149285. }
  149286. else
  149287. {
  149288. this.walls[position] = this.create(x, y, width, height);
  149289. this.walls[position].name = position;
  149290. this.walls[position].gravityFactor = 0;
  149291. this.walls[position].collides = COLLIDES.FIXED;
  149292. }
  149293. }
  149294. else
  149295. {
  149296. if (wall)
  149297. {
  149298. this.bodies.remove(wall);
  149299. }
  149300. this.walls[position] = null;
  149301. }
  149302. },
  149303. /**
  149304. * Creates a Graphics Game Object used for debug display and enables the world for debug drawing.
  149305. *
  149306. * @method Phaser.Physics.Impact.World#createDebugGraphic
  149307. * @since 3.0.0
  149308. *
  149309. * @return {Phaser.GameObjects.Graphics} The Graphics object created that will have the debug visuals drawn to it.
  149310. */
  149311. createDebugGraphic: function ()
  149312. {
  149313. var graphic = this.scene.sys.add.graphics({ x: 0, y: 0 });
  149314. graphic.setDepth(Number.MAX_VALUE);
  149315. this.debugGraphic = graphic;
  149316. this.drawDebug = true;
  149317. return graphic;
  149318. },
  149319. /**
  149320. * [description]
  149321. *
  149322. * @method Phaser.Physics.Impact.World#getNextID
  149323. * @since 3.0.0
  149324. *
  149325. * @return {integer} [description]
  149326. */
  149327. getNextID: function ()
  149328. {
  149329. return this._lastId++;
  149330. },
  149331. /**
  149332. * [description]
  149333. *
  149334. * @method Phaser.Physics.Impact.World#create
  149335. * @since 3.0.0
  149336. *
  149337. * @param {number} x - [description]
  149338. * @param {number} y - [description]
  149339. * @param {number} sizeX - [description]
  149340. * @param {number} sizeY - [description]
  149341. *
  149342. * @return {Phaser.Physics.Impact.Body} The Body that was added to this World.
  149343. */
  149344. create: function (x, y, sizeX, sizeY)
  149345. {
  149346. var body = new Body(this, x, y, sizeX, sizeY);
  149347. this.bodies.set(body);
  149348. return body;
  149349. },
  149350. /**
  149351. * [description]
  149352. *
  149353. * @method Phaser.Physics.Impact.World#remove
  149354. * @since 3.0.0
  149355. *
  149356. * @param {Phaser.Physics.Impact.Body} object - The Body to remove from this World.
  149357. */
  149358. remove: function (object)
  149359. {
  149360. this.bodies.delete(object);
  149361. },
  149362. /**
  149363. * [description]
  149364. *
  149365. * @method Phaser.Physics.Impact.World#pause
  149366. * @fires Phaser.Physics.Impact.Events#PAUSE
  149367. * @since 3.0.0
  149368. *
  149369. * @return {Phaser.Physics.Impact.World} This World object.
  149370. */
  149371. pause: function ()
  149372. {
  149373. this.enabled = false;
  149374. this.emit(Events.PAUSE);
  149375. return this;
  149376. },
  149377. /**
  149378. * [description]
  149379. *
  149380. * @method Phaser.Physics.Impact.World#resume
  149381. * @fires Phaser.Physics.Impact.Events#RESUME
  149382. * @since 3.0.0
  149383. *
  149384. * @return {Phaser.Physics.Impact.World} This World object.
  149385. */
  149386. resume: function ()
  149387. {
  149388. this.enabled = true;
  149389. this.emit(Events.RESUME);
  149390. return this;
  149391. },
  149392. /**
  149393. * [description]
  149394. *
  149395. * @method Phaser.Physics.Impact.World#update
  149396. * @since 3.0.0
  149397. *
  149398. * @param {number} time - The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout.
  149399. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  149400. */
  149401. update: function (time, delta)
  149402. {
  149403. if (!this.enabled || this.bodies.size === 0)
  149404. {
  149405. return;
  149406. }
  149407. // Impact uses a divided delta value that is clamped to the maxStep (20fps) maximum
  149408. var clampedDelta = Math.min(delta / 1000, this.maxStep) * this.timeScale;
  149409. this.delta = clampedDelta;
  149410. // Update all active bodies
  149411. var i;
  149412. var body;
  149413. var bodies = this.bodies.entries;
  149414. var len = bodies.length;
  149415. var hash = {};
  149416. var size = this.cellSize;
  149417. for (i = 0; i < len; i++)
  149418. {
  149419. body = bodies[i];
  149420. if (body.enabled)
  149421. {
  149422. body.update(clampedDelta);
  149423. }
  149424. }
  149425. // Run collision against them all now they're in the new positions from the update
  149426. for (i = 0; i < len; i++)
  149427. {
  149428. body = bodies[i];
  149429. if (body && !body.skipHash())
  149430. {
  149431. this.checkHash(body, hash, size);
  149432. }
  149433. }
  149434. if (this.drawDebug)
  149435. {
  149436. var graphics = this.debugGraphic;
  149437. graphics.clear();
  149438. for (i = 0; i < len; i++)
  149439. {
  149440. body = bodies[i];
  149441. if (body && body.willDrawDebug())
  149442. {
  149443. body.drawDebug(graphics);
  149444. }
  149445. }
  149446. }
  149447. },
  149448. /**
  149449. * Check the body against the spatial hash.
  149450. *
  149451. * @method Phaser.Physics.Impact.World#checkHash
  149452. * @since 3.0.0
  149453. *
  149454. * @param {Phaser.Physics.Impact.Body} body - [description]
  149455. * @param {object} hash - [description]
  149456. * @param {number} size - [description]
  149457. */
  149458. checkHash: function (body, hash, size)
  149459. {
  149460. var checked = {};
  149461. var xmin = Math.floor(body.pos.x / size);
  149462. var ymin = Math.floor(body.pos.y / size);
  149463. var xmax = Math.floor((body.pos.x + body.size.x) / size) + 1;
  149464. var ymax = Math.floor((body.pos.y + body.size.y) / size) + 1;
  149465. for (var x = xmin; x < xmax; x++)
  149466. {
  149467. for (var y = ymin; y < ymax; y++)
  149468. {
  149469. if (!hash[x])
  149470. {
  149471. hash[x] = {};
  149472. hash[x][y] = [ body ];
  149473. }
  149474. else if (!hash[x][y])
  149475. {
  149476. hash[x][y] = [ body ];
  149477. }
  149478. else
  149479. {
  149480. var cell = hash[x][y];
  149481. for (var c = 0; c < cell.length; c++)
  149482. {
  149483. if (body.touches(cell[c]) && !checked[cell[c].id])
  149484. {
  149485. checked[cell[c].id] = true;
  149486. this.checkBodies(body, cell[c]);
  149487. }
  149488. }
  149489. cell.push(body);
  149490. }
  149491. }
  149492. }
  149493. },
  149494. /**
  149495. * [description]
  149496. *
  149497. * @method Phaser.Physics.Impact.World#checkBodies
  149498. * @since 3.0.0
  149499. *
  149500. * @param {Phaser.Physics.Impact.Body} bodyA - [description]
  149501. * @param {Phaser.Physics.Impact.Body} bodyB - [description]
  149502. */
  149503. checkBodies: function (bodyA, bodyB)
  149504. {
  149505. // 2 fixed bodies won't do anything
  149506. if (bodyA.collides === COLLIDES.FIXED && bodyB.collides === COLLIDES.FIXED)
  149507. {
  149508. return;
  149509. }
  149510. // bitwise checks
  149511. if (bodyA.checkAgainst & bodyB.type)
  149512. {
  149513. bodyA.check(bodyB);
  149514. }
  149515. if (bodyB.checkAgainst & bodyA.type)
  149516. {
  149517. bodyB.check(bodyA);
  149518. }
  149519. if (bodyA.collides && bodyB.collides && bodyA.collides + bodyB.collides > COLLIDES.ACTIVE)
  149520. {
  149521. Solver(this, bodyA, bodyB);
  149522. }
  149523. },
  149524. /**
  149525. * [description]
  149526. *
  149527. * @method Phaser.Physics.Impact.World#setCollidesNever
  149528. * @since 3.0.0
  149529. *
  149530. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  149531. *
  149532. * @return {Phaser.Physics.Impact.World} This World object.
  149533. */
  149534. setCollidesNever: function (bodies)
  149535. {
  149536. for (var i = 0; i < bodies.length; i++)
  149537. {
  149538. bodies[i].collides = COLLIDES.NEVER;
  149539. }
  149540. return this;
  149541. },
  149542. /**
  149543. * [description]
  149544. *
  149545. * @method Phaser.Physics.Impact.World#setLite
  149546. * @since 3.0.0
  149547. *
  149548. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  149549. *
  149550. * @return {Phaser.Physics.Impact.World} This World object.
  149551. */
  149552. setLite: function (bodies)
  149553. {
  149554. for (var i = 0; i < bodies.length; i++)
  149555. {
  149556. bodies[i].collides = COLLIDES.LITE;
  149557. }
  149558. return this;
  149559. },
  149560. /**
  149561. * [description]
  149562. *
  149563. * @method Phaser.Physics.Impact.World#setPassive
  149564. * @since 3.0.0
  149565. *
  149566. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  149567. *
  149568. * @return {Phaser.Physics.Impact.World} This World object.
  149569. */
  149570. setPassive: function (bodies)
  149571. {
  149572. for (var i = 0; i < bodies.length; i++)
  149573. {
  149574. bodies[i].collides = COLLIDES.PASSIVE;
  149575. }
  149576. return this;
  149577. },
  149578. /**
  149579. * [description]
  149580. *
  149581. * @method Phaser.Physics.Impact.World#setActive
  149582. * @since 3.0.0
  149583. *
  149584. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  149585. *
  149586. * @return {Phaser.Physics.Impact.World} This World object.
  149587. */
  149588. setActive: function (bodies)
  149589. {
  149590. for (var i = 0; i < bodies.length; i++)
  149591. {
  149592. bodies[i].collides = COLLIDES.ACTIVE;
  149593. }
  149594. return this;
  149595. },
  149596. /**
  149597. * [description]
  149598. *
  149599. * @method Phaser.Physics.Impact.World#setFixed
  149600. * @since 3.0.0
  149601. *
  149602. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  149603. *
  149604. * @return {Phaser.Physics.Impact.World} This World object.
  149605. */
  149606. setFixed: function (bodies)
  149607. {
  149608. for (var i = 0; i < bodies.length; i++)
  149609. {
  149610. bodies[i].collides = COLLIDES.FIXED;
  149611. }
  149612. return this;
  149613. },
  149614. /**
  149615. * [description]
  149616. *
  149617. * @method Phaser.Physics.Impact.World#setTypeNone
  149618. * @since 3.0.0
  149619. *
  149620. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  149621. *
  149622. * @return {Phaser.Physics.Impact.World} This World object.
  149623. */
  149624. setTypeNone: function (bodies)
  149625. {
  149626. for (var i = 0; i < bodies.length; i++)
  149627. {
  149628. bodies[i].type = TYPE.NONE;
  149629. }
  149630. return this;
  149631. },
  149632. /**
  149633. * [description]
  149634. *
  149635. * @method Phaser.Physics.Impact.World#setTypeA
  149636. * @since 3.0.0
  149637. *
  149638. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  149639. *
  149640. * @return {Phaser.Physics.Impact.World} This World object.
  149641. */
  149642. setTypeA: function (bodies)
  149643. {
  149644. for (var i = 0; i < bodies.length; i++)
  149645. {
  149646. bodies[i].type = TYPE.A;
  149647. }
  149648. return this;
  149649. },
  149650. /**
  149651. * [description]
  149652. *
  149653. * @method Phaser.Physics.Impact.World#setTypeB
  149654. * @since 3.0.0
  149655. *
  149656. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  149657. *
  149658. * @return {Phaser.Physics.Impact.World} This World object.
  149659. */
  149660. setTypeB: function (bodies)
  149661. {
  149662. for (var i = 0; i < bodies.length; i++)
  149663. {
  149664. bodies[i].type = TYPE.B;
  149665. }
  149666. return this;
  149667. },
  149668. /**
  149669. * [description]
  149670. *
  149671. * @method Phaser.Physics.Impact.World#setAvsB
  149672. * @since 3.0.0
  149673. *
  149674. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  149675. *
  149676. * @return {Phaser.Physics.Impact.World} This World object.
  149677. */
  149678. setAvsB: function (bodies)
  149679. {
  149680. for (var i = 0; i < bodies.length; i++)
  149681. {
  149682. bodies[i].type = TYPE.A;
  149683. bodies[i].checkAgainst = TYPE.B;
  149684. }
  149685. return this;
  149686. },
  149687. /**
  149688. * [description]
  149689. *
  149690. * @method Phaser.Physics.Impact.World#setBvsA
  149691. * @since 3.0.0
  149692. *
  149693. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  149694. *
  149695. * @return {Phaser.Physics.Impact.World} This World object.
  149696. */
  149697. setBvsA: function (bodies)
  149698. {
  149699. for (var i = 0; i < bodies.length; i++)
  149700. {
  149701. bodies[i].type = TYPE.B;
  149702. bodies[i].checkAgainst = TYPE.A;
  149703. }
  149704. return this;
  149705. },
  149706. /**
  149707. * [description]
  149708. *
  149709. * @method Phaser.Physics.Impact.World#setCheckAgainstNone
  149710. * @since 3.0.0
  149711. *
  149712. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  149713. *
  149714. * @return {Phaser.Physics.Impact.World} This World object.
  149715. */
  149716. setCheckAgainstNone: function (bodies)
  149717. {
  149718. for (var i = 0; i < bodies.length; i++)
  149719. {
  149720. bodies[i].checkAgainst = TYPE.NONE;
  149721. }
  149722. return this;
  149723. },
  149724. /**
  149725. * [description]
  149726. *
  149727. * @method Phaser.Physics.Impact.World#setCheckAgainstA
  149728. * @since 3.0.0
  149729. *
  149730. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  149731. *
  149732. * @return {Phaser.Physics.Impact.World} This World object.
  149733. */
  149734. setCheckAgainstA: function (bodies)
  149735. {
  149736. for (var i = 0; i < bodies.length; i++)
  149737. {
  149738. bodies[i].checkAgainst = TYPE.A;
  149739. }
  149740. return this;
  149741. },
  149742. /**
  149743. * [description]
  149744. *
  149745. * @method Phaser.Physics.Impact.World#setCheckAgainstB
  149746. * @since 3.0.0
  149747. *
  149748. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  149749. *
  149750. * @return {Phaser.Physics.Impact.World} This World object.
  149751. */
  149752. setCheckAgainstB: function (bodies)
  149753. {
  149754. for (var i = 0; i < bodies.length; i++)
  149755. {
  149756. bodies[i].checkAgainst = TYPE.B;
  149757. }
  149758. return this;
  149759. },
  149760. /**
  149761. * [description]
  149762. *
  149763. * @method Phaser.Physics.Impact.World#shutdown
  149764. * @since 3.0.0
  149765. */
  149766. shutdown: function ()
  149767. {
  149768. this.removeAllListeners();
  149769. },
  149770. /**
  149771. * [description]
  149772. *
  149773. * @method Phaser.Physics.Impact.World#destroy
  149774. * @since 3.0.0
  149775. */
  149776. destroy: function ()
  149777. {
  149778. this.removeAllListeners();
  149779. this.scene = null;
  149780. this.bodies.clear();
  149781. this.bodies = null;
  149782. this.collisionMap = null;
  149783. }
  149784. });
  149785. module.exports = World;
  149786. /***/ }),
  149787. /* 1293 */
  149788. /***/ (function(module, exports, __webpack_require__) {
  149789. /**
  149790. * @author Richard Davey <rich@photonstorm.com>
  149791. * @copyright 2019 Photon Storm Ltd.
  149792. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  149793. */
  149794. var Class = __webpack_require__(0);
  149795. var Components = __webpack_require__(547);
  149796. var Sprite = __webpack_require__(67);
  149797. /**
  149798. * @classdesc
  149799. * An Impact Physics Sprite Game Object.
  149800. *
  149801. * A Sprite Game Object is used for the display of both static and animated images in your game.
  149802. * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled
  149803. * and animated.
  149804. *
  149805. * The main difference between a Sprite and an Image Game Object is that you cannot animate Images.
  149806. * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation
  149807. * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases.
  149808. *
  149809. * @class ImpactSprite
  149810. * @extends Phaser.GameObjects.Sprite
  149811. * @memberof Phaser.Physics.Impact
  149812. * @constructor
  149813. * @since 3.0.0
  149814. *
  149815. * @extends Phaser.Physics.Impact.Components.Acceleration
  149816. * @extends Phaser.Physics.Impact.Components.BodyScale
  149817. * @extends Phaser.Physics.Impact.Components.BodyType
  149818. * @extends Phaser.Physics.Impact.Components.Bounce
  149819. * @extends Phaser.Physics.Impact.Components.CheckAgainst
  149820. * @extends Phaser.Physics.Impact.Components.Collides
  149821. * @extends Phaser.Physics.Impact.Components.Debug
  149822. * @extends Phaser.Physics.Impact.Components.Friction
  149823. * @extends Phaser.Physics.Impact.Components.Gravity
  149824. * @extends Phaser.Physics.Impact.Components.Offset
  149825. * @extends Phaser.Physics.Impact.Components.SetGameObject
  149826. * @extends Phaser.Physics.Impact.Components.Velocity
  149827. * @extends Phaser.GameObjects.Components.Alpha
  149828. * @extends Phaser.GameObjects.Components.BlendMode
  149829. * @extends Phaser.GameObjects.Components.Depth
  149830. * @extends Phaser.GameObjects.Components.Flip
  149831. * @extends Phaser.GameObjects.Components.GetBounds
  149832. * @extends Phaser.GameObjects.Components.Origin
  149833. * @extends Phaser.GameObjects.Components.Pipeline
  149834. * @extends Phaser.GameObjects.Components.ScaleMode
  149835. * @extends Phaser.GameObjects.Components.ScrollFactor
  149836. * @extends Phaser.GameObjects.Components.Size
  149837. * @extends Phaser.GameObjects.Components.Texture
  149838. * @extends Phaser.GameObjects.Components.Tint
  149839. * @extends Phaser.GameObjects.Components.Transform
  149840. * @extends Phaser.GameObjects.Components.Visible
  149841. *
  149842. * @param {Phaser.Physics.Impact.World} world - [description]
  149843. * @param {number} x - The horizontal position of this Game Object in the world.
  149844. * @param {number} y - The vertical position of this Game Object in the world.
  149845. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  149846. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  149847. */
  149848. var ImpactSprite = new Class({
  149849. Extends: Sprite,
  149850. Mixins: [
  149851. Components.Acceleration,
  149852. Components.BodyScale,
  149853. Components.BodyType,
  149854. Components.Bounce,
  149855. Components.CheckAgainst,
  149856. Components.Collides,
  149857. Components.Debug,
  149858. Components.Friction,
  149859. Components.Gravity,
  149860. Components.Offset,
  149861. Components.SetGameObject,
  149862. Components.Velocity
  149863. ],
  149864. initialize:
  149865. function ImpactSprite (world, x, y, texture, frame)
  149866. {
  149867. Sprite.call(this, world.scene, x, y, texture, frame);
  149868. /**
  149869. * [description]
  149870. *
  149871. * @name Phaser.Physics.Impact.ImpactSprite#body
  149872. * @type {Phaser.Physics.Impact.Body}
  149873. * @since 3.0.0
  149874. */
  149875. this.body = world.create(x - this.frame.centerX, y - this.frame.centerY, this.width, this.height);
  149876. this.body.parent = this;
  149877. this.body.gameObject = this;
  149878. /**
  149879. * [description]
  149880. *
  149881. * @name Phaser.Physics.Impact.ImpactSprite#size
  149882. * @type {{x: number, y: number}}
  149883. * @since 3.0.0
  149884. */
  149885. this.size = this.body.size;
  149886. /**
  149887. * [description]
  149888. *
  149889. * @name Phaser.Physics.Impact.ImpactSprite#offset
  149890. * @type {{x: number, y: number}}
  149891. * @since 3.0.0
  149892. */
  149893. this.offset = this.body.offset;
  149894. /**
  149895. * [description]
  149896. *
  149897. * @name Phaser.Physics.Impact.ImpactSprite#vel
  149898. * @type {{x: number, y: number}}
  149899. * @since 3.0.0
  149900. */
  149901. this.vel = this.body.vel;
  149902. /**
  149903. * [description]
  149904. *
  149905. * @name Phaser.Physics.Impact.ImpactSprite#accel
  149906. * @type {{x: number, y: number}}
  149907. * @since 3.0.0
  149908. */
  149909. this.accel = this.body.accel;
  149910. /**
  149911. * [description]
  149912. *
  149913. * @name Phaser.Physics.Impact.ImpactSprite#friction
  149914. * @type {{x: number, y: number}}
  149915. * @since 3.0.0
  149916. */
  149917. this.friction = this.body.friction;
  149918. /**
  149919. * [description]
  149920. *
  149921. * @name Phaser.Physics.Impact.ImpactSprite#maxVel
  149922. * @type {{x: number, y: number}}
  149923. * @since 3.0.0
  149924. */
  149925. this.maxVel = this.body.maxVel;
  149926. }
  149927. });
  149928. module.exports = ImpactSprite;
  149929. /***/ }),
  149930. /* 1294 */
  149931. /***/ (function(module, exports, __webpack_require__) {
  149932. /**
  149933. * @author Richard Davey <rich@photonstorm.com>
  149934. * @copyright 2019 Photon Storm Ltd.
  149935. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  149936. */
  149937. var Class = __webpack_require__(0);
  149938. var Components = __webpack_require__(547);
  149939. var Image = __webpack_require__(93);
  149940. /**
  149941. * @classdesc
  149942. * An Impact Physics Image Game Object.
  149943. *
  149944. * An Image is a light-weight Game Object useful for the display of static images in your game,
  149945. * such as logos, backgrounds, scenery or other non-animated elements. Images can have input
  149946. * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an
  149947. * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component.
  149948. *
  149949. * @class ImpactImage
  149950. * @extends Phaser.GameObjects.Image
  149951. * @memberof Phaser.Physics.Impact
  149952. * @constructor
  149953. * @since 3.0.0
  149954. *
  149955. * @extends Phaser.Physics.Impact.Components.Acceleration
  149956. * @extends Phaser.Physics.Impact.Components.BodyScale
  149957. * @extends Phaser.Physics.Impact.Components.BodyType
  149958. * @extends Phaser.Physics.Impact.Components.Bounce
  149959. * @extends Phaser.Physics.Impact.Components.CheckAgainst
  149960. * @extends Phaser.Physics.Impact.Components.Collides
  149961. * @extends Phaser.Physics.Impact.Components.Debug
  149962. * @extends Phaser.Physics.Impact.Components.Friction
  149963. * @extends Phaser.Physics.Impact.Components.Gravity
  149964. * @extends Phaser.Physics.Impact.Components.Offset
  149965. * @extends Phaser.Physics.Impact.Components.SetGameObject
  149966. * @extends Phaser.Physics.Impact.Components.Velocity
  149967. * @extends Phaser.GameObjects.Components.Alpha
  149968. * @extends Phaser.GameObjects.Components.BlendMode
  149969. * @extends Phaser.GameObjects.Components.Depth
  149970. * @extends Phaser.GameObjects.Components.Flip
  149971. * @extends Phaser.GameObjects.Components.GetBounds
  149972. * @extends Phaser.GameObjects.Components.Origin
  149973. * @extends Phaser.GameObjects.Components.Pipeline
  149974. * @extends Phaser.GameObjects.Components.ScaleMode
  149975. * @extends Phaser.GameObjects.Components.ScrollFactor
  149976. * @extends Phaser.GameObjects.Components.Size
  149977. * @extends Phaser.GameObjects.Components.Texture
  149978. * @extends Phaser.GameObjects.Components.Tint
  149979. * @extends Phaser.GameObjects.Components.Transform
  149980. * @extends Phaser.GameObjects.Components.Visible
  149981. *
  149982. * @param {Phaser.Physics.Impact.World} world - The physics world of the Impact physics system.
  149983. * @param {number} x - The horizontal position of this Game Object in the world.
  149984. * @param {number} y - The vertical position of this Game Object in the world.
  149985. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  149986. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  149987. */
  149988. var ImpactImage = new Class({
  149989. Extends: Image,
  149990. Mixins: [
  149991. Components.Acceleration,
  149992. Components.BodyScale,
  149993. Components.BodyType,
  149994. Components.Bounce,
  149995. Components.CheckAgainst,
  149996. Components.Collides,
  149997. Components.Debug,
  149998. Components.Friction,
  149999. Components.Gravity,
  150000. Components.Offset,
  150001. Components.SetGameObject,
  150002. Components.Velocity
  150003. ],
  150004. initialize:
  150005. function ImpactImage (world, x, y, texture, frame)
  150006. {
  150007. Image.call(this, world.scene, x, y, texture, frame);
  150008. /**
  150009. * The Physics Body linked to an ImpactImage.
  150010. *
  150011. * @name Phaser.Physics.Impact.ImpactImage#body
  150012. * @type {Phaser.Physics.Impact.Body}
  150013. * @since 3.0.0
  150014. */
  150015. this.body = world.create(x - this.frame.centerX, y - this.frame.centerY, this.width, this.height);
  150016. this.body.parent = this;
  150017. this.body.gameObject = this;
  150018. /**
  150019. * The size of the physics Body.
  150020. *
  150021. * @name Phaser.Physics.Impact.ImpactImage#size
  150022. * @type {{x: number, y: number}}
  150023. * @since 3.0.0
  150024. */
  150025. this.size = this.body.size;
  150026. /**
  150027. * The X and Y offset of the Body from the left and top of the Image.
  150028. *
  150029. * @name Phaser.Physics.Impact.ImpactImage#offset
  150030. * @type {{x: number, y: number}}
  150031. * @since 3.0.0
  150032. */
  150033. this.offset = this.body.offset;
  150034. /**
  150035. * The velocity, or rate of change the Body's position. Measured in pixels per second.
  150036. *
  150037. * @name Phaser.Physics.Impact.ImpactImage#vel
  150038. * @type {{x: number, y: number}}
  150039. * @since 3.0.0
  150040. */
  150041. this.vel = this.body.vel;
  150042. /**
  150043. * The acceleration is the rate of change of the velocity. Measured in pixels per second squared.
  150044. *
  150045. * @name Phaser.Physics.Impact.ImpactImage#accel
  150046. * @type {{x: number, y: number}}
  150047. * @since 3.0.0
  150048. */
  150049. this.accel = this.body.accel;
  150050. /**
  150051. * Friction between colliding bodies.
  150052. *
  150053. * @name Phaser.Physics.Impact.ImpactImage#friction
  150054. * @type {{x: number, y: number}}
  150055. * @since 3.0.0
  150056. */
  150057. this.friction = this.body.friction;
  150058. /**
  150059. * The maximum velocity of the body.
  150060. *
  150061. * @name Phaser.Physics.Impact.ImpactImage#maxVel
  150062. * @type {{x: number, y: number}}
  150063. * @since 3.0.0
  150064. */
  150065. this.maxVel = this.body.maxVel;
  150066. }
  150067. });
  150068. module.exports = ImpactImage;
  150069. /***/ }),
  150070. /* 1295 */
  150071. /***/ (function(module, exports, __webpack_require__) {
  150072. /**
  150073. * @author Richard Davey <rich@photonstorm.com>
  150074. * @copyright 2019 Photon Storm Ltd.
  150075. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  150076. */
  150077. var Class = __webpack_require__(0);
  150078. var Components = __webpack_require__(547);
  150079. /**
  150080. * @classdesc
  150081. * [description]
  150082. *
  150083. * @class ImpactBody
  150084. * @memberof Phaser.Physics.Impact
  150085. * @constructor
  150086. * @since 3.0.0
  150087. *
  150088. * @extends Phaser.Physics.Impact.Components.Acceleration
  150089. * @extends Phaser.Physics.Impact.Components.BodyScale
  150090. * @extends Phaser.Physics.Impact.Components.BodyType
  150091. * @extends Phaser.Physics.Impact.Components.Bounce
  150092. * @extends Phaser.Physics.Impact.Components.CheckAgainst
  150093. * @extends Phaser.Physics.Impact.Components.Collides
  150094. * @extends Phaser.Physics.Impact.Components.Debug
  150095. * @extends Phaser.Physics.Impact.Components.Friction
  150096. * @extends Phaser.Physics.Impact.Components.Gravity
  150097. * @extends Phaser.Physics.Impact.Components.Offset
  150098. * @extends Phaser.Physics.Impact.Components.SetGameObject
  150099. * @extends Phaser.Physics.Impact.Components.Velocity
  150100. *
  150101. * @param {Phaser.Physics.Impact.World} world - [description]
  150102. * @param {number} x - x - The horizontal position of this physics body in the world.
  150103. * @param {number} y - y - The vertical position of this physics body in the world.
  150104. * @param {number} width - The width of the physics body in the world.
  150105. * @param {number} height - [description]
  150106. */
  150107. var ImpactBody = new Class({
  150108. Mixins: [
  150109. Components.Acceleration,
  150110. Components.BodyScale,
  150111. Components.BodyType,
  150112. Components.Bounce,
  150113. Components.CheckAgainst,
  150114. Components.Collides,
  150115. Components.Debug,
  150116. Components.Friction,
  150117. Components.Gravity,
  150118. Components.Offset,
  150119. Components.SetGameObject,
  150120. Components.Velocity
  150121. ],
  150122. initialize:
  150123. function ImpactBody (world, x, y, width, height)
  150124. {
  150125. /**
  150126. * [description]
  150127. *
  150128. * @name Phaser.Physics.Impact.ImpactBody#body
  150129. * @type {Phaser.Physics.Impact.Body}
  150130. * @since 3.0.0
  150131. */
  150132. this.body = world.create(x, y, width, height);
  150133. this.body.parent = this;
  150134. /**
  150135. * [description]
  150136. *
  150137. * @name Phaser.Physics.Impact.ImpactBody#size
  150138. * @type {{x: number, y: number}}
  150139. * @since 3.0.0
  150140. */
  150141. this.size = this.body.size;
  150142. /**
  150143. * [description]
  150144. *
  150145. * @name Phaser.Physics.Impact.ImpactBody#offset
  150146. * @type {{x: number, y: number}}
  150147. * @since 3.0.0
  150148. */
  150149. this.offset = this.body.offset;
  150150. /**
  150151. * [description]
  150152. *
  150153. * @name Phaser.Physics.Impact.ImpactBody#vel
  150154. * @type {{x: number, y: number}}
  150155. * @since 3.0.0
  150156. */
  150157. this.vel = this.body.vel;
  150158. /**
  150159. * [description]
  150160. *
  150161. * @name Phaser.Physics.Impact.ImpactBody#accel
  150162. * @type {{x: number, y: number}}
  150163. * @since 3.0.0
  150164. */
  150165. this.accel = this.body.accel;
  150166. /**
  150167. * [description]
  150168. *
  150169. * @name Phaser.Physics.Impact.ImpactBody#friction
  150170. * @type {{x: number, y: number}}
  150171. * @since 3.0.0
  150172. */
  150173. this.friction = this.body.friction;
  150174. /**
  150175. * [description]
  150176. *
  150177. * @name Phaser.Physics.Impact.ImpactBody#maxVel
  150178. * @type {{x: number, y: number}}
  150179. * @since 3.0.0
  150180. */
  150181. this.maxVel = this.body.maxVel;
  150182. }
  150183. });
  150184. module.exports = ImpactBody;
  150185. /***/ }),
  150186. /* 1296 */
  150187. /***/ (function(module, exports, __webpack_require__) {
  150188. /**
  150189. * @author Richard Davey <rich@photonstorm.com>
  150190. * @copyright 2019 Photon Storm Ltd.
  150191. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  150192. */
  150193. var Class = __webpack_require__(0);
  150194. var ImpactBody = __webpack_require__(1295);
  150195. var ImpactImage = __webpack_require__(1294);
  150196. var ImpactSprite = __webpack_require__(1293);
  150197. /**
  150198. * @classdesc
  150199. * The Impact Physics Factory allows you to easily create Impact Physics enabled Game Objects.
  150200. * Objects that are created by this Factory are automatically added to the physics world.
  150201. *
  150202. * @class Factory
  150203. * @memberof Phaser.Physics.Impact
  150204. * @constructor
  150205. * @since 3.0.0
  150206. *
  150207. * @param {Phaser.Physics.Impact.World} world - A reference to the Impact Physics world.
  150208. */
  150209. var Factory = new Class({
  150210. initialize:
  150211. function Factory (world)
  150212. {
  150213. /**
  150214. * A reference to the Impact Physics world.
  150215. *
  150216. * @name Phaser.Physics.Impact.Factory#world
  150217. * @type {Phaser.Physics.Impact.World}
  150218. * @since 3.0.0
  150219. */
  150220. this.world = world;
  150221. /**
  150222. * A reference to the Scene.Systems this Impact Physics instance belongs to.
  150223. *
  150224. * @name Phaser.Physics.Impact.Factory#sys
  150225. * @type {Phaser.Scenes.Systems}
  150226. * @since 3.0.0
  150227. */
  150228. this.sys = world.scene.sys;
  150229. },
  150230. /**
  150231. * Creates a new ImpactBody object and adds it to the physics simulation.
  150232. *
  150233. * @method Phaser.Physics.Impact.Factory#body
  150234. * @since 3.0.0
  150235. *
  150236. * @param {number} x - The horizontal position of the body in the physics world.
  150237. * @param {number} y - The vertical position of the body in the physics world.
  150238. * @param {number} width - The width of the body.
  150239. * @param {number} height - The height of the body.
  150240. *
  150241. * @return {Phaser.Physics.Impact.ImpactBody} The ImpactBody object that was created.
  150242. */
  150243. body: function (x, y, width, height)
  150244. {
  150245. return new ImpactBody(this.world, x, y, width, height);
  150246. },
  150247. /**
  150248. * Adds an Impact Physics Body to the given Game Object.
  150249. *
  150250. * @method Phaser.Physics.Impact.Factory#existing
  150251. * @since 3.0.0
  150252. *
  150253. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to receive the physics body.
  150254. *
  150255. * @return {Phaser.GameObjects.GameObject} The Game Object.
  150256. */
  150257. existing: function (gameObject)
  150258. {
  150259. var x = gameObject.x - gameObject.frame.centerX;
  150260. var y = gameObject.y - gameObject.frame.centerY;
  150261. var w = gameObject.width;
  150262. var h = gameObject.height;
  150263. gameObject.body = this.world.create(x, y, w, h);
  150264. gameObject.body.parent = gameObject;
  150265. gameObject.body.gameObject = gameObject;
  150266. return gameObject;
  150267. },
  150268. /**
  150269. * Creates a new ImpactImage object and adds it to the physics world.
  150270. *
  150271. * @method Phaser.Physics.Impact.Factory#image
  150272. * @since 3.0.0
  150273. *
  150274. * @param {number} x - The horizontal position of this Game Object in the world.
  150275. * @param {number} y - The vertical position of this Game Object in the world.
  150276. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  150277. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  150278. *
  150279. * @return {Phaser.Physics.Impact.ImpactImage} The ImpactImage object that was created.
  150280. */
  150281. image: function (x, y, key, frame)
  150282. {
  150283. var image = new ImpactImage(this.world, x, y, key, frame);
  150284. this.sys.displayList.add(image);
  150285. return image;
  150286. },
  150287. /**
  150288. * Creates a new ImpactSprite object and adds it to the physics world.
  150289. *
  150290. * @method Phaser.Physics.Impact.Factory#sprite
  150291. * @since 3.0.0
  150292. *
  150293. * @param {number} x - The horizontal position of this Game Object in the world.
  150294. * @param {number} y - The vertical position of this Game Object in the world.
  150295. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  150296. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  150297. *
  150298. * @return {Phaser.Physics.Impact.ImpactSprite} The ImpactSprite object that was created.
  150299. */
  150300. sprite: function (x, y, key, frame)
  150301. {
  150302. var sprite = new ImpactSprite(this.world, x, y, key, frame);
  150303. this.sys.displayList.add(sprite);
  150304. this.sys.updateList.add(sprite);
  150305. return sprite;
  150306. },
  150307. /**
  150308. * Destroys this Factory.
  150309. *
  150310. * @method Phaser.Physics.Impact.Factory#destroy
  150311. * @since 3.5.0
  150312. */
  150313. destroy: function ()
  150314. {
  150315. this.world = null;
  150316. this.sys = null;
  150317. }
  150318. });
  150319. module.exports = Factory;
  150320. /***/ }),
  150321. /* 1297 */
  150322. /***/ (function(module, exports, __webpack_require__) {
  150323. /**
  150324. * @author Richard Davey <rich@photonstorm.com>
  150325. * @copyright 2019 Photon Storm Ltd.
  150326. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  150327. */
  150328. var Class = __webpack_require__(0);
  150329. var DefaultDefs = __webpack_require__(1355);
  150330. /**
  150331. * @classdesc
  150332. * [description]
  150333. *
  150334. * @class CollisionMap
  150335. * @memberof Phaser.Physics.Impact
  150336. * @constructor
  150337. * @since 3.0.0
  150338. *
  150339. * @param {integer} [tilesize=32] - [description]
  150340. * @param {array} [data] - [description]
  150341. */
  150342. var CollisionMap = new Class({
  150343. initialize:
  150344. function CollisionMap (tilesize, data)
  150345. {
  150346. if (tilesize === undefined) { tilesize = 32; }
  150347. /**
  150348. * [description]
  150349. *
  150350. * @name Phaser.Physics.Impact.CollisionMap#tilesize
  150351. * @type {integer}
  150352. * @default 32
  150353. * @since 3.0.0
  150354. */
  150355. this.tilesize = tilesize;
  150356. /**
  150357. * [description]
  150358. *
  150359. * @name Phaser.Physics.Impact.CollisionMap#data
  150360. * @type {array}
  150361. * @since 3.0.0
  150362. */
  150363. this.data = (Array.isArray(data)) ? data : [];
  150364. /**
  150365. * [description]
  150366. *
  150367. * @name Phaser.Physics.Impact.CollisionMap#width
  150368. * @type {number}
  150369. * @since 3.0.0
  150370. */
  150371. this.width = (Array.isArray(data)) ? data[0].length : 0;
  150372. /**
  150373. * [description]
  150374. *
  150375. * @name Phaser.Physics.Impact.CollisionMap#height
  150376. * @type {number}
  150377. * @since 3.0.0
  150378. */
  150379. this.height = (Array.isArray(data)) ? data.length : 0;
  150380. /**
  150381. * [description]
  150382. *
  150383. * @name Phaser.Physics.Impact.CollisionMap#lastSlope
  150384. * @type {integer}
  150385. * @default 55
  150386. * @since 3.0.0
  150387. */
  150388. this.lastSlope = 55;
  150389. /**
  150390. * [description]
  150391. *
  150392. * @name Phaser.Physics.Impact.CollisionMap#tiledef
  150393. * @type {object}
  150394. * @since 3.0.0
  150395. */
  150396. this.tiledef = DefaultDefs;
  150397. },
  150398. /**
  150399. * [description]
  150400. *
  150401. * @method Phaser.Physics.Impact.CollisionMap#trace
  150402. * @since 3.0.0
  150403. *
  150404. * @param {number} x - [description]
  150405. * @param {number} y - [description]
  150406. * @param {number} vx - [description]
  150407. * @param {number} vy - [description]
  150408. * @param {number} objectWidth - [description]
  150409. * @param {number} objectHeight - [description]
  150410. *
  150411. * @return {boolean} [description]
  150412. */
  150413. trace: function (x, y, vx, vy, objectWidth, objectHeight)
  150414. {
  150415. // Set up the trace-result
  150416. var res = {
  150417. collision: { x: false, y: false, slope: false },
  150418. pos: { x: x + vx, y: y + vy },
  150419. tile: { x: 0, y: 0 }
  150420. };
  150421. if (!this.data)
  150422. {
  150423. return res;
  150424. }
  150425. var steps = Math.ceil(Math.max(Math.abs(vx), Math.abs(vy)) / this.tilesize);
  150426. if (steps > 1)
  150427. {
  150428. var sx = vx / steps;
  150429. var sy = vy / steps;
  150430. for (var i = 0; i < steps && (sx || sy); i++)
  150431. {
  150432. this.step(res, x, y, sx, sy, objectWidth, objectHeight, vx, vy, i);
  150433. x = res.pos.x;
  150434. y = res.pos.y;
  150435. if (res.collision.x)
  150436. {
  150437. sx = 0;
  150438. vx = 0;
  150439. }
  150440. if (res.collision.y)
  150441. {
  150442. sy = 0;
  150443. vy = 0;
  150444. }
  150445. if (res.collision.slope)
  150446. {
  150447. break;
  150448. }
  150449. }
  150450. }
  150451. else
  150452. {
  150453. this.step(res, x, y, vx, vy, objectWidth, objectHeight, vx, vy, 0);
  150454. }
  150455. return res;
  150456. },
  150457. /**
  150458. * [description]
  150459. *
  150460. * @method Phaser.Physics.Impact.CollisionMap#step
  150461. * @since 3.0.0
  150462. *
  150463. * @param {object} res - [description]
  150464. * @param {number} x - [description]
  150465. * @param {number} y - [description]
  150466. * @param {number} vx - [description]
  150467. * @param {number} vy - [description]
  150468. * @param {number} width - [description]
  150469. * @param {number} height - [description]
  150470. * @param {number} rvx - [description]
  150471. * @param {number} rvy - [description]
  150472. * @param {number} step - [description]
  150473. */
  150474. step: function (res, x, y, vx, vy, width, height, rvx, rvy, step)
  150475. {
  150476. var t = 0;
  150477. var tileX;
  150478. var tileY;
  150479. var tilesize = this.tilesize;
  150480. var mapWidth = this.width;
  150481. var mapHeight = this.height;
  150482. // Horizontal
  150483. if (vx)
  150484. {
  150485. var pxOffsetX = (vx > 0 ? width : 0);
  150486. var tileOffsetX = (vx < 0 ? tilesize : 0);
  150487. var firstTileY = Math.max(Math.floor(y / tilesize), 0);
  150488. var lastTileY = Math.min(Math.ceil((y + height) / tilesize), mapHeight);
  150489. tileX = Math.floor((res.pos.x + pxOffsetX) / tilesize);
  150490. var prevTileX = Math.floor((x + pxOffsetX) / tilesize);
  150491. if (step > 0 || tileX === prevTileX || prevTileX < 0 || prevTileX >= mapWidth)
  150492. {
  150493. prevTileX = -1;
  150494. }
  150495. if (tileX >= 0 && tileX < mapWidth)
  150496. {
  150497. for (tileY = firstTileY; tileY < lastTileY; tileY++)
  150498. {
  150499. if (prevTileX !== -1)
  150500. {
  150501. t = this.data[tileY][prevTileX];
  150502. if (t > 1 && t <= this.lastSlope && this.checkDef(res, t, x, y, rvx, rvy, width, height, prevTileX, tileY))
  150503. {
  150504. break;
  150505. }
  150506. }
  150507. t = this.data[tileY][tileX];
  150508. if (t === 1 || t > this.lastSlope || (t > 1 && this.checkDef(res, t, x, y, rvx, rvy, width, height, tileX, tileY)))
  150509. {
  150510. if (t > 1 && t <= this.lastSlope && res.collision.slope)
  150511. {
  150512. break;
  150513. }
  150514. res.collision.x = true;
  150515. res.tile.x = t;
  150516. res.pos.x = (tileX * tilesize) - pxOffsetX + tileOffsetX;
  150517. x = res.pos.x;
  150518. rvx = 0;
  150519. break;
  150520. }
  150521. }
  150522. }
  150523. }
  150524. // Vertical
  150525. if (vy)
  150526. {
  150527. var pxOffsetY = (vy > 0 ? height : 0);
  150528. var tileOffsetY = (vy < 0 ? tilesize : 0);
  150529. var firstTileX = Math.max(Math.floor(res.pos.x / tilesize), 0);
  150530. var lastTileX = Math.min(Math.ceil((res.pos.x + width) / tilesize), mapWidth);
  150531. tileY = Math.floor((res.pos.y + pxOffsetY) / tilesize);
  150532. var prevTileY = Math.floor((y + pxOffsetY) / tilesize);
  150533. if (step > 0 || tileY === prevTileY || prevTileY < 0 || prevTileY >= mapHeight)
  150534. {
  150535. prevTileY = -1;
  150536. }
  150537. if (tileY >= 0 && tileY < mapHeight)
  150538. {
  150539. for (tileX = firstTileX; tileX < lastTileX; tileX++)
  150540. {
  150541. if (prevTileY !== -1)
  150542. {
  150543. t = this.data[prevTileY][tileX];
  150544. if (t > 1 && t <= this.lastSlope && this.checkDef(res, t, x, y, rvx, rvy, width, height, tileX, prevTileY))
  150545. {
  150546. break;
  150547. }
  150548. }
  150549. t = this.data[tileY][tileX];
  150550. if (t === 1 || t > this.lastSlope || (t > 1 && this.checkDef(res, t, x, y, rvx, rvy, width, height, tileX, tileY)))
  150551. {
  150552. if (t > 1 && t <= this.lastSlope && res.collision.slope)
  150553. {
  150554. break;
  150555. }
  150556. res.collision.y = true;
  150557. res.tile.y = t;
  150558. res.pos.y = tileY * tilesize - pxOffsetY + tileOffsetY;
  150559. break;
  150560. }
  150561. }
  150562. }
  150563. }
  150564. },
  150565. /**
  150566. * [description]
  150567. *
  150568. * @method Phaser.Physics.Impact.CollisionMap#checkDef
  150569. * @since 3.0.0
  150570. *
  150571. * @param {object} res - [description]
  150572. * @param {number} t - [description]
  150573. * @param {number} x - [description]
  150574. * @param {number} y - [description]
  150575. * @param {number} vx - [description]
  150576. * @param {number} vy - [description]
  150577. * @param {number} width - [description]
  150578. * @param {number} height - [description]
  150579. * @param {number} tileX - [description]
  150580. * @param {number} tileY - [description]
  150581. *
  150582. * @return {boolean} [description]
  150583. */
  150584. checkDef: function (res, t, x, y, vx, vy, width, height, tileX, tileY)
  150585. {
  150586. var def = this.tiledef[t];
  150587. if (!def)
  150588. {
  150589. return false;
  150590. }
  150591. var tilesize = this.tilesize;
  150592. var lx = (tileX + def[0]) * tilesize;
  150593. var ly = (tileY + def[1]) * tilesize;
  150594. var lvx = (def[2] - def[0]) * tilesize;
  150595. var lvy = (def[3] - def[1]) * tilesize;
  150596. var solid = def[4];
  150597. var tx = x + vx + (lvy < 0 ? width : 0) - lx;
  150598. var ty = y + vy + (lvx > 0 ? height : 0) - ly;
  150599. if (lvx * ty - lvy * tx > 0)
  150600. {
  150601. if (vx * -lvy + vy * lvx < 0)
  150602. {
  150603. return solid;
  150604. }
  150605. var length = Math.sqrt(lvx * lvx + lvy * lvy);
  150606. var nx = lvy / length;
  150607. var ny = -lvx / length;
  150608. var proj = tx * nx + ty * ny;
  150609. var px = nx * proj;
  150610. var py = ny * proj;
  150611. if (px * px + py * py >= vx * vx + vy * vy)
  150612. {
  150613. return solid || (lvx * (ty - vy) - lvy * (tx - vx) < 0.5);
  150614. }
  150615. res.pos.x = x + vx - px;
  150616. res.pos.y = y + vy - py;
  150617. res.collision.slope = { x: lvx, y: lvy, nx: nx, ny: ny };
  150618. return true;
  150619. }
  150620. return false;
  150621. }
  150622. });
  150623. module.exports = CollisionMap;
  150624. /***/ }),
  150625. /* 1298 */
  150626. /***/ (function(module, exports, __webpack_require__) {
  150627. /**
  150628. * @author Richard Davey <rich@photonstorm.com>
  150629. * @copyright 2019 Photon Storm Ltd.
  150630. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  150631. */
  150632. var Class = __webpack_require__(0);
  150633. var COLLIDES = __webpack_require__(240);
  150634. var GetVelocity = __webpack_require__(1360);
  150635. var TYPE = __webpack_require__(239);
  150636. var UpdateMotion = __webpack_require__(1359);
  150637. /**
  150638. * @callback BodyUpdateCallback
  150639. *
  150640. * @param {Phaser.Physics.Impact.Body} body - [description]
  150641. */
  150642. /**
  150643. * @typedef {object} JSONImpactBody
  150644. * @todo Replace object types
  150645. *
  150646. * @property {string} name - [description]
  150647. * @property {object} size - [description]
  150648. * @property {object} pos - The entity's position in the game world.
  150649. * @property {object} vel - Current velocity in pixels per second.
  150650. * @property {object} accel - Current acceleration to be added to the entity's velocity per second. E.g. an entity with a `vel.x` of 0 and `accel.x` of 10 will have a `vel.x` of 100 ten seconds later.
  150651. * @property {object} friction - Deceleration to be subtracted from the entity's velocity per second. Only applies if `accel` is 0.
  150652. * @property {object} maxVel - The maximum velocity a body can move.
  150653. * @property {number} gravityFactor - [description]
  150654. * @property {number} bounciness - [description]
  150655. * @property {number} minBounceVelocity - [description]
  150656. * @property {Phaser.Physics.Impact.TYPE} type - [description]
  150657. * @property {Phaser.Physics.Impact.TYPE} checkAgainst - [description]
  150658. * @property {Phaser.Physics.Impact.COLLIDES} collides - [description]
  150659. */
  150660. /**
  150661. * @classdesc
  150662. * An Impact.js compatible physics body.
  150663. * This re-creates the properties you'd get on an Entity and the math needed to update them.
  150664. *
  150665. * @class Body
  150666. * @memberof Phaser.Physics.Impact
  150667. * @constructor
  150668. * @since 3.0.0
  150669. *
  150670. * @param {Phaser.Physics.Impact.World} world - [description]
  150671. * @param {number} x - [description]
  150672. * @param {number} y - [description]
  150673. * @param {number} [sx=16] - [description]
  150674. * @param {number} [sy=16] - [description]
  150675. */
  150676. var Body = new Class({
  150677. initialize:
  150678. function Body (world, x, y, sx, sy)
  150679. {
  150680. if (sx === undefined) { sx = 16; }
  150681. if (sy === undefined) { sy = sx; }
  150682. /**
  150683. * [description]
  150684. *
  150685. * @name Phaser.Physics.Impact.Body#world
  150686. * @type {Phaser.Physics.Impact.World}
  150687. * @since 3.0.0
  150688. */
  150689. this.world = world;
  150690. /**
  150691. * [description]
  150692. *
  150693. * @name Phaser.Physics.Impact.Body#gameObject
  150694. * @type {Phaser.GameObjects.GameObject}
  150695. * @default null
  150696. * @since 3.0.0
  150697. */
  150698. this.gameObject = null;
  150699. /**
  150700. * [description]
  150701. *
  150702. * @name Phaser.Physics.Impact.Body#enabled
  150703. * @type {boolean}
  150704. * @default true
  150705. * @since 3.0.0
  150706. */
  150707. this.enabled = true;
  150708. /**
  150709. * The ImpactBody, ImpactSprite or ImpactImage object that owns this Body, if any.
  150710. *
  150711. * @name Phaser.Physics.Impact.Body#parent
  150712. * @type {?(Phaser.Physics.Impact.ImpactBody|Phaser.Physics.Impact.ImpactImage|Phaser.Physics.Impact.ImpactSprite)}
  150713. * @since 3.0.0
  150714. */
  150715. this.parent;
  150716. /**
  150717. * [description]
  150718. *
  150719. * @name Phaser.Physics.Impact.Body#id
  150720. * @type {integer}
  150721. * @since 3.0.0
  150722. */
  150723. this.id = world.getNextID();
  150724. /**
  150725. * [description]
  150726. *
  150727. * @name Phaser.Physics.Impact.Body#name
  150728. * @type {string}
  150729. * @default ''
  150730. * @since 3.0.0
  150731. */
  150732. this.name = '';
  150733. /**
  150734. * [description]
  150735. *
  150736. * @name Phaser.Physics.Impact.Body#size
  150737. * @type {{x: number, y: number}}
  150738. * @since 3.0.0
  150739. */
  150740. this.size = { x: sx, y: sy };
  150741. /**
  150742. * [description]
  150743. *
  150744. * @name Phaser.Physics.Impact.Body#offset
  150745. * @type {{x: number, y: number}}
  150746. * @since 3.0.0
  150747. */
  150748. this.offset = { x: 0, y: 0 };
  150749. /**
  150750. * [description]
  150751. *
  150752. * @name Phaser.Physics.Impact.Body#pos
  150753. * @type {{x: number, y: number}}
  150754. * @since 3.0.0
  150755. */
  150756. this.pos = { x: x, y: y };
  150757. /**
  150758. * [description]
  150759. *
  150760. * @name Phaser.Physics.Impact.Body#last
  150761. * @type {{x: number, y: number}}
  150762. * @since 3.0.0
  150763. */
  150764. this.last = { x: x, y: y };
  150765. /**
  150766. * [description]
  150767. *
  150768. * @name Phaser.Physics.Impact.Body#vel
  150769. * @type {{x: number, y: number}}
  150770. * @since 3.0.0
  150771. */
  150772. this.vel = { x: 0, y: 0 };
  150773. /**
  150774. * [description]
  150775. *
  150776. * @name Phaser.Physics.Impact.Body#accel
  150777. * @type {{x: number, y: number}}
  150778. * @since 3.0.0
  150779. */
  150780. this.accel = { x: 0, y: 0 };
  150781. /**
  150782. * [description]
  150783. *
  150784. * @name Phaser.Physics.Impact.Body#friction
  150785. * @type {{x: number, y: number}}
  150786. * @since 3.0.0
  150787. */
  150788. this.friction = { x: 0, y: 0 };
  150789. /**
  150790. * [description]
  150791. *
  150792. * @name Phaser.Physics.Impact.Body#maxVel
  150793. * @type {{x: number, y: number}}
  150794. * @since 3.0.0
  150795. */
  150796. this.maxVel = { x: world.defaults.maxVelocityX, y: world.defaults.maxVelocityY };
  150797. /**
  150798. * [description]
  150799. *
  150800. * @name Phaser.Physics.Impact.Body#standing
  150801. * @type {boolean}
  150802. * @default false
  150803. * @since 3.0.0
  150804. */
  150805. this.standing = false;
  150806. /**
  150807. * [description]
  150808. *
  150809. * @name Phaser.Physics.Impact.Body#gravityFactor
  150810. * @type {number}
  150811. * @since 3.0.0
  150812. */
  150813. this.gravityFactor = world.defaults.gravityFactor;
  150814. /**
  150815. * [description]
  150816. *
  150817. * @name Phaser.Physics.Impact.Body#bounciness
  150818. * @type {number}
  150819. * @since 3.0.0
  150820. */
  150821. this.bounciness = world.defaults.bounciness;
  150822. /**
  150823. * [description]
  150824. *
  150825. * @name Phaser.Physics.Impact.Body#minBounceVelocity
  150826. * @type {number}
  150827. * @since 3.0.0
  150828. */
  150829. this.minBounceVelocity = world.defaults.minBounceVelocity;
  150830. /**
  150831. * [description]
  150832. *
  150833. * @name Phaser.Physics.Impact.Body#accelGround
  150834. * @type {number}
  150835. * @default 0
  150836. * @since 3.0.0
  150837. */
  150838. this.accelGround = 0;
  150839. /**
  150840. * [description]
  150841. *
  150842. * @name Phaser.Physics.Impact.Body#accelAir
  150843. * @type {number}
  150844. * @default 0
  150845. * @since 3.0.0
  150846. */
  150847. this.accelAir = 0;
  150848. /**
  150849. * [description]
  150850. *
  150851. * @name Phaser.Physics.Impact.Body#jumpSpeed
  150852. * @type {number}
  150853. * @default 0
  150854. * @since 3.0.0
  150855. */
  150856. this.jumpSpeed = 0;
  150857. /**
  150858. * [description]
  150859. *
  150860. * @name Phaser.Physics.Impact.Body#type
  150861. * @type {Phaser.Physics.Impact.TYPE}
  150862. * @since 3.0.0
  150863. */
  150864. this.type = TYPE.NONE;
  150865. /**
  150866. * [description]
  150867. *
  150868. * @name Phaser.Physics.Impact.Body#checkAgainst
  150869. * @type {Phaser.Physics.Impact.TYPE}
  150870. * @since 3.0.0
  150871. */
  150872. this.checkAgainst = TYPE.NONE;
  150873. /**
  150874. * [description]
  150875. *
  150876. * @name Phaser.Physics.Impact.Body#collides
  150877. * @type {Phaser.Physics.Impact.COLLIDES}
  150878. * @since 3.0.0
  150879. */
  150880. this.collides = COLLIDES.NEVER;
  150881. /**
  150882. * [description]
  150883. *
  150884. * @name Phaser.Physics.Impact.Body#debugShowBody
  150885. * @type {boolean}
  150886. * @since 3.0.0
  150887. */
  150888. this.debugShowBody = world.defaults.debugShowBody;
  150889. /**
  150890. * [description]
  150891. *
  150892. * @name Phaser.Physics.Impact.Body#debugShowVelocity
  150893. * @type {boolean}
  150894. * @since 3.0.0
  150895. */
  150896. this.debugShowVelocity = world.defaults.debugShowVelocity;
  150897. /**
  150898. * [description]
  150899. *
  150900. * @name Phaser.Physics.Impact.Body#debugBodyColor
  150901. * @type {integer}
  150902. * @since 3.0.0
  150903. */
  150904. this.debugBodyColor = world.defaults.bodyDebugColor;
  150905. /**
  150906. * [description]
  150907. *
  150908. * @name Phaser.Physics.Impact.Body#updateCallback
  150909. * @type {?BodyUpdateCallback}
  150910. * @since 3.0.0
  150911. */
  150912. this.updateCallback;
  150913. /**
  150914. * min 44 deg, max 136 deg
  150915. *
  150916. * @name Phaser.Physics.Impact.Body#slopeStanding
  150917. * @type {{ min: number, max: number }}
  150918. * @since 3.0.0
  150919. */
  150920. this.slopeStanding = { min: 0.767944870877505, max: 2.3736477827122884 };
  150921. },
  150922. /**
  150923. * [description]
  150924. *
  150925. * @method Phaser.Physics.Impact.Body#reset
  150926. * @since 3.0.0
  150927. *
  150928. * @param {number} x - [description]
  150929. * @param {number} y - [description]
  150930. */
  150931. reset: function (x, y)
  150932. {
  150933. this.pos = { x: x, y: y };
  150934. this.last = { x: x, y: y };
  150935. this.vel = { x: 0, y: 0 };
  150936. this.accel = { x: 0, y: 0 };
  150937. this.friction = { x: 0, y: 0 };
  150938. this.maxVel = { x: 100, y: 100 };
  150939. this.standing = false;
  150940. this.gravityFactor = 1;
  150941. this.bounciness = 0;
  150942. this.minBounceVelocity = 40;
  150943. this.accelGround = 0;
  150944. this.accelAir = 0;
  150945. this.jumpSpeed = 0;
  150946. this.type = TYPE.NONE;
  150947. this.checkAgainst = TYPE.NONE;
  150948. this.collides = COLLIDES.NEVER;
  150949. },
  150950. /**
  150951. * [description]
  150952. *
  150953. * @method Phaser.Physics.Impact.Body#update
  150954. * @since 3.0.0
  150955. *
  150956. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  150957. */
  150958. update: function (delta)
  150959. {
  150960. var pos = this.pos;
  150961. this.last.x = pos.x;
  150962. this.last.y = pos.y;
  150963. this.vel.y += this.world.gravity * delta * this.gravityFactor;
  150964. this.vel.x = GetVelocity(delta, this.vel.x, this.accel.x, this.friction.x, this.maxVel.x);
  150965. this.vel.y = GetVelocity(delta, this.vel.y, this.accel.y, this.friction.y, this.maxVel.y);
  150966. var mx = this.vel.x * delta;
  150967. var my = this.vel.y * delta;
  150968. var res = this.world.collisionMap.trace(pos.x, pos.y, mx, my, this.size.x, this.size.y);
  150969. if (this.handleMovementTrace(res))
  150970. {
  150971. UpdateMotion(this, res);
  150972. }
  150973. var go = this.gameObject;
  150974. if (go)
  150975. {
  150976. go.x = (pos.x - this.offset.x) + go.displayOriginX * go.scaleX;
  150977. go.y = (pos.y - this.offset.y) + go.displayOriginY * go.scaleY;
  150978. }
  150979. if (this.updateCallback)
  150980. {
  150981. this.updateCallback(this);
  150982. }
  150983. },
  150984. /**
  150985. * [description]
  150986. *
  150987. * @method Phaser.Physics.Impact.Body#drawDebug
  150988. * @since 3.0.0
  150989. *
  150990. * @param {Phaser.GameObjects.Graphics} graphic - [description]
  150991. */
  150992. drawDebug: function (graphic)
  150993. {
  150994. var pos = this.pos;
  150995. if (this.debugShowBody)
  150996. {
  150997. graphic.lineStyle(1, this.debugBodyColor, 1);
  150998. graphic.strokeRect(pos.x, pos.y, this.size.x, this.size.y);
  150999. }
  151000. if (this.debugShowVelocity)
  151001. {
  151002. var x = pos.x + this.size.x / 2;
  151003. var y = pos.y + this.size.y / 2;
  151004. graphic.lineStyle(1, this.world.defaults.velocityDebugColor, 1);
  151005. graphic.lineBetween(x, y, x + this.vel.x, y + this.vel.y);
  151006. }
  151007. },
  151008. /**
  151009. * [description]
  151010. *
  151011. * @method Phaser.Physics.Impact.Body#willDrawDebug
  151012. * @since 3.0.0
  151013. *
  151014. * @return {boolean} [description]
  151015. */
  151016. willDrawDebug: function ()
  151017. {
  151018. return (this.debugShowBody || this.debugShowVelocity);
  151019. },
  151020. /**
  151021. * [description]
  151022. *
  151023. * @method Phaser.Physics.Impact.Body#skipHash
  151024. * @since 3.0.0
  151025. *
  151026. * @return {boolean} [description]
  151027. */
  151028. skipHash: function ()
  151029. {
  151030. return (!this.enabled || (this.type === 0 && this.checkAgainst === 0 && this.collides === 0));
  151031. },
  151032. /**
  151033. * Determines whether the body collides with the `other` one or not.
  151034. *
  151035. * @method Phaser.Physics.Impact.Body#touches
  151036. * @since 3.0.0
  151037. *
  151038. * @param {Phaser.Physics.Impact.Body} other - [description]
  151039. *
  151040. * @return {boolean} [description]
  151041. */
  151042. touches: function (other)
  151043. {
  151044. return !(
  151045. this.pos.x >= other.pos.x + other.size.x ||
  151046. this.pos.x + this.size.x <= other.pos.x ||
  151047. this.pos.y >= other.pos.y + other.size.y ||
  151048. this.pos.y + this.size.y <= other.pos.y
  151049. );
  151050. },
  151051. /**
  151052. * Reset the size and position of the physics body.
  151053. *
  151054. * @method Phaser.Physics.Impact.Body#resetSize
  151055. * @since 3.0.0
  151056. *
  151057. * @param {number} x - The x coordinate to position the body.
  151058. * @param {number} y - The y coordinate to position the body.
  151059. * @param {number} width - The width of the body.
  151060. * @param {number} height - The height of the body.
  151061. *
  151062. * @return {Phaser.Physics.Impact.Body} This Body object.
  151063. */
  151064. resetSize: function (x, y, width, height)
  151065. {
  151066. this.pos.x = x;
  151067. this.pos.y = y;
  151068. this.size.x = width;
  151069. this.size.y = height;
  151070. return this;
  151071. },
  151072. /**
  151073. * Export this body object to JSON.
  151074. *
  151075. * @method Phaser.Physics.Impact.Body#toJSON
  151076. * @since 3.0.0
  151077. *
  151078. * @return {JSONImpactBody} JSON representation of this body object.
  151079. */
  151080. toJSON: function ()
  151081. {
  151082. var output = {
  151083. name: this.name,
  151084. size: { x: this.size.x, y: this.size.y },
  151085. pos: { x: this.pos.x, y: this.pos.y },
  151086. vel: { x: this.vel.x, y: this.vel.y },
  151087. accel: { x: this.accel.x, y: this.accel.y },
  151088. friction: { x: this.friction.x, y: this.friction.y },
  151089. maxVel: { x: this.maxVel.x, y: this.maxVel.y },
  151090. gravityFactor: this.gravityFactor,
  151091. bounciness: this.bounciness,
  151092. minBounceVelocity: this.minBounceVelocity,
  151093. type: this.type,
  151094. checkAgainst: this.checkAgainst,
  151095. collides: this.collides
  151096. };
  151097. return output;
  151098. },
  151099. /**
  151100. * [description]
  151101. *
  151102. * @method Phaser.Physics.Impact.Body#fromJSON
  151103. * @todo Code it!
  151104. * @since 3.0.0
  151105. *
  151106. * @param {object} config - [description]
  151107. */
  151108. fromJSON: function ()
  151109. {
  151110. },
  151111. /**
  151112. * Can be overridden by user code
  151113. *
  151114. * @method Phaser.Physics.Impact.Body#check
  151115. * @since 3.0.0
  151116. *
  151117. * @param {Phaser.Physics.Impact.Body} other - [description]
  151118. */
  151119. check: function ()
  151120. {
  151121. },
  151122. /**
  151123. * Can be overridden by user code
  151124. *
  151125. * @method Phaser.Physics.Impact.Body#collideWith
  151126. * @since 3.0.0
  151127. *
  151128. * @param {Phaser.Physics.Impact.Body} other - [description]
  151129. * @param {string} axis - [description]
  151130. */
  151131. collideWith: function (other, axis)
  151132. {
  151133. if (this.parent && this.parent._collideCallback)
  151134. {
  151135. this.parent._collideCallback.call(this.parent._callbackScope, this, other, axis);
  151136. }
  151137. },
  151138. /**
  151139. * Can be overridden by user code but must return a boolean.
  151140. *
  151141. * @method Phaser.Physics.Impact.Body#handleMovementTrace
  151142. * @since 3.0.0
  151143. *
  151144. * @param {number} res - [description]
  151145. *
  151146. * @return {boolean} [description]
  151147. */
  151148. handleMovementTrace: function ()
  151149. {
  151150. return true;
  151151. },
  151152. /**
  151153. * [description]
  151154. *
  151155. * @method Phaser.Physics.Impact.Body#destroy
  151156. * @since 3.0.0
  151157. */
  151158. destroy: function ()
  151159. {
  151160. this.world.remove(this);
  151161. this.enabled = false;
  151162. this.world = null;
  151163. this.gameObject = null;
  151164. this.parent = null;
  151165. }
  151166. });
  151167. module.exports = Body;
  151168. /***/ }),
  151169. /* 1299 */,
  151170. /* 1300 */
  151171. /***/ (function(module, exports, __webpack_require__) {
  151172. /**
  151173. * @author Richard Davey <rich@photonstorm.com>
  151174. * @copyright 2019 Photon Storm Ltd.
  151175. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  151176. */
  151177. /**
  151178. * @namespace Phaser.Renderer.WebGL.Pipelines
  151179. */
  151180. module.exports = {
  151181. BitmapMaskPipeline: __webpack_require__(454),
  151182. ForwardDiffuseLightPipeline: __webpack_require__(453),
  151183. TextureTintPipeline: __webpack_require__(211)
  151184. };
  151185. /***/ }),
  151186. /* 1301 */
  151187. /***/ (function(module, exports, __webpack_require__) {
  151188. /**
  151189. * @author Richard Davey <rich@photonstorm.com>
  151190. * @copyright 2019 Photon Storm Ltd.
  151191. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  151192. */
  151193. /**
  151194. * @namespace Phaser.Renderer.WebGL
  151195. */
  151196. module.exports = {
  151197. Utils: __webpack_require__(9),
  151198. WebGLPipeline: __webpack_require__(212),
  151199. WebGLRenderer: __webpack_require__(456),
  151200. Pipelines: __webpack_require__(1300),
  151201. // Constants
  151202. BYTE: 0,
  151203. SHORT: 1,
  151204. UNSIGNED_BYTE: 2,
  151205. UNSIGNED_SHORT: 3,
  151206. FLOAT: 4
  151207. };
  151208. /***/ }),
  151209. /* 1302 */
  151210. /***/ (function(module, exports, __webpack_require__) {
  151211. /**
  151212. * @author Richard Davey <rich@photonstorm.com>
  151213. * @copyright 2019 Photon Storm Ltd.
  151214. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  151215. */
  151216. /**
  151217. * @callback SnapshotCallback
  151218. *
  151219. * @param {(Phaser.Display.Color|HTMLImageElement)} snapshot - Either a Color object if a single pixel is being grabbed, or a new Image which contains a snapshot of the canvas contents.
  151220. */
  151221. /**
  151222. * @typedef {object} SnapshotState
  151223. *
  151224. * @property {SnapshotCallback} callback - The function to call after the snapshot is taken.
  151225. * @property {string} [type='image/png'] - The format of the image to create, usually `image/png` or `image/jpeg`.
  151226. * @property {number} [encoderOptions=0.92] - The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`.
  151227. * @property {integer} [x=0] - The x coordinate to start the snapshot from.
  151228. * @property {integer} [y=0] - The y coordinate to start the snapshot from.
  151229. * @property {integer} [width] - The width of the snapshot.
  151230. * @property {integer} [height] - The height of the snapshot.
  151231. * @property {boolean} [getPixel=false] - Is this a snapshot to get a single pixel, or an area?
  151232. */
  151233. /**
  151234. * @namespace Phaser.Renderer.Snapshot
  151235. */
  151236. module.exports = {
  151237. Canvas: __webpack_require__(458),
  151238. WebGL: __webpack_require__(455)
  151239. };
  151240. /***/ }),
  151241. /* 1303 */
  151242. /***/ (function(module, exports, __webpack_require__) {
  151243. /**
  151244. * @author Richard Davey <rich@photonstorm.com>
  151245. * @copyright 2019 Photon Storm Ltd.
  151246. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  151247. */
  151248. /**
  151249. * @namespace Phaser.Renderer.Canvas
  151250. */
  151251. module.exports = {
  151252. CanvasRenderer: __webpack_require__(459),
  151253. GetBlendModes: __webpack_require__(457),
  151254. SetTransform: __webpack_require__(25)
  151255. };
  151256. /***/ }),
  151257. /* 1304 */
  151258. /***/ (function(module, exports, __webpack_require__) {
  151259. /**
  151260. * @author Richard Davey <rich@photonstorm.com>
  151261. * @copyright 2019 Photon Storm Ltd.
  151262. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  151263. */
  151264. /**
  151265. * @namespace Phaser.Renderer
  151266. */
  151267. module.exports = {
  151268. Canvas: __webpack_require__(1303),
  151269. Snapshot: __webpack_require__(1302),
  151270. WebGL: __webpack_require__(1301)
  151271. };
  151272. /***/ }),
  151273. /* 1305 */
  151274. /***/ (function(module, exports, __webpack_require__) {
  151275. var Matter = __webpack_require__(541);
  151276. /**
  151277. * A coordinate wrapping plugin for matter.js.
  151278. * See the readme for usage and examples.
  151279. * @module MatterWrap
  151280. */
  151281. var MatterWrap = {
  151282. // plugin meta
  151283. name: 'matter-wrap', // PLUGIN_NAME
  151284. version: '0.1.4', // PLUGIN_VERSION
  151285. for: 'matter-js@^0.13.1',
  151286. silent: true, // no console log please
  151287. // installs the plugin where `base` is `Matter`
  151288. // you should not need to call this directly.
  151289. install: function(base) {
  151290. base.after('Engine.update', function() {
  151291. MatterWrap.Engine.update(this);
  151292. });
  151293. },
  151294. Engine: {
  151295. /**
  151296. * Updates the engine by wrapping bodies and composites inside `engine.world`.
  151297. * This is called automatically by the plugin.
  151298. * @function MatterWrap.Engine.update
  151299. * @param {Matter.Engine} engine The engine to update.
  151300. * @returns {void} No return value.
  151301. */
  151302. update: function(engine) {
  151303. var world = engine.world,
  151304. bodies = Matter.Composite.allBodies(world),
  151305. composites = Matter.Composite.allComposites(world);
  151306. for (var i = 0; i < bodies.length; i += 1) {
  151307. var body = bodies[i];
  151308. if (body.plugin.wrap) {
  151309. MatterWrap.Body.wrap(body, body.plugin.wrap);
  151310. }
  151311. }
  151312. for (i = 0; i < composites.length; i += 1) {
  151313. var composite = composites[i];
  151314. if (composite.plugin.wrap) {
  151315. MatterWrap.Composite.wrap(composite, composite.plugin.wrap);
  151316. }
  151317. }
  151318. }
  151319. },
  151320. Bounds: {
  151321. /**
  151322. * Returns a translation vector that wraps the `objectBounds` inside the `bounds`.
  151323. * @function MatterWrap.Bounds.wrap
  151324. * @param {Matter.Bounds} objectBounds The bounds of the object to wrap inside the bounds.
  151325. * @param {Matter.Bounds} bounds The bounds to wrap the body inside.
  151326. * @returns {?Matter.Vector} A translation vector (only if wrapping is required).
  151327. */
  151328. wrap: function(objectBounds, bounds) {
  151329. var x = null,
  151330. y = null;
  151331. if (typeof bounds.min.x !== 'undefined' && typeof bounds.max.x !== 'undefined') {
  151332. if (objectBounds.min.x > bounds.max.x) {
  151333. x = bounds.min.x - objectBounds.max.x;
  151334. } else if (objectBounds.max.x < bounds.min.x) {
  151335. x = bounds.max.x - objectBounds.min.x;
  151336. }
  151337. }
  151338. if (typeof bounds.min.y !== 'undefined' && typeof bounds.max.y !== 'undefined') {
  151339. if (objectBounds.min.y > bounds.max.y) {
  151340. y = bounds.min.y - objectBounds.max.y;
  151341. } else if (objectBounds.max.y < bounds.min.y) {
  151342. y = bounds.max.y - objectBounds.min.y;
  151343. }
  151344. }
  151345. if (x !== null || y !== null) {
  151346. return {
  151347. x: x || 0,
  151348. y: y || 0
  151349. };
  151350. }
  151351. }
  151352. },
  151353. Body: {
  151354. /**
  151355. * Wraps the `body` position such that it always stays within the given bounds.
  151356. * Upon crossing a boundary the body will appear on the opposite side of the bounds,
  151357. * while maintaining its velocity.
  151358. * This is called automatically by the plugin.
  151359. * @function MatterWrap.Body.wrap
  151360. * @param {Matter.Body} body The body to wrap.
  151361. * @param {Matter.Bounds} bounds The bounds to wrap the body inside.
  151362. * @returns {?Matter.Vector} The translation vector that was applied (only if wrapping was required).
  151363. */
  151364. wrap: function(body, bounds) {
  151365. var translation = MatterWrap.Bounds.wrap(body.bounds, bounds);
  151366. if (translation) {
  151367. Matter.Body.translate(body, translation);
  151368. }
  151369. return translation;
  151370. }
  151371. },
  151372. Composite: {
  151373. /**
  151374. * Returns the union of the bounds of all of the composite's bodies
  151375. * (not accounting for constraints).
  151376. * @function MatterWrap.Composite.bounds
  151377. * @param {Matter.Composite} composite The composite.
  151378. * @returns {Matter.Bounds} The composite bounds.
  151379. */
  151380. bounds: function(composite) {
  151381. var bodies = Matter.Composite.allBodies(composite),
  151382. vertices = [];
  151383. for (var i = 0; i < bodies.length; i += 1) {
  151384. var body = bodies[i];
  151385. vertices.push(body.bounds.min, body.bounds.max);
  151386. }
  151387. return Matter.Bounds.create(vertices);
  151388. },
  151389. /**
  151390. * Wraps the `composite` position such that it always stays within the given bounds.
  151391. * Upon crossing a boundary the composite will appear on the opposite side of the bounds,
  151392. * while maintaining its velocity.
  151393. * This is called automatically by the plugin.
  151394. * @function MatterWrap.Composite.wrap
  151395. * @param {Matter.Composite} composite The composite to wrap.
  151396. * @param {Matter.Bounds} bounds The bounds to wrap the composite inside.
  151397. * @returns {?Matter.Vector} The translation vector that was applied (only if wrapping was required).
  151398. */
  151399. wrap: function(composite, bounds) {
  151400. var translation = MatterWrap.Bounds.wrap(
  151401. MatterWrap.Composite.bounds(composite),
  151402. bounds
  151403. );
  151404. if (translation) {
  151405. Matter.Composite.translate(composite, translation);
  151406. }
  151407. return translation;
  151408. }
  151409. }
  151410. };
  151411. module.exports = MatterWrap;
  151412. /**
  151413. * @namespace Matter.Body
  151414. * @see http://brm.io/matter-js/docs/classes/Body.html
  151415. */
  151416. /**
  151417. * This plugin adds a new property `body.plugin.wrap` to instances of `Matter.Body`.
  151418. * This is a `Matter.Bounds` instance that specifies the wrapping region.
  151419. * @property {Matter.Bounds} body.plugin.wrap
  151420. * @memberof Matter.Body
  151421. */
  151422. /**
  151423. * This plugin adds a new property `composite.plugin.wrap` to instances of `Matter.Composite`.
  151424. * This is a `Matter.Bounds` instance that specifies the wrapping region.
  151425. * @property {Matter.Bounds} composite.plugin.wrap
  151426. * @memberof Matter.Composite
  151427. */
  151428. /***/ }),
  151429. /* 1306 */
  151430. /***/ (function(module, exports, __webpack_require__) {
  151431. var Matter = __webpack_require__(541);
  151432. /**
  151433. * An attractors plugin for matter.js.
  151434. * See the readme for usage and examples.
  151435. * @module MatterAttractors
  151436. */
  151437. var MatterAttractors = {
  151438. // plugin meta
  151439. name: 'matter-attractors', // PLUGIN_NAME
  151440. version: '0.1.7', // PLUGIN_VERSION
  151441. for: 'matter-js@^0.13.1',
  151442. silent: true, // no console log please
  151443. // installs the plugin where `base` is `Matter`
  151444. // you should not need to call this directly.
  151445. install: function(base) {
  151446. base.after('Body.create', function() {
  151447. MatterAttractors.Body.init(this);
  151448. });
  151449. base.before('Engine.update', function(engine) {
  151450. MatterAttractors.Engine.update(engine);
  151451. });
  151452. },
  151453. Body: {
  151454. /**
  151455. * Initialises the `body` to support attractors.
  151456. * This is called automatically by the plugin.
  151457. * @function MatterAttractors.Body.init
  151458. * @param {Matter.Body} body The body to init.
  151459. * @returns {void} No return value.
  151460. */
  151461. init: function(body) {
  151462. body.plugin.attractors = body.plugin.attractors || [];
  151463. }
  151464. },
  151465. Engine: {
  151466. /**
  151467. * Applies all attractors for all bodies in the `engine`.
  151468. * This is called automatically by the plugin.
  151469. * @function MatterAttractors.Engine.update
  151470. * @param {Matter.Engine} engine The engine to update.
  151471. * @returns {void} No return value.
  151472. */
  151473. update: function(engine) {
  151474. var world = engine.world,
  151475. bodies = Matter.Composite.allBodies(world);
  151476. for (var i = 0; i < bodies.length; i += 1) {
  151477. var bodyA = bodies[i],
  151478. attractors = bodyA.plugin.attractors;
  151479. if (attractors && attractors.length > 0) {
  151480. for (var j = i + 1; j < bodies.length; j += 1) {
  151481. var bodyB = bodies[j];
  151482. for (var k = 0; k < attractors.length; k += 1) {
  151483. var attractor = attractors[k],
  151484. forceVector = attractor;
  151485. if (Matter.Common.isFunction(attractor)) {
  151486. forceVector = attractor(bodyA, bodyB);
  151487. }
  151488. if (forceVector) {
  151489. Matter.Body.applyForce(bodyB, bodyB.position, forceVector);
  151490. }
  151491. }
  151492. }
  151493. }
  151494. }
  151495. }
  151496. },
  151497. /**
  151498. * Defines some useful common attractor functions that can be used
  151499. * by pushing them to your body's `body.plugin.attractors` array.
  151500. * @namespace MatterAttractors.Attractors
  151501. * @property {number} gravityConstant The gravitational constant used by the gravity attractor.
  151502. */
  151503. Attractors: {
  151504. gravityConstant: 0.001,
  151505. /**
  151506. * An attractor function that applies Newton's law of gravitation.
  151507. * Use this by pushing `MatterAttractors.Attractors.gravity` to your body's `body.plugin.attractors` array.
  151508. * The gravitational constant defaults to `0.001` which you can change
  151509. * at `MatterAttractors.Attractors.gravityConstant`.
  151510. * @function MatterAttractors.Attractors.gravity
  151511. * @param {Matter.Body} bodyA The first body.
  151512. * @param {Matter.Body} bodyB The second body.
  151513. * @returns {void} No return value.
  151514. */
  151515. gravity: function(bodyA, bodyB) {
  151516. // use Newton's law of gravitation
  151517. var bToA = Matter.Vector.sub(bodyB.position, bodyA.position),
  151518. distanceSq = Matter.Vector.magnitudeSquared(bToA) || 0.0001,
  151519. normal = Matter.Vector.normalise(bToA),
  151520. magnitude = -MatterAttractors.Attractors.gravityConstant * (bodyA.mass * bodyB.mass / distanceSq),
  151521. force = Matter.Vector.mult(normal, magnitude);
  151522. // to apply forces to both bodies
  151523. Matter.Body.applyForce(bodyA, bodyA.position, Matter.Vector.neg(force));
  151524. Matter.Body.applyForce(bodyB, bodyB.position, force);
  151525. }
  151526. }
  151527. };
  151528. module.exports = MatterAttractors;
  151529. /**
  151530. * @namespace Matter.Body
  151531. * @see http://brm.io/matter-js/docs/classes/Body.html
  151532. */
  151533. /**
  151534. * This plugin adds a new property `body.plugin.attractors` to instances of `Matter.Body`.
  151535. * This is an array of callback functions that will be called automatically
  151536. * for every pair of bodies, on every engine update.
  151537. * @property {Function[]} body.plugin.attractors
  151538. * @memberof Matter.Body
  151539. */
  151540. /**
  151541. * An attractor function calculates the force to be applied
  151542. * to `bodyB`, it should either:
  151543. * - return the force vector to be applied to `bodyB`
  151544. * - or apply the force to the body(s) itself
  151545. * @callback AttractorFunction
  151546. * @param {Matter.Body} bodyA
  151547. * @param {Matter.Body} bodyB
  151548. * @returns {(Vector|undefined)} a force vector (optional)
  151549. */
  151550. /***/ }),
  151551. /* 1307 */
  151552. /***/ (function(module, exports, __webpack_require__) {
  151553. /**
  151554. * @author Richard Davey <rich@photonstorm.com>
  151555. * @copyright 2019 Photon Storm Ltd.
  151556. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  151557. */
  151558. var Class = __webpack_require__(0);
  151559. var Factory = __webpack_require__(1291);
  151560. var GetFastValue = __webpack_require__(2);
  151561. var GetValue = __webpack_require__(4);
  151562. var MatterAttractors = __webpack_require__(1306);
  151563. var MatterLib = __webpack_require__(1286);
  151564. var MatterWrap = __webpack_require__(1305);
  151565. var Merge = __webpack_require__(103);
  151566. var Plugin = __webpack_require__(540);
  151567. var PluginCache = __webpack_require__(17);
  151568. var SceneEvents = __webpack_require__(16);
  151569. var World = __webpack_require__(1281);
  151570. var Vertices = __webpack_require__(82);
  151571. /**
  151572. * @classdesc
  151573. * [description]
  151574. *
  151575. * @class MatterPhysics
  151576. * @memberof Phaser.Physics.Matter
  151577. * @constructor
  151578. * @since 3.0.0
  151579. *
  151580. * @param {Phaser.Scene} scene - [description]
  151581. */
  151582. var MatterPhysics = new Class({
  151583. initialize:
  151584. function MatterPhysics (scene)
  151585. {
  151586. /**
  151587. * [description]
  151588. *
  151589. * @name Phaser.Physics.Matter.MatterPhysics#scene
  151590. * @type {Phaser.Scene}
  151591. * @since 3.0.0
  151592. */
  151593. this.scene = scene;
  151594. /**
  151595. * [description]
  151596. *
  151597. * @name Phaser.Physics.Matter.MatterPhysics#systems
  151598. * @type {Phaser.Scenes.Systems}
  151599. * @since 3.0.0
  151600. */
  151601. this.systems = scene.sys;
  151602. /**
  151603. * [description]
  151604. *
  151605. * @name Phaser.Physics.Matter.MatterPhysics#config
  151606. * @type {object}
  151607. * @since 3.0.0
  151608. */
  151609. this.config = this.getConfig();
  151610. /**
  151611. * [description]
  151612. *
  151613. * @name Phaser.Physics.Matter.MatterPhysics#world
  151614. * @type {Phaser.Physics.Matter.World}
  151615. * @since 3.0.0
  151616. */
  151617. this.world;
  151618. /**
  151619. * [description]
  151620. *
  151621. * @name Phaser.Physics.Matter.MatterPhysics#add
  151622. * @type {Phaser.Physics.Matter.Factory}
  151623. * @since 3.0.0
  151624. */
  151625. this.add;
  151626. /**
  151627. * A reference to the `Matter.Vertices` module which contains methods for creating and manipulating sets of vertices.
  151628. * A set of vertices is an array of `Matter.Vector` with additional indexing properties inserted by `Vertices.create`.
  151629. * A `Matter.Body` maintains a set of vertices to represent the shape of the object (its convex hull).
  151630. *
  151631. * @name Phaser.Physics.Matter.MatterPhysics#verts
  151632. * @type {MatterJS.Vertices}
  151633. * @since 3.14.0
  151634. */
  151635. this.verts = Vertices;
  151636. // Matter plugins
  151637. if (GetValue(this.config, 'plugins.attractors', false))
  151638. {
  151639. Plugin.register(MatterAttractors);
  151640. Plugin.use(MatterLib, MatterAttractors);
  151641. }
  151642. if (GetValue(this.config, 'plugins.wrap', false))
  151643. {
  151644. Plugin.register(MatterWrap);
  151645. Plugin.use(MatterLib, MatterWrap);
  151646. }
  151647. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  151648. scene.sys.events.on(SceneEvents.START, this.start, this);
  151649. },
  151650. /**
  151651. * This method is called automatically, only once, when the Scene is first created.
  151652. * Do not invoke it directly.
  151653. *
  151654. * @method Phaser.Physics.Matter.MatterPhysics#boot
  151655. * @private
  151656. * @since 3.5.1
  151657. */
  151658. boot: function ()
  151659. {
  151660. this.world = new World(this.scene, this.config);
  151661. this.add = new Factory(this.world);
  151662. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  151663. },
  151664. /**
  151665. * This method is called automatically by the Scene when it is starting up.
  151666. * It is responsible for creating local systems, properties and listening for Scene events.
  151667. * Do not invoke it directly.
  151668. *
  151669. * @method Phaser.Physics.Matter.MatterPhysics#start
  151670. * @private
  151671. * @since 3.5.0
  151672. */
  151673. start: function ()
  151674. {
  151675. if (!this.world)
  151676. {
  151677. this.world = new World(this.scene, this.config);
  151678. this.add = new Factory(this.world);
  151679. }
  151680. var eventEmitter = this.systems.events;
  151681. eventEmitter.on(SceneEvents.UPDATE, this.world.update, this.world);
  151682. eventEmitter.on(SceneEvents.POST_UPDATE, this.world.postUpdate, this.world);
  151683. eventEmitter.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  151684. },
  151685. /**
  151686. * [description]
  151687. *
  151688. * @method Phaser.Physics.Matter.MatterPhysics#getConfig
  151689. * @since 3.0.0
  151690. *
  151691. * @return {object} [description]
  151692. */
  151693. getConfig: function ()
  151694. {
  151695. var gameConfig = this.systems.game.config.physics;
  151696. var sceneConfig = this.systems.settings.physics;
  151697. var config = Merge(
  151698. GetFastValue(sceneConfig, 'matter', {}),
  151699. GetFastValue(gameConfig, 'matter', {})
  151700. );
  151701. return config;
  151702. },
  151703. /**
  151704. * [description]
  151705. *
  151706. * @method Phaser.Physics.Matter.MatterPhysics#enableAttractorPlugin
  151707. * @since 3.0.0
  151708. *
  151709. * @return {Phaser.Physics.Matter.MatterPhysics} This Matter Physics instance.
  151710. */
  151711. enableAttractorPlugin: function ()
  151712. {
  151713. Plugin.register(MatterAttractors);
  151714. Plugin.use(MatterLib, MatterAttractors);
  151715. return this;
  151716. },
  151717. /**
  151718. * [description]
  151719. *
  151720. * @method Phaser.Physics.Matter.MatterPhysics#enableWrapPlugin
  151721. * @since 3.0.0
  151722. *
  151723. * @return {Phaser.Physics.Matter.MatterPhysics} This Matter Physics instance.
  151724. */
  151725. enableWrapPlugin: function ()
  151726. {
  151727. Plugin.register(MatterWrap);
  151728. Plugin.use(MatterLib, MatterWrap);
  151729. return this;
  151730. },
  151731. /**
  151732. * [description]
  151733. *
  151734. * @method Phaser.Physics.Matter.MatterPhysics#pause
  151735. * @since 3.0.0
  151736. *
  151737. * @return {Phaser.Physics.Matter.World} The Matter World object.
  151738. */
  151739. pause: function ()
  151740. {
  151741. return this.world.pause();
  151742. },
  151743. /**
  151744. * [description]
  151745. *
  151746. * @method Phaser.Physics.Matter.MatterPhysics#resume
  151747. * @since 3.0.0
  151748. *
  151749. * @return {Phaser.Physics.Matter.World} The Matter World object.
  151750. */
  151751. resume: function ()
  151752. {
  151753. return this.world.resume();
  151754. },
  151755. /**
  151756. * Sets the Matter Engine to run at fixed timestep of 60Hz and enables `autoUpdate`.
  151757. * If you have set a custom `getDelta` function then this will override it.
  151758. *
  151759. * @method Phaser.Physics.Matter.MatterPhysics#set60Hz
  151760. * @since 3.4.0
  151761. *
  151762. * @return {Phaser.Physics.Matter.MatterPhysics} This Matter Physics instance.
  151763. */
  151764. set60Hz: function ()
  151765. {
  151766. this.world.getDelta = this.world.update60Hz;
  151767. this.world.autoUpdate = true;
  151768. return this;
  151769. },
  151770. /**
  151771. * Sets the Matter Engine to run at fixed timestep of 30Hz and enables `autoUpdate`.
  151772. * If you have set a custom `getDelta` function then this will override it.
  151773. *
  151774. * @method Phaser.Physics.Matter.MatterPhysics#set30Hz
  151775. * @since 3.4.0
  151776. *
  151777. * @return {Phaser.Physics.Matter.MatterPhysics} This Matter Physics instance.
  151778. */
  151779. set30Hz: function ()
  151780. {
  151781. this.world.getDelta = this.world.update30Hz;
  151782. this.world.autoUpdate = true;
  151783. return this;
  151784. },
  151785. /**
  151786. * Manually advances the physics simulation by one iteration.
  151787. *
  151788. * You can optionally pass in the `delta` and `correction` values to be used by Engine.update.
  151789. * If undefined they use the Matter defaults of 60Hz and no correction.
  151790. *
  151791. * Calling `step` directly bypasses any checks of `enabled` or `autoUpdate`.
  151792. *
  151793. * It also ignores any custom `getDelta` functions, as you should be passing the delta
  151794. * value in to this call.
  151795. *
  151796. * You can adjust the number of iterations that Engine.update performs internally.
  151797. * Use the Scene Matter Physics config object to set the following properties:
  151798. *
  151799. * positionIterations (defaults to 6)
  151800. * velocityIterations (defaults to 4)
  151801. * constraintIterations (defaults to 2)
  151802. *
  151803. * Adjusting these values can help performance in certain situations, depending on the physics requirements
  151804. * of your game.
  151805. *
  151806. * @method Phaser.Physics.Matter.MatterPhysics#step
  151807. * @since 3.4.0
  151808. *
  151809. * @param {number} [delta=16.666] - [description]
  151810. * @param {number} [correction=1] - [description]
  151811. */
  151812. step: function (delta, correction)
  151813. {
  151814. this.world.step(delta, correction);
  151815. },
  151816. /**
  151817. * The Scene that owns this plugin is shutting down.
  151818. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  151819. *
  151820. * @method Phaser.Physics.Matter.MatterPhysics#shutdown
  151821. * @private
  151822. * @since 3.0.0
  151823. */
  151824. shutdown: function ()
  151825. {
  151826. var eventEmitter = this.systems.events;
  151827. eventEmitter.off(SceneEvents.UPDATE, this.world.update, this.world);
  151828. eventEmitter.off(SceneEvents.POST_UPDATE, this.world.postUpdate, this.world);
  151829. eventEmitter.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  151830. this.add.destroy();
  151831. this.world.destroy();
  151832. this.add = null;
  151833. this.world = null;
  151834. },
  151835. /**
  151836. * The Scene that owns this plugin is being destroyed.
  151837. * We need to shutdown and then kill off all external references.
  151838. *
  151839. * @method Phaser.Physics.Matter.MatterPhysics#destroy
  151840. * @private
  151841. * @since 3.0.0
  151842. */
  151843. destroy: function ()
  151844. {
  151845. this.shutdown();
  151846. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  151847. this.scene = null;
  151848. this.systems = null;
  151849. }
  151850. });
  151851. PluginCache.register('MatterPhysics', MatterPhysics, 'matterPhysics');
  151852. module.exports = MatterPhysics;
  151853. /***/ }),
  151854. /* 1308 */
  151855. /***/ (function(module, exports, __webpack_require__) {
  151856. /**
  151857. * The `Matter.Svg` module contains methods for converting SVG images into an array of vector points.
  151858. *
  151859. * To use this module you also need the SVGPathSeg polyfill: https://github.com/progers/pathseg
  151860. *
  151861. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  151862. *
  151863. * @class Svg
  151864. */
  151865. var Svg = {};
  151866. module.exports = Svg;
  151867. var Bounds = __webpack_require__(86);
  151868. var Common = __webpack_require__(36);
  151869. (function() {
  151870. /**
  151871. * Converts an SVG path into an array of vector points.
  151872. * If the input path forms a concave shape, you must decompose the result into convex parts before use.
  151873. * See `Bodies.fromVertices` which provides support for this.
  151874. * Note that this function is not guaranteed to support complex paths (such as those with holes).
  151875. * You must load the `pathseg.js` polyfill on newer browsers.
  151876. * @method pathToVertices
  151877. * @param {SVGPathElement} path
  151878. * @param {Number} [sampleLength=15]
  151879. * @return {Vector[]} points
  151880. */
  151881. Svg.pathToVertices = function(path, sampleLength) {
  151882. if (typeof window !== 'undefined' && !('SVGPathSeg' in window)) {
  151883. Common.warn('Svg.pathToVertices: SVGPathSeg not defined, a polyfill is required.');
  151884. }
  151885. // https://github.com/wout/svg.topoly.js/blob/master/svg.topoly.js
  151886. var i, il, total, point, segment, segments,
  151887. segmentsQueue, lastSegment,
  151888. lastPoint, segmentIndex, points = [],
  151889. lx, ly, length = 0, x = 0, y = 0;
  151890. sampleLength = sampleLength || 15;
  151891. var addPoint = function(px, py, pathSegType) {
  151892. // all odd-numbered path types are relative except PATHSEG_CLOSEPATH (1)
  151893. var isRelative = pathSegType % 2 === 1 && pathSegType > 1;
  151894. // when the last point doesn't equal the current point add the current point
  151895. if (!lastPoint || px != lastPoint.x || py != lastPoint.y) {
  151896. if (lastPoint && isRelative) {
  151897. lx = lastPoint.x;
  151898. ly = lastPoint.y;
  151899. } else {
  151900. lx = 0;
  151901. ly = 0;
  151902. }
  151903. var point = {
  151904. x: lx + px,
  151905. y: ly + py
  151906. };
  151907. // set last point
  151908. if (isRelative || !lastPoint) {
  151909. lastPoint = point;
  151910. }
  151911. points.push(point);
  151912. x = lx + px;
  151913. y = ly + py;
  151914. }
  151915. };
  151916. var addSegmentPoint = function(segment) {
  151917. var segType = segment.pathSegTypeAsLetter.toUpperCase();
  151918. // skip path ends
  151919. if (segType === 'Z')
  151920. return;
  151921. // map segment to x and y
  151922. switch (segType) {
  151923. case 'M':
  151924. case 'L':
  151925. case 'T':
  151926. case 'C':
  151927. case 'S':
  151928. case 'Q':
  151929. x = segment.x;
  151930. y = segment.y;
  151931. break;
  151932. case 'H':
  151933. x = segment.x;
  151934. break;
  151935. case 'V':
  151936. y = segment.y;
  151937. break;
  151938. }
  151939. addPoint(x, y, segment.pathSegType);
  151940. };
  151941. // ensure path is absolute
  151942. Svg._svgPathToAbsolute(path);
  151943. // get total length
  151944. total = path.getTotalLength();
  151945. // queue segments
  151946. segments = [];
  151947. for (i = 0; i < path.pathSegList.numberOfItems; i += 1)
  151948. segments.push(path.pathSegList.getItem(i));
  151949. segmentsQueue = segments.concat();
  151950. // sample through path
  151951. while (length < total) {
  151952. // get segment at position
  151953. segmentIndex = path.getPathSegAtLength(length);
  151954. segment = segments[segmentIndex];
  151955. // new segment
  151956. if (segment != lastSegment) {
  151957. while (segmentsQueue.length && segmentsQueue[0] != segment)
  151958. addSegmentPoint(segmentsQueue.shift());
  151959. lastSegment = segment;
  151960. }
  151961. // add points in between when curving
  151962. // TODO: adaptive sampling
  151963. switch (segment.pathSegTypeAsLetter.toUpperCase()) {
  151964. case 'C':
  151965. case 'T':
  151966. case 'S':
  151967. case 'Q':
  151968. case 'A':
  151969. point = path.getPointAtLength(length);
  151970. addPoint(point.x, point.y, 0);
  151971. break;
  151972. }
  151973. // increment by sample value
  151974. length += sampleLength;
  151975. }
  151976. // add remaining segments not passed by sampling
  151977. for (i = 0, il = segmentsQueue.length; i < il; ++i)
  151978. addSegmentPoint(segmentsQueue[i]);
  151979. return points;
  151980. };
  151981. Svg._svgPathToAbsolute = function(path) {
  151982. // http://phrogz.net/convert-svg-path-to-all-absolute-commands
  151983. // Copyright (c) Gavin Kistner
  151984. // http://phrogz.net/js/_ReuseLicense.txt
  151985. // Modifications: tidy formatting and naming
  151986. var x0, y0, x1, y1, x2, y2, segs = path.pathSegList,
  151987. x = 0, y = 0, len = segs.numberOfItems;
  151988. for (var i = 0; i < len; ++i) {
  151989. var seg = segs.getItem(i),
  151990. segType = seg.pathSegTypeAsLetter;
  151991. if (/[MLHVCSQTA]/.test(segType)) {
  151992. if ('x' in seg) x = seg.x;
  151993. if ('y' in seg) y = seg.y;
  151994. } else {
  151995. if ('x1' in seg) x1 = x + seg.x1;
  151996. if ('x2' in seg) x2 = x + seg.x2;
  151997. if ('y1' in seg) y1 = y + seg.y1;
  151998. if ('y2' in seg) y2 = y + seg.y2;
  151999. if ('x' in seg) x += seg.x;
  152000. if ('y' in seg) y += seg.y;
  152001. switch (segType) {
  152002. case 'm':
  152003. segs.replaceItem(path.createSVGPathSegMovetoAbs(x, y), i);
  152004. break;
  152005. case 'l':
  152006. segs.replaceItem(path.createSVGPathSegLinetoAbs(x, y), i);
  152007. break;
  152008. case 'h':
  152009. segs.replaceItem(path.createSVGPathSegLinetoHorizontalAbs(x), i);
  152010. break;
  152011. case 'v':
  152012. segs.replaceItem(path.createSVGPathSegLinetoVerticalAbs(y), i);
  152013. break;
  152014. case 'c':
  152015. segs.replaceItem(path.createSVGPathSegCurvetoCubicAbs(x, y, x1, y1, x2, y2), i);
  152016. break;
  152017. case 's':
  152018. segs.replaceItem(path.createSVGPathSegCurvetoCubicSmoothAbs(x, y, x2, y2), i);
  152019. break;
  152020. case 'q':
  152021. segs.replaceItem(path.createSVGPathSegCurvetoQuadraticAbs(x, y, x1, y1), i);
  152022. break;
  152023. case 't':
  152024. segs.replaceItem(path.createSVGPathSegCurvetoQuadraticSmoothAbs(x, y), i);
  152025. break;
  152026. case 'a':
  152027. segs.replaceItem(path.createSVGPathSegArcAbs(x, y, seg.r1, seg.r2, seg.angle, seg.largeArcFlag, seg.sweepFlag), i);
  152028. break;
  152029. case 'z':
  152030. case 'Z':
  152031. x = x0;
  152032. y = y0;
  152033. break;
  152034. }
  152035. }
  152036. if (segType == 'M' || segType == 'm') {
  152037. x0 = x;
  152038. y0 = y;
  152039. }
  152040. }
  152041. };
  152042. })();
  152043. /***/ }),
  152044. /* 1309 */
  152045. /***/ (function(module, exports, __webpack_require__) {
  152046. // @if DEBUG
  152047. /**
  152048. * _Internal Class_, not generally used outside of the engine's internals.
  152049. *
  152050. */
  152051. var Metrics = {};
  152052. module.exports = Metrics;
  152053. var Composite = __webpack_require__(149);
  152054. var Common = __webpack_require__(36);
  152055. (function() {
  152056. /**
  152057. * Creates a new metrics.
  152058. * @method create
  152059. * @private
  152060. * @return {metrics} A new metrics
  152061. */
  152062. Metrics.create = function(options) {
  152063. var defaults = {
  152064. extended: false,
  152065. narrowDetections: 0,
  152066. narrowphaseTests: 0,
  152067. narrowReuse: 0,
  152068. narrowReuseCount: 0,
  152069. midphaseTests: 0,
  152070. broadphaseTests: 0,
  152071. narrowEff: 0.0001,
  152072. midEff: 0.0001,
  152073. broadEff: 0.0001,
  152074. collisions: 0,
  152075. buckets: 0,
  152076. bodies: 0,
  152077. pairs: 0
  152078. };
  152079. return Common.extend(defaults, false, options);
  152080. };
  152081. /**
  152082. * Resets metrics.
  152083. * @method reset
  152084. * @private
  152085. * @param {metrics} metrics
  152086. */
  152087. Metrics.reset = function(metrics) {
  152088. if (metrics.extended) {
  152089. metrics.narrowDetections = 0;
  152090. metrics.narrowphaseTests = 0;
  152091. metrics.narrowReuse = 0;
  152092. metrics.narrowReuseCount = 0;
  152093. metrics.midphaseTests = 0;
  152094. metrics.broadphaseTests = 0;
  152095. metrics.narrowEff = 0;
  152096. metrics.midEff = 0;
  152097. metrics.broadEff = 0;
  152098. metrics.collisions = 0;
  152099. metrics.buckets = 0;
  152100. metrics.pairs = 0;
  152101. metrics.bodies = 0;
  152102. }
  152103. };
  152104. /**
  152105. * Updates metrics.
  152106. * @method update
  152107. * @private
  152108. * @param {metrics} metrics
  152109. * @param {engine} engine
  152110. */
  152111. Metrics.update = function(metrics, engine) {
  152112. if (metrics.extended) {
  152113. var world = engine.world,
  152114. bodies = Composite.allBodies(world);
  152115. metrics.collisions = metrics.narrowDetections;
  152116. metrics.pairs = engine.pairs.list.length;
  152117. metrics.bodies = bodies.length;
  152118. metrics.midEff = (metrics.narrowDetections / (metrics.midphaseTests || 1)).toFixed(2);
  152119. metrics.narrowEff = (metrics.narrowDetections / (metrics.narrowphaseTests || 1)).toFixed(2);
  152120. metrics.broadEff = (1 - (metrics.broadphaseTests / (bodies.length || 1))).toFixed(2);
  152121. metrics.narrowReuse = (metrics.narrowReuseCount / (metrics.narrowphaseTests || 1)).toFixed(2);
  152122. //var broadphase = engine.broadphase[engine.broadphase.current];
  152123. //if (broadphase.instance)
  152124. // metrics.buckets = Common.keys(broadphase.instance.buckets).length;
  152125. }
  152126. };
  152127. })();
  152128. // @endif
  152129. /***/ }),
  152130. /* 1310 */
  152131. /***/ (function(module, exports, __webpack_require__) {
  152132. /**
  152133. * The `Matter.Query` module contains methods for performing collision queries.
  152134. *
  152135. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  152136. *
  152137. * @class Query
  152138. */
  152139. var Query = {};
  152140. module.exports = Query;
  152141. var Vector = __webpack_require__(87);
  152142. var SAT = __webpack_require__(542);
  152143. var Bounds = __webpack_require__(86);
  152144. var Bodies = __webpack_require__(138);
  152145. var Vertices = __webpack_require__(82);
  152146. (function() {
  152147. /**
  152148. * Returns a list of collisions between `body` and `bodies`.
  152149. * @method collides
  152150. * @param {body} body
  152151. * @param {body[]} bodies
  152152. * @return {object[]} Collisions
  152153. */
  152154. Query.collides = function(body, bodies) {
  152155. var collisions = [];
  152156. for (var i = 0; i < bodies.length; i++) {
  152157. var bodyA = bodies[i];
  152158. if (Bounds.overlaps(bodyA.bounds, body.bounds)) {
  152159. for (var j = bodyA.parts.length === 1 ? 0 : 1; j < bodyA.parts.length; j++) {
  152160. var part = bodyA.parts[j];
  152161. if (Bounds.overlaps(part.bounds, body.bounds)) {
  152162. var collision = SAT.collides(part, body);
  152163. if (collision.collided) {
  152164. collisions.push(collision);
  152165. break;
  152166. }
  152167. }
  152168. }
  152169. }
  152170. }
  152171. return collisions;
  152172. };
  152173. /**
  152174. * Casts a ray segment against a set of bodies and returns all collisions, ray width is optional. Intersection points are not provided.
  152175. * @method ray
  152176. * @param {body[]} bodies
  152177. * @param {vector} startPoint
  152178. * @param {vector} endPoint
  152179. * @param {number} [rayWidth]
  152180. * @return {object[]} Collisions
  152181. */
  152182. Query.ray = function(bodies, startPoint, endPoint, rayWidth) {
  152183. rayWidth = rayWidth || 1e-100;
  152184. var rayAngle = Vector.angle(startPoint, endPoint),
  152185. rayLength = Vector.magnitude(Vector.sub(startPoint, endPoint)),
  152186. rayX = (endPoint.x + startPoint.x) * 0.5,
  152187. rayY = (endPoint.y + startPoint.y) * 0.5,
  152188. ray = Bodies.rectangle(rayX, rayY, rayLength, rayWidth, { angle: rayAngle }),
  152189. collisions = Query.collides(ray, bodies);
  152190. for (var i = 0; i < collisions.length; i += 1) {
  152191. var collision = collisions[i];
  152192. collision.body = collision.bodyB = collision.bodyA;
  152193. }
  152194. return collisions;
  152195. };
  152196. /**
  152197. * Returns all bodies whose bounds are inside (or outside if set) the given set of bounds, from the given set of bodies.
  152198. * @method region
  152199. * @param {body[]} bodies
  152200. * @param {bounds} bounds
  152201. * @param {bool} [outside=false]
  152202. * @return {body[]} The bodies matching the query
  152203. */
  152204. Query.region = function(bodies, bounds, outside) {
  152205. var result = [];
  152206. for (var i = 0; i < bodies.length; i++) {
  152207. var body = bodies[i],
  152208. overlaps = Bounds.overlaps(body.bounds, bounds);
  152209. if ((overlaps && !outside) || (!overlaps && outside))
  152210. result.push(body);
  152211. }
  152212. return result;
  152213. };
  152214. /**
  152215. * Returns all bodies whose vertices contain the given point, from the given set of bodies.
  152216. * @method point
  152217. * @param {body[]} bodies
  152218. * @param {vector} point
  152219. * @return {body[]} The bodies matching the query
  152220. */
  152221. Query.point = function(bodies, point) {
  152222. var result = [];
  152223. for (var i = 0; i < bodies.length; i++) {
  152224. var body = bodies[i];
  152225. if (Bounds.contains(body.bounds, point)) {
  152226. for (var j = body.parts.length === 1 ? 0 : 1; j < body.parts.length; j++) {
  152227. var part = body.parts[j];
  152228. if (Bounds.contains(part.bounds, point)
  152229. && Vertices.contains(part.vertices, point)) {
  152230. result.push(body);
  152231. break;
  152232. }
  152233. }
  152234. }
  152235. }
  152236. return result;
  152237. };
  152238. })();
  152239. /***/ }),
  152240. /* 1311 */
  152241. /***/ (function(module, exports, __webpack_require__) {
  152242. /**
  152243. * @author Richard Davey <rich@photonstorm.com>
  152244. * @copyright 2019 Photon Storm Ltd.
  152245. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  152246. */
  152247. var Bounds = __webpack_require__(86);
  152248. var Class = __webpack_require__(0);
  152249. var Composite = __webpack_require__(149);
  152250. var Constraint = __webpack_require__(209);
  152251. var Detector = __webpack_require__(543);
  152252. var Events = __webpack_require__(545);
  152253. var InputEvents = __webpack_require__(52);
  152254. var Merge = __webpack_require__(103);
  152255. var Sleeping = __webpack_require__(238);
  152256. var Vector2 = __webpack_require__(3);
  152257. var Vertices = __webpack_require__(82);
  152258. /**
  152259. * @classdesc
  152260. * A Pointer Constraint is a special type of constraint that allows you to click
  152261. * and drag bodies in a Matter World. It monitors the active Pointers in a Scene,
  152262. * and when one is pressed down it checks to see if that hit any part of any active
  152263. * body in the world. If it did, and the body has input enabled, it will begin to
  152264. * drag it until either released, or you stop it via the `stopDrag` method.
  152265. *
  152266. * You can adjust the stiffness, length and other properties of the constraint via
  152267. * the `options` object on creation.
  152268. *
  152269. * @class PointerConstraint
  152270. * @memberof Phaser.Physics.Matter
  152271. * @constructor
  152272. * @since 3.0.0
  152273. *
  152274. * @param {Phaser.Scene} scene - A reference to the Scene to which this Pointer Constraint belongs.
  152275. * @param {Phaser.Physics.Matter.World} world - A reference to the Matter World instance to which this Constraint belongs.
  152276. * @param {object} [options] - A Constraint configuration object.
  152277. */
  152278. var PointerConstraint = new Class({
  152279. initialize:
  152280. function PointerConstraint (scene, world, options)
  152281. {
  152282. if (options === undefined) { options = {}; }
  152283. // Defaults
  152284. var defaults = {
  152285. label: 'Pointer Constraint',
  152286. pointA: { x: 0, y: 0 },
  152287. pointB: { x: 0, y: 0 },
  152288. damping: 0,
  152289. length: 0.01,
  152290. stiffness: 0.1,
  152291. angularStiffness: 1,
  152292. collisionFilter: {
  152293. category: 0x0001,
  152294. mask: 0xFFFFFFFF,
  152295. group: 0
  152296. }
  152297. };
  152298. /**
  152299. * A reference to the Scene to which this Pointer Constraint belongs.
  152300. * This is the same Scene as the Matter World instance.
  152301. *
  152302. * @name Phaser.Physics.Matter.PointerConstraint#scene
  152303. * @type {Phaser.Scene}
  152304. * @since 3.0.0
  152305. */
  152306. this.scene = scene;
  152307. /**
  152308. * A reference to the Matter World instance to which this Constraint belongs.
  152309. *
  152310. * @name Phaser.Physics.Matter.PointerConstraint#world
  152311. * @type {Phaser.Physics.Matter.World}
  152312. * @since 3.0.0
  152313. */
  152314. this.world = world;
  152315. /**
  152316. * The Camera the Pointer was interacting with when the input
  152317. * down event was processed.
  152318. *
  152319. * @name Phaser.Physics.Matter.PointerConstraint#camera
  152320. * @type {Phaser.Cameras.Scene2D.Camera}
  152321. * @since 3.0.0
  152322. */
  152323. this.camera = null;
  152324. /**
  152325. * A reference to the Input Pointer that activated this Constraint.
  152326. * This is set in the `onDown` handler.
  152327. *
  152328. * @name Phaser.Physics.Matter.PointerConstraint#pointer
  152329. * @type {Phaser.Input.Pointer}
  152330. * @default null
  152331. * @since 3.0.0
  152332. */
  152333. this.pointer = null;
  152334. /**
  152335. * Is this Constraint active or not?
  152336. *
  152337. * An active constraint will be processed each update. An inactive one will be skipped.
  152338. * Use this to toggle a Pointer Constraint on and off.
  152339. *
  152340. * @name Phaser.Physics.Matter.PointerConstraint#active
  152341. * @type {boolean}
  152342. * @default true
  152343. * @since 3.0.0
  152344. */
  152345. this.active = true;
  152346. /**
  152347. * The internal transformed position.
  152348. *
  152349. * @name Phaser.Physics.Matter.PointerConstraint#position
  152350. * @type {Phaser.Math.Vector2}
  152351. * @since 3.0.0
  152352. */
  152353. this.position = new Vector2();
  152354. /**
  152355. * The body that is currently being dragged, if any.
  152356. *
  152357. * @name Phaser.Physics.Matter.PointerConstraint#body
  152358. * @type {?MatterJS.Body}
  152359. * @since 3.16.2
  152360. */
  152361. this.body = null;
  152362. /**
  152363. * The part of the body that was clicked on to start the drag.
  152364. *
  152365. * @name Phaser.Physics.Matter.PointerConstraint#part
  152366. * @type {?MatterJS.Body}
  152367. * @since 3.16.2
  152368. */
  152369. this.part = null;
  152370. /**
  152371. * The native Matter Constraint that is used to attach to bodies.
  152372. *
  152373. * @name Phaser.Physics.Matter.PointerConstraint#constraint
  152374. * @type {object}
  152375. * @since 3.0.0
  152376. */
  152377. this.constraint = Constraint.create(Merge(options, defaults));
  152378. this.world.on(Events.BEFORE_UPDATE, this.update, this);
  152379. scene.sys.input.on(InputEvents.POINTER_DOWN, this.onDown, this);
  152380. },
  152381. /**
  152382. * A Pointer has been pressed down onto the Scene.
  152383. *
  152384. * If this Constraint doesn't have an active Pointer then a hit test is
  152385. * run against all active bodies in the world. If one is found it is bound
  152386. * to this constraint and the drag begins.
  152387. *
  152388. * @method Phaser.Physics.Matter.PointerConstraint#onDown
  152389. * @fires Phaser.Physics.Matter.Events#DRAG_START
  152390. * @since 3.0.0
  152391. *
  152392. * @param {Phaser.Input.Pointer} pointer - A reference to the Pointer that was pressed.
  152393. */
  152394. onDown: function (pointer)
  152395. {
  152396. if (!this.pointer)
  152397. {
  152398. if (this.getBody(pointer))
  152399. {
  152400. this.pointer = pointer;
  152401. this.camera = pointer.camera;
  152402. }
  152403. }
  152404. },
  152405. /**
  152406. * Scans all active bodies in the current Matter World to see if any of them
  152407. * are hit by the Pointer. The _first one_ found to hit is set as the active contraint
  152408. * body.
  152409. *
  152410. * @method Phaser.Physics.Matter.PointerConstraint#getBody
  152411. * @since 3.16.2
  152412. *
  152413. * @return {boolean} `true` if a body was found and set, otherwise `false`.
  152414. */
  152415. getBody: function (pointer)
  152416. {
  152417. var pos = this.position;
  152418. var constraint = this.constraint;
  152419. pointer.camera.getWorldPoint(pointer.x, pointer.y, pos);
  152420. var bodies = Composite.allBodies(this.world.localWorld);
  152421. for (var i = 0; i < bodies.length; i++)
  152422. {
  152423. var body = bodies[i];
  152424. if (!body.ignorePointer &&
  152425. Bounds.contains(body.bounds, pos) &&
  152426. Detector.canCollide(body.collisionFilter, constraint.collisionFilter))
  152427. {
  152428. if (this.hitTestBody(body, pos))
  152429. {
  152430. this.world.emit(Events.DRAG_START, this.body, this.part, this);
  152431. return true;
  152432. }
  152433. }
  152434. }
  152435. return false;
  152436. },
  152437. /**
  152438. * Scans the current body to determine if a part of it was clicked on.
  152439. * If a part is found the body is set as the `constraint.bodyB` property,
  152440. * as well as the `body` property of this class. The part is also set.
  152441. *
  152442. * @method Phaser.Physics.Matter.PointerConstraint#hitTestBody
  152443. * @since 3.16.2
  152444. *
  152445. * @param {MatterJS.Body} body - The Matter Body to check.
  152446. * @param {Phaser.Math.Vector2} position - A translated hit test position.
  152447. *
  152448. * @return {boolean} `true` if a part of the body was hit, otherwise `false`.
  152449. */
  152450. hitTestBody: function (body, position)
  152451. {
  152452. var constraint = this.constraint;
  152453. var start = (body.parts.length > 1) ? 1 : 0;
  152454. for (var i = start; i < body.parts.length; i++)
  152455. {
  152456. var part = body.parts[i];
  152457. if (Vertices.contains(part.vertices, position))
  152458. {
  152459. constraint.bodyB = body;
  152460. constraint.pointA.x = position.x;
  152461. constraint.pointA.y = position.y;
  152462. constraint.pointB.x = position.x - body.position.x;
  152463. constraint.pointB.y = position.y - body.position.y;
  152464. constraint.angleB = body.angle;
  152465. Sleeping.set(body, false);
  152466. this.part = part;
  152467. this.body = body;
  152468. return true;
  152469. }
  152470. }
  152471. return false;
  152472. },
  152473. /**
  152474. * Internal update handler. Called in the Matter BEFORE_UPDATE step.
  152475. *
  152476. * @method Phaser.Physics.Matter.PointerConstraint#update
  152477. * @fires Phaser.Physics.Matter.Events#DRAG
  152478. * @since 3.0.0
  152479. */
  152480. update: function ()
  152481. {
  152482. var body = this.body;
  152483. var pointer = this.pointer;
  152484. if (!this.active || !pointer || !body)
  152485. {
  152486. return;
  152487. }
  152488. if (pointer.isDown)
  152489. {
  152490. var pos = this.position;
  152491. var constraint = this.constraint;
  152492. this.camera.getWorldPoint(pointer.x, pointer.y, pos);
  152493. Sleeping.set(body, false);
  152494. constraint.pointA.x = pos.x;
  152495. constraint.pointA.y = pos.y;
  152496. this.world.emit(Events.DRAG, body, this);
  152497. }
  152498. else
  152499. {
  152500. // Pointer has been released since the last world step
  152501. this.stopDrag();
  152502. }
  152503. },
  152504. /**
  152505. * Stops the Pointer Constraint from dragging the body any further.
  152506. *
  152507. * This is called automatically if the Pointer is released while actively
  152508. * dragging a body. Or, you can call it manually to release a body from a
  152509. * constraint without having to first release the pointer.
  152510. *
  152511. * @method Phaser.Physics.Matter.PointerConstraint#stopDrag
  152512. * @fires Phaser.Physics.Matter.Events#DRAG_END
  152513. * @since 3.16.2
  152514. */
  152515. stopDrag: function ()
  152516. {
  152517. var body = this.body;
  152518. var constraint = this.constraint;
  152519. if (body)
  152520. {
  152521. this.world.emit(Events.DRAG_END, body, this);
  152522. this.pointer = null;
  152523. this.body = null;
  152524. this.part = null;
  152525. constraint.bodyB = null;
  152526. }
  152527. },
  152528. /**
  152529. * Destroys this Pointer Constraint instance and all of its references.
  152530. *
  152531. * @method Phaser.Physics.Matter.PointerConstraint#destroy
  152532. * @since 3.0.0
  152533. */
  152534. destroy: function ()
  152535. {
  152536. this.world.removeConstraint(this.constraint);
  152537. this.pointer = null;
  152538. this.constraint = null;
  152539. this.body = null;
  152540. this.part = null;
  152541. this.world.off(Events.BEFORE_UPDATE, this.update);
  152542. this.scene.sys.input.off(InputEvents.POINTER_DOWN, this.onDown, this);
  152543. }
  152544. });
  152545. module.exports = PointerConstraint;
  152546. /***/ }),
  152547. /* 1312 */
  152548. /***/ (function(module, exports, __webpack_require__) {
  152549. /**
  152550. * @author Richard Davey <rich@photonstorm.com>
  152551. * @copyright 2019 Photon Storm Ltd.
  152552. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  152553. */
  152554. var Body = __webpack_require__(72);
  152555. /**
  152556. * [description]
  152557. *
  152558. * @name Phaser.Physics.Matter.Components.Velocity
  152559. * @since 3.0.0
  152560. */
  152561. var Velocity = {
  152562. /**
  152563. * [description]
  152564. *
  152565. * @method Phaser.Physics.Matter.Components.Velocity#setAngularVelocity
  152566. * @since 3.0.0
  152567. *
  152568. * @param {number} value - [description]
  152569. *
  152570. * @return {Phaser.GameObjects.GameObject} This Game Object.
  152571. */
  152572. setAngularVelocity: function (value)
  152573. {
  152574. Body.setAngularVelocity(this.body, value);
  152575. return this;
  152576. },
  152577. /**
  152578. * Sets the horizontal velocity of the physics body.
  152579. *
  152580. * @method Phaser.Physics.Matter.Components.Velocity#setVelocityX
  152581. * @since 3.0.0
  152582. *
  152583. * @param {number} x - The horizontal velocity value.
  152584. *
  152585. * @return {Phaser.GameObjects.GameObject} This Game Object.
  152586. */
  152587. setVelocityX: function (x)
  152588. {
  152589. this._tempVec2.set(x, this.body.velocity.y);
  152590. Body.setVelocity(this.body, this._tempVec2);
  152591. return this;
  152592. },
  152593. /**
  152594. * Sets vertical velocity of the physics body.
  152595. *
  152596. * @method Phaser.Physics.Matter.Components.Velocity#setVelocityY
  152597. * @since 3.0.0
  152598. *
  152599. * @param {number} y - The vertical velocity value.
  152600. *
  152601. * @return {Phaser.GameObjects.GameObject} This Game Object.
  152602. */
  152603. setVelocityY: function (y)
  152604. {
  152605. this._tempVec2.set(this.body.velocity.x, y);
  152606. Body.setVelocity(this.body, this._tempVec2);
  152607. return this;
  152608. },
  152609. /**
  152610. * Sets both the horizontal and vertical velocity of the physics body.
  152611. *
  152612. * @method Phaser.Physics.Matter.Components.Velocity#setVelocity
  152613. * @since 3.0.0
  152614. *
  152615. * @param {number} x - The horizontal velocity value.
  152616. * @param {number} [y=x] - The vertical velocity value, it can be either positive or negative. If not given, it will be the same as the `x` value.
  152617. *
  152618. * @return {Phaser.GameObjects.GameObject} This Game Object.
  152619. */
  152620. setVelocity: function (x, y)
  152621. {
  152622. this._tempVec2.set(x, y);
  152623. Body.setVelocity(this.body, this._tempVec2);
  152624. return this;
  152625. }
  152626. };
  152627. module.exports = Velocity;
  152628. /***/ }),
  152629. /* 1313 */
  152630. /***/ (function(module, exports, __webpack_require__) {
  152631. /**
  152632. * @author Richard Davey <rich@photonstorm.com>
  152633. * @copyright 2019 Photon Storm Ltd.
  152634. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  152635. */
  152636. var Body = __webpack_require__(72);
  152637. var MATH_CONST = __webpack_require__(20);
  152638. var WrapAngle = __webpack_require__(214);
  152639. var WrapAngleDegrees = __webpack_require__(213);
  152640. // global bitmask flag for GameObject.renderMask (used by Scale)
  152641. var _FLAG = 4; // 0100
  152642. // Transform Component
  152643. /**
  152644. * Provides methods used for getting and setting the position, scale and rotation of a Game Object.
  152645. *
  152646. * @name Phaser.Physics.Matter.Components.Transform
  152647. * @since 3.0.0
  152648. */
  152649. var Transform = {
  152650. /**
  152651. * The x position of this Game Object.
  152652. *
  152653. * @name Phaser.Physics.Matter.Components.Transform#x
  152654. * @type {number}
  152655. * @since 3.0.0
  152656. */
  152657. x: {
  152658. get: function ()
  152659. {
  152660. return this.body.position.x;
  152661. },
  152662. set: function (value)
  152663. {
  152664. this._tempVec2.set(value, this.y);
  152665. Body.setPosition(this.body, this._tempVec2);
  152666. }
  152667. },
  152668. /**
  152669. * The y position of this Game Object.
  152670. *
  152671. * @name Phaser.Physics.Matter.Components.Transform#y
  152672. * @type {number}
  152673. * @since 3.0.0
  152674. */
  152675. y: {
  152676. get: function ()
  152677. {
  152678. return this.body.position.y;
  152679. },
  152680. set: function (value)
  152681. {
  152682. this._tempVec2.set(this.x, value);
  152683. Body.setPosition(this.body, this._tempVec2);
  152684. }
  152685. },
  152686. /**
  152687. * The horizontal scale of this Game Object.
  152688. *
  152689. * @name Phaser.Physics.Matter.Components.Transform#scaleX
  152690. * @type {number}
  152691. * @since 3.0.0
  152692. */
  152693. scaleX: {
  152694. get: function ()
  152695. {
  152696. return this._scaleX;
  152697. },
  152698. set: function (value)
  152699. {
  152700. var factorX = 1 / this._scaleX;
  152701. var factorY = 1 / this._scaleY;
  152702. this._scaleX = value;
  152703. if (this._scaleX === 0)
  152704. {
  152705. this.renderFlags &= ~_FLAG;
  152706. }
  152707. else
  152708. {
  152709. this.renderFlags |= _FLAG;
  152710. }
  152711. // Reset Matter scale back to 1 (sigh)
  152712. Body.scale(this.body, factorX, factorY);
  152713. Body.scale(this.body, value, this._scaleY);
  152714. }
  152715. },
  152716. /**
  152717. * The vertical scale of this Game Object.
  152718. *
  152719. * @name Phaser.Physics.Matter.Components.Transform#scaleY
  152720. * @type {number}
  152721. * @since 3.0.0
  152722. */
  152723. scaleY: {
  152724. get: function ()
  152725. {
  152726. return this._scaleY;
  152727. },
  152728. set: function (value)
  152729. {
  152730. var factorX = 1 / this._scaleX;
  152731. var factorY = 1 / this._scaleY;
  152732. this._scaleY = value;
  152733. if (this._scaleY === 0)
  152734. {
  152735. this.renderFlags &= ~_FLAG;
  152736. }
  152737. else
  152738. {
  152739. this.renderFlags |= _FLAG;
  152740. }
  152741. Body.scale(this.body, factorX, factorY);
  152742. Body.scale(this.body, this._scaleX, value);
  152743. }
  152744. },
  152745. /**
  152746. * Use `angle` to set or get rotation of the physics body associated to this GameObject. Unlike rotation, when using set the value can be in degrees, which will be converted to radians internally.
  152747. *
  152748. * @name Phaser.Physics.Matter.Components.Transform#angle
  152749. * @type {number}
  152750. * @since 3.0.0
  152751. */
  152752. angle: {
  152753. get: function ()
  152754. {
  152755. return WrapAngleDegrees(this.body.angle * MATH_CONST.RAD_TO_DEG);
  152756. },
  152757. set: function (value)
  152758. {
  152759. // value is in degrees
  152760. this.rotation = WrapAngleDegrees(value) * MATH_CONST.DEG_TO_RAD;
  152761. }
  152762. },
  152763. /**
  152764. * Use `rotation` to set or get the rotation of the physics body associated with this GameObject. The value when set must be in radians.
  152765. *
  152766. * @name Phaser.Physics.Matter.Components.Transform#rotation
  152767. * @type {number}
  152768. * @since 3.0.0
  152769. */
  152770. rotation: {
  152771. get: function ()
  152772. {
  152773. return this.body.angle;
  152774. },
  152775. set: function (value)
  152776. {
  152777. // value is in radians
  152778. this._rotation = WrapAngle(value);
  152779. Body.setAngle(this.body, this._rotation);
  152780. }
  152781. },
  152782. /**
  152783. * Sets the position of the physics body along x and y axes. Both the parameters to this function are optional and if not passed any they default to 0.
  152784. *
  152785. * @method Phaser.Physics.Matter.Components.Transform#setPosition
  152786. * @since 3.0.0
  152787. *
  152788. * @param {number} [x=0] - The horizontal position of the body.
  152789. * @param {number} [y=x] - The vertical position of the body.
  152790. *
  152791. * @return {this} This Game Object.
  152792. */
  152793. setPosition: function (x, y)
  152794. {
  152795. if (x === undefined) { x = 0; }
  152796. if (y === undefined) { y = x; }
  152797. this._tempVec2.set(x, y);
  152798. Body.setPosition(this.body, this._tempVec2);
  152799. return this;
  152800. },
  152801. /**
  152802. * [description]
  152803. *
  152804. * @method Phaser.Physics.Matter.Components.Transform#setRotation
  152805. * @since 3.0.0
  152806. *
  152807. * @param {number} [radians=0] - [description]
  152808. *
  152809. * @return {this} This Game Object.
  152810. */
  152811. setRotation: function (radians)
  152812. {
  152813. if (radians === undefined) { radians = 0; }
  152814. this._rotation = WrapAngle(radians);
  152815. Body.setAngle(this.body, radians);
  152816. return this;
  152817. },
  152818. /**
  152819. * [description]
  152820. *
  152821. * @method Phaser.Physics.Matter.Components.Transform#setFixedRotation
  152822. * @since 3.0.0
  152823. *
  152824. * @return {this} This Game Object.
  152825. */
  152826. setFixedRotation: function ()
  152827. {
  152828. Body.setInertia(this.body, Infinity);
  152829. return this;
  152830. },
  152831. /**
  152832. * [description]
  152833. *
  152834. * @method Phaser.Physics.Matter.Components.Transform#setAngle
  152835. * @since 3.0.0
  152836. *
  152837. * @param {number} [degrees=0] - [description]
  152838. *
  152839. * @return {this} This Game Object.
  152840. */
  152841. setAngle: function (degrees)
  152842. {
  152843. if (degrees === undefined) { degrees = 0; }
  152844. this.angle = degrees;
  152845. Body.setAngle(this.body, this.rotation);
  152846. return this;
  152847. },
  152848. /**
  152849. * Sets the scale of this Game Object.
  152850. *
  152851. * @method Phaser.Physics.Matter.Components.Transform#setScale
  152852. * @since 3.0.0
  152853. *
  152854. * @param {number} [x=1] - The horizontal scale of this Game Object.
  152855. * @param {number} [y=x] - The vertical scale of this Game Object. If not set it will use the x value.
  152856. * @param {Phaser.Math.Vector2} [point] - The point (Vector2) from which scaling will occur.
  152857. *
  152858. * @return {this} This Game Object.
  152859. */
  152860. setScale: function (x, y, point)
  152861. {
  152862. if (x === undefined) { x = 1; }
  152863. if (y === undefined) { y = x; }
  152864. var factorX = 1 / this._scaleX;
  152865. var factorY = 1 / this._scaleY;
  152866. this._scaleX = x;
  152867. this._scaleY = y;
  152868. Body.scale(this.body, factorX, factorY, point);
  152869. Body.scale(this.body, x, y, point);
  152870. return this;
  152871. }
  152872. };
  152873. module.exports = Transform;
  152874. /***/ }),
  152875. /* 1314 */
  152876. /***/ (function(module, exports) {
  152877. /**
  152878. * @author Richard Davey <rich@photonstorm.com>
  152879. * @copyright 2019 Photon Storm Ltd.
  152880. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  152881. */
  152882. /**
  152883. * @typedef {object} Phaser.Physics.Matter.Events.SleepStartEvent
  152884. *
  152885. * @property {any} source - The source object of the event.
  152886. * @property {string} name - The name of the event.
  152887. */
  152888. /**
  152889. * The Matter Physics Sleep Start Event.
  152890. *
  152891. * This event is dispatched by a Matter Physics World instance when a Body goes to sleep.
  152892. *
  152893. * Listen to it from a Scene using: `this.matter.world.on('sleepstart', listener)`.
  152894. *
  152895. * @event Phaser.Physics.Matter.Events#SLEEP_START
  152896. *
  152897. * @param {Phaser.Physics.Matter.Events.SleepStartEvent} event - The Sleep Event object.
  152898. * @param {MatterJS.Body} body - The body that has gone to sleep.
  152899. */
  152900. module.exports = 'sleepstart';
  152901. /***/ }),
  152902. /* 1315 */
  152903. /***/ (function(module, exports) {
  152904. /**
  152905. * @author Richard Davey <rich@photonstorm.com>
  152906. * @copyright 2019 Photon Storm Ltd.
  152907. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  152908. */
  152909. /**
  152910. * @typedef {object} Phaser.Physics.Matter.Events.SleepEndEvent
  152911. *
  152912. * @property {any} source - The source object of the event.
  152913. * @property {string} name - The name of the event.
  152914. */
  152915. /**
  152916. * The Matter Physics Sleep End Event.
  152917. *
  152918. * This event is dispatched by a Matter Physics World instance when a Body stop sleeping.
  152919. *
  152920. * Listen to it from a Scene using: `this.matter.world.on('sleepend', listener)`.
  152921. *
  152922. * @event Phaser.Physics.Matter.Events#SLEEP_END
  152923. *
  152924. * @param {Phaser.Physics.Matter.Events.SleepEndEvent} event - The Sleep Event object.
  152925. * @param {MatterJS.Body} body - The body that has stopped sleeping.
  152926. */
  152927. module.exports = 'sleepend';
  152928. /***/ }),
  152929. /* 1316 */
  152930. /***/ (function(module, exports) {
  152931. /**
  152932. * @author Richard Davey <rich@photonstorm.com>
  152933. * @copyright 2019 Photon Storm Ltd.
  152934. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  152935. */
  152936. /**
  152937. * The Matter Physics World Resume Event.
  152938. *
  152939. * This event is dispatched by an Matter Physics World instance when it resumes from a paused state.
  152940. *
  152941. * Listen to it from a Scene using: `this.matter.world.on('resume', listener)`.
  152942. *
  152943. * @event Phaser.Physics.Matter.Events#RESUME
  152944. */
  152945. module.exports = 'resume';
  152946. /***/ }),
  152947. /* 1317 */
  152948. /***/ (function(module, exports) {
  152949. /**
  152950. * @author Richard Davey <rich@photonstorm.com>
  152951. * @copyright 2019 Photon Storm Ltd.
  152952. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  152953. */
  152954. /**
  152955. * The Matter Physics World Pause Event.
  152956. *
  152957. * This event is dispatched by an Matter Physics World instance when it is paused.
  152958. *
  152959. * Listen to it from a Scene using: `this.matter.world.on('pause', listener)`.
  152960. *
  152961. * @event Phaser.Physics.Matter.Events#PAUSE
  152962. */
  152963. module.exports = 'pause';
  152964. /***/ }),
  152965. /* 1318 */
  152966. /***/ (function(module, exports) {
  152967. /**
  152968. * @author Richard Davey <rich@photonstorm.com>
  152969. * @copyright 2019 Photon Storm Ltd.
  152970. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  152971. */
  152972. /**
  152973. * The Matter Physics Drag Start Event.
  152974. *
  152975. * This event is dispatched by a Matter Physics World instance when a Pointer Constraint
  152976. * starts dragging a body.
  152977. *
  152978. * Listen to it from a Scene using: `this.matter.world.on('dragstart', listener)`.
  152979. *
  152980. * @event Phaser.Physics.Matter.Events#DRAG_START
  152981. *
  152982. * @param {MatterJS.Body} body - The Body that has started being dragged. This is a Matter Body, not a Phaser Game Object.
  152983. * @param {MatterJS.Body} part - The part of the body that was clicked on.
  152984. * @param {Phaser.Physics.Matter.PointerConstraint} constraint - The Pointer Constraint that is dragging the body.
  152985. */
  152986. module.exports = 'dragstart';
  152987. /***/ }),
  152988. /* 1319 */
  152989. /***/ (function(module, exports) {
  152990. /**
  152991. * @author Richard Davey <rich@photonstorm.com>
  152992. * @copyright 2019 Photon Storm Ltd.
  152993. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  152994. */
  152995. /**
  152996. * The Matter Physics Drag Event.
  152997. *
  152998. * This event is dispatched by a Matter Physics World instance when a Pointer Constraint
  152999. * is actively dragging a body. It is emitted each time the pointer moves.
  153000. *
  153001. * Listen to it from a Scene using: `this.matter.world.on('drag', listener)`.
  153002. *
  153003. * @event Phaser.Physics.Matter.Events#DRAG
  153004. *
  153005. * @param {MatterJS.Body} body - The Body that is being dragged. This is a Matter Body, not a Phaser Game Object.
  153006. * @param {Phaser.Physics.Matter.PointerConstraint} constraint - The Pointer Constraint that is dragging the body.
  153007. */
  153008. module.exports = 'drag';
  153009. /***/ }),
  153010. /* 1320 */
  153011. /***/ (function(module, exports) {
  153012. /**
  153013. * @author Richard Davey <rich@photonstorm.com>
  153014. * @copyright 2019 Photon Storm Ltd.
  153015. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153016. */
  153017. /**
  153018. * The Matter Physics Drag End Event.
  153019. *
  153020. * This event is dispatched by a Matter Physics World instance when a Pointer Constraint
  153021. * stops dragging a body.
  153022. *
  153023. * Listen to it from a Scene using: `this.matter.world.on('dragend', listener)`.
  153024. *
  153025. * @event Phaser.Physics.Matter.Events#DRAG_END
  153026. *
  153027. * @param {MatterJS.Body} body - The Body that has stopped being dragged. This is a Matter Body, not a Phaser Game Object.
  153028. * @param {Phaser.Physics.Matter.PointerConstraint} constraint - The Pointer Constraint that was dragging the body.
  153029. */
  153030. module.exports = 'dragend';
  153031. /***/ }),
  153032. /* 1321 */
  153033. /***/ (function(module, exports) {
  153034. /**
  153035. * @author Richard Davey <rich@photonstorm.com>
  153036. * @copyright 2019 Photon Storm Ltd.
  153037. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153038. */
  153039. /**
  153040. * @typedef {object} Phaser.Physics.Matter.Events.CollisionStartEvent
  153041. *
  153042. * @property {array} pairs - A list of all affected pairs in the collision.
  153043. * @property {number} timestamp - The Matter Engine `timing.timestamp` value for the event.
  153044. * @property {any} source - The source object of the event.
  153045. * @property {string} name - The name of the event.
  153046. */
  153047. /**
  153048. * The Matter Physics Collision Start Event.
  153049. *
  153050. * This event is dispatched by a Matter Physics World instance after the engine has updated.
  153051. * It provides a list of all pairs that have started to collide in the current tick (if any).
  153052. *
  153053. * Listen to it from a Scene using: `this.matter.world.on('collisionstart', listener)`.
  153054. *
  153055. * @event Phaser.Physics.Matter.Events#COLLISION_START
  153056. *
  153057. * @param {Phaser.Physics.Matter.Events.CollisionStartEvent} event - The Collision Event object.
  153058. * @param {MatterJS.Body} bodyA - The first body of the first colliding pair. The `event.pairs` array may contain more colliding bodies.
  153059. * @param {MatterJS.Body} bodyB - The second body of the first colliding pair. The `event.pairs` array may contain more colliding bodies.
  153060. */
  153061. module.exports = 'collisionstart';
  153062. /***/ }),
  153063. /* 1322 */
  153064. /***/ (function(module, exports) {
  153065. /**
  153066. * @author Richard Davey <rich@photonstorm.com>
  153067. * @copyright 2019 Photon Storm Ltd.
  153068. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153069. */
  153070. /**
  153071. * @typedef {object} Phaser.Physics.Matter.Events.CollisionEndEvent
  153072. *
  153073. * @property {array} pairs - A list of all affected pairs in the collision.
  153074. * @property {number} timestamp - The Matter Engine `timing.timestamp` value for the event.
  153075. * @property {any} source - The source object of the event.
  153076. * @property {string} name - The name of the event.
  153077. */
  153078. /**
  153079. * The Matter Physics Collision End Event.
  153080. *
  153081. * This event is dispatched by a Matter Physics World instance after the engine has updated.
  153082. * It provides a list of all pairs that have finished colliding in the current tick (if any).
  153083. *
  153084. * Listen to it from a Scene using: `this.matter.world.on('collisionend', listener)`.
  153085. *
  153086. * @event Phaser.Physics.Matter.Events#COLLISION_END
  153087. *
  153088. * @param {Phaser.Physics.Matter.Events.CollisionEndEvent} event - The Collision Event object.
  153089. * @param {MatterJS.Body} bodyA - The first body of the first colliding pair. The `event.pairs` array may contain more colliding bodies.
  153090. * @param {MatterJS.Body} bodyB - The second body of the first colliding pair. The `event.pairs` array may contain more colliding bodies.
  153091. */
  153092. module.exports = 'collisionend';
  153093. /***/ }),
  153094. /* 1323 */
  153095. /***/ (function(module, exports) {
  153096. /**
  153097. * @author Richard Davey <rich@photonstorm.com>
  153098. * @copyright 2019 Photon Storm Ltd.
  153099. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153100. */
  153101. /**
  153102. * @typedef {object} Phaser.Physics.Matter.Events.CollisionActiveEvent
  153103. *
  153104. * @property {array} pairs - A list of all affected pairs in the collision.
  153105. * @property {number} timestamp - The Matter Engine `timing.timestamp` value for the event.
  153106. * @property {any} source - The source object of the event.
  153107. * @property {string} name - The name of the event.
  153108. */
  153109. /**
  153110. * The Matter Physics Collision Active Event.
  153111. *
  153112. * This event is dispatched by a Matter Physics World instance after the engine has updated.
  153113. * It provides a list of all pairs that are colliding in the current tick (if any).
  153114. *
  153115. * Listen to it from a Scene using: `this.matter.world.on('collisionactive', listener)`.
  153116. *
  153117. * @event Phaser.Physics.Matter.Events#COLLISION_ACTIVE
  153118. *
  153119. * @param {Phaser.Physics.Matter.Events.CollisionActiveEvent} event - The Collision Event object.
  153120. * @param {MatterJS.Body} bodyA - The first body of the first colliding pair. The `event.pairs` array may contain more colliding bodies.
  153121. * @param {MatterJS.Body} bodyB - The second body of the first colliding pair. The `event.pairs` array may contain more colliding bodies.
  153122. */
  153123. module.exports = 'collisionactive';
  153124. /***/ }),
  153125. /* 1324 */
  153126. /***/ (function(module, exports) {
  153127. /**
  153128. * @author Richard Davey <rich@photonstorm.com>
  153129. * @copyright 2019 Photon Storm Ltd.
  153130. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153131. */
  153132. /**
  153133. * @typedef {object} Phaser.Physics.Matter.Events.BeforeUpdateEvent
  153134. *
  153135. * @property {number} timestamp - The Matter Engine `timing.timestamp` value for the event.
  153136. * @property {any} source - The source object of the event.
  153137. * @property {string} name - The name of the event.
  153138. */
  153139. /**
  153140. * The Matter Physics Before Update Event.
  153141. *
  153142. * This event is dispatched by a Matter Physics World instance right before all the collision processing takes place.
  153143. *
  153144. * Listen to it from a Scene using: `this.matter.world.on('beforeupdate', listener)`.
  153145. *
  153146. * @event Phaser.Physics.Matter.Events#BEFORE_UPDATE
  153147. *
  153148. * @param {Phaser.Physics.Matter.Events.BeforeUpdateEvent} event - The Update Event object.
  153149. */
  153150. module.exports = 'beforeupdate';
  153151. /***/ }),
  153152. /* 1325 */
  153153. /***/ (function(module, exports) {
  153154. /**
  153155. * @author Richard Davey <rich@photonstorm.com>
  153156. * @copyright 2019 Photon Storm Ltd.
  153157. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153158. */
  153159. /**
  153160. * @typedef {object} Phaser.Physics.Matter.Events.AfterUpdateEvent
  153161. *
  153162. * @property {number} timestamp - The Matter Engine `timing.timestamp` value for the event.
  153163. * @property {any} source - The source object of the event.
  153164. * @property {string} name - The name of the event.
  153165. */
  153166. /**
  153167. * The Matter Physics After Update Event.
  153168. *
  153169. * This event is dispatched by a Matter Physics World instance after the engine has updated and all collision events have resolved.
  153170. *
  153171. * Listen to it from a Scene using: `this.matter.world.on('afterupdate', listener)`.
  153172. *
  153173. * @event Phaser.Physics.Matter.Events#AFTER_UPDATE
  153174. *
  153175. * @param {Phaser.Physics.Matter.Events.AfterUpdateEvent} event - The Update Event object.
  153176. */
  153177. module.exports = 'afterupdate';
  153178. /***/ }),
  153179. /* 1326 */
  153180. /***/ (function(module, exports, __webpack_require__) {
  153181. /**
  153182. * @author Richard Davey <rich@photonstorm.com>
  153183. * @copyright 2019 Photon Storm Ltd.
  153184. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153185. */
  153186. var Events = __webpack_require__(545);
  153187. var MatterEvents = __webpack_require__(210);
  153188. /**
  153189. * [description]
  153190. *
  153191. * @name Phaser.Physics.Matter.Components.Sleep
  153192. * @since 3.0.0
  153193. */
  153194. var Sleep = {
  153195. /**
  153196. * [description]
  153197. *
  153198. * @method Phaser.Physics.Matter.Components.Sleep#setSleepThreshold
  153199. * @since 3.0.0
  153200. *
  153201. * @param {number} [value=60] - [description]
  153202. *
  153203. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153204. */
  153205. setSleepThreshold: function (value)
  153206. {
  153207. if (value === undefined) { value = 60; }
  153208. this.body.sleepThreshold = value;
  153209. return this;
  153210. },
  153211. /**
  153212. * [description]
  153213. *
  153214. * @method Phaser.Physics.Matter.Components.Sleep#setSleepEvents
  153215. * @since 3.0.0
  153216. *
  153217. * @param {boolean} start - [description]
  153218. * @param {boolean} end - [description]
  153219. *
  153220. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153221. */
  153222. setSleepEvents: function (start, end)
  153223. {
  153224. this.setSleepStartEvent(start);
  153225. this.setSleepEndEvent(end);
  153226. return this;
  153227. },
  153228. /**
  153229. * [description]
  153230. *
  153231. * @method Phaser.Physics.Matter.Components.Sleep#setSleepStartEvent
  153232. * @since 3.0.0
  153233. *
  153234. * @param {boolean} value - [description]
  153235. *
  153236. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153237. */
  153238. setSleepStartEvent: function (value)
  153239. {
  153240. if (value)
  153241. {
  153242. var world = this.world;
  153243. MatterEvents.on(this.body, 'sleepStart', function (event)
  153244. {
  153245. world.emit(Events.SLEEP_START, event, this);
  153246. });
  153247. }
  153248. else
  153249. {
  153250. MatterEvents.off(this.body, 'sleepStart');
  153251. }
  153252. return this;
  153253. },
  153254. /**
  153255. * [description]
  153256. *
  153257. * @method Phaser.Physics.Matter.Components.Sleep#setSleepEndEvent
  153258. * @since 3.0.0
  153259. *
  153260. * @param {boolean} value - [description]
  153261. *
  153262. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153263. */
  153264. setSleepEndEvent: function (value)
  153265. {
  153266. if (value)
  153267. {
  153268. var world = this.world;
  153269. MatterEvents.on(this.body, 'sleepEnd', function (event)
  153270. {
  153271. world.emit(Events.SLEEP_END, event, this);
  153272. });
  153273. }
  153274. else
  153275. {
  153276. MatterEvents.off(this.body, 'sleepEnd');
  153277. }
  153278. return this;
  153279. }
  153280. };
  153281. module.exports = Sleep;
  153282. /***/ }),
  153283. /* 1327 */
  153284. /***/ (function(module, exports, __webpack_require__) {
  153285. /**
  153286. * @author Joachim Grill <joachim@codeandweb.com>
  153287. * @copyright 2018 CodeAndWeb GmbH
  153288. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153289. */
  153290. var Bodies = __webpack_require__(138);
  153291. var Body = __webpack_require__(72);
  153292. var Bounds = __webpack_require__(86);
  153293. var Common = __webpack_require__(36);
  153294. var GetFastValue = __webpack_require__(2);
  153295. var Vector = __webpack_require__(87);
  153296. var Vertices = __webpack_require__(82);
  153297. /**
  153298. * Use PhysicsEditorParser.parseBody() to build a Matter body object, based on a physics data file
  153299. * created and exported with PhysicsEditor (https://www.codeandweb.com/physicseditor).
  153300. *
  153301. * @namespace Phaser.Physics.Matter.PhysicsEditorParser
  153302. * @since 3.10.0
  153303. */
  153304. var PhysicsEditorParser = {
  153305. /**
  153306. * Parses a body element exported by PhysicsEditor.
  153307. *
  153308. * @function Phaser.Physics.Matter.PhysicsEditorParser.parseBody
  153309. * @since 3.10.0
  153310. *
  153311. * @param {number} x - x position.
  153312. * @param {number} y - y position.
  153313. * @param {number} w - width.
  153314. * @param {number} h - height.
  153315. * @param {object} config - body configuration and fixture (child body) definitions.
  153316. *
  153317. * @return {object} A matter body, consisting of several parts (child bodies)
  153318. */
  153319. parseBody: function (x, y, w, h, config)
  153320. {
  153321. var fixtureConfigs = GetFastValue(config, 'fixtures', []);
  153322. var fixtures = [];
  153323. for (var fc = 0; fc < fixtureConfigs.length; fc++)
  153324. {
  153325. var fixtureParts = this.parseFixture(fixtureConfigs[fc]);
  153326. for (var i = 0; i < fixtureParts.length; i++)
  153327. {
  153328. fixtures.push(fixtureParts[i]);
  153329. }
  153330. }
  153331. var matterConfig = Common.extend({}, false, config);
  153332. delete matterConfig.fixtures;
  153333. delete matterConfig.type;
  153334. var body = Body.create(matterConfig);
  153335. Body.setParts(body, fixtures);
  153336. body.render.sprite.xOffset = body.position.x / w;
  153337. body.render.sprite.yOffset = body.position.y / h;
  153338. Body.setPosition(body, { x: x, y: y });
  153339. return body;
  153340. },
  153341. /**
  153342. * Parses an element of the "fixtures" list exported by PhysicsEditor
  153343. *
  153344. * @function Phaser.Physics.Matter.PhysicsEditorParser.parseFixture
  153345. * @since 3.10.0
  153346. *
  153347. * @param {object} fixtureConfig - the fixture object to parse
  153348. *
  153349. * @return {object[]} - A list of matter bodies
  153350. */
  153351. parseFixture: function (fixtureConfig)
  153352. {
  153353. var matterConfig = Common.extend({}, false, fixtureConfig);
  153354. delete matterConfig.circle;
  153355. delete matterConfig.vertices;
  153356. var fixtures;
  153357. if (fixtureConfig.circle)
  153358. {
  153359. var x = GetFastValue(fixtureConfig.circle, 'x');
  153360. var y = GetFastValue(fixtureConfig.circle, 'y');
  153361. var r = GetFastValue(fixtureConfig.circle, 'radius');
  153362. fixtures = [ Bodies.circle(x, y, r, matterConfig) ];
  153363. }
  153364. else if (fixtureConfig.vertices)
  153365. {
  153366. fixtures = this.parseVertices(fixtureConfig.vertices, matterConfig);
  153367. }
  153368. return fixtures;
  153369. },
  153370. /**
  153371. * Parses the "vertices" lists exported by PhysicsEditor.
  153372. *
  153373. * @function Phaser.Physics.Matter.PhysicsEditorParser.parseVertices
  153374. * @since 3.10.0
  153375. *
  153376. * @param {object} vertexSets - The vertex lists to parse.
  153377. * @param {object} options - Matter body options.
  153378. *
  153379. * @return {object[]} - A list of matter bodies.
  153380. */
  153381. parseVertices: function (vertexSets, options)
  153382. {
  153383. var i, j, k, v, z;
  153384. var parts = [];
  153385. options = options || {};
  153386. for (v = 0; v < vertexSets.length; v += 1)
  153387. {
  153388. parts.push(Body.create(Common.extend({
  153389. position: Vertices.centre(vertexSets[v]),
  153390. vertices: vertexSets[v]
  153391. }, options)));
  153392. }
  153393. // flag coincident part edges
  153394. var coincidentMaxDist = 5;
  153395. for (i = 0; i < parts.length; i++)
  153396. {
  153397. var partA = parts[i];
  153398. for (j = i + 1; j < parts.length; j++)
  153399. {
  153400. var partB = parts[j];
  153401. if (Bounds.overlaps(partA.bounds, partB.bounds))
  153402. {
  153403. var pav = partA.vertices,
  153404. pbv = partB.vertices;
  153405. // iterate vertices of both parts
  153406. for (k = 0; k < partA.vertices.length; k++)
  153407. {
  153408. for (z = 0; z < partB.vertices.length; z++)
  153409. {
  153410. // find distances between the vertices
  153411. var da = Vector.magnitudeSquared(Vector.sub(pav[(k + 1) % pav.length], pbv[z])),
  153412. db = Vector.magnitudeSquared(Vector.sub(pav[k], pbv[(z + 1) % pbv.length]));
  153413. // if both vertices are very close, consider the edge concident (internal)
  153414. if (da < coincidentMaxDist && db < coincidentMaxDist)
  153415. {
  153416. pav[k].isInternal = true;
  153417. pbv[z].isInternal = true;
  153418. }
  153419. }
  153420. }
  153421. }
  153422. }
  153423. }
  153424. return parts;
  153425. }
  153426. };
  153427. module.exports = PhysicsEditorParser;
  153428. /***/ }),
  153429. /* 1328 */
  153430. /***/ (function(module, exports, __webpack_require__) {
  153431. /**
  153432. * @author Richard Davey <rich@photonstorm.com>
  153433. * @copyright 2019 Photon Storm Ltd.
  153434. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153435. */
  153436. var Bodies = __webpack_require__(138);
  153437. var Body = __webpack_require__(72);
  153438. var GetFastValue = __webpack_require__(2);
  153439. var PhysicsEditorParser = __webpack_require__(1327);
  153440. var Vertices = __webpack_require__(82);
  153441. /**
  153442. * [description]
  153443. *
  153444. * @name Phaser.Physics.Matter.Components.SetBody
  153445. * @since 3.0.0
  153446. */
  153447. var SetBody = {
  153448. // Calling any of these methods resets previous properties you may have set on the body, including plugins, mass, etc
  153449. /**
  153450. * Set the body on a Game Object to a rectangle.
  153451. *
  153452. * @method Phaser.Physics.Matter.Components.SetBody#setRectangle
  153453. * @since 3.0.0
  153454. *
  153455. * @param {number} width - Width of the rectangle.
  153456. * @param {number} height - Height of the rectangle.
  153457. * @param {object} options - [description]
  153458. *
  153459. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153460. */
  153461. setRectangle: function (width, height, options)
  153462. {
  153463. return this.setBody({ type: 'rectangle', width: width, height: height }, options);
  153464. },
  153465. /**
  153466. * [description]
  153467. *
  153468. * @method Phaser.Physics.Matter.Components.SetBody#setCircle
  153469. * @since 3.0.0
  153470. *
  153471. * @param {number} radius - [description]
  153472. * @param {object} options - [description]
  153473. *
  153474. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153475. */
  153476. setCircle: function (radius, options)
  153477. {
  153478. return this.setBody({ type: 'circle', radius: radius }, options);
  153479. },
  153480. /**
  153481. * Set the body on the Game Object to a polygon shape.
  153482. *
  153483. * @method Phaser.Physics.Matter.Components.SetBody#setPolygon
  153484. * @since 3.0.0
  153485. *
  153486. * @param {number} radius - The radius of the polygon.
  153487. * @param {number} sides - The amount of sides creating the polygon.
  153488. * @param {object} options - A matterjs config object.
  153489. *
  153490. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153491. */
  153492. setPolygon: function (radius, sides, options)
  153493. {
  153494. return this.setBody({ type: 'polygon', sides: sides, radius: radius }, options);
  153495. },
  153496. /**
  153497. * Creates a new matterjs trapezoid body.
  153498. *
  153499. * @method Phaser.Physics.Matter.Components.SetBody#setTrapezoid
  153500. * @since 3.0.0
  153501. *
  153502. * @param {number} width - The width of the trapezoid.
  153503. * @param {number} height - The height of the trapezoid.
  153504. * @param {number} slope - The angle of slope for the trapezoid.
  153505. * @param {object} options - A matterjs config object for the body.
  153506. *
  153507. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153508. */
  153509. setTrapezoid: function (width, height, slope, options)
  153510. {
  153511. return this.setBody({ type: 'trapezoid', width: width, height: height, slope: slope }, options);
  153512. },
  153513. /**
  153514. * [description]
  153515. *
  153516. * @method Phaser.Physics.Matter.Components.SetBody#setExistingBody
  153517. * @since 3.0.0
  153518. *
  153519. * @param {MatterJS.Body} body - [description]
  153520. * @param {boolean} [addToWorld=true] - [description]
  153521. *
  153522. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153523. */
  153524. setExistingBody: function (body, addToWorld)
  153525. {
  153526. if (addToWorld === undefined)
  153527. {
  153528. addToWorld = true;
  153529. }
  153530. if (this.body)
  153531. {
  153532. this.world.remove(this.body);
  153533. }
  153534. this.body = body;
  153535. for (var i = 0; i < body.parts.length; i++)
  153536. {
  153537. body.parts[i].gameObject = this;
  153538. }
  153539. var _this = this;
  153540. body.destroy = function destroy ()
  153541. {
  153542. _this.world.remove(_this.body);
  153543. _this.body.gameObject = null;
  153544. };
  153545. if (addToWorld)
  153546. {
  153547. this.world.add(body);
  153548. }
  153549. if (this._originComponent)
  153550. {
  153551. this.setOrigin(body.render.sprite.xOffset, body.render.sprite.yOffset);
  153552. }
  153553. return this;
  153554. },
  153555. /**
  153556. * [description]
  153557. *
  153558. * @method Phaser.Physics.Matter.Components.SetBody#setBody
  153559. * @since 3.0.0
  153560. *
  153561. * @param {object} config - [description]
  153562. * @param {object} options - [description]
  153563. *
  153564. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153565. */
  153566. setBody: function (config, options)
  153567. {
  153568. if (!config)
  153569. {
  153570. return this;
  153571. }
  153572. var body;
  153573. // Allow them to do: shape: 'circle' instead of shape: { type: 'circle' }
  153574. if (typeof config === 'string')
  153575. {
  153576. // Using defaults
  153577. config = { type: config };
  153578. }
  153579. var shapeType = GetFastValue(config, 'type', 'rectangle');
  153580. var bodyX = GetFastValue(config, 'x', this._tempVec2.x);
  153581. var bodyY = GetFastValue(config, 'y', this._tempVec2.y);
  153582. var bodyWidth = GetFastValue(config, 'width', this.width);
  153583. var bodyHeight = GetFastValue(config, 'height', this.height);
  153584. switch (shapeType)
  153585. {
  153586. case 'rectangle':
  153587. body = Bodies.rectangle(bodyX, bodyY, bodyWidth, bodyHeight, options);
  153588. break;
  153589. case 'circle':
  153590. var radius = GetFastValue(config, 'radius', Math.max(bodyWidth, bodyHeight) / 2);
  153591. var maxSides = GetFastValue(config, 'maxSides', 25);
  153592. body = Bodies.circle(bodyX, bodyY, radius, options, maxSides);
  153593. break;
  153594. case 'trapezoid':
  153595. var slope = GetFastValue(config, 'slope', 0.5);
  153596. body = Bodies.trapezoid(bodyX, bodyY, bodyWidth, bodyHeight, slope, options);
  153597. break;
  153598. case 'polygon':
  153599. var sides = GetFastValue(config, 'sides', 5);
  153600. var pRadius = GetFastValue(config, 'radius', Math.max(bodyWidth, bodyHeight) / 2);
  153601. body = Bodies.polygon(bodyX, bodyY, sides, pRadius, options);
  153602. break;
  153603. case 'fromVertices':
  153604. case 'fromVerts':
  153605. var verts = GetFastValue(config, 'verts', null);
  153606. if (verts)
  153607. {
  153608. // Has the verts array come from Vertices.fromPath, or is it raw?
  153609. if (typeof verts === 'string')
  153610. {
  153611. verts = Vertices.fromPath(verts);
  153612. }
  153613. if (this.body && !this.body.hasOwnProperty('temp'))
  153614. {
  153615. Body.setVertices(this.body, verts);
  153616. body = this.body;
  153617. }
  153618. else
  153619. {
  153620. var flagInternal = GetFastValue(config, 'flagInternal', false);
  153621. var removeCollinear = GetFastValue(config, 'removeCollinear', 0.01);
  153622. var minimumArea = GetFastValue(config, 'minimumArea', 10);
  153623. body = Bodies.fromVertices(bodyX, bodyY, verts, options, flagInternal, removeCollinear, minimumArea);
  153624. }
  153625. }
  153626. break;
  153627. case 'fromPhysicsEditor':
  153628. body = PhysicsEditorParser.parseBody(bodyX, bodyY, bodyWidth, bodyHeight, config);
  153629. break;
  153630. }
  153631. if (body)
  153632. {
  153633. this.setExistingBody(body, config.addToWorld);
  153634. }
  153635. return this;
  153636. }
  153637. };
  153638. module.exports = SetBody;
  153639. /***/ }),
  153640. /* 1329 */
  153641. /***/ (function(module, exports) {
  153642. /**
  153643. * @author Richard Davey <rich@photonstorm.com>
  153644. * @copyright 2019 Photon Storm Ltd.
  153645. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153646. */
  153647. /**
  153648. * [description]
  153649. *
  153650. * @name Phaser.Physics.Matter.Components.Sensor
  153651. * @since 3.0.0
  153652. */
  153653. var Sensor = {
  153654. /**
  153655. * [description]
  153656. *
  153657. * @method Phaser.Physics.Matter.Components.Sensor#setSensor
  153658. * @since 3.0.0
  153659. *
  153660. * @param {boolean} value - [description]
  153661. *
  153662. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153663. */
  153664. setSensor: function (value)
  153665. {
  153666. this.body.isSensor = value;
  153667. return this;
  153668. },
  153669. /**
  153670. * [description]
  153671. *
  153672. * @method Phaser.Physics.Matter.Components.Sensor#isSensor
  153673. * @since 3.0.0
  153674. *
  153675. * @return {boolean} [description]
  153676. */
  153677. isSensor: function ()
  153678. {
  153679. return this.body.isSensor;
  153680. }
  153681. };
  153682. module.exports = Sensor;
  153683. /***/ }),
  153684. /* 1330 */
  153685. /***/ (function(module, exports, __webpack_require__) {
  153686. /**
  153687. * @author Richard Davey <rich@photonstorm.com>
  153688. * @copyright 2019 Photon Storm Ltd.
  153689. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153690. */
  153691. var Body = __webpack_require__(72);
  153692. /**
  153693. * [description]
  153694. *
  153695. * @name Phaser.Physics.Matter.Components.Static
  153696. * @since 3.0.0
  153697. */
  153698. var Static = {
  153699. /**
  153700. * [description]
  153701. *
  153702. * @method Phaser.Physics.Matter.Components.Static#setStatic
  153703. * @since 3.0.0
  153704. *
  153705. * @param {boolean} value - [description]
  153706. *
  153707. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153708. */
  153709. setStatic: function (value)
  153710. {
  153711. Body.setStatic(this.body, value);
  153712. return this;
  153713. },
  153714. /**
  153715. * [description]
  153716. *
  153717. * @method Phaser.Physics.Matter.Components.Static#isStatic
  153718. * @since 3.0.0
  153719. *
  153720. * @return {boolean} [description]
  153721. */
  153722. isStatic: function ()
  153723. {
  153724. return this.body.isStatic;
  153725. }
  153726. };
  153727. module.exports = Static;
  153728. /***/ }),
  153729. /* 1331 */
  153730. /***/ (function(module, exports, __webpack_require__) {
  153731. /**
  153732. * @author Richard Davey <rich@photonstorm.com>
  153733. * @copyright 2019 Photon Storm Ltd.
  153734. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153735. */
  153736. var Body = __webpack_require__(72);
  153737. var Vector2 = __webpack_require__(3);
  153738. /**
  153739. * Allows accessing the mass, density, and center of mass of a Matter-enabled Game Object. Should be used as a mixin and not directly.
  153740. *
  153741. * @name Phaser.Physics.Matter.Components.Mass
  153742. * @since 3.0.0
  153743. */
  153744. var Mass = {
  153745. /**
  153746. * Sets the mass of the Game Object's Matter Body.
  153747. *
  153748. * @method Phaser.Physics.Matter.Components.Mass#setMass
  153749. * @since 3.0.0
  153750. *
  153751. * @param {number} value - The new mass of the body.
  153752. *
  153753. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153754. */
  153755. setMass: function (value)
  153756. {
  153757. Body.setMass(this.body, value);
  153758. return this;
  153759. },
  153760. /**
  153761. * Sets density of the body.
  153762. *
  153763. * @method Phaser.Physics.Matter.Components.Mass#setDensity
  153764. * @since 3.0.0
  153765. *
  153766. * @param {number} value - The new density of the body.
  153767. *
  153768. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153769. */
  153770. setDensity: function (value)
  153771. {
  153772. Body.setDensity(this.body, value);
  153773. return this;
  153774. },
  153775. /**
  153776. * The body's center of mass.
  153777. *
  153778. * @name Phaser.Physics.Matter.Components.Mass#centerOfMass
  153779. * @readonly
  153780. * @since 3.10.0
  153781. *
  153782. * @return {Phaser.Math.Vector2} The center of mass.
  153783. */
  153784. centerOfMass: {
  153785. get: function ()
  153786. {
  153787. return new Vector2(this.body.render.sprite.xOffset * this.width, this.body.render.sprite.yOffset * this.height);
  153788. }
  153789. }
  153790. };
  153791. module.exports = Mass;
  153792. /***/ }),
  153793. /* 1332 */
  153794. /***/ (function(module, exports) {
  153795. /**
  153796. * @author Richard Davey <rich@photonstorm.com>
  153797. * @copyright 2019 Photon Storm Ltd.
  153798. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153799. */
  153800. /**
  153801. * A component to manipulate world gravity for Matter.js bodies.
  153802. *
  153803. * @name Phaser.Physics.Matter.Components.Gravity
  153804. * @since 3.0.0
  153805. */
  153806. var Gravity = {
  153807. /**
  153808. * A togglable function for ignoring world gravity in real-time on the current body.
  153809. *
  153810. * @method Phaser.Physics.Matter.Components.Gravity#setIgnoreGravity
  153811. * @since 3.0.0
  153812. *
  153813. * @param {boolean} value - Set to true to ignore the effect of world gravity, or false to not ignore it.
  153814. *
  153815. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153816. */
  153817. setIgnoreGravity: function (value)
  153818. {
  153819. this.body.ignoreGravity = value;
  153820. return this;
  153821. }
  153822. };
  153823. module.exports = Gravity;
  153824. /***/ }),
  153825. /* 1333 */
  153826. /***/ (function(module, exports) {
  153827. /**
  153828. * @author Richard Davey <rich@photonstorm.com>
  153829. * @copyright 2019 Photon Storm Ltd.
  153830. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153831. */
  153832. /**
  153833. * Contains methods for changing the friction of a Game Object's Matter Body. Should be used a mixin, not called directly.
  153834. *
  153835. * @name Phaser.Physics.Matter.Components.Friction
  153836. * @since 3.0.0
  153837. */
  153838. var Friction = {
  153839. /**
  153840. * Sets new friction values for this Game Object's Matter Body.
  153841. *
  153842. * @method Phaser.Physics.Matter.Components.Friction#setFriction
  153843. * @since 3.0.0
  153844. *
  153845. * @param {number} value - The new friction of the body, between 0 and 1, where 0 allows the Body to slide indefinitely, while 1 allows it to stop almost immediately after a force is applied.
  153846. * @param {number} [air] - If provided, the new air resistance of the Body. The higher the value, the faster the Body will slow as it moves through space. 0 means the body has no air resistance.
  153847. * @param {number} [fstatic] - If provided, the new static friction of the Body. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. 0 means the body will never "stick" when it is nearly stationary.
  153848. *
  153849. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153850. */
  153851. setFriction: function (value, air, fstatic)
  153852. {
  153853. this.body.friction = value;
  153854. if (air !== undefined)
  153855. {
  153856. this.body.frictionAir = air;
  153857. }
  153858. if (fstatic !== undefined)
  153859. {
  153860. this.body.frictionStatic = fstatic;
  153861. }
  153862. return this;
  153863. },
  153864. /**
  153865. * Sets a new air resistance for this Game Object's Matter Body. A value of 0 means the Body will never slow as it moves through space. The higher the value, the faster a Body slows when moving through space.
  153866. *
  153867. * @method Phaser.Physics.Matter.Components.Friction#setFrictionAir
  153868. * @since 3.0.0
  153869. *
  153870. * @param {number} value - The new air resistance for the Body.
  153871. *
  153872. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153873. */
  153874. setFrictionAir: function (value)
  153875. {
  153876. this.body.frictionAir = value;
  153877. return this;
  153878. },
  153879. /**
  153880. * Sets a new static friction for this Game Object's Matter Body. A value of 0 means the Body will never "stick" when it is nearly stationary. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary.
  153881. *
  153882. * @method Phaser.Physics.Matter.Components.Friction#setFrictionStatic
  153883. * @since 3.0.0
  153884. *
  153885. * @param {number} value - The new static friction for the Body.
  153886. *
  153887. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153888. */
  153889. setFrictionStatic: function (value)
  153890. {
  153891. this.body.frictionStatic = value;
  153892. return this;
  153893. }
  153894. };
  153895. module.exports = Friction;
  153896. /***/ }),
  153897. /* 1334 */
  153898. /***/ (function(module, exports, __webpack_require__) {
  153899. /**
  153900. * @author Richard Davey <rich@photonstorm.com>
  153901. * @copyright 2019 Photon Storm Ltd.
  153902. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  153903. */
  153904. var Body = __webpack_require__(72);
  153905. /**
  153906. * A component to apply force to Matter.js bodies.
  153907. *
  153908. * @name Phaser.Physics.Matter.Components.Force
  153909. * @since 3.0.0
  153910. */
  153911. var Force = {
  153912. // force = vec2 / point
  153913. /**
  153914. * Applies a force to a body.
  153915. *
  153916. * @method Phaser.Physics.Matter.Components.Force#applyForce
  153917. * @since 3.0.0
  153918. *
  153919. * @param {Phaser.Math.Vector2} force - A Vector that specifies the force to apply.
  153920. *
  153921. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153922. */
  153923. applyForce: function (force)
  153924. {
  153925. this._tempVec2.set(this.body.position.x, this.body.position.y);
  153926. Body.applyForce(this.body, this._tempVec2, force);
  153927. return this;
  153928. },
  153929. /**
  153930. * Applies a force to a body from a given position.
  153931. *
  153932. * @method Phaser.Physics.Matter.Components.Force#applyForceFrom
  153933. * @since 3.0.0
  153934. *
  153935. * @param {Phaser.Math.Vector2} position - The position in which the force comes from.
  153936. * @param {Phaser.Math.Vector2} force - A Vector that specifies the force to apply.
  153937. *
  153938. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153939. */
  153940. applyForceFrom: function (position, force)
  153941. {
  153942. Body.applyForce(this.body, position, force);
  153943. return this;
  153944. },
  153945. /**
  153946. * Apply thrust to the forward position of the body.
  153947. *
  153948. * @method Phaser.Physics.Matter.Components.Force#thrust
  153949. * @since 3.0.0
  153950. *
  153951. * @param {number} speed - A speed value to be applied to a directional force.
  153952. *
  153953. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153954. */
  153955. thrust: function (speed)
  153956. {
  153957. var angle = this.body.angle;
  153958. this._tempVec2.set(speed * Math.cos(angle), speed * Math.sin(angle));
  153959. Body.applyForce(this.body, { x: this.body.position.x, y: this.body.position.y }, this._tempVec2);
  153960. return this;
  153961. },
  153962. /**
  153963. * Apply thrust to the left position of the body.
  153964. *
  153965. * @method Phaser.Physics.Matter.Components.Force#thrustLeft
  153966. * @since 3.0.0
  153967. *
  153968. * @param {number} speed - A speed value to be applied to a directional force.
  153969. *
  153970. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153971. */
  153972. thrustLeft: function (speed)
  153973. {
  153974. var angle = this.body.angle - Math.PI / 2;
  153975. this._tempVec2.set(speed * Math.cos(angle), speed * Math.sin(angle));
  153976. Body.applyForce(this.body, { x: this.body.position.x, y: this.body.position.y }, this._tempVec2);
  153977. return this;
  153978. },
  153979. /**
  153980. * Apply thrust to the right position of the body.
  153981. *
  153982. * @method Phaser.Physics.Matter.Components.Force#thrustRight
  153983. * @since 3.0.0
  153984. *
  153985. * @param {number} speed - A speed value to be applied to a directional force.
  153986. *
  153987. * @return {Phaser.GameObjects.GameObject} This Game Object.
  153988. */
  153989. thrustRight: function (speed)
  153990. {
  153991. var angle = this.body.angle + Math.PI / 2;
  153992. this._tempVec2.set(speed * Math.cos(angle), speed * Math.sin(angle));
  153993. Body.applyForce(this.body, { x: this.body.position.x, y: this.body.position.y }, this._tempVec2);
  153994. return this;
  153995. },
  153996. /**
  153997. * Apply thrust to the back position of the body.
  153998. *
  153999. * @method Phaser.Physics.Matter.Components.Force#thrustBack
  154000. * @since 3.0.0
  154001. *
  154002. * @param {number} speed - A speed value to be applied to a directional force.
  154003. *
  154004. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154005. */
  154006. thrustBack: function (speed)
  154007. {
  154008. var angle = this.body.angle - Math.PI;
  154009. this._tempVec2.set(speed * Math.cos(angle), speed * Math.sin(angle));
  154010. Body.applyForce(this.body, { x: this.body.position.x, y: this.body.position.y }, this._tempVec2);
  154011. return this;
  154012. }
  154013. };
  154014. module.exports = Force;
  154015. /***/ }),
  154016. /* 1335 */
  154017. /***/ (function(module, exports) {
  154018. /**
  154019. * @author Richard Davey <rich@photonstorm.com>
  154020. * @copyright 2019 Photon Storm Ltd.
  154021. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154022. */
  154023. /**
  154024. * Contains methods for changing the collision filter of a Matter Body. Should be used as a mixin and not called directly.
  154025. *
  154026. * @name Phaser.Physics.Matter.Components.Collision
  154027. * @since 3.0.0
  154028. */
  154029. var Collision = {
  154030. /**
  154031. * Sets the collision category of this Game Object's Matter Body. This number must be a power of two between 2^0 (= 1) and 2^31. Two bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision categories are included in their collision masks (see {@link #setCollidesWith}).
  154032. *
  154033. * @method Phaser.Physics.Matter.Components.Collision#setCollisionCategory
  154034. * @since 3.0.0
  154035. *
  154036. * @param {number} value - Unique category bitfield.
  154037. *
  154038. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154039. */
  154040. setCollisionCategory: function (value)
  154041. {
  154042. this.body.collisionFilter.category = value;
  154043. return this;
  154044. },
  154045. /**
  154046. * Sets the collision group of this Game Object's Matter Body. If this is zero or two Matter Bodies have different values, they will collide according to the usual rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). If two Matter Bodies have the same positive value, they will always collide; if they have the same negative value, they will never collide.
  154047. *
  154048. * @method Phaser.Physics.Matter.Components.Collision#setCollisionGroup
  154049. * @since 3.0.0
  154050. *
  154051. * @param {number} value - Unique group index.
  154052. *
  154053. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154054. */
  154055. setCollisionGroup: function (value)
  154056. {
  154057. this.body.collisionFilter.group = value;
  154058. return this;
  154059. },
  154060. /**
  154061. * Sets the collision mask for this Game Object's Matter Body. Two Matter Bodies with different collision groups will only collide if each one includes the other's category in its mask based on a bitwise AND, i.e. `(categoryA & maskB) !== 0` and `(categoryB & maskA) !== 0` are both true.
  154062. *
  154063. * @method Phaser.Physics.Matter.Components.Collision#setCollidesWith
  154064. * @since 3.0.0
  154065. *
  154066. * @param {(number|number[])} categories - A unique category bitfield, or an array of them.
  154067. *
  154068. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154069. */
  154070. setCollidesWith: function (categories)
  154071. {
  154072. var flags = 0;
  154073. if (!Array.isArray(categories))
  154074. {
  154075. flags = categories;
  154076. }
  154077. else
  154078. {
  154079. for (var i = 0; i < categories.length; i++)
  154080. {
  154081. flags |= categories[i];
  154082. }
  154083. }
  154084. this.body.collisionFilter.mask = flags;
  154085. return this;
  154086. }
  154087. };
  154088. module.exports = Collision;
  154089. /***/ }),
  154090. /* 1336 */
  154091. /***/ (function(module, exports) {
  154092. /**
  154093. * @author Richard Davey <rich@photonstorm.com>
  154094. * @copyright 2019 Photon Storm Ltd.
  154095. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154096. */
  154097. /**
  154098. * A component to set restitution on objects.
  154099. *
  154100. * @name Phaser.Physics.Matter.Components.Bounce
  154101. * @since 3.0.0
  154102. */
  154103. var Bounce = {
  154104. /**
  154105. * Sets the restitution on the physics object.
  154106. *
  154107. * @method Phaser.Physics.Matter.Components.Bounce#setBounce
  154108. * @since 3.0.0
  154109. *
  154110. * @param {number} value - A Number that defines the restitution (elasticity) of the body. The value is always positive and is in the range (0, 1). A value of 0 means collisions may be perfectly inelastic and no bouncing may occur. A value of 0.8 means the body may bounce back with approximately 80% of its kinetic energy. Note that collision response is based on pairs of bodies, and that restitution values are combined with the following formula: `Math.max(bodyA.restitution, bodyB.restitution)`
  154111. *
  154112. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154113. */
  154114. setBounce: function (value)
  154115. {
  154116. this.body.restitution = value;
  154117. return this;
  154118. }
  154119. };
  154120. module.exports = Bounce;
  154121. /***/ }),
  154122. /* 1337 */
  154123. /***/ (function(module, exports, __webpack_require__) {
  154124. /**
  154125. * @author Richard Davey <rich@photonstorm.com>
  154126. * @copyright 2019 Photon Storm Ltd.
  154127. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154128. */
  154129. var Components = __webpack_require__(452);
  154130. var GetFastValue = __webpack_require__(2);
  154131. var Vector2 = __webpack_require__(3);
  154132. /**
  154133. * Internal function to check if the object has a getter or setter.
  154134. *
  154135. * @function hasGetterOrSetter
  154136. * @private
  154137. *
  154138. * @param {object} def - The object to check.
  154139. *
  154140. * @return {boolean} True if it has a getter or setter, otherwise false.
  154141. */
  154142. function hasGetterOrSetter (def)
  154143. {
  154144. return (!!def.get && typeof def.get === 'function') || (!!def.set && typeof def.set === 'function');
  154145. }
  154146. /**
  154147. * [description]
  154148. *
  154149. * @function Phaser.Physics.Matter.MatterGameObject
  154150. * @since 3.3.0
  154151. *
  154152. * @param {Phaser.Physics.Matter.World} world - The Matter world to add the body to.
  154153. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will have the Matter body applied to it.
  154154. * @param {object} options - Matter options config object.
  154155. *
  154156. * @return {Phaser.GameObjects.GameObject} The Game Object that was created with the Matter body.
  154157. */
  154158. var MatterGameObject = function (world, gameObject, options)
  154159. {
  154160. if (options === undefined) { options = {}; }
  154161. var x = gameObject.x;
  154162. var y = gameObject.y;
  154163. // Temp body pos to avoid body null checks
  154164. gameObject.body = {
  154165. temp: true,
  154166. position: {
  154167. x: x,
  154168. y: y
  154169. }
  154170. };
  154171. var mixins = [
  154172. Components.Bounce,
  154173. Components.Collision,
  154174. Components.Force,
  154175. Components.Friction,
  154176. Components.Gravity,
  154177. Components.Mass,
  154178. Components.Sensor,
  154179. Components.SetBody,
  154180. Components.Sleep,
  154181. Components.Static,
  154182. Components.Transform,
  154183. Components.Velocity
  154184. ];
  154185. // First let's inject all of the components into the Game Object
  154186. mixins.forEach(function (mixin)
  154187. {
  154188. for (var key in mixin)
  154189. {
  154190. if (hasGetterOrSetter(mixin[key]))
  154191. {
  154192. Object.defineProperty(gameObject, key, {
  154193. get: mixin[key].get,
  154194. set: mixin[key].set
  154195. });
  154196. }
  154197. else
  154198. {
  154199. Object.defineProperty(gameObject, key, {value: mixin[key]});
  154200. }
  154201. }
  154202. });
  154203. gameObject.world = world;
  154204. gameObject._tempVec2 = new Vector2(x, y);
  154205. var shape = GetFastValue(options, 'shape', null);
  154206. if (!shape)
  154207. {
  154208. shape = 'rectangle';
  154209. }
  154210. gameObject.setBody(shape, options);
  154211. return gameObject;
  154212. };
  154213. module.exports = MatterGameObject;
  154214. /***/ }),
  154215. /* 1338 */
  154216. /***/ (function(module, exports, __webpack_require__) {
  154217. /**
  154218. * @author Richard Davey <rich@photonstorm.com>
  154219. * @copyright 2019 Photon Storm Ltd.
  154220. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154221. */
  154222. /**
  154223. * @namespace Phaser.Physics.Matter
  154224. */
  154225. module.exports = {
  154226. Factory: __webpack_require__(1291),
  154227. Image: __webpack_require__(1288),
  154228. Matter: __webpack_require__(541),
  154229. MatterPhysics: __webpack_require__(1307),
  154230. PolyDecomp: __webpack_require__(1290),
  154231. Sprite: __webpack_require__(1287),
  154232. TileBody: __webpack_require__(544),
  154233. World: __webpack_require__(1281)
  154234. };
  154235. /**
  154236. * @namespace MatterJS
  154237. */
  154238. /**
  154239. * @classdesc
  154240. * The `Matter.Body` module contains methods for creating and manipulating body models.
  154241. * A `Matter.Body` is a rigid body that can be simulated by a `Matter.Engine`.
  154242. * Factories for commonly used body configurations (such as rectangles, circles and other polygons) can be found in the module `Matter.Bodies`.
  154243. *
  154244. * @class MatterJS.Body
  154245. */
  154246. /**
  154247. * @classdesc
  154248. * The `Matter.Composite` module contains methods for creating and manipulating composite bodies.
  154249. * A composite body is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`, therefore composites form a tree structure.
  154250. * It is important to use the functions in this module to modify composites, rather than directly modifying their properties.
  154251. * Note that the `Matter.World` object is also a type of `Matter.Composite` and as such all composite methods here can also operate on a `Matter.World`.
  154252. *
  154253. * @class MatterJS.Composite
  154254. */
  154255. /**
  154256. * @classdesc
  154257. * The `Matter.World` module contains methods for creating and manipulating the world composite.
  154258. * A `Matter.World` is a `Matter.Composite` body, which is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`.
  154259. * A `Matter.World` has a few additional properties including `gravity` and `bounds`.
  154260. * It is important to use the functions in the `Matter.Composite` module to modify the world composite, rather than directly modifying its properties.
  154261. * There are also a few methods here that alias those in `Matter.Composite` for easier readability.
  154262. *
  154263. * @class MatterJS.World
  154264. * @extends MatterJS.Composite
  154265. */
  154266. /**
  154267. * @classdesc
  154268. * The `Matter.Constraint` module contains methods for creating and manipulating constraints.
  154269. * Constraints are used for specifying that a fixed distance must be maintained between two bodies (or a body and a fixed world-space position).
  154270. * The stiffness of constraints can be modified to create springs or elastic.
  154271. *
  154272. * @class MatterJS.Constraint
  154273. */
  154274. /**
  154275. * @classdesc
  154276. * The `Matter.Engine` module contains methods for creating and manipulating engines.
  154277. * An engine is a controller that manages updating the simulation of the world.
  154278. *
  154279. * @class MatterJS.Engine
  154280. */
  154281. /**
  154282. * @classdesc
  154283. * The `Matter.Vertices` module contains methods for creating and manipulating sets of vertices.
  154284. * A set of vertices is an array of `Matter.Vector` with additional indexing properties inserted by `Vertices.create`.
  154285. * A `Matter.Body` maintains a set of vertices to represent the shape of the object (its convex hull).
  154286. *
  154287. * @class MatterJS.Vertices
  154288. */
  154289. /***/ }),
  154290. /* 1339 */
  154291. /***/ (function(module, exports) {
  154292. /**
  154293. * @author Richard Davey <rich@photonstorm.com>
  154294. * @copyright 2019 Photon Storm Ltd.
  154295. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154296. */
  154297. /**
  154298. * [description]
  154299. *
  154300. * @function Phaser.Physics.Impact.SeparateY
  154301. * @since 3.0.0
  154302. *
  154303. * @param {Phaser.Physics.Impact.World} world - [description]
  154304. * @param {Phaser.Physics.Impact.Body} top - [description]
  154305. * @param {Phaser.Physics.Impact.Body} bottom - [description]
  154306. * @param {Phaser.Physics.Impact.Body} [weak] - [description]
  154307. */
  154308. var SeparateY = function (world, top, bottom, weak)
  154309. {
  154310. var nudge = (top.pos.y + top.size.y - bottom.pos.y);
  154311. var nudgeX;
  154312. var resTop;
  154313. if (weak)
  154314. {
  154315. var strong = (top === weak) ? bottom : top;
  154316. weak.vel.y = -weak.vel.y * weak.bounciness + strong.vel.y;
  154317. // Riding on a platform?
  154318. nudgeX = 0;
  154319. if (weak === top && Math.abs(weak.vel.y - strong.vel.y) < weak.minBounceVelocity)
  154320. {
  154321. weak.standing = true;
  154322. nudgeX = strong.vel.x * world.delta;
  154323. }
  154324. var resWeak = world.collisionMap.trace(weak.pos.x, weak.pos.y, nudgeX, weak === top ? -nudge : nudge, weak.size.x, weak.size.y);
  154325. weak.pos.y = resWeak.pos.y;
  154326. weak.pos.x = resWeak.pos.x;
  154327. }
  154328. else if (world.gravity && (bottom.standing || top.vel.y > 0))
  154329. {
  154330. resTop = world.collisionMap.trace(top.pos.x, top.pos.y, 0, -(top.pos.y + top.size.y - bottom.pos.y), top.size.x, top.size.y);
  154331. top.pos.y = resTop.pos.y;
  154332. if (top.bounciness > 0 && top.vel.y > top.minBounceVelocity)
  154333. {
  154334. top.vel.y *= -top.bounciness;
  154335. }
  154336. else
  154337. {
  154338. top.standing = true;
  154339. top.vel.y = 0;
  154340. }
  154341. }
  154342. else
  154343. {
  154344. var v2 = (top.vel.y - bottom.vel.y) / 2;
  154345. top.vel.y = -v2;
  154346. bottom.vel.y = v2;
  154347. nudgeX = bottom.vel.x * world.delta;
  154348. resTop = world.collisionMap.trace(top.pos.x, top.pos.y, nudgeX, -nudge / 2, top.size.x, top.size.y);
  154349. top.pos.y = resTop.pos.y;
  154350. var resBottom = world.collisionMap.trace(bottom.pos.x, bottom.pos.y, 0, nudge / 2, bottom.size.x, bottom.size.y);
  154351. bottom.pos.y = resBottom.pos.y;
  154352. }
  154353. };
  154354. module.exports = SeparateY;
  154355. /***/ }),
  154356. /* 1340 */
  154357. /***/ (function(module, exports) {
  154358. /**
  154359. * @author Richard Davey <rich@photonstorm.com>
  154360. * @copyright 2019 Photon Storm Ltd.
  154361. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154362. */
  154363. /**
  154364. * [description]
  154365. *
  154366. * @function Phaser.Physics.Impact.SeparateX
  154367. * @since 3.0.0
  154368. *
  154369. * @param {Phaser.Physics.Impact.World} world - [description]
  154370. * @param {Phaser.Physics.Impact.Body} left - [description]
  154371. * @param {Phaser.Physics.Impact.Body} right - [description]
  154372. * @param {Phaser.Physics.Impact.Body} [weak] - [description]
  154373. */
  154374. var SeparateX = function (world, left, right, weak)
  154375. {
  154376. var nudge = left.pos.x + left.size.x - right.pos.x;
  154377. // We have a weak entity, so just move this one
  154378. if (weak)
  154379. {
  154380. var strong = (left === weak) ? right : left;
  154381. weak.vel.x = -weak.vel.x * weak.bounciness + strong.vel.x;
  154382. var resWeak = world.collisionMap.trace(weak.pos.x, weak.pos.y, weak === left ? -nudge : nudge, 0, weak.size.x, weak.size.y);
  154383. weak.pos.x = resWeak.pos.x;
  154384. }
  154385. else
  154386. {
  154387. var v2 = (left.vel.x - right.vel.x) / 2;
  154388. left.vel.x = -v2;
  154389. right.vel.x = v2;
  154390. var resLeft = world.collisionMap.trace(left.pos.x, left.pos.y, -nudge / 2, 0, left.size.x, left.size.y);
  154391. left.pos.x = Math.floor(resLeft.pos.x);
  154392. var resRight = world.collisionMap.trace(right.pos.x, right.pos.y, nudge / 2, 0, right.size.x, right.size.y);
  154393. right.pos.x = Math.ceil(resRight.pos.x);
  154394. }
  154395. };
  154396. module.exports = SeparateX;
  154397. /***/ }),
  154398. /* 1341 */
  154399. /***/ (function(module, exports, __webpack_require__) {
  154400. /**
  154401. * @author Richard Davey <rich@photonstorm.com>
  154402. * @copyright 2019 Photon Storm Ltd.
  154403. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154404. */
  154405. var COLLIDES = __webpack_require__(240);
  154406. var Events = __webpack_require__(548);
  154407. var SeparateX = __webpack_require__(1340);
  154408. var SeparateY = __webpack_require__(1339);
  154409. /**
  154410. * Impact Physics Solver
  154411. *
  154412. * @function Phaser.Physics.Impact.Solver
  154413. * @fires Phaser.Physics.Impact.Events#COLLIDE
  154414. * @since 3.0.0
  154415. *
  154416. * @param {Phaser.Physics.Impact.World} world - The Impact simulation to run the solver in.
  154417. * @param {Phaser.Physics.Impact.Body} bodyA - The first body in the collision.
  154418. * @param {Phaser.Physics.Impact.Body} bodyB - The second body in the collision.
  154419. */
  154420. var Solver = function (world, bodyA, bodyB)
  154421. {
  154422. var weak = null;
  154423. if (bodyA.collides === COLLIDES.LITE || bodyB.collides === COLLIDES.FIXED)
  154424. {
  154425. weak = bodyA;
  154426. }
  154427. else if (bodyB.collides === COLLIDES.LITE || bodyA.collides === COLLIDES.FIXED)
  154428. {
  154429. weak = bodyB;
  154430. }
  154431. if (bodyA.last.x + bodyA.size.x > bodyB.last.x && bodyA.last.x < bodyB.last.x + bodyB.size.x)
  154432. {
  154433. if (bodyA.last.y < bodyB.last.y)
  154434. {
  154435. SeparateY(world, bodyA, bodyB, weak);
  154436. }
  154437. else
  154438. {
  154439. SeparateY(world, bodyB, bodyA, weak);
  154440. }
  154441. bodyA.collideWith(bodyB, 'y');
  154442. bodyB.collideWith(bodyA, 'y');
  154443. world.emit(Events.COLLIDE, bodyA, bodyB, 'y');
  154444. }
  154445. else if (bodyA.last.y + bodyA.size.y > bodyB.last.y && bodyA.last.y < bodyB.last.y + bodyB.size.y)
  154446. {
  154447. if (bodyA.last.x < bodyB.last.x)
  154448. {
  154449. SeparateX(world, bodyA, bodyB, weak);
  154450. }
  154451. else
  154452. {
  154453. SeparateX(world, bodyB, bodyA, weak);
  154454. }
  154455. bodyA.collideWith(bodyB, 'x');
  154456. bodyB.collideWith(bodyA, 'x');
  154457. world.emit(Events.COLLIDE, bodyA, bodyB, 'x');
  154458. }
  154459. };
  154460. module.exports = Solver;
  154461. /***/ }),
  154462. /* 1342 */
  154463. /***/ (function(module, exports, __webpack_require__) {
  154464. /**
  154465. * @author Richard Davey <rich@photonstorm.com>
  154466. * @copyright 2019 Photon Storm Ltd.
  154467. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154468. */
  154469. var Class = __webpack_require__(0);
  154470. var Factory = __webpack_require__(1296);
  154471. var GetFastValue = __webpack_require__(2);
  154472. var Merge = __webpack_require__(103);
  154473. var PluginCache = __webpack_require__(17);
  154474. var SceneEvents = __webpack_require__(16);
  154475. var World = __webpack_require__(1292);
  154476. /**
  154477. * @classdesc
  154478. * [description]
  154479. *
  154480. * @class ImpactPhysics
  154481. * @memberof Phaser.Physics.Impact
  154482. * @constructor
  154483. * @since 3.0.0
  154484. *
  154485. * @param {Phaser.Scene} scene - [description]
  154486. */
  154487. var ImpactPhysics = new Class({
  154488. initialize:
  154489. function ImpactPhysics (scene)
  154490. {
  154491. /**
  154492. * [description]
  154493. *
  154494. * @name Phaser.Physics.Impact.ImpactPhysics#scene
  154495. * @type {Phaser.Scene}
  154496. * @since 3.0.0
  154497. */
  154498. this.scene = scene;
  154499. /**
  154500. * [description]
  154501. *
  154502. * @name Phaser.Physics.Impact.ImpactPhysics#systems
  154503. * @type {Phaser.Scenes.Systems}
  154504. * @since 3.0.0
  154505. */
  154506. this.systems = scene.sys;
  154507. /**
  154508. * [description]
  154509. *
  154510. * @name Phaser.Physics.Impact.ImpactPhysics#config
  154511. * @type {object}
  154512. * @since 3.0.0
  154513. */
  154514. this.config = this.getConfig();
  154515. /**
  154516. * [description]
  154517. *
  154518. * @name Phaser.Physics.Impact.ImpactPhysics#world
  154519. * @type {Phaser.Physics.Impact.World}
  154520. * @since 3.0.0
  154521. */
  154522. this.world;
  154523. /**
  154524. * [description]
  154525. *
  154526. * @name Phaser.Physics.Impact.ImpactPhysics#add
  154527. * @type {Phaser.Physics.Impact.Factory}
  154528. * @since 3.0.0
  154529. */
  154530. this.add;
  154531. scene.sys.events.once(SceneEvents.BOOT, this.boot, this);
  154532. scene.sys.events.on(SceneEvents.START, this.start, this);
  154533. },
  154534. /**
  154535. * This method is called automatically, only once, when the Scene is first created.
  154536. * Do not invoke it directly.
  154537. *
  154538. * @method Phaser.Physics.Impact.ImpactPhysics#boot
  154539. * @private
  154540. * @since 3.5.1
  154541. */
  154542. boot: function ()
  154543. {
  154544. this.world = new World(this.scene, this.config);
  154545. this.add = new Factory(this.world);
  154546. this.systems.events.once(SceneEvents.DESTROY, this.destroy, this);
  154547. },
  154548. /**
  154549. * This method is called automatically by the Scene when it is starting up.
  154550. * It is responsible for creating local systems, properties and listening for Scene events.
  154551. * Do not invoke it directly.
  154552. *
  154553. * @method Phaser.Physics.Impact.ImpactPhysics#start
  154554. * @private
  154555. * @since 3.5.0
  154556. */
  154557. start: function ()
  154558. {
  154559. if (!this.world)
  154560. {
  154561. this.world = new World(this.scene, this.config);
  154562. this.add = new Factory(this.world);
  154563. }
  154564. var eventEmitter = this.systems.events;
  154565. eventEmitter.on(SceneEvents.UPDATE, this.world.update, this.world);
  154566. eventEmitter.once(SceneEvents.SHUTDOWN, this.shutdown, this);
  154567. },
  154568. /**
  154569. * [description]
  154570. *
  154571. * @method Phaser.Physics.Impact.ImpactPhysics#getConfig
  154572. * @since 3.0.0
  154573. *
  154574. * @return {object} [description]
  154575. */
  154576. getConfig: function ()
  154577. {
  154578. var gameConfig = this.systems.game.config.physics;
  154579. var sceneConfig = this.systems.settings.physics;
  154580. var config = Merge(
  154581. GetFastValue(sceneConfig, 'impact', {}),
  154582. GetFastValue(gameConfig, 'impact', {})
  154583. );
  154584. return config;
  154585. },
  154586. /**
  154587. * [description]
  154588. *
  154589. * @method Phaser.Physics.Impact.ImpactPhysics#pause
  154590. * @since 3.0.0
  154591. *
  154592. * @return {Phaser.Physics.Impact.World} The Impact World object.
  154593. */
  154594. pause: function ()
  154595. {
  154596. return this.world.pause();
  154597. },
  154598. /**
  154599. * [description]
  154600. *
  154601. * @method Phaser.Physics.Impact.ImpactPhysics#resume
  154602. * @since 3.0.0
  154603. *
  154604. * @return {Phaser.Physics.Impact.World} The Impact World object.
  154605. */
  154606. resume: function ()
  154607. {
  154608. return this.world.resume();
  154609. },
  154610. /**
  154611. * The Scene that owns this plugin is shutting down.
  154612. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  154613. *
  154614. * @method Phaser.Physics.Impact.ImpactPhysics#shutdown
  154615. * @private
  154616. * @since 3.0.0
  154617. */
  154618. shutdown: function ()
  154619. {
  154620. var eventEmitter = this.systems.events;
  154621. eventEmitter.off(SceneEvents.UPDATE, this.world.update, this.world);
  154622. eventEmitter.off(SceneEvents.SHUTDOWN, this.shutdown, this);
  154623. this.add.destroy();
  154624. this.world.destroy();
  154625. this.add = null;
  154626. this.world = null;
  154627. },
  154628. /**
  154629. * The Scene that owns this plugin is being destroyed.
  154630. * We need to shutdown and then kill off all external references.
  154631. *
  154632. * @method Phaser.Physics.Impact.ImpactPhysics#destroy
  154633. * @private
  154634. * @since 3.0.0
  154635. */
  154636. destroy: function ()
  154637. {
  154638. this.shutdown();
  154639. this.scene.sys.events.off(SceneEvents.START, this.start, this);
  154640. this.scene = null;
  154641. this.systems = null;
  154642. }
  154643. });
  154644. PluginCache.register('ImpactPhysics', ImpactPhysics, 'impactPhysics');
  154645. module.exports = ImpactPhysics;
  154646. /***/ }),
  154647. /* 1343 */
  154648. /***/ (function(module, exports) {
  154649. /**
  154650. * @author Richard Davey <rich@photonstorm.com>
  154651. * @copyright 2019 Photon Storm Ltd.
  154652. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154653. */
  154654. /**
  154655. * The Impact Velocity component.
  154656. * Should be applied as a mixin.
  154657. *
  154658. * @name Phaser.Physics.Impact.Components.Velocity
  154659. * @since 3.0.0
  154660. */
  154661. var Velocity = {
  154662. /**
  154663. * Sets the horizontal velocity of the physics body.
  154664. *
  154665. * @method Phaser.Physics.Impact.Components.Velocity#setVelocityX
  154666. * @since 3.0.0
  154667. *
  154668. * @param {number} x - The horizontal velocity value.
  154669. *
  154670. * @return {this} This Game Object.
  154671. */
  154672. setVelocityX: function (x)
  154673. {
  154674. this.vel.x = x;
  154675. return this;
  154676. },
  154677. /**
  154678. * Sets the vertical velocity of the physics body.
  154679. *
  154680. * @method Phaser.Physics.Impact.Components.Velocity#setVelocityY
  154681. * @since 3.0.0
  154682. *
  154683. * @param {number} y - The vertical velocity value.
  154684. *
  154685. * @return {this} This Game Object.
  154686. */
  154687. setVelocityY: function (y)
  154688. {
  154689. this.vel.y = y;
  154690. return this;
  154691. },
  154692. /**
  154693. * Sets the horizontal and vertical velocities of the physics body.
  154694. *
  154695. * @method Phaser.Physics.Impact.Components.Velocity#setVelocity
  154696. * @since 3.0.0
  154697. *
  154698. * @param {number} x - The horizontal velocity value.
  154699. * @param {number} [y=x] - The vertical velocity value. If not given, defaults to the horizontal value.
  154700. *
  154701. * @return {this} This Game Object.
  154702. */
  154703. setVelocity: function (x, y)
  154704. {
  154705. if (y === undefined) { y = x; }
  154706. this.vel.x = x;
  154707. this.vel.y = y;
  154708. return this;
  154709. },
  154710. /**
  154711. * Sets the maximum velocity this body can travel at.
  154712. *
  154713. * @method Phaser.Physics.Impact.Components.Velocity#setMaxVelocity
  154714. * @since 3.0.0
  154715. *
  154716. * @param {number} x - The maximum allowed horizontal velocity.
  154717. * @param {number} [y=x] - The maximum allowed vertical velocity. If not given, defaults to the horizontal value.
  154718. *
  154719. * @return {this} This Game Object.
  154720. */
  154721. setMaxVelocity: function (x, y)
  154722. {
  154723. if (y === undefined) { y = x; }
  154724. this.maxVel.x = x;
  154725. this.maxVel.y = y;
  154726. return this;
  154727. }
  154728. };
  154729. module.exports = Velocity;
  154730. /***/ }),
  154731. /* 1344 */
  154732. /***/ (function(module, exports) {
  154733. /**
  154734. * @author Richard Davey <rich@photonstorm.com>
  154735. * @copyright 2019 Photon Storm Ltd.
  154736. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154737. */
  154738. /**
  154739. * The Impact Set Game Object component.
  154740. * Should be applied as a mixin.
  154741. *
  154742. * @name Phaser.Physics.Impact.Components.SetGameObject
  154743. * @since 3.0.0
  154744. */
  154745. var SetGameObject = {
  154746. /**
  154747. * [description]
  154748. *
  154749. * @method Phaser.Physics.Impact.Components.SetGameObject#setGameObject
  154750. * @since 3.0.0
  154751. *
  154752. * @param {Phaser.GameObjects.GameObject} gameObject - [description]
  154753. * @param {boolean} [sync=true] - [description]
  154754. *
  154755. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154756. */
  154757. setGameObject: function (gameObject, sync)
  154758. {
  154759. if (sync === undefined) { sync = true; }
  154760. if (gameObject)
  154761. {
  154762. this.body.gameObject = gameObject;
  154763. if (sync)
  154764. {
  154765. this.syncGameObject();
  154766. }
  154767. }
  154768. else
  154769. {
  154770. this.body.gameObject = null;
  154771. }
  154772. return this;
  154773. },
  154774. /**
  154775. * [description]
  154776. *
  154777. * @method Phaser.Physics.Impact.Components.SetGameObject#syncGameObject
  154778. * @since 3.0.0
  154779. *
  154780. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154781. */
  154782. syncGameObject: function ()
  154783. {
  154784. var gameObject = this.body.gameObject;
  154785. if (gameObject)
  154786. {
  154787. this.setBodySize(gameObject.width * gameObject.scaleX, gameObject.height * gameObject.scaleY);
  154788. }
  154789. return this;
  154790. }
  154791. };
  154792. module.exports = SetGameObject;
  154793. /***/ }),
  154794. /* 1345 */
  154795. /***/ (function(module, exports) {
  154796. /**
  154797. * @author Richard Davey <rich@photonstorm.com>
  154798. * @copyright 2019 Photon Storm Ltd.
  154799. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154800. */
  154801. /**
  154802. * The Impact Offset component.
  154803. * Should be applied as a mixin.
  154804. *
  154805. * @name Phaser.Physics.Impact.Components.Offset
  154806. * @since 3.0.0
  154807. */
  154808. var Offset = {
  154809. /**
  154810. * [description]
  154811. *
  154812. * @method Phaser.Physics.Impact.Components.Offset#setOffset
  154813. * @since 3.0.0
  154814. *
  154815. * @param {number} x - [description]
  154816. * @param {number} y - [description]
  154817. * @param {number} [width] - [description]
  154818. * @param {number} [height] - [description]
  154819. *
  154820. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154821. */
  154822. setOffset: function (x, y, width, height)
  154823. {
  154824. this.body.offset.x = x;
  154825. this.body.offset.y = y;
  154826. if (width)
  154827. {
  154828. this.setBodySize(width, height);
  154829. }
  154830. return this;
  154831. }
  154832. };
  154833. module.exports = Offset;
  154834. /***/ }),
  154835. /* 1346 */
  154836. /***/ (function(module, exports) {
  154837. /**
  154838. * @author Richard Davey <rich@photonstorm.com>
  154839. * @copyright 2019 Photon Storm Ltd.
  154840. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154841. */
  154842. /**
  154843. * The Impact Gravity component.
  154844. * Should be applied as a mixin.
  154845. *
  154846. * @name Phaser.Physics.Impact.Components.Gravity
  154847. * @since 3.0.0
  154848. */
  154849. var Gravity = {
  154850. /**
  154851. * [description]
  154852. *
  154853. * @method Phaser.Physics.Impact.Components.Gravity#setGravity
  154854. * @since 3.0.0
  154855. *
  154856. * @param {number} value - [description]
  154857. *
  154858. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154859. */
  154860. setGravity: function (value)
  154861. {
  154862. this.body.gravityFactor = value;
  154863. return this;
  154864. },
  154865. /**
  154866. * [description]
  154867. *
  154868. * @name Phaser.Physics.Impact.Components.Gravity#gravity
  154869. * @type {number}
  154870. * @since 3.0.0
  154871. */
  154872. gravity: {
  154873. get: function ()
  154874. {
  154875. return this.body.gravityFactor;
  154876. },
  154877. set: function (value)
  154878. {
  154879. this.body.gravityFactor = value;
  154880. }
  154881. }
  154882. };
  154883. module.exports = Gravity;
  154884. /***/ }),
  154885. /* 1347 */
  154886. /***/ (function(module, exports) {
  154887. /**
  154888. * @author Richard Davey <rich@photonstorm.com>
  154889. * @copyright 2019 Photon Storm Ltd.
  154890. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154891. */
  154892. /**
  154893. * The Impact Friction component.
  154894. * Should be applied as a mixin.
  154895. *
  154896. * @name Phaser.Physics.Impact.Components.Friction
  154897. * @since 3.0.0
  154898. */
  154899. var Friction = {
  154900. /**
  154901. * [description]
  154902. *
  154903. * @method Phaser.Physics.Impact.Components.Friction#setFrictionX
  154904. * @since 3.0.0
  154905. *
  154906. * @param {number} x - [description]
  154907. *
  154908. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154909. */
  154910. setFrictionX: function (x)
  154911. {
  154912. this.friction.x = x;
  154913. return this;
  154914. },
  154915. /**
  154916. * [description]
  154917. *
  154918. * @method Phaser.Physics.Impact.Components.Friction#setFrictionY
  154919. * @since 3.0.0
  154920. *
  154921. * @param {number} y - [description]
  154922. *
  154923. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154924. */
  154925. setFrictionY: function (y)
  154926. {
  154927. this.friction.y = y;
  154928. return this;
  154929. },
  154930. /**
  154931. * [description]
  154932. *
  154933. * @method Phaser.Physics.Impact.Components.Friction#setFriction
  154934. * @since 3.0.0
  154935. *
  154936. * @param {number} x - [description]
  154937. * @param {number} y - [description]
  154938. *
  154939. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154940. */
  154941. setFriction: function (x, y)
  154942. {
  154943. this.friction.x = x;
  154944. this.friction.y = y;
  154945. return this;
  154946. }
  154947. };
  154948. module.exports = Friction;
  154949. /***/ }),
  154950. /* 1348 */
  154951. /***/ (function(module, exports) {
  154952. /**
  154953. * @author Richard Davey <rich@photonstorm.com>
  154954. * @copyright 2019 Photon Storm Ltd.
  154955. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  154956. */
  154957. /**
  154958. * The Impact Debug component.
  154959. * Should be applied as a mixin.
  154960. *
  154961. * @name Phaser.Physics.Impact.Components.Debug
  154962. * @since 3.0.0
  154963. */
  154964. var Debug = {
  154965. /**
  154966. * [description]
  154967. *
  154968. * @method Phaser.Physics.Impact.Components.Debug#setDebug
  154969. * @since 3.0.0
  154970. *
  154971. * @param {boolean} showBody - [description]
  154972. * @param {boolean} showVelocity - [description]
  154973. * @param {number} bodyColor - [description]
  154974. *
  154975. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154976. */
  154977. setDebug: function (showBody, showVelocity, bodyColor)
  154978. {
  154979. this.debugShowBody = showBody;
  154980. this.debugShowVelocity = showVelocity;
  154981. this.debugBodyColor = bodyColor;
  154982. return this;
  154983. },
  154984. /**
  154985. * [description]
  154986. *
  154987. * @method Phaser.Physics.Impact.Components.Debug#setDebugBodyColor
  154988. * @since 3.0.0
  154989. *
  154990. * @param {number} value - [description]
  154991. *
  154992. * @return {Phaser.GameObjects.GameObject} This Game Object.
  154993. */
  154994. setDebugBodyColor: function (value)
  154995. {
  154996. this.body.debugBodyColor = value;
  154997. return this;
  154998. },
  154999. /**
  155000. * [description]
  155001. *
  155002. * @name Phaser.Physics.Impact.Components.Debug#debugShowBody
  155003. * @type {boolean}
  155004. * @since 3.0.0
  155005. */
  155006. debugShowBody: {
  155007. get: function ()
  155008. {
  155009. return this.body.debugShowBody;
  155010. },
  155011. set: function (value)
  155012. {
  155013. this.body.debugShowBody = value;
  155014. }
  155015. },
  155016. /**
  155017. * [description]
  155018. *
  155019. * @name Phaser.Physics.Impact.Components.Debug#debugShowVelocity
  155020. * @type {boolean}
  155021. * @since 3.0.0
  155022. */
  155023. debugShowVelocity: {
  155024. get: function ()
  155025. {
  155026. return this.body.debugShowVelocity;
  155027. },
  155028. set: function (value)
  155029. {
  155030. this.body.debugShowVelocity = value;
  155031. }
  155032. },
  155033. /**
  155034. * [description]
  155035. *
  155036. * @name Phaser.Physics.Impact.Components.Debug#debugBodyColor
  155037. * @type {number}
  155038. * @since 3.0.0
  155039. */
  155040. debugBodyColor: {
  155041. get: function ()
  155042. {
  155043. return this.body.debugBodyColor;
  155044. },
  155045. set: function (value)
  155046. {
  155047. this.body.debugBodyColor = value;
  155048. }
  155049. }
  155050. };
  155051. module.exports = Debug;
  155052. /***/ }),
  155053. /* 1349 */
  155054. /***/ (function(module, exports, __webpack_require__) {
  155055. /**
  155056. * @author Richard Davey <rich@photonstorm.com>
  155057. * @copyright 2019 Photon Storm Ltd.
  155058. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155059. */
  155060. var COLLIDES = __webpack_require__(240);
  155061. /**
  155062. * @callback CollideCallback
  155063. *
  155064. * @param {Phaser.Physics.Impact.Body} body - [description]
  155065. * @param {Phaser.Physics.Impact.Body} other - [description]
  155066. * @param {string} axis - [description]
  155067. */
  155068. /**
  155069. * The Impact Collides component.
  155070. * Should be applied as a mixin.
  155071. *
  155072. * @name Phaser.Physics.Impact.Components.Collides
  155073. * @since 3.0.0
  155074. */
  155075. var Collides = {
  155076. _collideCallback: null,
  155077. _callbackScope: null,
  155078. /**
  155079. * [description]
  155080. *
  155081. * @method Phaser.Physics.Impact.Components.Collides#setCollideCallback
  155082. * @since 3.0.0
  155083. *
  155084. * @param {CollideCallback} callback - [description]
  155085. * @param {*} scope - [description]
  155086. *
  155087. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155088. */
  155089. setCollideCallback: function (callback, scope)
  155090. {
  155091. this._collideCallback = callback;
  155092. if (scope)
  155093. {
  155094. this._callbackScope = scope;
  155095. }
  155096. return this;
  155097. },
  155098. /**
  155099. * [description]
  155100. *
  155101. * @method Phaser.Physics.Impact.Components.Collides#setCollidesNever
  155102. * @since 3.0.0
  155103. *
  155104. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155105. */
  155106. setCollidesNever: function ()
  155107. {
  155108. this.body.collides = COLLIDES.NEVER;
  155109. return this;
  155110. },
  155111. /**
  155112. * [description]
  155113. *
  155114. * @method Phaser.Physics.Impact.Components.Collides#setLiteCollision
  155115. * @since 3.6.0
  155116. *
  155117. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155118. */
  155119. setLiteCollision: function ()
  155120. {
  155121. this.body.collides = COLLIDES.LITE;
  155122. return this;
  155123. },
  155124. /**
  155125. * [description]
  155126. *
  155127. * @method Phaser.Physics.Impact.Components.Collides#setPassiveCollision
  155128. * @since 3.6.0
  155129. *
  155130. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155131. */
  155132. setPassiveCollision: function ()
  155133. {
  155134. this.body.collides = COLLIDES.PASSIVE;
  155135. return this;
  155136. },
  155137. /**
  155138. * [description]
  155139. *
  155140. * @method Phaser.Physics.Impact.Components.Collides#setActiveCollision
  155141. * @since 3.6.0
  155142. *
  155143. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155144. */
  155145. setActiveCollision: function ()
  155146. {
  155147. this.body.collides = COLLIDES.ACTIVE;
  155148. return this;
  155149. },
  155150. /**
  155151. * [description]
  155152. *
  155153. * @method Phaser.Physics.Impact.Components.Collides#setFixedCollision
  155154. * @since 3.6.0
  155155. *
  155156. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155157. */
  155158. setFixedCollision: function ()
  155159. {
  155160. this.body.collides = COLLIDES.FIXED;
  155161. return this;
  155162. },
  155163. /**
  155164. * [description]
  155165. *
  155166. * @name Phaser.Physics.Impact.Components.Collides#collides
  155167. * @type {number}
  155168. * @since 3.0.0
  155169. */
  155170. collides: {
  155171. get: function ()
  155172. {
  155173. return this.body.collides;
  155174. },
  155175. set: function (value)
  155176. {
  155177. this.body.collides = value;
  155178. }
  155179. }
  155180. };
  155181. module.exports = Collides;
  155182. /***/ }),
  155183. /* 1350 */
  155184. /***/ (function(module, exports, __webpack_require__) {
  155185. /**
  155186. * @author Richard Davey <rich@photonstorm.com>
  155187. * @copyright 2019 Photon Storm Ltd.
  155188. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155189. */
  155190. var TYPE = __webpack_require__(239);
  155191. /**
  155192. * The Impact Check Against component.
  155193. * Should be applied as a mixin.
  155194. *
  155195. * @name Phaser.Physics.Impact.Components.CheckAgainst
  155196. * @since 3.0.0
  155197. */
  155198. var CheckAgainst = {
  155199. /**
  155200. * [description]
  155201. *
  155202. * @method Phaser.Physics.Impact.Components.CheckAgainst#setAvsB
  155203. * @since 3.0.0
  155204. *
  155205. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155206. */
  155207. setAvsB: function ()
  155208. {
  155209. this.setTypeA();
  155210. return this.setCheckAgainstB();
  155211. },
  155212. /**
  155213. * [description]
  155214. *
  155215. * @method Phaser.Physics.Impact.Components.CheckAgainst#setBvsA
  155216. * @since 3.0.0
  155217. *
  155218. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155219. */
  155220. setBvsA: function ()
  155221. {
  155222. this.setTypeB();
  155223. return this.setCheckAgainstA();
  155224. },
  155225. /**
  155226. * [description]
  155227. *
  155228. * @method Phaser.Physics.Impact.Components.CheckAgainst#setCheckAgainstNone
  155229. * @since 3.0.0
  155230. *
  155231. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155232. */
  155233. setCheckAgainstNone: function ()
  155234. {
  155235. this.body.checkAgainst = TYPE.NONE;
  155236. return this;
  155237. },
  155238. /**
  155239. * [description]
  155240. *
  155241. * @method Phaser.Physics.Impact.Components.CheckAgainst#setCheckAgainstA
  155242. * @since 3.0.0
  155243. *
  155244. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155245. */
  155246. setCheckAgainstA: function ()
  155247. {
  155248. this.body.checkAgainst = TYPE.A;
  155249. return this;
  155250. },
  155251. /**
  155252. * [description]
  155253. *
  155254. * @method Phaser.Physics.Impact.Components.CheckAgainst#setCheckAgainstB
  155255. * @since 3.0.0
  155256. *
  155257. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155258. */
  155259. setCheckAgainstB: function ()
  155260. {
  155261. this.body.checkAgainst = TYPE.B;
  155262. return this;
  155263. },
  155264. /**
  155265. * [description]
  155266. *
  155267. * @name Phaser.Physics.Impact.Components.CheckAgainst#checkAgainst
  155268. * @type {number}
  155269. * @since 3.0.0
  155270. */
  155271. checkAgainst: {
  155272. get: function ()
  155273. {
  155274. return this.body.checkAgainst;
  155275. },
  155276. set: function (value)
  155277. {
  155278. this.body.checkAgainst = value;
  155279. }
  155280. }
  155281. };
  155282. module.exports = CheckAgainst;
  155283. /***/ }),
  155284. /* 1351 */
  155285. /***/ (function(module, exports) {
  155286. /**
  155287. * @author Richard Davey <rich@photonstorm.com>
  155288. * @copyright 2019 Photon Storm Ltd.
  155289. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155290. */
  155291. /**
  155292. * The Impact Bounce component.
  155293. * Should be applied as a mixin.
  155294. *
  155295. * @name Phaser.Physics.Impact.Components.Bounce
  155296. * @since 3.0.0
  155297. */
  155298. var Bounce = {
  155299. /**
  155300. * Sets the impact physics bounce, or restitution, value.
  155301. *
  155302. * @method Phaser.Physics.Impact.Components.Bounce#setBounce
  155303. * @since 3.0.0
  155304. *
  155305. * @param {number} value - A value between 0 (no rebound) and 1 (full rebound)
  155306. *
  155307. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155308. */
  155309. setBounce: function (value)
  155310. {
  155311. this.body.bounciness = value;
  155312. return this;
  155313. },
  155314. /**
  155315. * Sets the minimum velocity the body is allowed to be moving to be considered for rebound.
  155316. *
  155317. * @method Phaser.Physics.Impact.Components.Bounce#setMinBounceVelocity
  155318. * @since 3.0.0
  155319. *
  155320. * @param {number} value - The minimum allowed velocity.
  155321. *
  155322. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155323. */
  155324. setMinBounceVelocity: function (value)
  155325. {
  155326. this.body.minBounceVelocity = value;
  155327. return this;
  155328. },
  155329. /**
  155330. * The bounce, or restitution, value of this body.
  155331. * A value between 0 (no rebound) and 1 (full rebound)
  155332. *
  155333. * @name Phaser.Physics.Impact.Components.Bounce#bounce
  155334. * @type {number}
  155335. * @since 3.0.0
  155336. */
  155337. bounce: {
  155338. get: function ()
  155339. {
  155340. return this.body.bounciness;
  155341. },
  155342. set: function (value)
  155343. {
  155344. this.body.bounciness = value;
  155345. }
  155346. }
  155347. };
  155348. module.exports = Bounce;
  155349. /***/ }),
  155350. /* 1352 */
  155351. /***/ (function(module, exports, __webpack_require__) {
  155352. /**
  155353. * @author Richard Davey <rich@photonstorm.com>
  155354. * @copyright 2019 Photon Storm Ltd.
  155355. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155356. */
  155357. var TYPE = __webpack_require__(239);
  155358. /**
  155359. * The Impact Body Type component.
  155360. * Should be applied as a mixin.
  155361. *
  155362. * @name Phaser.Physics.Impact.Components.BodyType
  155363. * @since 3.0.0
  155364. */
  155365. var BodyType = {
  155366. /**
  155367. * [description]
  155368. *
  155369. * @method Phaser.Physics.Impact.Components.BodyType#getBodyType
  155370. * @since 3.0.0
  155371. *
  155372. * @return {number} [description]
  155373. */
  155374. getBodyType: function ()
  155375. {
  155376. return this.body.type;
  155377. },
  155378. /**
  155379. * [description]
  155380. *
  155381. * @method Phaser.Physics.Impact.Components.BodyType#setTypeNone
  155382. * @since 3.0.0
  155383. *
  155384. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155385. */
  155386. setTypeNone: function ()
  155387. {
  155388. this.body.type = TYPE.NONE;
  155389. return this;
  155390. },
  155391. /**
  155392. * [description]
  155393. *
  155394. * @method Phaser.Physics.Impact.Components.BodyType#setTypeA
  155395. * @since 3.0.0
  155396. *
  155397. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155398. */
  155399. setTypeA: function ()
  155400. {
  155401. this.body.type = TYPE.A;
  155402. return this;
  155403. },
  155404. /**
  155405. * [description]
  155406. *
  155407. * @method Phaser.Physics.Impact.Components.BodyType#setTypeB
  155408. * @since 3.0.0
  155409. *
  155410. * @return {Phaser.GameObjects.GameObject} This Game Object.
  155411. */
  155412. setTypeB: function ()
  155413. {
  155414. this.body.type = TYPE.B;
  155415. return this;
  155416. }
  155417. };
  155418. module.exports = BodyType;
  155419. /***/ }),
  155420. /* 1353 */
  155421. /***/ (function(module, exports) {
  155422. /**
  155423. * @author Richard Davey <rich@photonstorm.com>
  155424. * @copyright 2019 Photon Storm Ltd.
  155425. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155426. */
  155427. /**
  155428. * The Impact Body Scale component.
  155429. * Should be applied as a mixin.
  155430. *
  155431. * @name Phaser.Physics.Impact.Components.BodyScale
  155432. * @since 3.0.0
  155433. */
  155434. var BodyScale = {
  155435. /**
  155436. * Sets the size of the physics body.
  155437. *
  155438. * @method Phaser.Physics.Impact.Components.BodyScale#setBodySize
  155439. * @since 3.0.0
  155440. *
  155441. * @param {number} width - The width of the body in pixels.
  155442. * @param {number} [height=width] - The height of the body in pixels.
  155443. *
  155444. * @return {this} This Game Object.
  155445. */
  155446. setBodySize: function (width, height)
  155447. {
  155448. if (height === undefined) { height = width; }
  155449. this.body.size.x = Math.round(width);
  155450. this.body.size.y = Math.round(height);
  155451. return this;
  155452. },
  155453. /**
  155454. * Sets the scale of the physics body.
  155455. *
  155456. * @method Phaser.Physics.Impact.Components.BodyScale#setBodyScale
  155457. * @since 3.0.0
  155458. *
  155459. * @param {number} scaleX - The horizontal scale of the body.
  155460. * @param {number} [scaleY] - The vertical scale of the body. If not given, will use the horizontal scale value.
  155461. *
  155462. * @return {this} This Game Object.
  155463. */
  155464. setBodyScale: function (scaleX, scaleY)
  155465. {
  155466. if (scaleY === undefined) { scaleY = scaleX; }
  155467. var gameObject = this.body.gameObject;
  155468. if (gameObject)
  155469. {
  155470. gameObject.setScale(scaleX, scaleY);
  155471. return this.setBodySize(gameObject.width * gameObject.scaleX, gameObject.height * gameObject.scaleY);
  155472. }
  155473. else
  155474. {
  155475. return this.setBodySize(this.body.size.x * scaleX, this.body.size.y * scaleY);
  155476. }
  155477. }
  155478. };
  155479. module.exports = BodyScale;
  155480. /***/ }),
  155481. /* 1354 */
  155482. /***/ (function(module, exports) {
  155483. /**
  155484. * @author Richard Davey <rich@photonstorm.com>
  155485. * @copyright 2019 Photon Storm Ltd.
  155486. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155487. */
  155488. /**
  155489. * The Impact Acceleration component.
  155490. * Should be applied as a mixin.
  155491. *
  155492. * @name Phaser.Physics.Impact.Components.Acceleration
  155493. * @since 3.0.0
  155494. */
  155495. var Acceleration = {
  155496. /**
  155497. * Sets the horizontal acceleration of this body.
  155498. *
  155499. * @method Phaser.Physics.Impact.Components.Acceleration#setAccelerationX
  155500. * @since 3.0.0
  155501. *
  155502. * @param {number} x - The amount of acceleration to apply.
  155503. *
  155504. * @return {this} This Game Object.
  155505. */
  155506. setAccelerationX: function (x)
  155507. {
  155508. this.accel.x = x;
  155509. return this;
  155510. },
  155511. /**
  155512. * Sets the vertical acceleration of this body.
  155513. *
  155514. * @method Phaser.Physics.Impact.Components.Acceleration#setAccelerationY
  155515. * @since 3.0.0
  155516. *
  155517. * @param {number} y - The amount of acceleration to apply.
  155518. *
  155519. * @return {this} This Game Object.
  155520. */
  155521. setAccelerationY: function (y)
  155522. {
  155523. this.accel.y = y;
  155524. return this;
  155525. },
  155526. /**
  155527. * Sets the horizontal and vertical acceleration of this body.
  155528. *
  155529. * @method Phaser.Physics.Impact.Components.Acceleration#setAcceleration
  155530. * @since 3.0.0
  155531. *
  155532. * @param {number} x - The amount of horizontal acceleration to apply.
  155533. * @param {number} y - The amount of vertical acceleration to apply.
  155534. *
  155535. * @return {this} This Game Object.
  155536. */
  155537. setAcceleration: function (x, y)
  155538. {
  155539. this.accel.x = x;
  155540. this.accel.y = y;
  155541. return this;
  155542. }
  155543. };
  155544. module.exports = Acceleration;
  155545. /***/ }),
  155546. /* 1355 */
  155547. /***/ (function(module, exports) {
  155548. /**
  155549. * @author Richard Davey <rich@photonstorm.com>
  155550. * @copyright 2019 Photon Storm Ltd.
  155551. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155552. */
  155553. var H = 0.5;
  155554. var N = 1 / 3;
  155555. var M = 2 / 3;
  155556. // Tile ID to Slope defs.
  155557. // First 4 elements = line data, final = solid or non-solid behind the line
  155558. module.exports = {
  155559. 2: [ 0, 1, 1, 0, true ],
  155560. 3: [ 0, 1, 1, H, true ],
  155561. 4: [ 0, H, 1, 0, true ],
  155562. 5: [ 0, 1, 1, M, true ],
  155563. 6: [ 0, M, 1, N, true ],
  155564. 7: [ 0, N, 1, 0, true ],
  155565. 8: [ H, 1, 0, 0, true ],
  155566. 9: [ 1, 0, H, 1, true ],
  155567. 10: [ H, 1, 1, 0, true ],
  155568. 11: [ 0, 0, H, 1, true ],
  155569. 12: [ 0, 0, 1, 0, false ],
  155570. 13: [ 1, 1, 0, 0, true ],
  155571. 14: [ 1, H, 0, 0, true ],
  155572. 15: [ 1, 1, 0, H, true ],
  155573. 16: [ 1, N, 0, 0, true ],
  155574. 17: [ 1, M, 0, N, true ],
  155575. 18: [ 1, 1, 0, M, true ],
  155576. 19: [ 1, 1, H, 0, true ],
  155577. 20: [ H, 0, 0, 1, true ],
  155578. 21: [ 0, 1, H, 0, true ],
  155579. 22: [ H, 0, 1, 1, true ],
  155580. 23: [ 1, 1, 0, 1, false ],
  155581. 24: [ 0, 0, 1, 1, true ],
  155582. 25: [ 0, 0, 1, H, true ],
  155583. 26: [ 0, H, 1, 1, true ],
  155584. 27: [ 0, 0, 1, N, true ],
  155585. 28: [ 0, N, 1, M, true ],
  155586. 29: [ 0, M, 1, 1, true ],
  155587. 30: [ N, 1, 0, 0, true ],
  155588. 31: [ 1, 0, M, 1, true ],
  155589. 32: [ M, 1, 1, 0, true ],
  155590. 33: [ 0, 0, N, 1, true ],
  155591. 34: [ 1, 0, 1, 1, false ],
  155592. 35: [ 1, 0, 0, 1, true ],
  155593. 36: [ 1, H, 0, 1, true ],
  155594. 37: [ 1, 0, 0, H, true ],
  155595. 38: [ 1, M, 0, 1, true ],
  155596. 39: [ 1, N, 0, M, true ],
  155597. 40: [ 1, 0, 0, N, true ],
  155598. 41: [ M, 1, N, 0, true ],
  155599. 42: [ M, 0, N, 1, true ],
  155600. 43: [ N, 1, M, 0, true ],
  155601. 44: [ N, 0, M, 1, true ],
  155602. 45: [ 0, 1, 0, 0, false ],
  155603. 52: [ 1, 1, M, 0, true ],
  155604. 53: [ N, 0, 0, 1, true ],
  155605. 54: [ 0, 1, N, 0, true ],
  155606. 55: [ M, 0, 1, 1, true ]
  155607. };
  155608. /***/ }),
  155609. /* 1356 */
  155610. /***/ (function(module, exports) {
  155611. /**
  155612. * @author Richard Davey <rich@photonstorm.com>
  155613. * @copyright 2019 Photon Storm Ltd.
  155614. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155615. */
  155616. /**
  155617. * The Impact Physics World Resume Event.
  155618. *
  155619. * This event is dispatched by an Impact Physics World instance when it resumes from a paused state.
  155620. *
  155621. * Listen to it from a Scene using: `this.impact.world.on('resume', listener)`.
  155622. *
  155623. * @event Phaser.Physics.Impact.Events#RESUME
  155624. */
  155625. module.exports = 'resume';
  155626. /***/ }),
  155627. /* 1357 */
  155628. /***/ (function(module, exports) {
  155629. /**
  155630. * @author Richard Davey <rich@photonstorm.com>
  155631. * @copyright 2019 Photon Storm Ltd.
  155632. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155633. */
  155634. /**
  155635. * The Impact Physics World Pause Event.
  155636. *
  155637. * This event is dispatched by an Impact Physics World instance when it is paused.
  155638. *
  155639. * Listen to it from a Scene using: `this.impact.world.on('pause', listener)`.
  155640. *
  155641. * @event Phaser.Physics.Impact.Events#PAUSE
  155642. */
  155643. module.exports = 'pause';
  155644. /***/ }),
  155645. /* 1358 */
  155646. /***/ (function(module, exports) {
  155647. /**
  155648. * @author Richard Davey <rich@photonstorm.com>
  155649. * @copyright 2019 Photon Storm Ltd.
  155650. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155651. */
  155652. /**
  155653. * The Impact Physics World Collide Event.
  155654. *
  155655. * This event is dispatched by an Impact Physics World instance if two bodies collide.
  155656. *
  155657. * Listen to it from a Scene using: `this.impact.world.on('collide', listener)`.
  155658. *
  155659. * @event Phaser.Physics.Impact.Events#COLLIDE
  155660. *
  155661. * @param {Phaser.Physics.Impact.Body} bodyA - The first body involved in the collision.
  155662. * @param {Phaser.Physics.Impact.Body} bodyB - The second body involved in the collision.
  155663. * @param {string} axis - The collision axis. Either `x` or `y`.
  155664. */
  155665. module.exports = 'collide';
  155666. /***/ }),
  155667. /* 1359 */
  155668. /***/ (function(module, exports) {
  155669. /**
  155670. * @author Richard Davey <rich@photonstorm.com>
  155671. * @copyright 2019 Photon Storm Ltd.
  155672. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155673. */
  155674. /**
  155675. * Set up the trace-result
  155676. * var res = {
  155677. * collision: {x: false, y: false, slope: false},
  155678. * pos: {x: x, y: y},
  155679. * tile: {x: 0, y: 0}
  155680. * };
  155681. *
  155682. * @function Phaser.Physics.Impact.UpdateMotion
  155683. * @since 3.0.0
  155684. *
  155685. * @param {Phaser.Physics.Impact.Body} body - [description]
  155686. * @param {object} res - [description]
  155687. */
  155688. var UpdateMotion = function (body, res)
  155689. {
  155690. body.standing = false;
  155691. // Y
  155692. if (res.collision.y)
  155693. {
  155694. if (body.bounciness > 0 && Math.abs(body.vel.y) > body.minBounceVelocity)
  155695. {
  155696. body.vel.y *= -body.bounciness;
  155697. }
  155698. else
  155699. {
  155700. if (body.vel.y > 0)
  155701. {
  155702. body.standing = true;
  155703. }
  155704. body.vel.y = 0;
  155705. }
  155706. }
  155707. // X
  155708. if (res.collision.x)
  155709. {
  155710. if (body.bounciness > 0 && Math.abs(body.vel.x) > body.minBounceVelocity)
  155711. {
  155712. body.vel.x *= -body.bounciness;
  155713. }
  155714. else
  155715. {
  155716. body.vel.x = 0;
  155717. }
  155718. }
  155719. // SLOPE
  155720. if (res.collision.slope)
  155721. {
  155722. var s = res.collision.slope;
  155723. if (body.bounciness > 0)
  155724. {
  155725. var proj = body.vel.x * s.nx + body.vel.y * s.ny;
  155726. body.vel.x = (body.vel.x - s.nx * proj * 2) * body.bounciness;
  155727. body.vel.y = (body.vel.y - s.ny * proj * 2) * body.bounciness;
  155728. }
  155729. else
  155730. {
  155731. var lengthSquared = s.x * s.x + s.y * s.y;
  155732. var dot = (body.vel.x * s.x + body.vel.y * s.y) / lengthSquared;
  155733. body.vel.x = s.x * dot;
  155734. body.vel.y = s.y * dot;
  155735. var angle = Math.atan2(s.x, s.y);
  155736. if (angle > body.slopeStanding.min && angle < body.slopeStanding.max)
  155737. {
  155738. body.standing = true;
  155739. }
  155740. }
  155741. }
  155742. body.pos.x = res.pos.x;
  155743. body.pos.y = res.pos.y;
  155744. };
  155745. module.exports = UpdateMotion;
  155746. /***/ }),
  155747. /* 1360 */
  155748. /***/ (function(module, exports, __webpack_require__) {
  155749. /**
  155750. * @author Richard Davey <rich@photonstorm.com>
  155751. * @copyright 2019 Photon Storm Ltd.
  155752. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155753. */
  155754. var Clamp = __webpack_require__(23);
  155755. /**
  155756. * [description]
  155757. *
  155758. * @function Phaser.Physics.Impact.GetVelocity
  155759. * @since 3.0.0
  155760. *
  155761. * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate.
  155762. * @param {number} vel - [description]
  155763. * @param {number} accel - [description]
  155764. * @param {number} friction - [description]
  155765. * @param {number} max - [description]
  155766. *
  155767. * @return {number} [description]
  155768. */
  155769. var GetVelocity = function (delta, vel, accel, friction, max)
  155770. {
  155771. if (accel)
  155772. {
  155773. return Clamp(vel + accel * delta, -max, max);
  155774. }
  155775. else if (friction)
  155776. {
  155777. var frictionDelta = friction * delta;
  155778. if (vel - frictionDelta > 0)
  155779. {
  155780. return vel - frictionDelta;
  155781. }
  155782. else if (vel + frictionDelta < 0)
  155783. {
  155784. return vel + frictionDelta;
  155785. }
  155786. else
  155787. {
  155788. return 0;
  155789. }
  155790. }
  155791. return Clamp(vel, -max, max);
  155792. };
  155793. module.exports = GetVelocity;
  155794. /***/ }),
  155795. /* 1361 */
  155796. /***/ (function(module, exports, __webpack_require__) {
  155797. /**
  155798. * @author Richard Davey <rich@photonstorm.com>
  155799. * @copyright 2019 Photon Storm Ltd.
  155800. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155801. */
  155802. /**
  155803. * An Impact.js compatible physics world, body and solver, for those who are used
  155804. * to the Impact way of defining and controlling physics bodies. Also works with
  155805. * the new Loader support for Weltmeister map data.
  155806. *
  155807. * World updated to run off the Phaser main loop.
  155808. * Body extended to support additional setter functions.
  155809. *
  155810. * To create the map data you'll need Weltmeister, which comes with Impact
  155811. * and can be purchased from http://impactjs.com
  155812. *
  155813. * My thanks to Dominic Szablewski for his permission to support Impact in Phaser.
  155814. *
  155815. * @namespace Phaser.Physics.Impact
  155816. */
  155817. module.exports = {
  155818. Body: __webpack_require__(1298),
  155819. Events: __webpack_require__(548),
  155820. COLLIDES: __webpack_require__(240),
  155821. CollisionMap: __webpack_require__(1297),
  155822. Factory: __webpack_require__(1296),
  155823. Image: __webpack_require__(1294),
  155824. ImpactBody: __webpack_require__(1295),
  155825. ImpactPhysics: __webpack_require__(1342),
  155826. Sprite: __webpack_require__(1293),
  155827. TYPE: __webpack_require__(239),
  155828. World: __webpack_require__(1292)
  155829. };
  155830. /***/ }),
  155831. /* 1362 */
  155832. /***/ (function(module, exports, __webpack_require__) {
  155833. /**
  155834. * @author Richard Davey <rich@photonstorm.com>
  155835. * @copyright 2019 Photon Storm Ltd.
  155836. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155837. */
  155838. /**
  155839. * @namespace Phaser.Physics
  155840. */
  155841. module.exports = {
  155842. Arcade: __webpack_require__(577),
  155843. Impact: __webpack_require__(1361),
  155844. Matter: __webpack_require__(1338)
  155845. };
  155846. /***/ }),
  155847. /* 1363 */
  155848. /***/ (function(module, exports, __webpack_require__) {
  155849. /* WEBPACK VAR INJECTION */(function(global) {/**
  155850. * @author Richard Davey <rich@photonstorm.com>
  155851. * @copyright 2019 Photon Storm Ltd.
  155852. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  155853. */
  155854. __webpack_require__(1280);
  155855. var CONST = __webpack_require__(28);
  155856. var Extend = __webpack_require__(19);
  155857. /**
  155858. * @namespace Phaser
  155859. */
  155860. var Phaser = {
  155861. Actions: __webpack_require__(450),
  155862. Animations: __webpack_require__(1191),
  155863. Cache: __webpack_require__(1176),
  155864. Cameras: __webpack_require__(1173),
  155865. Core: __webpack_require__(1097),
  155866. Class: __webpack_require__(0),
  155867. Create: __webpack_require__(1038),
  155868. Curves: __webpack_require__(1032),
  155869. Data: __webpack_require__(1029),
  155870. Display: __webpack_require__(1027),
  155871. DOM: __webpack_require__(998),
  155872. Events: __webpack_require__(997),
  155873. Game: __webpack_require__(995),
  155874. GameObjects: __webpack_require__(902),
  155875. Geom: __webpack_require__(279),
  155876. Input: __webpack_require__(635),
  155877. Loader: __webpack_require__(601),
  155878. Math: __webpack_require__(387),
  155879. Physics: __webpack_require__(1362),
  155880. Plugins: __webpack_require__(538),
  155881. Renderer: __webpack_require__(1304),
  155882. Scale: __webpack_require__(536),
  155883. Scene: __webpack_require__(331),
  155884. Scenes: __webpack_require__(535),
  155885. Sound: __webpack_require__(533),
  155886. Structs: __webpack_require__(532),
  155887. Textures: __webpack_require__(531),
  155888. Tilemaps: __webpack_require__(529),
  155889. Time: __webpack_require__(480),
  155890. Tweens: __webpack_require__(478),
  155891. Utils: __webpack_require__(468)
  155892. };
  155893. // Merge in the optional plugins
  155894. if (false)
  155895. {}
  155896. if (false)
  155897. {}
  155898. // Merge in the consts
  155899. Phaser = Extend(false, Phaser, CONST);
  155900. // Export it
  155901. module.exports = Phaser;
  155902. global.Phaser = Phaser;
  155903. /*
  155904. * "Documentation is like pizza: when it is good, it is very, very good;
  155905. * and when it is bad, it is better than nothing."
  155906. * -- Dick Brandon
  155907. */
  155908. /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(215)))
  155909. /***/ })
  155910. /******/ ]);
  155911. });